鱼C论坛

 找回密码
 立即注册
查看: 2694|回复: 6

[已解决]关于实验10(3),显示12666出错

[复制链接]
发表于 2017-6-25 20:20:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 3-3 于 2017-6-25 20:24 编辑
  1. assume cs:code,ds:data

  2. data segment
  3.         db 10 dup (0)
  4. data ends


  5. code segment
  6. start:
  7.         mov ax,12666
  8.         mov bx,data
  9.         mov ds,bx
  10.         mov si,0
  11.         call dtoc
  12.         
  13.         mov dh,8
  14.         mov dl,3
  15.         mov cl,2
  16.         call show_str
  17.         
  18.         mov ax,4c00h
  19.         int 21h
  20.         
  21.         dtoc:
  22.                 push di
  23.                 push bx
  24.                 push ds
  25.                 push si
  26.                 push cx
  27.                 push dx
  28.                 push ax
  29.                
  30.                 mov si,0
  31.            d20:        
  32.             mov di,10
  33.                 mov cx,ax
  34.                 jcxz d21   ;低位如果为零
  35.                
  36.                 push ax        
  37.                 mov ax,dx
  38.                 mov dx,0        
  39.                 div di        
  40.                 mov bx,ax
  41.                 pop ax        
  42.                 div di        
  43.                 add dx,30h
  44.                 push dx
  45.                 mov dx,bx        
  46.                 inc si
  47.                 jmp d20
  48.         
  49.            d21:
  50.                 mov cx,dx
  51.                 jcxz d22                ;高低位全部为0时,转到d22执行
  52.                 jmp d20
  53.                
  54.           d22:
  55.                 mov di,0
  56.                 mov cx,si
  57.            d23:
  58.                 pop ax
  59.                 mov ds:[di],al
  60.                 inc di
  61.                 loop d23
  62.                
  63.                
  64.                 mov dl,0
  65.                 mov [si],dl
  66.                
  67.          
  68.                 pop ax
  69.                 pop dx
  70.                 pop cx
  71.                 pop si
  72.                 pop ds
  73.                 pop bx
  74.                 pop di
  75.                 ret
  76.         
  77.                         
  78.         show_str:
  79.                 push ax
  80.                 push cx
  81.                 push si
  82.                 push es
  83.                 push dx               
  84.         
  85.                 mov ax,160
  86.                 mul dh
  87.                 mov bx,ax
  88.                
  89.                 mov ax,2
  90.                 mul dl
  91.                 add bx,ax
  92.                         
  93.                 mov ax,0b800h
  94.                 mov es,ax
  95.                
  96.                 mov al,cl
  97.                 mov cl,0
  98.                
  99.         s2:        
  100.                 mov ch,[si]
  101.                 jcxz output
  102.                
  103.                 mov es:[bx],ch
  104.                 mov es:[bx+1],al        
  105.                 add bx,2
  106.                 inc si
  107.                 jmp s2
  108.                
  109.                         
  110.         output:
  111.                 pop dx
  112.                 pop es
  113.                 pop si
  114.                 pop cx
  115.                 pop ax
  116.                 ret

  117.         
  118.         
  119.         
  120. code ends
  121. end start
复制代码



代码如上,使用的是实验10(2)的除法,调试的时候,使用g ,就能够显示 12666,如图1

可是在直接执行的时候,根本没有显示 12666,如图2显示的,




这是怎么回事?都试了两天了。。。
最佳答案
2017-6-26 16:05:22
你的程序我调试了一下,调试的时候是没有问题。
第一次执行也没有问题,但是第二次执行后就出问题了。
你的第四十行代码 mov ax,dx 我感觉有问题。dx初始值是什么?没有地方将它初始化啊!
在循环d20前面加上,sub dx,dx,初始化dx后,你再试试。
我试了一下,反复执行没有问题了。

图1,未显示12666

图1,未显示12666
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-25 23:07:21 | 显示全部楼层
本帖最后由 人造人 于 2017-6-25 23:08 编辑

如果说,把  call dtoc 注释,能够正常显示,那说明了什么?

  1. assume cs:code,ds:data

  2. data segment
  3.        ; db 10 dup (0)
  4.        db 'test', 0 ; 测试字符串
  5. data ends


  6. code segment
  7. start:
  8.         mov ax,12666
  9.         mov bx,data
  10.         mov ds,bx
  11.         mov si,0
  12.         ;call dtoc
  13.         
  14.         mov dh,8
  15.         mov dl,3
  16.         mov cl,2
  17.         call show_str
  18.         
  19.         mov ax,4c00h
  20.         int 21h
  21.         
  22.         dtoc:
  23.                 push di
  24.                 push bx
  25.                 push ds
  26.                 push si
  27.                 push cx
  28.                 push dx
  29.                 push ax
  30.                
  31.                 mov si,0
  32.            d20:        
  33.             mov di,10
  34.                 mov cx,ax
  35.                 jcxz d21   ;低位如果为零
  36.                
  37.                 push ax        
  38.                 mov ax,dx
  39.                 mov dx,0        
  40.                 div di        
  41.                 mov bx,ax
  42.                 pop ax        
  43.                 div di        
  44.                 add dx,30h
  45.                 push dx
  46.                 mov dx,bx        
  47.                 inc si
  48.                 jmp d20
  49.         
  50.            d21:
  51.                 mov cx,dx
  52.                 jcxz d22                ;高低位全部为0时,转到d22执行
  53.                 jmp d20
  54.                
  55.           d22:
  56.                 mov di,0
  57.                 mov cx,si
  58.            d23:
  59.                 pop ax
  60.                 mov ds:[di],al
  61.                 inc di
  62.                 loop d23
  63.                
  64.                
  65.                 mov dl,0
  66.                 mov [si],dl
  67.                
  68.          
  69.                 pop ax
  70.                 pop dx
  71.                 pop cx
  72.                 pop si
  73.                 pop ds
  74.                 pop bx
  75.                 pop di
  76.                 ret
  77.         
  78.                         
  79.         show_str:
  80.                 push ax
  81.                 push cx
  82.                 push si
  83.                 push es
  84.                 push dx               
  85.         
  86.                 mov ax,160
  87.                 mul dh
  88.                 mov bx,ax
  89.                
  90.                 mov ax,2
  91.                 mul dl
  92.                 add bx,ax
  93.                         
  94.                 mov ax,0b800h
  95.                 mov es,ax
  96.                
  97.                 mov al,cl
  98.                 mov cl,0
  99.                
  100.         s2:        
  101.                 mov ch,[si]
  102.                 jcxz output
  103.                
  104.                 mov es:[bx],ch
  105.                 mov es:[bx+1],al        
  106.                 add bx,2
  107.                 inc si
  108.                 jmp s2
  109.                
  110.                         
  111.         output:
  112.                 pop dx
  113.                 pop es
  114.                 pop si
  115.                 pop cx
  116.                 pop ax
  117.                 ret

  118.         
  119.         
  120.         
  121. code ends
  122. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-26 08:31:14 | 显示全部楼层
人造人 发表于 2017-6-25 23:07
如果说,把  call dtoc 注释,能够正常显示,那说明了什么?

谢谢。我把您的代码调试了一下,报错了,报错的内容见图。
这里又有两个问题。
第一个就是把 call   call dtoc 注释,能够正常显示,这为什么?我学到不到位,觉得如果把call dtoc 注释掉代码能够正常显示的话,我的逻辑就有点乱了。
第二个问题,就是报错中问题怎么解决?在网上找了资料,没有找到相关的解决方法。
谢谢。
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 12:44:14 | 显示全部楼层
3-3 发表于 2017-6-26 08:31
谢谢。我把您的代码调试了一下,报错了,报错的内容见图。
这里又有两个问题。
第一个就是把 call   ca ...

这个只是警告,我用masm6.15 没有这个问题

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-26 12:47:31 | 显示全部楼层
好的,我再试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 16:05:22 | 显示全部楼层    本楼为最佳答案   
你的程序我调试了一下,调试的时候是没有问题。
第一次执行也没有问题,但是第二次执行后就出问题了。
你的第四十行代码 mov ax,dx 我感觉有问题。dx初始值是什么?没有地方将它初始化啊!
在循环d20前面加上,sub dx,dx,初始化dx后,你再试试。
我试了一下,反复执行没有问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-26 22:37:17 | 显示全部楼层
erh 发表于 2017-6-26 16:05
你的程序我调试了一下,调试的时候是没有问题。
第一次执行也没有问题,但是第二次执行后就出问题了。
你 ...

果然!只顾着ax,却把dx给忘了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 21:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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