OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4760|回复: 4

在IAP编程试验中遇到不懂的汇编程序代码,求助!

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-9-9
在线时间
18 小时
发表于 2021-1-14 17:35:02 | 显示全部楼层 |阅读模式
20金钱
在IAP实验程序中有如下函数:

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
        }
}                 

我找了各个地方的很多资料,一直没找到的就是“MSR_MSP”这个函数的注释,实在是不能理解这个函数是怎么实现初始化堆栈指针的。
函数具体内容如下:

__asm void MSR_MSP(u32 addr)
{
    MSR MSP, r0                         //set Main Stack value
    BX r14            //返回R14
}

假设函数的形参addr为0x08003000地址内的值,是栈顶指针,但是这个函数的第一句是把寄存器r0赋给MSP,这个函数的意思是不是默认r0的值就等于形参addr?那为什么r0寄存器就刚好等于形参呢?为什么形参不是保存在不是其他寄存器呢?希望能有STM32爱好者能分析分析解除疑惑,谢谢!
还有就是我这个函数会报错,实际编译器编译完之后显示是0error;0warning的,这个我也有点疑惑。。。_asm是内联汇编,为什么会报错呢?该怎么操作才能没有错误呢?

最佳答案

查看完整内容[请看2#楼]

首先你可以看看PM0056手册(Programming manual)的101页,记录了MSR指令的功能。 其次,根据AAPCS的规定,函数的第一至四的参数由R0-R3传递,多余的参数压入堆栈。 __asm void MSR_MSP(u32 addr)这个函数就是产生一条特殊的MSR指令设置特殊的寄存器,没啥好疑惑的,你仔细看看Cortex-M3的指令集就可以明白。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2021-1-14 17:35:03 | 显示全部楼层
首先你可以看看PM0056手册(Programming manual)的101页,记录了MSR指令的功能。
其次,根据AAPCS的规定,函数的第一至四的参数由R0-R3传递,多余的参数压入堆栈。
__asm void MSR_MSP(u32 addr)这个函数就是产生一条特殊的MSR指令设置特殊的寄存器,没啥好疑惑的,你仔细看看Cortex-M3的指令集就可以明白。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-1-15 02:30:01 | 显示全部楼层
这是设置堆栈首地址用的,你把理解成设置栈顶地址,就对了。CPU运行之前,得先设置这个。
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2019-9-9
在线时间
18 小时
 楼主| 发表于 2021-1-17 21:30:46 | 显示全部楼层
0x00000000 发表于 2021-1-14 17:35
首先你可以看看PM0056手册(Programming manual)的101页,记录了MSR指令的功能。
其次,根据AAPCS的规定 ...

已经查到了相关资料,感谢你的回答,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 10:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表