assembly - 访问汇编中寄存器的高阶字节

标签 assembly x86 bit-manipulation masm

如果我有一个用双字填充的寄存器 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/

相关文章:

javascript - 如何从二进制 int 中获取百分比,其中每一位代表 x 百分比?

c - 使用按位运算符 ~ 和 & 使 |运算符(operator)

assembly - 更短的 x86 调用指令

c - 为什么 AVX-256 VMOVAPS 指令只复制四个单精度 float 而不是 8 个?

assembly - 在汇编中编写 __attribute((constructor)) 函数 - 可以完成吗?

windows - 崩溃转储意味着在顺序指令之间更改了寄存器值

assembly - 什么是处理器提示?

c - 如何获取 x86 Linux 内核定义

algorithm - 比较 BFS 算法的两种不同实现时了解性能细节

binary - 什么是 “two' 的补码”?