在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:
答案 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没有缓存,并且必须从内存加载。)