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将数据放入寄存器的工作,这些数据将由某些重要的后台功能使用?
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)