IDIV
已签名的分割
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F6 /7 | IDIV r/m8 | M | 有效 | 有效 | 由r/m8签名除AX,结果存储在: AL:=引文,AH:=保留. |
F7 /7 | IDIV r/m16 | M | 有效 | 有效 | 由r/m16签名除DX:AX,结果存储在AX:=引文,DX:=留文. |
F7 /7 | IDIV r/m32 | M | 有效 | 有效 | 签名除EDX:EAX 由r/m32,结果存储于EAX:=引文使用formative,EDX:=剩余. |
REX.W + F7 /7 | IDIV r/m64 | M | 有效 | 不可编码 | 签名除RDX:RAX 由r/m64,结果存储于RAX:=引文使用formative,RDX:=剩余. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
由 源操作数 (divisor) 除以 AX, DX: AX, 或 EDX: EAX (dividend) 中的(已签名) 值, 并将结果存储在 AX (AH: AL), DX: AX, 或 EDX: EAX 登记册中 。 源操作数可以是通用寄存器,也可以是内存位置. 此指令的动作取决于 操作数大小 (dividend/divisor) 。
非整体结果被截断(选择)到0. 其余的总是小于大小的分数. 过度流用#DE(潜水错误)例外表示,而不是用CF旗表示.
在64位模式下,指令的默认操作大小为32位. 使用REX.R前缀可以访问额外的登记册(R8-R15). 使用REX.W前缀将操作提升到64位. 在应用REX.W时的64位模式中,指令将RDX:RAX的签名值除以源操作数. RAX包含64位商数; RDX包含一个64位的剩余部分.
参见本节开头的汇总图,用于编码数据和限制. 见表3-53。
IDIV 结果
| 操作大小 | 红利 | 潜水员 | 引号 | 剩余部分 | 引号范围 |
|---|---|---|---|---|---|
| e AX | r/m8 AL | AH | -128 to +127 |
行动
IF SRC = 0
THEN #DE; (* Divide error *)
FI;
IF OperandSize = 8 (* Word/byte operation *)
THEN
temp := AX / SRC; (* Signed division *)
IF (temp > 7FH) or (temp < 80H)
(* If a positive result is greater than 7FH or a negative result is less than 80H *)
THEN #DE; (* Divide error *)
ELSE
AL := temp;
AH := AX SignedModulus SRC;
FI;
ELSE 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;
FI;
FI;
ELSE IF OperandSize = 32 (* Quadword/doubleword operation *)
temp := EDX:EAX / SRC; (* Signed division *)
IF (temp > 7FFFFFFFH) or (temp < 80000000H)
(* If a positive result is greater than 7FFFFFFFH
or a negative result is less than 80000000H *)
THEN
#DE; (* Divide error *)
ELSE
EAX := temp;
EDX := EDXE:AX SignedModulus SRC;
FI;
FI;
ELSE IF OperandSize = 64 (* Doublequadword/quadword operation *)
temp := RDX:RAX / SRC; (* Signed division *)
IF (temp > 7FFFFFFFFFFFFFFFH) or (temp < 8000000000000000H)
(* If a positive result is greater than 7FFFFFFFFFFFFFFFH
or a negative result is less than 8000000000000000H *)
THEN
#DE; (* Divide error *)
ELSE
RAX := temp;
RDX := RDE:RAX SignedModulus SRC;
FI;
FI;
FI;受影响的旗帜
CF,OF,SF,ZF,AF,和PF的旗帜没有定义.
异常
保护模式
#DE | 如果 源操作数 (divisor) 是 0 。 签名的结果( 引号) 对于目的地来说太大 。 |
#GP(0) | 如果 内存操作数 有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,则使用 DS,ES,FS 或 GS 寄存器访问内存,并包含 NULL 段选择子. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#DE | 如果 源操作数 (divisor) 为 0. |
#GP | 签名结果(引号)对于目的地来说太大. |
#SS | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#UD | 如果 内存操作数 有效地址在 SS 段限制之外。如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#DE | 如果 源操作数 (divisor) 为 0. |
#GP(0) | 签名结果(引号)对于目的地来说太大. |
#SS(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#PF(fault-code) | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#AC(0) | 如果发生 页面错误 。 |
#UD | 如果启用对齐检查, 并使用不对齐的内存引用。 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. |
#DE | 如果 源操作数 (divisor) 是 0, 如果商号太大到指定注册点。 #PF(fault-code) 如果 页面错误 发生 。 |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |