在ASM 32位中,EAX寄存器从0到31位。 在EAX中,存在从0位到15位的AX。 如何将寄存器从15位称为31位?
答案 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位寄存器中的字节,然后允许您使用AH
和AL
或仅AX
访问这些片段。您必须意识到BSWAP会颠倒字节的顺序,因此它不仅仅是交换高阶和低阶字。
mov eax, [ebx]
bswap eax ; The highest order byte is now in AL
; The second highest order byte is now in AH