王爽课程设计出错
本帖最后由 ck17951 于 2017-12-20 02:11 编辑看楼下
人数和人均我都给去掉了,只剩这年份和收入两种该数据了
去掉主程序的loop ,s循环,可以在屏幕显示一行 1975 16
加入循环调试到收入22 的时候debug就崩溃了..
大神快来救我,弄了好久了 assume cs:code
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,2759000,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
data ends
table segment
db 16 dup (0)
table ends
stack segment
dw 32 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov es,ax
mov ax,table ;数据存放段.显存段已经在子程序中定义
mov ds,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
mov dh,5
s:push cx
mov ax,es: ;录入年份
mov ,ax
mov ax,es:2
mov .2,ax
mov byte ptr .4,0 ;字符串的第4位是0
mov dl,3
mov cl,7
push dx
call show_str
mov ax,es:84 ;录入收入
mov ,ax
mov dx,es:86
mov .2,dx
call dtoc
pop dx
mov dl,20
mov cl,7
push dx
call show_str
pop dx
add si,4
add di,2
inc dh
pop cx
loop s
mov ax,4c00h
int 21h
divdw:
push bx
push si
mov bx,ax ;寄存原先地16位在ba
mov ax,dx
mov dx,0
div cx ;进行高16位除法,商在ax,余数在dx
mov si,ax ;将高16位除法的商存在si
mov ax,bx
div cx ;低十六位与原先高十六位除以cx的余数作为新的32位数,去除cx
mov cx,dx
mov dx,si ;
pop si
pop bx
ret
dtoc:
push bx
push si
push di
ok:mov cx,10
call divdw
push cx ;余数存在cx压栈
mov si,ax ;地位商存si,加上高位商dx.判断和是不是0
add si,dx
mov cx,si
inc di ;计算进行了多少次除法运算
jcxz ok0
jmp short ok
ok0: mov byte ptr ,0 ;末尾加0
mov cx,di ;除法的次数赋予cx,循环
mov di,0
ok1: pop ax
add al,30h ;每次的余数出栈到ax
mov ,al ;赋予ds段字符串
inc di ;di从0开始到cx
loop ok1
pop di
pop si
pop bx
ret
show_str:
push es
push ax
push bx
push si
push di
push cx
mov si,0
mov di,0
mov ax,0b800h
mov es,ax
mov al,160
dec dh
mul dh
mov bx,ax
mov al,2
dec dl
mul dl
mov di,ax
ko:
mov cl,
mov ch,0
jcxz ko0
pop cx
push cx
mov ah,cl
mov al,
mov word ptr es:,ax
inc si
add di,2
jmp short ko
ko0: pop cx
pop di
pop si
pop bx
pop ax
pop es
ret
code ends
end start ck17951 发表于 2017-12-20 01:56
这下容易看了.大神快来啊 本帖最后由 kingfon 于 2017-12-20 11:43 编辑
你的思路和流程要先弄清楚,传递给子程序的参数要明确意义,不然很容易死循环,特别是cx的使用
55mov dl,3
56mov cl,7 ;此处还处在循环当中,改变cx的值之前要先push cx
57push dx ;栈的使用要注意入栈出栈的顺序
58call show_str
在debug里跟踪每条指令要注意各寄存器的值,我只帮你跟了第1次循环发现了这个问题,你不要着急着写代码,先把思路和流程弄清楚
我自己做了1个,你参考一下 kingfon 发表于 2017-12-20 11:39
你的思路和流程要先弄清楚,传递给子程序的参数要明确意义,不然很容易死循环,特别是cx的使用
55mo ...
55mov dl,3
56mov cl,7 ;此处还处在循环当中,改变cx的值之前要先push cx
57push dx ;栈的使用要注意入栈出栈的顺序
58call show_str
嗯,这里我注意到了,在58行cal了show_str以前我把dx压栈了,而cx我在循环开始我也压栈了,在loop前出栈
下面是调试到第一次的debug的图 s:push cxs: ;压栈cx
mov ax,es:
mov ,ax
mov ax,es:2
mov .2,ax
mov byte ptr .4,0
mov dl,3
mov cl,7
push dx ;压栈dx
call show_str
mov ax,es:84
mov ,ax
mov dx,es:86
mov .2,dx
call dtoc
pop dx ;出栈dx
mov dl,20
mov cl,7
push dx ;压栈dx
call show_str
pop dx ;出栈dx
add si,4
add di,2
inc dh
pop cx ;出栈cx
loop s
主程循环里的出入栈顺序没有错哦 快来大神,帮帮我 本帖最后由 kingfon 于 2017-12-20 21:50 编辑
ck17951 发表于 2017-12-20 01:56
我找出问题了,dtoc子程序中用di来存放做除法的次数,调用divdw之前要先置0,第1次循环没有问题是因为刚好di是0,你只要在109行后加一句mov di,0就可以了{:5_91:}
这是我在你程序第109行后加入mov di,0后的运行结果,结果正常
kingfon 发表于 2017-12-20 21:45
我找出问题了,dtoc子程序中用di来存放做除法的次数,调用divdw之前要先置0,第1次循环没有问题是因为 ...
666666666666666666666666送你,真犀利,我找了好久,今天早也还是的,运行debug就崩溃,根本找不到.{:5_93:}一百个赞送你{:5_93:}{:5_93:}
页:
[1]