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

Access higher order bytes of a register in assembly

如果我有一个用双字填充的寄存器 eax,我可以使用 al 和 ah 访问两个较低的寄存器。如果我想访问寄存器的其他两个字节,我需要什么样的命令?

IMO 最好是将 shr(右移位)x8 并使用 AL 来获取您需要的值。优化手册(来自 Intel)非常不推荐使用 AH 寄存器:

3.5.1.12 零延迟 MOV 指令

在基于代号为 Ivy Bridge 的英特尔微架构的处理器中,寄存器到寄存器移动操作的子集在前端执行(类似于零习语,请参阅第 3.5.1.7 节)。这在乱序引擎中节省了 scheduling/execution 资源。大多数形式的注册到注册。因此,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 所以你可能需要一些调整。

在不知道确切目的的情况下,很难确定什么是最好的方法,但您可以从其他答案和评论中看出,有几种不同的方法可以给这只猫剥皮。我将分享另一个我经常使用的方法示例。

        push    ebp
        mov     ebp, esp
        mov     eax, 141f2d72H
        push    eax

现在EBP-4或ESP指向的内存内容为;

72 2D 1F 14

现在有很多组合可以将数据作为字节或字寻址。

        mov     al, [bp-1]            AL = 14H      
        mov     ax, [bp-2]            AX = 141FH

我并不是在提倡这是比其他示例更好的方法,只是我发现的一种方法可以有效地处理我所做的一些事情。