IDIV

已签名的分割

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F6 /7IDIV r/m8M有效有效由r/m8签名除AX,结果存储在: AL:=引文,AH:=保留.
F7 /7IDIV r/m16M有效有效由r/m16签名除DX:AX,结果存储在AX:=引文,DX:=留文.
F7 /7IDIV r/m32M有效有效签名除EDX:EAX 由r/m32,结果存储于EAX:=引文使用formative,EDX:=剩余.
REX.W + F7 /7IDIV r/m64M有效不可编码签名除RDX:RAX 由r/m64,结果存储于RAX:=引文使用formative,RDX:=剩余.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

M

  1. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

涉及的标志位

说明

由 源操作数 (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 AXr/m8 ALAH-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 前缀 。

来源