8086汇编使用div指令做8位除法异常终止的原因及解决方法
问题成因
该异常是8086架构的除法溢出中断触发导致的,具体原理如下:
- 你当前使用的是8位除法指令
div bl:该指令默认被除数为AX寄存器存储的16位值,运算后商存入AL、余数存入AH,要求运算得到的商不能超过8位无符号数的最大值0xFF(十进制255),一旦超出就会自动触发0号中断(除法溢出中断),DOS环境下该中断的默认处理逻辑就是直接终止程序运行。 - 你调整后的运算为
0xFFFF / 0xFF,计算可得结果为257,对应十六进制0x101,已经远大于AL寄存器能存储的最大值0xFF,因此触发溢出导致程序异常退出。
解决方案
推荐直接改用16位除法规避溢出问题,修改后参考代码如下:
name l2z1 data segment br4 dw 0FFFFh ; 调整后的被除数 br5 db 0FFh data ends code segment assume cs:code, ds:data ut: mov ax,data mov ds, ax mov ax, br4 xor dx, dx ; 无符号数除法前置操作:将被除数扩展为DX:AX组成的32位形式,DX位清0 mov bh, 0 mov bl, br5 ; 将8位除数扩展为16位存入BX div bx ; 改用16位除法:商存入AX、余数存入DX,最大支持商为0xFFFF,完全容纳当前运算结果 ; 后续可按需处理AX中的商、DX中的余数 mov bx, ax mov ax, 4ch int 21h code ends end ut
- 16位除法的约定是被除数为
DX:AX组成的32位无符号数,除以16位源操作数,商存在AX、余数存在DX,最大支持商为0xFFFF(十进制65535),完全覆盖你当前运算的结果,不会触发溢出。 - 如果你确实需要保留8位除法逻辑,可以在执行
div指令前先做前置判断:如果AH >= 除数,说明运算后商必然超过8位,提前走自定义溢出处理逻辑即可,不需要触发系统默认的终止逻辑。
内容的提问来源于stack exchange,提问作者Jovana G
相关产品推荐
相关产品推荐

