Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Masm32,获取位和位值_Assembly_Bit_Masm_Masm32 - Fatal编程技术网

Assembly Masm32,获取位和位值

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 我知道的不多,但我完全不知道如何保存位并将其转移到另一个寄存器。在理解了这一点之后,我可以在它周围建立一个循环 此外,代码或建议也很好。提前感谢您的帮助 我不知道你为什么会

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

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

这是我目前的代码:

     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,dl
shr
/
mov
只要你不介意丢失
edx
的内容就可以了。我从未见过基于1的位计数。当使用
BT
BTC
BTS
时,这种情况会非常混乱。我同意,但最初的问题是
ror-edx,4
,这对于基于1的位计数是正确的,因此假设。