访问汇编中寄存器的高阶字节
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
我并不是在提倡这是比其他示例更好的方法,只是我发现的一种方法可以有效地处理我所做的一些事情。
如果我有一个用双字填充的寄存器 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
我并不是在提倡这是比其他示例更好的方法,只是我发现的一种方法可以有效地处理我所做的一些事情。