独孤王道 发表于 2019-3-18 10:53:50

望大神指点

assume cs:code

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:        mov bx,10
                        inc si
                s:        div bx
                        add dl,30h
                        mov ds:,dl
                        mov dx,0
                        inc ax
                        mov cx,ax
                        dec ax
                        jcxz s1
                        inc si
                        loop s
                s1:        ret
               
show_str:        dec si
                        mov bl,dh
                        mov dh,0
                        add dl,dl
                        mov di,dx
                        mov dx,0
                        mov bh,0
                        mov ax,160
                        mul bx
                        add ax,160
                        mov bx,ax
                        mov ax,0b800h
                        mov es,ax
                        mov ch,0
                        mov dx,cx
                s8:        mov al,ds:
                        mov es:,al
                        mov es:,dl
                        mov cl,ds:
                        mov ch,0
                        dec si
                        add di,2
                        jcxz s10
                        jmp s8
                s10:ret       
                               
                       
code ends
end start
为什么我单步执行可以,直接运行会报错,显示除法溢出呢

jackz007 发表于 2019-3-18 12:23:34

   试试我修改的代码:
data segment
      db 010h dup (0)
data ends

stack segment stack
      dw 080h dup (0)
stack ends

code segment
      assume cs:code , ds:data , ss:stack
main proc near
                        mov ax,12666
                        mov bx,data
                        mov ds,bx
                        mov si,0
                        call dtoc
                        
                        mov dh,8          ; 第8行
                        mov dl,3          ; 第3列
                        mov cl,2          ; 字符颜色:绿色
                        call show_str
                        
                        xor ax,ax
                        int 016h

                        mov ax,4c00h
                        int 21h
main endp
Align 010h
dtoc proc near
                        mov bx,10
                s:      cwd
                        div bx
                        add dl,30h
                        mov ds:,dl
                        or ax,ax
                        jz s1
                        inc si
                        jmp s
                s1:   ret
dtoc endp
Align 10h
show_str proc near
                        mov ax,0b800h
                        mov es,ax
                        xor bx,bx
                        mov bl,dh
                        dec bx
                        xor dh,dh
                        add dx,dx
                        mov di,dx
                        mov ax,160
                        mul bx
                        add di,ax
                s8:   mov al,ds:
                        or al,al
                        jz s10
                        stosb
                        mov al,cl
                        stosb
                        dec si
                        jmp s8
                s10:    ret
show_str endp      
code ends
end main

独孤王道 发表于 2019-3-19 14:39:26

jackz007 发表于 2019-3-18 12:23
试试我修改的代码:

谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。{:5_109:}

jackz007 发表于 2019-3-19 15:18:13

独孤王道 发表于 2019-3-19 14:39
谢谢,刚刚我看了你给我的代码运行是不会报错的。后面我又重新查了下我的,是除法前dx没有初始化造成的。 ...

   做16位除法的时候,如果没有特别用到 dx 就一定要把它置为 0 值,这是特别容易被忽视和出问题的地方。
   你的代码首次执行 div 指令的时候,没有始化 dx,但是,进入循环以后就有了。
页: [1]
查看完整版本: 望大神指点