Assembly Masm32,获取位和位值
我有一个关于如何将位从一个寄存器存储到另一个寄存器的问题。以下是我需要回答的问题: 写入一系列指令,从寄存器edx移动到AL位5到12 这是我目前的代码:Assembly Masm32,获取位和位值,assembly,bit,masm,masm32,Assembly,Bit,Masm,Masm32,我有一个关于如何将位从一个寄存器存储到另一个寄存器的问题。以下是我需要回答的问题: 写入一系列指令,从寄存器edx移动到AL位5到12 这是我目前的代码: mov edx,8F1h ror edx,4 l1: ;store this bit in the al register loop l1 我知道的不多,但我完全不知道如何保存位并将其转移到另一个寄存器。在理解了这一点之后,我可以在它周围建立一个循环 此外,代码或建议也很好。提前感谢您的帮助 我不知道你为什么会
mov edx,8F1h
ror edx,4
l1:
;store this bit in the al register
loop l1
我知道的不多,但我完全不知道如何保存位并将其转移到另一个寄存器。在理解了这一点之后,我可以在它周围建立一个循环
此外,代码或建议也很好。提前感谢您的帮助 我不知道你为什么会在那一刻感到失落。您应该考虑从
edx
(位置5-12)复制8位,因此您只需在ror
之后执行mov
:
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
我相信vhu的答案是错误的。通过分析x86汇编中的位重要性顺序可以看出这一点,根据32位寄存器的这一简单图示(在本例中,
edx
):
[-------------------------------------dx------------------------------------------][-----------------------------------------------------------------------] [------------dh--------------------[------------dl--------------------[---------------------------------------------------------------] [---------------------------------------------------------------edx------------------------------------------------------] 31 30 29 28 27 26 24 23 22 21 20 19 18 17 15 14 13 11 10 09 08 07 06 05 04 02 01 00
因此,我们可以推断比特5-12位于右侧,即
edx的“低阶”或“最低有效”字(2字节)。也就是说,为了存储这些位,我们必须使用rol
指令,而不需要循环
指令
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字节,因此不需要使用和
指令进行“位掩码”
简单的成功 在前面的回答中,我没有理解所有的旋转。
简单的:
mov al, dl
and al, 0ff0h
我已经很久没有组装了,但为什么不从edx移动到al,然后向左旋转4次呢?应该是右而不是左,如问题中所述。此外,位编号通常是基于零的,因此它应该是5位而不是4位。最后,您应该使用和
屏蔽不需要的位。不需要循环。注意:您可能希望先移动到eax
,以免破坏edx
。提示:DL是edx的低位8位。您可能希望旋转5,而不是4。您的数字不正确dx
是edx
的最低有效字(位0-15),而dl
是dx
的最低有效字节(位0-7)。请参阅“英特尔64和IA-32体系结构软件开发人员手册”第1卷,第3-11页,图3-5。vhu的答案比您的答案更准确。你的AL从DL只得到零。这是你想要的吗?提示:AL的正确值应该是47h。我没有投票,但是ff0h
是12位,所以和AL,ff0h
没有意义(如果我们忽略ff0h
可能会被解释为标签的事实,因为它以字母开头)。这不是前导零,而是十六进制数字的计数。AL只能保存8位,这是两个十六进制数字,而不是三个或四个。哦,是的。已经有十多年了。也许是这样的?:shr-edx,4mov-al,dlshr
/mov
只要你不介意丢失edx
的内容就可以了。我从未见过基于1的位计数。当使用BT
、BTC
或BTS
时,这种情况会非常混乱。我同意,但最初的问题是ror-edx,4
,这对于基于1的位计数是正确的,因此假设。