如果我有一个充满dword的寄存器eax,我可以使用al和ah访问两个低位寄存器。如果我想访问寄存器的其他两个字节,我需要什么样的命令?
答案 0 :(得分:1)
IMO最好是shr(右移位)x8并使用AL来获得所需的值。优化手册(来自英特尔)高度推荐使用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中拥有eax中的第一个字节,ebx中的第2个字节,ecx中的第3个字节以及最后一个字节(原点中eax的最低部分)。它也是nasm语法我不熟悉masm所以你可能需要一些调整。
答案 1 :(得分:1)
在不知道确切目的的情况下,很难确定什么是最好的方法,但是你可以通过其他答案和评论来判断,有几种不同的方法可以让这只猫受到影响。我将分享另一个我经常使用的方法的例子。
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
我并不是在提倡这是一个比其他例子更好的方法,只是我发现一种方法可以有效地处理我所做的一些事情。