8086 运行时 16 位除法溢出错误
8086 16-bit division overflow error on runtime
以下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 word [07100h]
,而不是给你像大多数汇编程序一样出现错误(操作数大小不明确)。
因此,.
首先,与 test al, 1
/ jnz odd
相比,使用 div
作为 2(或 2 的幂)是 可怕的 。那是 non-destructive,并且不会修改 DX,因此您需要的寄存器要少得多。而且 ,以及更糟 code-size。
但是其次,将除数存储到内存中然后使用内存源操作数也很奇怪。在循环外使用 mov si, 13
,然后在循环内使用 div si
来测试是否可以被 13 或其他东西整除。这肯定会使 operand-size 成为 16 位,因此您将 dx:ax / si
转换为 AX 和 DX,而不是将 ah:al / 1_byte
转换为 AL 和 AH。
此外,您不需要一些额外的静态存储位置,或者额外的 code-size 来将地址编码到存储和 div
中,或者从缓存中加载它的额外成本每次 div
运行。 (与 div
的成本相比,现代 CPU 微不足道,但实际 8086 没有缓存,必须从内存中加载。)
以下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 word [07100h]
,而不是给你像大多数汇编程序一样出现错误(操作数大小不明确)。
因此,
首先,与 test al, 1
/ jnz odd
相比,使用 div
作为 2(或 2 的幂)是 可怕的 。那是 non-destructive,并且不会修改 DX,因此您需要的寄存器要少得多。而且
但是其次,将除数存储到内存中然后使用内存源操作数也很奇怪。在循环外使用 mov si, 13
,然后在循环内使用 div si
来测试是否可以被 13 或其他东西整除。这肯定会使 operand-size 成为 16 位,因此您将 dx:ax / si
转换为 AX 和 DX,而不是将 ah:al / 1_byte
转换为 AL 和 AH。
此外,您不需要一些额外的静态存储位置,或者额外的 code-size 来将地址编码到存储和 div
中,或者从缓存中加载它的额外成本每次 div
运行。 (与 div
的成本相比,现代 CPU 微不足道,但实际 8086 没有缓存,必须从内存中加载。)