ASM 8086 除以 0

Kat*_*e44 0 assembly

我正在尝试解决一个问题,从键盘读取实数,将 pi 添加到其中,然后将其写入文件中。一切都很顺利,直到我到达 div 并出现 Divide by 0 错误。这是有问题的代码部分:

mov ax, frac
div ten
Run Code Online (Sandbox Code Playgroud)

frac 是一个类似 234f 的词,我通过 Turbo 调试器运行它,ax 得到值 234f,十在数据段中定义为一个字节,如下所示

ten db 10
Run Code Online (Sandbox Code Playgroud)

在 Turbo 调试器中,当我到达这里时,在 div 10 中,它会将我带入 div 函数的内部结构,并最终发送 Divided by 0 错误。

我必须提到的是,就在之前我做了另一个 div,在另一个变量上完全相同,一切都很完美。div 函数还有其他我不知道的含义吗?如果需要的话我可以发布所有代码,但是代码很长,我不知道你是否能理解。

Jes*_*ter 5

您实际上得到的是溢出,而不是被零除(但这是相同的异常)。问题是您的除法产生 8 位结果,而您的输入AX=375Fh=18271除以10给定结果后1827,结果不适合 8 位。AX=234F(这是来自您的屏幕截图,但也类似。)

如果需要 16 位结果,则必须使用 32 位除法。请注意对输入和除数进行零扩展。例子:

xor dx, dx ; zero extend ax
div ten    ; divide dx:ax by ten (use word override if necessary)
; quotient now in ax, remainder in dx
...
ten dw 10  ; notice it is a word
Run Code Online (Sandbox Code Playgroud)

有关各种形式的工作方式,请参阅指令集参考div