如何寻址32位寄存器的高16位?

时间:2017-10-19 07:25:12

标签: assembly

在ASM 32位中,EAX寄存器从0到31位。 在EAX中,存在从0位到15位的AX。 如何将寄存器从15位称为31位?

http://www.c-jump.com/CIS77/asm_images/eax.png

2 个答案:

答案 0 :(得分:2)

您不能直接寻址32位寄存器的前16位。

如果你想在不影响低16位的情况下摆弄前16位,你必须使用多个指令: 您可以使用屏蔽(or / and / xor)或转移(shr / shl)。

以下所有示例都保留eax的低16位。

例如:

and eax,0x0000FFFF  ; zero out top 16 bits ;and with 1 does not change bit.
or eax,0xFFFF0000   ; set top 16 bits to 1; or with 0 does not change bit.
xor eax,0xFFFF0000  ; invert top 16 bits; xor with 0 does not change bit.

;copy ax into eax-high
mov ebx,eax         ; copy eax to temp register
movzx eax,ax        ; clear out top 16 bits of eax
shl ebx,16          ; move ax to ebx-high
or eax,ebx          ; combine ax and ebx-high, cloning ax.

;exchange ax and eax-high
rol eax,16          

您可以在此处查看说明的说明:http://www.felixcloutier.com/x86/

答案 1 :(得分:1)

虽然您无法直接访问高位字节,但有一条指令比其他答案中的逻辑更容易。

查看BSWAP指令。该指令交换32位寄存器中的字节,然后允许您使用AHAL或仅AX访问这些片段。您必须意识到BSWAP会颠倒字节的顺序,因此它不仅仅是交换高阶和低阶字。

 mov eax, [ebx]
 bswap eax  ; The highest order byte is now in AL
            ; The second highest order byte is now in AH