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 没有缓存,必须从内存中加载。)