DIV命令使我的程序挂起。如何避免呢?(包括简短代码。)

dzi*_*990 1 x86 assembly division hang

(处理器Intel x86)

.MODEL SMALL

Print   EQU 2
Exit    EQU 4Ch

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

a   DW  8
b   DW  2

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

Start   PROC

    mov ax, SEG DGROUP
    mov ds, ax

    mov ax, a
    ;div    b <---- uncommenting it makes program hang

    mov dx, ax
    add dx, '0'

    mov ah, Print      
    int 21h
    mov ah, Exit
    int 21h

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

Start   ENDP
    .STACK 512

    END Start
Run Code Online (Sandbox Code Playgroud)

如果使用Turbo Assembler进行编译,则代码将输出8。如果取消注释DIV命令,则代码将挂起。

使用Turbo Debugger查看寄存器时,我看到DIV命令将除法结果发送到AX寄存器中-相同的寄存器存储了8,并将被发送到DX进行打印。

DIV挂起程序的原因是什么?我是否监督过DIV将数据放入寄存器的工作,这些数据将由某些重要的后台功能使用?

Fif*_*nik 6

mov ax, a
;div    b
Run Code Online (Sandbox Code Playgroud)

由于b是单词大小的变量,因此div b指令将DX:AX除以单词b。您忘记将DX设置为零!除法溢出,并触发了异常。

mov ax, a
xor dx, dx
div b
Run Code Online (Sandbox Code Playgroud)

  • 冒号只是一种约定的语法,用于表示 DX 包含 32 位数量的前 16 位。(AX 保存底部 16 位) (2认同)