鱼C论坛

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

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

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

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

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

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

看楼下
人数和人均我都给去掉了,只剩这年份和收入两种该数据了
去掉主程序的loop ,s循环,可以在屏幕显示一行 1975       16
加入循环调试到收入22 的时候debug就崩溃了..
大神快来救我,弄了好久了
最佳答案
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 | 显示全部楼层
  1. assume cs:code

  2. data segment  
  3.      
  4. db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  5. db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  6. db '1993','1994','1995'
  7.   
  8. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514  
  9. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000  
  10.   
  11. dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226  
  12. dw 11542,14430,15257,17800  
  13. data ends  
  14. table segment  
  15.     db 16 dup (0)
  16. table ends  

  17.        
  18. stack segment
  19.         dw 32 dup (0)
  20. stack ends
  21.    



  22. code segment
  23. start:   
  24.    mov ax,stack
  25.    mov ss,ax
  26.    mov sp,32
  27.    
  28.    mov ax,data
  29.    mov es,ax
  30.    
  31.    mov ax,table                ;数据存放段.显存段已经在子程序中定义
  32.    mov ds,ax
  33.    
  34.    mov bx,0
  35.    mov si,0
  36.    mov di,0
  37.    mov cx,21
  38.    
  39.    mov dh,5

  40. s:push cx
  41.    
  42.    
  43.    mov ax,es:[si]                  ;录入年份
  44.    mov [bx],ax
  45.    mov ax,es:2[si]
  46.    mov [bx].2,ax
  47.    mov byte ptr [bx].4,0            ;字符串的第4位是0
  48.    
  49.    mov dl,3
  50.    mov cl,7
  51.    push dx
  52.    call show_str
  53.    
  54.    mov ax,es:84[si]                 ;录入收入
  55.    mov [bx],ax
  56.    mov dx,es:86[si]
  57.    mov [bx].2,dx  
  58.      
  59.    call dtoc
  60.    pop dx            
  61.    mov dl,20
  62.    mov cl,7
  63.    push dx
  64.    call show_str
  65.    pop dx
  66.    
  67.    add si,4
  68.    add di,2
  69.    inc dh
  70.    
  71.    
  72.    pop cx
  73.   loop s
  74.    
  75.    mov ax,4c00h
  76.    int 21h
  77.    
  78.    
  79.    
  80. divdw:
  81.      
  82.          push bx
  83.          push si
  84.      
  85.      mov bx,ax                          ;寄存原先地16位在ba
  86.          mov ax,dx                           
  87.          mov dx,0
  88.          div cx                              ;进行高16位除法,商在ax,余数在dx
  89.          mov si,ax                           ;将高16位除法的商存在si
  90.          mov ax,bx                           
  91.          div cx                             ;低十六位与原先高十六位除以cx的余数作为新的32位数,去除cx
  92.          mov cx,dx
  93.          mov dx,si                           ;
  94.          
  95.          pop si
  96.          pop bx
  97.                   
  98.          ret
  99.          
  100. dtoc:
  101.      push bx
  102.          push si
  103.          push di
  104.          
  105.          
  106. ok:  mov cx,10
  107.      call divdw
  108.      
  109.          push cx                             ;余数存在cx压栈
  110.          mov si,ax                        ;地位商存si,加上高位商dx.判断和是不是0
  111.          add si,dx
  112.      mov cx,si
  113.        
  114.          inc di                            ;计算进行了多少次除法运算
  115.          jcxz ok0                           
  116.      jmp short ok

  117. ok0: mov byte ptr [di],0                ;末尾加0
  118.      
  119.          mov cx,di                           ;除法的次数赋予cx,循环
  120.          mov di,0

  121. ok1: pop ax
  122.      add al,30h                             ;每次的余数出栈到ax
  123.      mov [di],al                          ;赋予ds段字符串
  124.      inc di                                ;di从0开始到cx
  125.      loop ok1
  126.               
  127.      pop di
  128.          pop si
  129.          
  130.          pop bx
  131.          ret   
  132.    
  133.    
  134. show_str:
  135.      push es
  136.          push ax
  137.          push bx
  138.          push si
  139.          push di
  140.          push cx
  141.          
  142.          mov si,0
  143.      mov di,0         
  144.      mov ax,0b800h
  145.          mov es,ax
  146.      
  147.          mov al,160
  148.          dec dh
  149.          mul dh
  150.          mov bx,ax
  151.          
  152.          
  153.          mov al,2
  154.          dec dl
  155.          mul dl
  156.          mov di,ax
  157.          
  158. ko:       
  159.     mov cl,[si]
  160.         mov ch,0
  161.         jcxz ko0     
  162.     pop cx
  163.         push cx
  164.         mov ah,cl
  165.         mov al,[si]
  166.         mov word ptr es:[bx][di],ax
  167.        
  168.         inc si
  169.         add di,2
  170.         jmp short ko
  171. ko0: pop cx
  172.      pop di
  173.          pop si
  174.          pop bx
  175.          pop ax
  176.          pop es
  177.          ret
  178.          code ends
  179. 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-3-28 17:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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