Assembly &引用;除零“;除以非零时出错

Assembly &引用;除零“;除以非零时出错,assembly,divide,Assembly,Divide,以前,当我在TurboDebugger中出现“除零”错误时,我通过在除法两字节值之前将零放入DX寄存器来解决它 当我添加包含行(在代码中用“最近添加的”注释标记)的di寄存器时,返回了问题 在turbo调试器中,第一次返回“Lab:”标签后会出现零除错误 此外,在这种情况下,还有哪些因素会导致除零误差 .MODEL SMALL Print EQU 2 Exit EQU 4Ch .DATA ;----------------------------------------------

以前,当我在TurboDebugger中出现“除零”错误时,我通过在除法两字节值之前将零放入DX寄存器来解决它

当我添加包含行(在代码中用“最近添加的”注释标记)的di寄存器时,返回了问题

在turbo调试器中,第一次返回“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]影响两个变量,如下所示:


非常感谢,这很有帮助。:)(>。>…我记得这个网站的规则说,仅仅为了感谢某人而发表评论被认为是垃圾邮件。或者我记错了吗?我不愿意违反规则,同时我也不想粗鲁地不感谢他人。)没关系,我们都是人,不是机器。