"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] 影响两个变量,像这样:
以前当我在 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] 影响两个变量,像这样: