assembly - 如何在 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
我想使用前面描述的来查找单个位的当前索引
解决方案
您可以使用CLZ
来计算前导零。通过从中减去前导零,可以获得字节31
中第一个的位置。1
CLZ R1, R0
RSB R1, R1, #31
R0
包含DWORD
您要处理的内容。
R1
最后包含“第一个逻辑单元”。
CLZ 指令计算 Rm 中值中前导零的数量,并将结果返回到 Rd 中。如果源寄存器中没有设置任何位,则结果值为 32,如果设置了位 31,则结果值为 0。
当S
可选后缀添加到RSB
条件标志时,将更新并且#0
可以检测到寄存器。
推荐阅读
- laravel - 如何在 whereHas laravel 中使用 groupBy
- sql - 我上次上传的数据,时间戳关闭了 2 天,我该如何解决?
- sql - 使用相同计划执行查询的巨大差异
- html - Web 应用程序的 RESTful API 重定向,更改基本 URL
- jquery - 如何在 React js 中使用 jquery
- angular - 尝试将属性用于 [(value)] 时出错
- android - Android Biometrics - 选择哪种方法(回退到密码)?
- c++ - C++意外调用继承类的函数
- python - run_algorithm() 失败,因为它无法从 Internet 源获取数据(403 Forbidden)
- tinymce - 所见即所得编辑器不会在 Chrome 中激活