Assembly 如何在ARM汇编中找到dword中的第一个逻辑单元?

Assembly 如何在ARM汇编中找到dword中的第一个逻辑单元?,assembly,arm,Assembly,Arm,我想知道如何从右到左查找具有寄存器R0和R1的dword中的第一个逻辑单元(单位)。如何实现上述目标 我已经尝试过遍历dword的元素,但是我似乎没有正确地理解对我的期望。他还试图左右移动,但总体来说运气不佳 MOV R2, R0, LSR #31 loop: MOVS R0, R0, LSL #2 ADC R2, R2, R0, LSR #31 bne loop 我想使用前面描述的方法来查找单个位的当前索引您可以使用CLZ来计算前导零。通过从31中减去前导零,可以得到一个字节中第一个1的位置

我想知道如何从右到左查找具有寄存器R0和R1的dword中的第一个逻辑单元(单位)。如何实现上述目标

我已经尝试过遍历dword的元素,但是我似乎没有正确地理解对我的期望。他还试图左右移动,但总体来说运气不佳

MOV R2, R0, LSR #31
loop:
MOVS R0, R0, LSL #2
ADC R2, R2, R0, LSR #31
bne loop

我想使用前面描述的方法来查找单个位的当前索引

您可以使用
CLZ
来计算前导零。通过从
31
中减去前导零,可以得到一个字节中第一个
1
的位置

CLZ R1, R0
RSB R1, R1, #31
R0
包含要处理的
DWORD

R1
末尾包含“第一个逻辑单元”


S
可选后缀添加到
RSB
时,将更新,并可检测到
#0
寄存器。

您可以使用
CLZ
计算前导零。通过从
31
中减去前导零,可以得到一个字节中第一个
1
的位置

CLZ R1, R0
RSB R1, R1, #31
R0
包含要处理的
DWORD

R1
末尾包含“第一个逻辑单元”


S
可选后缀添加到
RSB
时,将更新,并可以检测到
#0
寄存器。

查找“第一个逻辑单元”是什么意思?你是说找到设定的第一位吗?如果是这样,您可以在ARMv5T和更高版本的体系结构上使用
clz
指令。哦,通过计算前导零,我可以得到dword中第一个
1
的索引?您找到“第一个逻辑单元”是什么意思?你是说找到设定的第一位吗?如果是这样,您可以在ARMv5T和更高版本的体系结构上使用
clz
指令。哦,通过计算前导零,我可以得到dword中第一个
1
的索引?ARM有一条
rsb
(反向减法)指令;您不需要单独的
movr1,#8
。但是CLZ计算32位字中的前导零,所以你应该从32中减去,除非你说的是高字节内的索引。(呃,实际上它应该是31-clz(x)`因为你想要一个0..31作为位索引。)而且你的例子不需要把静态内存位置弄得乱七八糟,把你的例子弄得乱七八糟;用输入和输出寄存器对其进行注释。我会去更新答案@彼得科德斯。我一定是忽略了
rsb
ARM有一条
rsb
(反向减法)指令;您不需要单独的
movr1,#8
。但是CLZ计算32位字中的前导零,所以你应该从32中减去,除非你说的是高字节内的索引。(呃,实际上它应该是31-clz(x)`因为你想要一个0..31作为位索引。)而且你的例子不需要把静态内存位置弄得乱七八糟,把你的例子弄得乱七八糟;用输入和输出寄存器对其进行注释。我会去更新答案@彼得科德斯。我一定是忽略了rsb的