我有一个虚拟代码:
int main()
{
while(1)
{
LED_Initialize();
LED_On(0);
delay();
LED_Off(0);
}
return 0;
}虚拟代码的程序集如下所示:
0x08000416 F7FFFFB3 BL.W LED_On (0x08000380)
22: delay();
0x0800041A F7FFFFF3 BL.W delay (0x08000404)
23: LED_Off(0);
**0x0800041E** 2000 MOVS r0,#0x00 下一条指令地址是0x0800041E,但是链接寄存器R14始终保持地址+1,在这种情况下,0x0800041F.Do真的不明白为什么?我知道这与Thumb指令有关,但有人能解释一下它的整个概念和原因吗?我用的是STM32F446REXX单片机。
发布于 2020-04-30 00:35:20
这是cortex M4,因此您可以获得cortex-m4的文档,文档中说它是基于armv7-m体系结构的,因此您可以获得cortex M4的体系结构参考手册
以下指令使EPSR.T设置为加载到PC的值的位:-A BLX或BX。-到PC的LDR。-包含PC的POP或LDM。
所以请阅读这篇文章:
EPSR.T T位支持ARM架构互通模型,但是,由于ARMv7-M仅支持Thumb指令的执行,因此必须始终将其值保持为1。对符合Thumb指令互通规则的PC的更新必须相应地更新EPSR.T。EPSR.T设置为0的指令执行会导致无效状态UsageFault,INVSTATE。
公平地说,更容易回到最初的arm arm现在称为armv5架构参考手册,在那里你有/有完整的尺寸和拇指,它以一种稍微更好的方式解释了,当这些指令使用该值时,它们获取lsbit并对其做出模式决定,根据位更改/停留在arm中更改/停留在thumb中。PC不保留该位,它被指令消耗并发送到PSR中的T位。
只使用拇指的cortex-ms机器必须保持该模式,并且如上所述,如果您尝试切换到arm,那么您将得到一个故障。(同样,如果没有使用lsbit设置正确地构建向量表,那么您将无法启动)。
请把它想象成一个地址,或者是一个不是地址加一个的地址,因为如果工具是正确的,那么如果你添加了一个,你会得到一个无效的地址和崩溃/故障,如果你觉得你必须或你不会伤害任何东西的位(除非地址没有以这种方式使用,那就是另一个错误)。
armv7-ar文档也将涵盖位主题,以及哪些指令可以切换模式,从它开始的armv4t到armv7-ar,有相当多的指令能够切换模式。而像gnu ld这样的链接器会为你添加一个弹床,如果你正确构建代码的话。
在使用此级别的处理器时,您应该始终将处理器文档放在屏幕或桌面上,以涵盖此类问题。再说一次,公平地说,只有拇指的文档看起来好像你已经从使用完整尺寸的手臂(armv4t到armv7ar)中知道了。
https://stackoverflow.com/questions/61506622
复制相似问题