获取EAX寄存器的上半部分

时间:2013-03-05 17:27:01

标签: assembly x86

在x86汇编语言中,有没有办法获得EAX寄存器的上半部分?我知道AX寄存器已经包含EAX寄存器的下半部分,但我还不知道有什么方法可以获得上半部分。

我知道mov bx, ax会将eax的下半部分移动到bx,但我想知道如何将eax的上半部分移动到bx同样。

4 个答案:

答案 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更紧凑。