"Division by zero" 除以非零时出错

"Division by zero" error when dividing by a non-zero

以前当我在 Turbo Debugger 中遇到 "division by zero" 错误时,我通过在 DIV 之前将一个零放入 DX 寄存器来解决它 - 通过两个字节的值进行识别。

问题 return 当我添加包含 di-register 的行时出现(在代码中用 "recently added" 注释标记)。

查看 turbo 调试器,第一个 return 到 "Lab:" 标签后出现除零错误。

除了这种情况,还有哪些情况会导致除零错误?

.MODEL SMALL

Print   EQU 2
Exit    EQU 4Ch

.DATA ;------------------------------------------------------

a   DW  59
ten DW  10

.CODE ;------------------------------------------------------

Start   PROC

    mov ax, SEG DGROUP
    mov ds, ax

    mov     ax, a
    mov di, 1       ; recently added
Lab:
    mov dx, 0
    div     ten     ; the "ten" variable is always non-zero (...right?)

    mov [di], dx    ; recently added
    inc di          ; recently added

    mov bx, ax

    add dx, '0' 
    mov ah, Print      
    int 21h        

    mov ax, bx

    cmp ax, 0
    jne Lab

    mov ah, Exit
    int 21h

; -----------------------------------------------------------

Start   ENDP
    .STACK 512

    END Start

这是对您的问题的解释:

.MODEL SMALL

Print   EQU 2
Exit    EQU 4Ch

.DATA ;------------------------------------------------------

a   DW  59
ten DW  10

.CODE ;------------------------------------------------------

Start   PROC

    mov ax, SEG DGROUP
    mov ds, ax

    mov     ax, a
    mov di, 1       ;DI POINTS TO SECOND BYTE (1) IN DATA SEGMENT.
                    ;THIS SECOND BYTE BELONGS TO "A". SO DI IS
                    ;POINTING TO THE SECOND BYTE OF "A".
Lab:
    mov dx, 0
    div     ten     

    mov [di], dx    ;DI IS NOT THE SAME THAN [DI]. MOVING DX (REMAINDER 
                    ;OF DIVISION) TO [DI], AND DI POINTS TO SECOND BYTE 
                    ;OF "A", SO THE VALUE OF DX IS OVERWRITING THE SECOND 
                    ;BYTE OF "A" AND THE FIRST BYTE OF "TEN", BECAUSE
                    ;DX SIZE IS 2 BYTES. SO "TEN" IS NO LONGER 10, IT'S 0.
    inc di

    mov bx, ax

    add dx, '0' 
    mov ah, Print      
    int 21h        

    mov ax, bx

    cmp ax, 0
    jne Lab

    mov ah, Exit
    int 21h

; -----------------------------------------------------------

Start   ENDP
    .STACK 512

    END Start

问题是 [di] 影响两个变量,像这样: