const
是一個字節。當你做IDIV byte_divisor
時,商將被放置在AL
中,並且具有-128到127的範圍。1000/5是200,這不在允許的範圍內。如果使用DIV
,商的範圍是0到255,這就是您的示例在這種情況下工作的原因。
如果你想IDIV
1000乘5你應該使用一個16位除數。但是需要注意的是,當使用IDIV r/m16
時,實際上劃分的是由DX
和AX
(DX
保存最高有效位,而AX
最低有效位)組成的32位雙字。
從Intel的手冊:
IDIV r/m16 Signed divide DX:AX by r/m16, with result stored in AX ← Quotient, DX ← Remainder.
IF OperandSize = 16 (* Doubleword/word operation *)
THEN
temp ← DX:AX/SRC; (* Signed division *)
IF (temp > 7FFFH) or (temp < 8000H)
(* If a positive result is greater than 7FFFH
or a negative result is less than 8000H *)
THEN
#DE; (* Divide error *)
ELSE
AX ← temp;
DX ← DX:AX SignedModulus SRC;
所以IDIV
之前,你應該從AX
價值創造DX:AX
一個符號雙。有一個名爲CWD
所做的正是這一個指令:
的CWD
指令 複製標誌在AX
寄存器中的值轉換成DX
寄存器的每個位的(第15位)。
即:
.data
const dw 5 ; now a word
.code
mov ax,1000
cwd ; sign-extend ax into dx
idiv const
; quotient is in ax, remainder in dx
完美。謝謝! –