DIV
未签名除法
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F6 /6 | DIV r/m8 | M | 有效 | 有效 | 未签名的除AX由r/m8,结果存储于AL:=引文;AH:=剩余. |
F7 /6 | DIV r/m16 | M | 有效 | 有效 | 未签名的DX:AX由r/m16除以,结果存储在AX:=引号,DX:=剩余. |
F7 /6 | DIV r/m32 | M | 有效 | 有效 | 无符号分割 EDX:EAX 由 r/m32 组成,结果存储于 EAX := 引文使用过时参数coauthors (帮助) EDX := 保存者. |
REX.W + F7 /6 | DIV r/m64 | M | 有效 | 不可编码 | 无符号分割 RDX:RAX 由 r/m64 组成,结果存储于 RAX := 引文使用过时参数coauthors (帮助) RDX := 保存者. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmescrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
在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
| 单词/字节 | AX | r/m8 | AL | AH | 255 |
|---|---|---|---|---|---|
| 双字/双字 | DX:AX | r/m16 | AX | DX | 65,535 |
| 四字/双字 | EDX:EAX | r/m32 | EAX | EDX | 232 - 1 |
| 双词/ | RDX:RAX | r/m64 | RAX | RDX | 264 - 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 前缀 。 |