. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  专家说的没错,当你遇到问题的时候不要怀疑自己的智商,而要问自己是否足够的坚持.  [已解决] 回复[ 4次 ]   点击[ 363次 ]  
huibian2009
[帖 主]   [ 发表时间:2009-08-20 10:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
我在做课程设计1时找不到头绪,非常烦闷,书也看不下去了,甚至想过要把汇编放弃.还好我并没有这么做.看到别人做出设计的那种高兴劲我更加的怀疑是不是自己智商比别人低呢?然后我专门找了著名的德国智商测验来做,结果是125分,成绩还不错,但是还是一看书就头疼,我就先把汇编放了几天,结果越放越懒,连笔记都不想翻了.后来我意识到不能这样半途而废,硬着头皮又看了起来.经过几天的休息,我感觉心情没那么烦燥了,于是我从网上把几个高手的答案复制到了自己的电脑上,分析他们的代码.结果是越看越不懂.一会出现一个跳转一会一个CALL,搞的我又没有耐性了.我静下心来,自己分析了一下难住自己的地方,原来是那个转换字符串的子程序令我陷入了困境.然后我就把高手的代码生成程序,专门调试转换字符串这个子程序,终于弄明白了是怎么一个流程,然后自己就试着编了编类似的小程序,此时我的信心又回来了.借着这个动力,我又开始从新考虑解决问题的思路.由于以前有过VB基础,在做子程序的时候就稍微了解一些.功夫不负有心人,经过努力,我成功的完成了课设1,当看到四排绿色的数字整齐的排列在DOS窗口中,我太激动了.更加深了我对专家喊话区那句话的坚信程度.所以希望有过和我类似经历,或者目前仍没有做出设计的朋友,能够坚持一下,胜利的大门永远为你我敞开.下面是我的程序,用了四个循环,想法很简单,就是将四列一列一列的输出,没有另辟内存存储转换的字符什么的,都是直接写入的显存,请各位指点.
assume cs:a,ds:b,ss:d
b segment
        db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
        db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
        db '1993','1994','1995'
        ;以上是表示21年的21个字符串
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        ;以上是表示21年公司收入的21个dword数据
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800
        ;以上是表示公司21年雇员人数的21个字型数据
b ends
d segment
        dd 100 dup (0)
d ends
a segment
start:        mov ax,b
        mov ds,ax
        mov ax,0b800h
        mov es,ax
        mov ax,d
        mov ss,ax
        mov sp,400
        mov bx,0;此为年份地址
        mov si,84;此为收入地址
        mov di,168;此为人员数量地址
        mov bp,0;显存行地址
        
;首先进行21次循环,以将年份存入显存中
        mov cx,21
v:        mov al,[bx+0]
        mov ah,[bx+1]
        mov dl,[bx+2]
        mov dh,[bx+3]
        call xienianfen;写年份子程序
        add bx,4
        loop v
        mov bp,0
        mov cx,21
        mov bx,84
        mov si,0
s1:        mov ax,[bx+si]
        mov dx,[bx+si+2]
        push si
        mov si,40
        call zhuanhuan
        pop si
        add si,4
        loop s1
        mov cx,21
        mov bp,0
        mov bx,168
s2:        mov ax,[bx]
        mov dx,0
        push si
        mov si,80
        call zhuanhuan
        pop si
        add bx,2
        loop s2
        mov cx,21
        mov bp,0
        mov bx,84
        push cx
        mov di,168
        mov si,0
s3:        push cx
        mov ax,[bx+si+0]
        mov dx,[bx+si+2]
        mov cx,[di]
        push si
        mov si,120
        call pingjun
        pop si
        pop cx
        add di,2
        add si,4
        loop s3
        
        mov ax,4c00h
        int 21h
xienianfen:
        
        push bx
        push si
        push di
        push ax
        
        mov si,0
                
        pop ax
        mov byte ptr es:[bp+0],al
        mov byte ptr es:[bp+1],2
        mov byte ptr es:[bp+2],ah
        mov byte ptr es:[bp+3],2
        mov byte ptr es:[bp+4],dl
        mov byte ptr es:[bp+5],2
        mov byte ptr es:[bp+6],dh
        mov byte ptr es:[bp+7],2
        add bp,0A0h
        pop di
        pop si
        pop bx
        ret;存取完毕,返回call xienianfen
zhuanhuan:
;转换字符串子程序
;参数:除数,cx;被除数,dx和ax

        push cx
        push bx
        mov bx,0
        push bx
p1:        push ax
        mov cx,10
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax;存储商
        pop ax
        div cx
        add dx,30h;存储余数
        push dx
        mov dx,bx
        mov cx,dx
        add cx,ax
        jcxz p
        jmp short p1
        
        
p:;写入显存子程序
;参数:行地址:bp
;列地址:si
        
t1:        pop cx
        jcxz t
        mov ch,2
        mov es:[bp+si],cl;将收入低字节写入显存中
        mov es:[bp+si+1],ch;写入绿色字体
        add si,2
        jmp short t1
        
t:        
        pop bx
        pop cx
        add bp,0a0h
        ret;返回call zhuanhuan        
pingjun:
;这个子程序用来求平均值
;参数:除数:雇员数1个字,用cx表示,被除数两个字,用DX和AX表示
        push bx
        push ax
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov dx,0
        pop bx
        call zhuanhuan;转换为字符串
        ret;返回call pingjun                        
a ends
end start
mess
[第1楼]   [ 回复时间:2009-08-20 17:13 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
经过风雨的洗礼才能见彩虹,恭喜楼主~
mywiil
[第2楼]   [ 回复时间:2009-08-21 11:31 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
不错,博主算是经历一个小波折,但是,也明白了一个很有用的道理。
huibian2009
[第3楼]   [ 回复时间:2009-08-21 14:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
感谢两位老师的关注,相信有你们的无私帮助,我们这群小菜鸟也会有很快的成长。
huibian2009
[第4楼]   [ 回复时间:2009-08-24 11:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-07-06 17:12
此贴由 贴主 于 [ 2009-08-24 11:54 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved