在x86汇编语言中,有没有办法获取EAX
寄存器的上半部分?我知道AX
寄存器已经包含寄存器的下半部分EAX
,但我还不知道有什么方法可以获得上半部分。
我知道这mov bx, ax
会将下半部分eax
移入bx
,但我也想知道如何将上半部分eax
移入bx
。
如果要保留 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
是显而易见的方法,可以避免任何部分注册停滞或错误依赖。
如果您不介意将bx
( 的低 16 位ebx
) 的原始值移动到 的高 16 位ebx
,则只需要 1 条指令:
shld ebx,eax,16
这不会修改eax
.
我会这样做:
mov ebx,eax
shr ebx, 16
ebx 现在包含 eax 的前 16 位
对于 16 位模式,这是最小(不是最快)的代码:只有 4 个字节。
push eax ; 2 bytes: prefix + opcode
pop ax ; 1 byte: opcode
pop bx ; 1 byte: opcode
shld ebx,eax,16
它甚至比占用 5 个字节内存的单指令更紧凑。