1. 同一个寄存器进行符号扩展(AL,AX,EAX,RAX)
1.1 指令说明
CBW(Convert Byte to Word):将AL寄存中的8位数值的符号位扩展到16位AX寄存中高8位的每一位。
CWDE(Convert Word to Double word for Extension或Convert Word to Extened Double word):将AX寄存中的16位数值的符号位扩展到32位EAX寄存中高16位的每一位。
CDQE(Convert Double word to Quad word for Extension或Convert Double word to Extened Quad word):将EAX寄存中的32位数值的符号位扩展到64位RAX寄存中高32位的每一位。
(注:后两个带E后缀的指令可能是后来加的,表示扩展;CDQE只对64位模式有效。)
1.2 示意图:
助记符--------------机器码----------------------描述
CBW-----------------98--------------------------符号扩展AL到AX
CWDE----------------98--------------------------符号扩展AX到EAX
CDQE----------------98--------------------------符号扩展EAX到RAX
1.3 测试代码(执行后观察RAX寄存器值的变化)
1.3.1 测试CBW
XOR RAX,RAX
XOR RDX,RDX
MOV AL,-1H
CBW
1.3.2 测试CWDE
XOR RAX,RAX
XOR RDX,RDX
MOV AX,-1H
CWDE
1.3.3 测试CDQE
XOR RAX,RAX
XOR RDX,RDX
MOV EAX,-1H
CDQE
2. 一个寄存器向另一个寄存器进行符号扩展(AL,AX,EAX,RAX-分别扩展到DL,EX,EDX,RDX)
2.1 指令说明
CWD(Convert Word to Double word):将AX寄存中的16位数值的符号位扩展到16位DX寄存中的每一位。
CDQ(Convert Double word to Quad word):将EAX寄存中的32位数值的符号位扩展到32位EDX寄存中的每一位。
CQO(Convert Quad word to Octonary word):将RAX寄存中的64位数值的符号位扩展到64位RDX寄存中的每一位。
(注:CQO只对64位模式有效。)
2.2 示意图:
助记符--------------机器码----------------------描述
CWD-----------------99--------------------------符号扩展AX到DX
CDQ-----------------99--------------------------符号扩展EAX到EDX
CQO-----------------99--------------------------符号扩展RAX到RDX
2.3 测试代码(执行后观察RDX寄存器值的变化)
2.3.1 测试CBW
XOR RAX,RAX
XOR RDX,RDX
MOV AX,-1H
CWD
2.3.2 测试CWDE
XOR RAX,RAX
XOR RDX,RDX
MOV EAX,-1H
CDQ
2.3.3 测试CDQE
XOR RAX,RAX
XOR RDX,RDX
MOV RAX,-1H
CQO
参考资源:
amd和intel开发文档和手册