汇编网首页登录博客注册
308272108的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
文章收藏
友情链接

[2012-02-16 18:57] 课程设计一中的疑惑

完成了目前对自己来说最难的一个,可中间也发现了一些问题  请路过的朋友帮忙解惑,谢谢了

assume cs:code,es:data,ds:table

data 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'

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

    dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

    dw 11542,14430,15257,17800

    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239

    dw 260,304,333

data ends

table segment

db 32 dup (0)

table ends

code segment

start:         mov ax,data
               mov es,ax
               mov bx,0      ;设置es:bx首地址
               mov ax,table
               mov ds,ax
               mov si,0      ;设置ds:si首地址
               mov di,0      ;设置ds:di首地址
               mov dh,3      ;
               mov dl,6
               mov cx,21     ;设置循环次数

a:             push cx
               push dx
               mov ax,es:[bx]
               mov [si],ax
               mov ax,es:2[bx]
               mov 2[si],ax  ;输入年份字符串
               add si,6
               mov ax,es:[bx].84
               mov dx,es:[bx].86
               call string   ;收入转换成字符串
               add si,10
               mov ax,es:[di].168
               mov dx,0
               call string   ;人员转换成字符串
               add si,6
               mov ax,es:[di].210 ;人均收入转换成字符串
               mov dx,0
               call string               
               mov cx,26
               mov si,0
b:             push cx
               mov cl,[si]
               jcxz c
d:             inc si
               pop cx
               loop b
               mov al,0
               mov [si],al
               mov si,0
               mov cl,2
               pop dx
               call show_str
               inc dh
               add bx,4
               add di,2
               pop cx
               loop a

               mov ax,4c00h
               int 21h

c:             mov al,20h
               mov [si],al
               jmp d

string:        push si       ;进入前ds:si所指向的当前位置
               push di
               push dx
               push cx
               push ax
               mov di,0
f:             mov cx,10
               call divdw
               add cx,30h
               push cx
               inc di
               mov cx,ax
               jcxz e
               jmp f
e:             mov cx,dx
               jcxz g
               jmp f
g:             mov cx,di
h:             pop ax
               mov [si],al
               inc si
               loop h
               mov al,0
               mov [si],al
               pop ax
               pop cx
               pop dx
               pop di
               pop si
               ret

divdw:         push bx
               push dx    ;问题在这:多了一个寄存器出现了麻烦,压入两个还可以,再压入第三个为什么就出现选择关闭终止应用程序的对话框?帮忙解释一下 谢谢                             
               push ax
               mov ax,dx
               mov dx,0
               div cx
               mov bx,ax
               pop ax
               div cx
               mov cx,dx
               mov dx,bx
               pop dx     ;多了一个寄存器出现了麻烦                              
               pop bx
               ret

show_str:      push ax
               push bx
               push cx
               push dx
               push si
               push es
               mov ax,0b800h
               mov es,ax
               mov ax,160
               mul dh
               mov bx,ax
               mov ax,2
               mul dl
               add bx,ax
               mov al,cl
               mov ch,0
s:             mov cl,[si]
               jcxz ok 
               mov es:[bx],cl
               mov es:1[bx],al
               inc si
               add bx,2
               jmp s
ok:            pop es
               pop si
               pop dx
               pop cx
               pop bx
               pop ax
               ret

code ends

end start
评论次数(2)  |  浏览次数(163)  |  类型(汇编作业) |  收藏此文  | 

[  tomato   发表于  2012-02-16 21:10  ]

问题应该不在子程序,应该在主程序。博主可以专门写一个测试程序对子程序进行测试。保证子程序正确的情况下,在添加一部分主程序的代码,逐步测试排除。不要把整个程序都写上去,这样不容易找到问题的所在。

[  308272108   发表于  2012-02-17 11:53  ]

我懂了  谢谢访友的指点,受益匪浅

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码