assembly - 8086 运行时 16 位除法溢出错误

标签 assembly x86 overflow division emu8086

以下 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/ 相比,将 div 用于 2(或 2 的幂)是可怕的>jnz 奇数。这是非破坏性的,不会修改 DX,因此您需要的寄存器要少得多。和 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/

相关文章:

c - 使用 SSE 加速 lower_bound 函数

linux - Linux 内核使用哪个程序集?真的是NASM吗?

c++ - 寄存器流水线计算

python - 溢出错误 : (34, 'Result too large' )

c - 在 macOS 上使用 Xcode 作为 root 运行应用程序时出现非法指令 (ud2)

assembly - 影子寄存器——arm

assembly - 无法在 FASM 或 NASM 中使用 wprintf 打印 Unicode 字符串

c++ - 在 C++ 代码中使用嵌入式汇编语言进行错误分析

CSS水平菜单链接问题

如果我输入一个等于 INT_Max+1 的数字,计算机不会返回 -1