如果我有一个用双字填充的寄存器 eax,我可以使用 al 和 ah 访问两个较低的寄存器。如果我想访问寄存器的其他两个字节,我需要什么样的命令?
最佳答案
IMO 最好的方法是将 shr(右移位)x8 并使用 AL 来获取所需的值。优化手册(来自 Intel)非常不推荐使用 AH 寄存器:
3.5.1.12 零延迟 MOV 指令
在基于代号为 Ivy Bridge 的英特尔微架构的处理器中,寄存器到寄存器移动操作的子集在前端执行(类似于零习语,请参阅第 3.5.1.7 节)。这节省了乱序引擎中的调度/执行资源。大多数形式的注册到注册。因此,MOVZX 对于 reg32、reg8 (如果不是 AH/BH/CH/DH)
是零延迟movzx esi, al ; esi = eax & 0xff
shr eax, 8 ; eax >>= 8;
movzx ecx, al
shr eax, 8
movzx ebx, al
shr eax, 8
您将在 eax 中有第一个字节,在 ebx 中有第二个字节,在 ecx 中有第三个字节,在 esi 中有最后一个字节(即 eax 的最低部分)。它也是 nasm 语法,我不熟悉 masm,因此您可能需要一些调整。
关于assembly - 访问汇编中寄存器的高阶字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433027/