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

Assembly 如何寻址32位寄存器的上16位?,assembly,Assembly,在ASM 32位中,EAX寄存器从0到31位。 在EAX中,有一个从0位到15位的AX。 如何从15位到31位调用寄存器 不能直接寻址32位寄存器的前16位 如果要在不影响下16位的情况下处理前16位,则必须使用多个指令: 您可以使用掩蔽(或/和/异或)或移位(shr/shl) 下面的所有示例都保留了eax的低16位不变 例如: and eax,0x0000FFFF ; zero out top 16 bits ;and with 1 does not change bit. or eax,0

在ASM 32位中,EAX寄存器从0到31位。 在EAX中,有一个从0位到15位的AX。 如何从15位到31位调用寄存器


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

如果要在不影响下16位的情况下处理前16位,则必须使用多个指令: 您可以使用掩蔽(
/
/
异或
)或移位(
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          

您可以在此处查找指令的描述:

虽然您无法直接访问高阶字节,但有一条指令使这比另一个答案中的逻辑简单得多

查看
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

没有。32位寄存器的上16位没有相应的寄存器。请移到低位,修改,然后返回高位。较低的位可作为16/8位值访问,以具有16位和8位寄存器,较高的部分仅扩展到32位。同样有用:BMI2
rorx ecx、eax、16
以复制和旋转。或者
shld ecx,eax,16
双移位到
ecx
,依赖于旧的ecx值。
bswap
也交换字节,这有什么帮助?现在你把数据放错了结尾。如果你读了答案,你会发现我指出了这一点。如果最终目标是访问单词中的单个字节,这是非常有用的。它比
roleax,16
()短一个字节,并且在大多数CPU上的性能相同。也许在另一个端口上运行。它没有立即操作数,这可能是uop缓存的一个优势,具体取决于周围具有立即+disp8或disp32寻址模式的指令。