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

时间:2019-05-27 16:41:04

标签: assembly arm

我想知道如何在双字中找到R1和R1寄存器中的第一个逻辑单元(单个位),例如从右到左。我怎样才能达到上述目的?

我尝试遍历dword的各个元素,但似乎无法正确理解我的期望。还尝试左右移动,总体上没有运气。

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

我想使用前面所述的方法来查找当前比特的索引

1 个答案:

答案 0 :(得分:1)

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

1

CLZ R1, R0 RSB R1, R1, #31 包含您要处理的R0
DWORD的末尾包含“第一个逻辑单元”。

  

The CLZ instruction counts the number of leading zeros in the value in Rm and returns the result in Rd. The result value is 32 if no bits are set in the source register, and zero if bit 31 is set.

R1可选后缀添加到S时,condition flags将被更新,并且可以检测到RSB寄存器。