首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ARM控制器中的链接寄存器指向返回地址+1

为什么ARM控制器中的链接寄存器指向返回地址+1
EN

Stack Overflow用户
提问于 2020-04-30 00:22:37
回答 1查看 47关注 0票数 0

我有一个虚拟代码:

代码语言:javascript
复制
int main()
{
    while(1)
    {
        LED_Initialize();
        LED_On(0);
        delay();
        LED_Off(0);
    }
    return 0;
}

虚拟代码的程序集如下所示:

代码语言:javascript
复制
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单片机。

EN

回答 1

Stack Overflow用户

发布于 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)中知道了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61506622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档