【问题标题】:"Division by zero" error when dividing by a non-zero除以非零时出现“除以零”错误
【发布时间】:2015-04-17 20:52:16
【问题描述】:

以前当我在 Turbo Debugger 中出现“除以零”错误时,我通过在 DIV-iding 之前将一个零放入 DX 寄存器来解决它。

当我添加包含 di-register 的行时返回的问题(在代码中用“最近添加的”cmets 标记)。

查看 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

【问题讨论】:

    标签: assembly divide


    【解决方案1】:

    这是您的问题的解释:

    .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] 影响了两个变量,像这样:

    【讨论】:

    • 非常感谢,这很有帮助。 :) (>.> ...我记得这个网站的规则说,仅仅为了感谢某人而发表评论被视为垃圾邮件。还是我记错了?我不愿意违反规则,同时我不想粗鲁和不感谢人。)
    • 没关系,我们都是stackoverflow中的人,不是机器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多