Masm32,获取位和位值

时间:2014-05-15 23:35:04

标签: assembly bit masm masm32

我有一个关于如何将一个寄存器存储到另一个寄存器的问题。这是我需要回答的问题:

写一系列指令,从寄存器edx移到AL位5到12。

到目前为止,这是我的代码:

     mov edx,8F1h
     ror edx,4
l1:
     ;store this bit in the al register
loop l1

我知道它并不多,但我完全迷失了如何保存该位并将其传输到另一个寄存器。在理解了这一点之后,我可以把它放在它周围。

此外,代码或建议会很棒。感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我不确定你为什么会感到迷茫。您应该考虑从edx(位置5-12)复制8位,因此您只需在mov之后执行ror

 mov edx, 8f1h
 ror edx, 5

 mov al, dl      ;copy lowest 8 bits from edx to al

 rol edx, 5      ;restore edx to 8f1h.

因为它已满dl =>注册移动al,你不必担心屏蔽位或任何东西。也不需要循环。

编辑:更新了答案以假设基于0的位数,因为这更常见。当然,如果你不介意摧毁edx,你可以使用更简单的方法:

 mov edx, 8f1h
 shr edx, 5

 mov al, dl      ;copy lowest 8 bits from edx to al

答案 1 :(得分:0)

我相信vhu的回答是不正确的。根据32位寄存器(在本例中为edx)的简单说明,可以通过分析x86汇编中位重要性的顺序来看出这一点:


[------------------------------ DX --------------- --------------] [---------------------------------- ---------------------------]

[-------------- dh -------------] [-------------- dl- ------------] [------------------------------------ -------------------------]

[---------------------------------------------- --------------- EDX ---------------------------------- --------------------------]

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00


因此,我们可以推断出位5-12位于右侧,即edx的“低位”或“最低位”字(2个字节)。有了这个,为了存储这些位,我们必须使用rol指令,而不需要loop指令......

mov edx, 8f1h
rol edx, 11           ;(15 - 5) + 1 is our distance from bit 5 to the least significant bit of dx (and also dl)
mov al, dl            ;now al contains bits 5-12 of edx prior to rotation, starting with the least significant bit of al

如果您想要恢复edx,只需在代码末尾添加:

ror edx, 11

由于edx中5-12位的宽度为8字节,因此不需要使用and指令进行“位掩码”。

简单的成功!

答案 2 :(得分:-1)

我没有在之前的答案中得到所有的旋转。
一个简单的错误:

mov al, dl
and al, 0ff0h