划分有符号整数后的结果错误

时间:2015-09-27 15:17:22

标签: assembly x86 division

基本问题:

我写了以下代码块:

DATASEG

Result db ?
Modulo db ?

var3 db -9
var4 db 2


CODESEG

start:

    mov ah, 0
    mov al, [var3]
    mov bl, [var4]
    div bl
    mov [Result], al
    mov [Modulo], ah 

我得错了-9/2的结果。 我得到的结果是“7B”,似乎它将“F7”视为247。

如何在将var3定义为databyte(db)的情况下正确完成此操作?

或者,还有其他方法吗?

感谢您的回答

1 个答案:

答案 0 :(得分:3)

您必须使用idiv执行已签名的部门。

div无法正确处理 var3

中的负数
mov al, [var3]
cbw
idiv byte ptr [var4]

根据您的评论,我发现您不喜欢cbw指令,并且您不希望使用最短代码进行除法指令。您可以随时对其进行编码:

mov   al, [var3]
mov   ah, FFh      ;Only if you 'know' var3 has a negative value!
mov   bl, [var4]
idiv   bl
mov   [Result], al
mov   [Modulo], ah

或者仍然避免cbw

movsx ax, byte ptr [var3]
mov   bl, [var4]
idiv   bl
mov   [Result], al
mov   [Modulo], ah