汇编:如何通过数学运算将三个两位数值寄存器合并为一个寄存器
寄存器十进制数值合并问题
你要把三个存储两位十进制数的寄存器按顺序合并为一个寄存器(r1作为前两位、r2作为中间两位、r3作为最后两位),比如r1=12、r2=34、r3=56时得到r0=123456,这完全可以通过数学运算实现,但你之前的代码逻辑存在错误。
错误原因分析
你使用的LSL #8是左移8位操作,等价于乘以256,这是二进制字节拼接的逻辑,而非十进制位数拼接:
- r1=12左移8位:
12×256=3072,加上r2=34后得到3072+34=3106 - 3106再左移8位:
3106×256=795136,加上r3=56后得到795136+56=795192,这就是你得到错误结果的原因。
正确实现方法
要实现十进制位数拼接,需按照十进制位权计算:前两位需乘以10000(100×100),中间两位乘以100,最后加上最后两位。对应ARM汇编代码如下:
mov r1, #12 mov r2, #34 mov r3, #56 mul r0, r1, #10000 @ 计算r1×10000,得到120000 mul r4, r2, #100 @ 计算r2×100,得到3400 add r0, r0, r4 @ 120000+3400=123400 add r0, r0, r3 @ 123400+56=123456,得到目标值
如果不想使用乘法指令,也可以用加法组合出位权(比如10000=8192+1024+512+256+32),但乘法指令更直观高效。
你提供的错误代码及调试截图
错误代码:
mov r1,#12 mov r2,#34 mov r3,#56 add r0, r2, r1, LSL #8 add r0, r3, r0, LSL #8
调试器寄存器值截图:
内容的提问来源于stack exchange,提问作者Kenny G
相关产品推荐
相关产品推荐

