ARM汇编实现Booth乘法算法时,分存于两个32位寄存器的64位数值的算术右移实现方法咨询
ARM汇编实现Booth乘法算法时,分存于两个32位寄存器的64位数值的算术右移实现方法咨询
嗨,我来帮你搞定这个64位算术右移的问题!
首先得明确:你这里的64位值UV是由两个32位寄存器组成的——U是高32位,V是低32位对吧?要实现它的算术右移1位,核心是要符合64位有符号数的算术右移规则:符号位(也就是U的最高位)保持不变,整个64位整体右移,U的最低位移到V的最高位,V的其余位依次右移。
你之前尝试的“分别对两个寄存器做ASR,再把低32位的MSB换成高32位移前的LSB”思路有问题:因为对V单独做ASR的话,V的最高位会被自己的符号位填充,而不是U原来的最低位,这就破坏了64位值的整体移位逻辑。
在32位ARM汇编里,我们可以利用进位标志位和RRX指令(带进位的右移)来正确实现,具体步骤和代码如下:
假设U存在寄存器R1,V存在寄存器R0,实现64位算术右移1位的代码:
; 第一步:对高32位U执行算术右移1位 ; 这一步会把U的符号位填充到新的最高位,同时将U原来的最低位存入进位标志C ASR R1, R1, #1 ; U = U 算术右移1位,原U的最低位→C标志 ; 第二步:对低32位V执行带进位的右移1位 ; 这一步会把进位标志C的值(也就是原U的最低位)填入V的最高位,同时V的其余位右移1位 RRX R0, R0 ; V = V 带进位右移1位,C的值→V的最高位
这样操作后,R1:R0就完成了64位算术右移1位的操作,完全符合Booth算法第13步的要求。
如果是ARMv8的64位架构,那就更简单了——直接用64位寄存器,一条ASR X0, X0, #1就能完成64位算术右移,但你应该是在用32位ARM环境,所以上面的方法就很合适。
备注:内容来源于stack exchange,提问作者CyberFrenzy




