Thumb-2架构下LDR r0,[r1, r2]!指令未正常工作问题咨询
关于TM4C123上LDR寄存器偏移写回失效的问题
嘿,这个问题我之前在Cortex-M4平台上踩过坑!咱们一步步说清楚:
首先,你用的TM4C123GH6PGE是基于ARMv7-M架构的Cortex-M4内核,这个架构的指令集对带写回(!)的LDR指令有严格限制:
- 只有立即数偏移的格式
LDR r0,[r1, #4]!是合法的,执行时会先更新基址寄存器r1,再加载数据到r0; - 而寄存器偏移的带写回格式
LDR r0,[r1, r2]!,在ARMv7-M的指令集里根本不被支持!
这不是CCS的问题,也不是硬件bug,是架构本身的指令编码限制——ARMv7-M并没有为寄存器偏移+写回的操作分配对应的指令编码,所以当你写这条指令时,编译器或者硬件会自动忽略掉!标记,把它当成普通的LDR r0,[r1, r2](不带写回)来执行,自然r1的值不会发生变化。
那想要实现“用r2做偏移加载,同时更新r1”的需求怎么办?很简单,拆成两条指令就行:
LDR r0, [r1, r2] ; 先把[r1+r2]地址的值加载到r0 ADD r1, r1, r2 ; 手动将r1更新为r1+r2
这样既符合指令集规范,又能达到你想要的效果。
你也可以在CCS里打开反汇编窗口,看看你写的LDR r0,[r1, r2]!最终被编译成了什么,大概率就是不带!的普通寄存器偏移加载指令,这也能验证上面的结论。
内容的提问来源于stack exchange,提问作者mjet




