CWD, CDQ, CQO
将单词转换为双词/ 将双词转换为四词
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
99 | CWD | ZO | 有效 | 有效 | DX:AX:=AX的签名延伸. |
99 | CDQ | ZO | 有效 | 有效 | EDX:EAX:=EAX的签名延伸. |
REX.W + 99 | CQO | ZO | 有效 | 不可编码 | RDX:RAX:=RAX的签名延伸. |
实测开销
正在从 arch-data 加载实测数据...
说明
将注册AX,EAX,或RAX(取决于操作数大小)中的操作数的大小翻一番,通过签号扩展方式将结果存储在注册DX:AX,EDX:EAX,或RDX:RAX中分别. CWD指令将AX寄存器中值的符号(bit 15)复制到DX寄存器中的每一个位位. CDQ指令将EAX寄存器中值的符号(bit 31)复制到EDX寄存器中的每一位位置. CQO指令(只有64位模式)将RAX寄存器中值的符号(bit 63)复制到RDX寄存器中的每一个位位.
CWD指令可用于从单词分割前的单词产生双词红利. CDQ指令可用于从双字分割前的双字产生四字红利. CQO指令可用于在四字分割前从四字产生双四字红利.
CWD和CDQ mnemonics参考了相同的操作码. CWD指令用于操作数大小属性为16,CDQ指令用于操作数大小属性为32时. 一些组装器在使用CWD时可能会将操作数大小强制至16,在使用CDQ时可能会强制至32. 另一些则可能将这些mnemonics作为同义词(CWD/CDQ)处理,并使用操作数大小属性的当前设置来决定要转换的值大小,而不管所使用的mnemonic.
在64位模式中,使用REX.W前缀将操作提升到64位. CQO mnemonics将同样的操作码与CWD/CDQ参照. 参见本节开头的汇总图,用于编码数据和限制.
行动
IF OperandSize = 16 (* CWD instruction *)
THEN
DX := SignExtend(AX);
ELSE IF OperandSize = 32 (* CDQ instruction *)
EDX := SignExtend(EAX); FI;
ELSE IF 64-Bit Mode and OperandSize = 64 (* CQO instruction*)
RDX := SignExtend(RAX); FI;
FI;受影响的旗帜
None.
异常
实地址模式
#UD | 如果使用 LOCK 前缀 。 |
保护模式
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
#UD | 如果使用 LOCK 前缀 。 |
64 位模式
#UD | 如果使用 LOCK 前缀 。 |