计数寄存器

时间:2016-10-02 22:42:40

标签: assembly arm

查看寄存器内容并计算设置为0的位数然后将该计数保存在不同寄存器中的最有效方法是什么?

显然需要一个循环和LSR一起使用,但我不确定如何与AND指令以及EOR一起实现。

1 个答案:

答案 0 :(得分:0)

这里没有真正的答案。某些处理器具有给出设置位数的指令(对于通用编程来说,它是一个非常无用的指令,但对于错误检测很有用)。假设你没有这样的指令,通常零是寄存器最可能的值,你应该特别测试。然后你不得不求助于数字。基本算法是AND与1,将结果添加到累加器,向右移,AND与1,并重复,直到你有所有位。或者因为你想要零比特,XOR为1.但我们可以加速它。你可以拿8位进行查找。但这会比8时钟更快还是更慢?它只取决于特定的指令集,内存缓存等。如果我们有一个“寄存器文件”,寄存器由索引号标识,我们可以设置寄存器0为4,寄存器1为3,寄存器2为3,寄存器3为2,依此类推(16个寄存器的计数为零位),输出4位,然后使用结果索引寄存器文件。你需要做几个来证明开销的合理性。

另一个问题是循环还是展开会更快。这又是高度依赖于架构的。

然后另一个可能的技巧是,如果设置了MSB,则该数字为负数。负数的测试是否比AND更快?很有可能。另一个是乘以2或加法自身可能会设置进位标志,并且进位加零可能比加寄存器更快。

有很多可能的小策略。