在x86汇编语言中,有没有办法获得EAX
寄存器的上半部分?我知道AX
寄存器已经包含EAX
寄存器的下半部分,但我还不知道有什么方法可以获得上半部分。
我知道mov bx, ax
会将eax
的下半部分移动到bx
,但我想知道如何将eax
的上半部分移动到bx
同样。
答案 0 :(得分:13)
如果你想保留EAX和EBX的上半部分:
rol eax, 16
mov bx, ax
rol eax, 16
如果有可用的临时寄存器,则效率更高(并且不会为以后的读取EAX的指令引入额外的延迟):
mov ecx, eax
shr ecx, 16
mov bx, cx
如果您不需要其中任何一种,mov ebx, eax
/ shr ebx, 16
是显而易见的方法,可以避免任何partial-register stalls or false dependencies。
答案 1 :(得分:8)
如果您不介意将bx
的原始值(ebx
的低16位)移位到ebx
的高16位,则只需要1条指令:
shld ebx,eax,16
这不会修改eax
。
答案 2 :(得分:3)
我会这样做:
mov ebx,eax
shr ebx, 16
ebx现在包含最高16位的eax
答案 3 :(得分:1)
对于16位模式,这是最小的(不是最快的)代码:只有4个字节。
push eax ; 2 bytes: prefix + opcode
pop ax ; 1 byte: opcode
pop bx ; 1 byte: opcode
它比占用5个字节内存的单个指令shld ebx,eax,16
更紧凑。