DIV

未签名除法

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F6 /6DIV r/m8M有效有效未签名的除AX由r/m8,结果存储于AL:=引文;AH:=剩余.
F7 /6DIV r/m16M有效有效未签名的DX:AX由r/m16除以,结果存储在AX:=引号,DX:=剩余.
F7 /6DIV r/m32M有效有效无符号分割 EDX:EAX 由 r/m32 组成,结果存储于 EAX := 引文使用过时参数coauthors (帮助) EDX := 保存者.
REX.W + F7 /6DIV r/m64M有效不可编码无符号分割 RDX:RAX 由 r/m64 组成,结果存储于 RAX := 引文使用过时参数coauthors (帮助) RDX := 保存者.

操作数编码

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

M

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

实测开销

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

涉及的标志位

说明

在AX,DX:AX,EDX:EAX,或RDX:RAX登记册(dividend)中由源操作数(divisor)除去未签名的值,并将结果存储在AX(AH:AL),DX:AX,EDX:EAX,或RDX:RAX登记册中. 源操作数可以是通用寄存器,也可以是内存位置. 此指令的动作取决于 操作数大小 (dividend/divisor) 。 使用64位操作数的分区只可用64位模式.

非整体结果被截断(选择)到0. 其余的总是小于大小的分数. 过度流用#DE(潜水错误)例外表示,而不是用CF旗表示.

在64位模式下,指令的默认操作大小为32位. 使用REX.R前缀可以访问额外的登记册(R8-R15). 使用REX.W前缀将操作提升到64位. 在应用REX.W时的64位模式中,指令用RDX:RAX将未署名值除以源操作数,并将商号存储在RAX,其余为RDX.

参见本节开头的汇总图,用于编码数据和限制. 见表3-17。

DIV Action

单词/字节AXr/m8ALAH255
双字/双字DX:AXr/m16AXDX65,535
四字/双字EDX:EAXr/m32EAXEDX232 - 1
双词/RDX:RAXr/m64RAXRDX264 - 1
四个字
DIV - 未签名的分割

行动

IF SRC = 0

    THEN #DE; FI; (* Divide Error *)
IF OperandSize = 8 (* Word/Byte Operation *)

    THEN
          temp := AX / SRC;
          IF temp > FFH
                THEN #DE; (* Divide error *)
                ELSE
                       AL := temp;
                       AH := AX MOD SRC;
          FI;

   ELSE IF OperandSize = 16 (* Doubleword/word operation *)

          THEN
                temp := DX:AX / SRC;
                IF temp > FFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       AX := temp;
                       DX := DX:AX MOD SRC;
                FI;

          FI;
    ELSE IF Operandsize = 32 (* Quadword/doubleword operation *)

          THEN
                temp := EDX:EAX / SRC;
                IF temp > FFFFFFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       EAX := temp;
                       EDX := EDX:EAX MOD SRC;
                FI;

          FI;
    ELSE IF 64-Bit Mode and Operandsize = 64 (* Doublequadword/quadword operation *)

          THEN
                temp := RDX:RAX / SRC;
                IF temp > FFFFFFFFFFFFFFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       RAX := temp;
                       RDX := RDX:RAX MOD 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如果 内存操作数 的有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,如果 DS,ES,FS,或 GS 注册簿中包含 NULL 段选择子.
#SS(0)如果 内存操作数 的有效地址在 SS 段限制之外。
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#DE如果 源操作数 (divisor) 是 0 。 如果商号太大, 无法指定注册 。
#GP(0)如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外.
#SS如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生.
#AC(0)如果启用对齐检查, 并使用不对齐的内存引用 。
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非冠状的.
#DE如果 源操作数 (divisor) 是 0, 如果商号太大到指定注册点。 #PF(fault-code) 如果 页面错误 发生 。
#AC(0)如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用.
#UD如果使用 LOCK 前缀 。

来源