以下 emu8086 中的代码给出溢出错误,我想做的就是确定数字是奇数还是偶数,所以我除以 2。我不知道哪里出了问题。
CLC
MOV CX, 20d
MOV BX, 07200h
MOV [07100h], 02h
loop:
JCXZ endloop
XOR DX, DX
MOV AX, BX
DIV [07100h] ; overflow error here
CMP DX, 0001h
JE even
JMP odd
endloop:
最佳答案
emu8086 不好,大概将您不明确的 DIV [07100h]
组装成 DIV byte [07100h]
而不是 DIV单词 [07100h]
您所期望的,而不是像大多数汇编程序那样给您一个错误(操作数大小不明确)。
因此,you fault with #DE
because 07200h / 2
overflows AL
.
首先,与 test al, 1
/ 相比,将
。这是非破坏性的,不会修改 DX,因此您需要的寄存器要少得多。和 div
用于 2(或 2 的幂)是可怕的>jnz 奇数div
is much slower than test
,以及更糟糕的代码大小。
但其次,将除数存储到内存中然后使用内存源操作数也很奇怪。在循环外使用 mov si, 13
,然后在循环内使用 div si
来测试是否可以被 13 或其他东西整除。这肯定会使操作数大小为 16 位,因此您将 dx:ax/si
放入 AX 和 DX,而不是将 ah:al/1_byte
放入 AL 和 AH .
此外,您不需要一些额外的静态存储位置,也不需要额外的代码大小来将地址编码到存储和 div
中,或者每次从缓存中加载它的额外成本div
运行时间。 (与 div
的成本相比,在现代 CPU 上微不足道,但实际 8086 没有缓存,必须从内存中加载。)
关于assembly - 8086 运行时 16 位除法溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49267442/