Assembly 如何寻址32位寄存器的上16位?
在ASM 32位中,EAX寄存器从0到31位。 在EAX中,有一个从0位到15位的AX。 如何从15位到31位调用寄存器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
不能直接寻址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寻址模式的指令。