3-3 发表于 2017-6-25 20:20:45

关于实验10(3),显示12666出错

本帖最后由 3-3 于 2017-6-25 20:24 编辑

assume cs:code,ds:data

data segment
      db 10 dup (0)
data ends


code segment
start:
      mov ax,12666
      mov bx,data
      mov ds,bx
      mov si,0
      call dtoc
      
      mov dh,8
      mov dl,3
      mov cl,2
      call show_str
      
      mov ax,4c00h
      int 21h
      
      dtoc:
                push di
                push bx
                push ds
                push si
                push cx
                push dx
                push ax
               
                mov si,0
         d20:      
            mov di,10
                mov cx,ax
                jcxz d21   ;低位如果为零
               
                push ax      
                mov ax,dx
                mov dx,0      
                div di      
                mov bx,ax
                pop ax      
                div di      
                add dx,30h
                push dx
                mov dx,bx      
                inc si
                jmp d20
      
         d21:
                mov cx,dx
                jcxz d22                ;高低位全部为0时,转到d22执行
                jmp d20
               
          d22:
                mov di,0
                mov cx,si
         d23:
                pop ax
                mov ds:,al
                inc di
                loop d23
               
               
                mov dl,0
                mov ,dl
               
         
                pop ax
                pop dx
                pop cx
                pop si
                pop ds
                pop bx
                pop di
                ret
      
                        
      show_str:
                push ax
                push cx
                push si
                push es
                push dx               
      
                mov ax,160
                mul dh
                mov bx,ax
               
                mov ax,2
                mul dl
                add bx,ax
                        
                mov ax,0b800h
                mov es,ax
               
                mov al,cl
                mov cl,0
               
      s2:      
                mov ch,
                jcxz output
               
                mov es:,ch
                mov es:,al      
                add bx,2
                inc si
                jmp s2
               
                        
      output:
                pop dx
                pop es
                pop si
                pop cx
                pop ax
                ret

      
      
      
code ends
end start


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

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




这是怎么回事?都试了两天了。。。

人造人 发表于 2017-6-25 23:07:21

本帖最后由 人造人 于 2017-6-25 23:08 编辑

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

assume cs:code,ds:data

data segment
       ; db 10 dup (0)
       db 'test', 0 ; 测试字符串
data ends


code segment
start:
      mov ax,12666
      mov bx,data
      mov ds,bx
      mov si,0
      ;call dtoc
      
      mov dh,8
      mov dl,3
      mov cl,2
      call show_str
      
      mov ax,4c00h
      int 21h
      
      dtoc:
                push di
                push bx
                push ds
                push si
                push cx
                push dx
                push ax
               
                mov si,0
         d20:      
            mov di,10
                mov cx,ax
                jcxz d21   ;低位如果为零
               
                push ax      
                mov ax,dx
                mov dx,0      
                div di      
                mov bx,ax
                pop ax      
                div di      
                add dx,30h
                push dx
                mov dx,bx      
                inc si
                jmp d20
      
         d21:
                mov cx,dx
                jcxz d22                ;高低位全部为0时,转到d22执行
                jmp d20
               
          d22:
                mov di,0
                mov cx,si
         d23:
                pop ax
                mov ds:,al
                inc di
                loop d23
               
               
                mov dl,0
                mov ,dl
               
         
                pop ax
                pop dx
                pop cx
                pop si
                pop ds
                pop bx
                pop di
                ret
      
                        
      show_str:
                push ax
                push cx
                push si
                push es
                push dx               
      
                mov ax,160
                mul dh
                mov bx,ax
               
                mov ax,2
                mul dl
                add bx,ax
                        
                mov ax,0b800h
                mov es,ax
               
                mov al,cl
                mov cl,0
               
      s2:      
                mov ch,
                jcxz output
               
                mov es:,ch
                mov es:,al      
                add bx,2
                inc si
                jmp s2
               
                        
      output:
                pop dx
                pop es
                pop si
                pop cx
                pop ax
                ret

      
      
      
code ends
end start

3-3 发表于 2017-6-26 08:31:14

人造人 发表于 2017-6-25 23:07
如果说,把call dtoc 注释,能够正常显示,那说明了什么?

谢谢。我把您的代码调试了一下,报错了,报错的内容见图。
这里又有两个问题。
第一个就是把 call   call dtoc 注释,能够正常显示,这为什么?我学到不到位,觉得如果把call dtoc 注释掉代码能够正常显示的话,我的逻辑就有点乱了。
第二个问题,就是报错中问题怎么解决?在网上找了资料,没有找到相关的解决方法。
谢谢。

人造人 发表于 2017-6-26 12:44:14

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

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

3-3 发表于 2017-6-26 12:47:31

好的,我再试试

erh 发表于 2017-6-26 16:05:22

你的程序我调试了一下,调试的时候是没有问题。
第一次执行也没有问题,但是第二次执行后就出问题了。
你的第四十行代码 mov ax,dx 我感觉有问题。dx初始值是什么?没有地方将它初始化啊!
在循环d20前面加上,sub dx,dx,初始化dx后,你再试试。
我试了一下,反复执行没有问题了。

3-3 发表于 2017-6-26 22:37:17

erh 发表于 2017-6-26 16:05
你的程序我调试了一下,调试的时候是没有问题。
第一次执行也没有问题,但是第二次执行后就出问题了。
你 ...

果然!只顾着ax,却把dx给忘了……
页: [1]
查看完整版本: 关于实验10(3),显示12666出错