ck17951 发表于 2017-12-20 01:47:48

王爽课程设计出错

本帖最后由 ck17951 于 2017-12-20 02:11 编辑

看楼下
人数和人均我都给去掉了,只剩这年份和收入两种该数据了
去掉主程序的loop ,s循环,可以在屏幕显示一行 1975       16
加入循环调试到收入22 的时候debug就崩溃了..
大神快来救我,弄了好久了

ck17951 发表于 2017-12-20 01:56:58

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:59:01

ck17951 发表于 2017-12-20 01:56


这下容易看了.大神快来啊

kingfon 发表于 2017-12-20 11:39:57

本帖最后由 kingfon 于 2017-12-20 11:43 编辑

你的思路和流程要先弄清楚,传递给子程序的参数要明确意义,不然很容易死循环,特别是cx的使用
55mov dl,3
56mov cl,7               ;此处还处在循环当中,改变cx的值之前要先push cx
57push dx                ;栈的使用要注意入栈出栈的顺序
58call show_str
在debug里跟踪每条指令要注意各寄存器的值,我只帮你跟了第1次循环发现了这个问题,你不要着急着写代码,先把思路和流程弄清楚
我自己做了1个,你参考一下

ck17951 发表于 2017-12-20 13:39:23

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的图

ck17951 发表于 2017-12-20 13:43:42

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

主程循环里的出入栈顺序没有错哦

ck17951 发表于 2017-12-20 17:36:20

快来大神,帮帮我

kingfon 发表于 2017-12-20 21:45:15

本帖最后由 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后的运行结果,结果正常

ck17951 发表于 2017-12-20 23:04:04

kingfon 发表于 2017-12-20 21:45
我找出问题了,dtoc子程序中用di来存放做除法的次数,调用divdw之前要先置0,第1次循环没有问题是因为 ...

666666666666666666666666送你,真犀利,我找了好久,今天早也还是的,运行debug就崩溃,根本找不到.{:5_93:}一百个赞送你{:5_93:}{:5_93:}
页: [1]
查看完整版本: 王爽课程设计出错