DIV 命令使我的程序挂起。如何避免? (包括短代码。)
DIV command makes my program hang. How to avoid it? (Short code included.)
(处理器英特尔 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
如果使用 Turbo 汇编器编译,代码输出 8。
如果我取消注释 DIV 命令,代码将挂起。
用 Turbo Debugger 查看寄存器,我看到 DIV 命令将除法结果发送到 AX 寄存器——存储数字 8 的同一个寄存器将被发送到 DX 到被打印出来。
是什么导致 DIV 挂起我的程序?我是否监督 DIV 将数据放入寄存器中,这些寄存器将被某些重要的后台函数或...某些东西使用?
mov ax, a
;div b
因为 b 是一个字大小的变量,所以 div b
指令将 DX:AX 除以字 b。你忘了用零设置 DX!除法溢出,触发异常
mov ax, a
xor dx, dx
div b
(处理器英特尔 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
如果使用 Turbo 汇编器编译,代码输出 8。 如果我取消注释 DIV 命令,代码将挂起。
用 Turbo Debugger 查看寄存器,我看到 DIV 命令将除法结果发送到 AX 寄存器——存储数字 8 的同一个寄存器将被发送到 DX 到被打印出来。
是什么导致 DIV 挂起我的程序?我是否监督 DIV 将数据放入寄存器中,这些寄存器将被某些重要的后台函数或...某些东西使用?
mov ax, a
;div b
因为 b 是一个字大小的变量,所以 div b
指令将 DX:AX 除以字 b。你忘了用零设置 DX!除法溢出,触发异常
mov ax, a
xor dx, dx
div b