除以有符号整数后的错误结果
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
基本问题:
我写了以下代码块:
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