首页 > 解决方案 > 如何在 ARM Assembly 中找到 dword 中的第一个逻辑单元?

问题描述

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

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

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

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

标签: assemblyarm

解决方案


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

CLZ R1, R0
RSB R1, R1, #31

R0包含DWORD您要处理的内容。
R1最后包含“第一个逻辑单元”。

CLZ 指令计算 Rm 中值中前导零的数量,并将结果返回到 Rd 中。如果源寄存器中没有设置任何位,则结果值为 32,如果设置了位 31,则结果值为 0。

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


推荐阅读