Assembly &引用;除零“;除以非零时出错
以前,当我在TurboDebugger中出现“除零”错误时,我通过在除法两字节值之前将零放入DX寄存器来解决它 当我添加包含行(在代码中用“最近添加的”注释标记)的di寄存器时,返回了问题 在turbo调试器中,第一次返回“Lab:”标签后会出现零除错误 此外,在这种情况下,还有哪些因素会导致除零误差Assembly &引用;除零“;除以非零时出错,assembly,divide,Assembly,Divide,以前,当我在TurboDebugger中出现“除零”错误时,我通过在除法两字节值之前将零放入DX寄存器来解决它 当我添加包含行(在代码中用“最近添加的”注释标记)的di寄存器时,返回了问题 在turbo调试器中,第一次返回“Lab:”标签后会出现零除错误 此外,在这种情况下,还有哪些因素会导致除零误差 .MODEL SMALL Print EQU 2 Exit EQU 4Ch .DATA ;----------------------------------------------
.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]影响两个变量,如下所示:
非常感谢,这很有帮助。:)(>。>…我记得这个网站的规则说,仅仅为了感谢某人而发表评论被认为是垃圾邮件。或者我记错了吗?我不愿意违反规则,同时我也不想粗鲁地不感谢他人。)没关系,我们都是人,不是机器。