【发布时间】:2017-09-20 08:34:29
【问题描述】:
我正在帮助我的一个朋友调试他的程序,我们将其范围缩小到一个即使在这里也会出现的问题:
.MODEL small
.STACK 16
.CODE
start:
mov ax, 044c0h
mov bl, 85
idiv bl
exit:
mov ax, 4c00h
int 21h
end start
使用 tasm 4.1 组装它并在 DOSBox 0.74 上运行它后,它进入了无限循环。当使用 turbo 调试器检查它时,可以看到它发生在 idiv 指令之后,由于某种原因修改了 cs 和 ip 寄存器,并且在两条看似随机的指令之后将它们恢复为指向 idiv 行,无限地再次执行它。
有人对此有什么解释吗?
【问题讨论】:
-
因为除法的有符号商无法放入 8 位寄存器 (AL),所以会出现算术溢出。 r16/r8 IDIV 的商的范围是 -128 到 +127 。您的除法得出的商为 207。
-
@MichaelPetch:是的。我正要提交这个作为答案,但你打败了我!
-
那将是 INT 00h 中断处理程序。让我有点惊讶的是,它只是直接跳回到损坏的代码,导致无限循环。我原以为它会终止应用程序、打印错误消息或更明显的东西。您是这么多天来第二个对此感到困惑的人。
-
除法溢出与除以零相同的异常。您应该设置异常处理或使用 16 位操作防止溢出。
-
啊,是的,当然。我没有想到手术的那个方面。组装还是新手。简单地把它变成一个分词应该可以解决它吗?
标签: assembly x86 x86-16 tasm dosbox