You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动