我有一个关于如何将一个寄存器存储到另一个寄存器的问题。这是我需要回答的问题:
写一系列指令,从寄存器edx
移到AL位5到12。
到目前为止,这是我的代码:
mov edx,8F1h
ror edx,4
l1:
;store this bit in the al register
loop l1
我知道它并不多,但我完全迷失了如何保存该位并将其传输到另一个寄存器。在理解了这一点之后,我可以把它放在它周围。
此外,代码或建议会很棒。感谢您的帮助!
答案 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