6

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

我知道这mov bx, ax会将下半部分eax移入bx,但我也想知道如何将上半部分eax移入bx

4

4 回答 4

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是显而易见的方法,可以避免任何部分注册停滞或错误依赖

于 2013-03-05T18:26:45.747 回答
8

如果您不介意将bx( 的低 16 位ebx) 的原始值移动到 的高 16 位ebx,则只需要 1 条指令:

shld ebx,eax,16

这不会修改eax.

于 2013-03-05T19:58:35.520 回答
4

我会这样做:

mov ebx,eax
shr ebx, 16

ebx 现在包含 eax 的前 16 位

于 2013-03-05T18:12:34.410 回答
1

对于 16 位模式,这是最小(不是最快)的代码:只有 4 个字节。

push eax  ; 2 bytes: prefix + opcode 
pop ax    ; 1 byte: opcode
pop bx    ; 1 byte: opcode

shld ebx,eax,16它甚至比占用 5 个字节内存的单指令更紧凑。

于 2018-05-15T14:30:37.643 回答