所以我之前在一家知名的GPU公司面试时遇到了一个有关位操作的问题。尽管我是计算机体系结构的博士生,但对汇编语言了解甚少(这很奇怪),正如这个故事所表明的那样,我搞砸了。问题很简单:
“编写一个快速的代码,用于计算32位寄存器中1的数量。”
现在我正在学习ARM汇编语言。因此,自然而然地,我重新思考了这个问题,并通过研究ISA提出了以下代码。
对于你们那些精通ARM的专家,这个代码正确吗?有更快的方法吗?作为一个初学者,我自然认为这还不完整。在ARM ISA中,“xx”中的AND指令似乎是多余的,但没有其他方法可以移动寄存器...
R1将包含最终的位数,而R2是我们要计算的位的寄存器。r6只是一个虚拟寄存器。注释用()括起来。
“编写一个快速的代码,用于计算32位寄存器中1的数量。”
现在我正在学习ARM汇编语言。因此,自然而然地,我重新思考了这个问题,并通过研究ISA提出了以下代码。
对于你们那些精通ARM的专家,这个代码正确吗?有更快的方法吗?作为一个初学者,我自然认为这还不完整。在ARM ISA中,“xx”中的AND指令似乎是多余的,但没有其他方法可以移动寄存器...
R1将包含最终的位数,而R2是我们要计算的位的寄存器。r6只是一个虚拟寄存器。注释用()括起来。
MOV R1, #0 (initialize R1 and R6 to zero)
MOV R6, #0
xx: AND R6, R6, R2, LSR #1 (Right shift by 1, right most bit is in carry flag)
ADDCS R1, #1 (Add #1 to R1 if carry flag is set)
CMP R2, #0 (update the status flags if R2 == 0 or not)
BEQ xx (branch back to xx until R2==0)
4*32+2
个指令。Dave Seal的算法只需六个指令加上一次内存访问;除非内存非常慢,否则它可能对所有类型的输入都同样快。我怀疑很少有人会理解Dave Seal的解决方案。对我来说,“反向减”只是很奇怪。 - artless noise