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

时间:2018-03-13 23:22:57

标签: 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:

1 个答案:

答案 0 :(得分:2)

emu8086很糟糕,并且可能将您的模糊DIV [07100h]汇总到DIV byte [07100h] 而不是您期望的DIV word [07100h],而不是给您一个错误(模糊不清)操作数大小)就像大多数汇编程序一样。

因此,you fault with #DE because 07200h / 2 overflows AL

首先,与div / test al, 1相比,使用jnz odd 2(或2的幂)可怕。这是非破坏性的,并且不会修改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,或者每次从缓存加载它的额外费用{{ 1}}跑。 (在现代CPU上的琐碎比较div的成本,但实际的8086没有缓存,并且必须从内存加载。)