除以有符号整数后的错误结果

Wrong result after dividing signed integer

基本问题:

我写了以下代码块:

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 定义为数据字节 (db) 的同时正确完成此操作?

或者,还有其他方法吗?

感谢您的回答

您必须使用 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