Assembly 如何在ARM汇编中找到dword中的第一个逻辑单元?
我想知道如何从右到左查找具有寄存器R0和R1的dword中的第一个逻辑单元(单位)。如何实现上述目标 我已经尝试过遍历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的位置
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的