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

时间:2018-01-24 22:52:59

标签: assembly masm

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

2 个答案:

答案 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

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