鱼C论坛

 找回密码
 立即注册
查看: 2625|回复: 8

[已解决]王爽课程设计出错

[复制链接]
发表于 2017-12-20 01:47:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

[b]看楼下
人数和人均我都给去掉了,只剩这年份和收入两种该数据了
去掉主程序的loop ,s循环,可以在屏幕显示一行 1975       16
加入循环调试到收入22 的时候debug就崩溃了..
大神快来救我,弄了好久了
[/b]
最佳答案
2017-12-20 21:45:15
本帖最后由 kingfon 于 2017-12-20 21:50 编辑


我找出问题了,dtoc子程序中用di来存放做除法的次数,调用divdw之前要先置0,第1次循环没有问题是因为刚好di是0,你只要在109行后加一句mov di,0就可以了
这是我在你程序第109行后加入mov di,0后的运行结果,结果正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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:[si]                  ;录入年份
   mov [bx],ax
   mov ax,es:2[si]
   mov [bx].2,ax
   mov byte ptr [bx].4,0            ;字符串的第4位是0
   
   mov dl,3
   mov cl,7
   push dx
   call show_str
   
   mov ax,es:84[si]                 ;录入收入
   mov [bx],ax
   mov dx,es:86[si]
   mov [bx].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 [di],0                ;末尾加0
     
         mov cx,di                           ;除法的次数赋予cx,循环
         mov di,0

ok1: pop ax 
     add al,30h                             ;每次的余数出栈到ax
     mov [di],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,[si]
        mov ch,0
        jcxz ko0     
    pop cx
        push cx
        mov ah,cl
        mov al,[si]
        mov word ptr es:[bx][di],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         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-20 01:59:01 | 显示全部楼层

这下容易看了.大神快来啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 11:39:57 | 显示全部楼层
本帖最后由 kingfon 于 2017-12-20 11:43 编辑

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

使用道具 举报

 楼主| 发表于 2017-12-20 13:39:23 | 显示全部楼层
kingfon 发表于 2017-12-20 11:39
你的思路和流程要先弄清楚,传递给子程序的参数要明确意义,不然很容易死循环,特别是cx的使用
55  mo ...

55  mov dl,3
56  mov cl,7               ;此处还处在循环当中,改变cx的值之前要先push cx
57  push dx                ;栈的使用要注意入栈出栈的顺序
58  call show_str         
嗯,这里我注意到了,在58行cal了show_str以前我把dx压栈了,而cx我在循环开始我也压栈了,在loop前出栈
下面是调试到第一次的debug的图
调试11111111111111111.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-20 13:43:42 | 显示全部楼层
s:  push cxs:                                 ;压栈cx
   
   
   mov ax,es:[si]                  
   mov [bx],ax
   mov ax,es:2[si]
   mov [bx].2,ax
   mov byte ptr [bx].4,0           
   
   mov dl,3
   mov cl,7
   push dx                                     ;压栈dx
   call show_str
   
   mov ax,es:84[si]               
   mov [bx],ax
   mov dx,es:86[si]
   mov [bx].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

主程循环里的出入栈顺序没有错哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-20 17:36:20 | 显示全部楼层
快来大神,帮帮我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 21:45:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 kingfon 于 2017-12-20 21:50 编辑


我找出问题了,dtoc子程序中用di来存放做除法的次数,调用divdw之前要先置0,第1次循环没有问题是因为刚好di是0,你只要在109行后加一句mov di,0就可以了
这是我在你程序第109行后加入mov di,0后的运行结果,结果正常
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

666666666666666666666666送你,真犀利,我找了好久,今天早也还是的,运行debug就崩溃,根本找不到.一百个赞送你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表