为何x=5*x/16等价于指定ARM汇编指令?求详细解释
表达式
x=5*x/16与ARM汇编指令的等价性解释 先明确前提:假设初始的x值存储在寄存器r0中,最终计算结果会存入r1。我们逐行拆解汇编指令的作用:
第一行:MOV r0, r0, LSR #4
LSR #4是逻辑右移4位操作,对于整数来说,右移n位等价于除以2^n,这里就是除以2^4=16。执行完这行后,r0的值变为x/16(默认针对无符号整数或正数的整除操作)。
第二行:ADD r1, r0, r0, LSL #2
这条ARM加法指令是三操作数格式,具体拆解逻辑:
- 第一个操作数是当前的
r0,也就是已经算出的x/16; - 第二个操作数是
r0, LSL #2,LSL #2是逻辑左移2位,等价于乘以2^2=4,所以这个操作数的值是4*(x/16); - 指令将这两个值相加后存入
r1:x/16 + 4*(x/16) = 5*(x/16),完全对应原表达式5*x/16的计算结果。
本质上,汇编是把5*x/16拆成了(x/16) + 4*(x/16),用移位代替乘除——这是ARM架构里常见的优化手段,因为移位操作的执行效率远高于乘除指令。
内容的提问来源于stack exchange,提问作者dirky9000
相关产品推荐
相关产品推荐

