OpenEdv-开源电子网

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

在IAP实验中遇到C语言参数传递的问题,函数参数在通用寄存器中如何存放

[复制链接]

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-12-28
在线时间
0 小时
发表于 2015-9-4 23:28:44 | 显示全部楼层 |阅读模式
5金钱
在做IAP实验的时候,不想通过定义C语言函数类型参数的方式修改PC指针,采用嵌入汇编的方式
(我的APP程序已经事先存放在0x08040000的地方了)
在BootLoader程序中有两个函数如下:
__asm void SET_MSP(unsigned int addr)
{
    MSR MSP, r0    //set Main Stack value
    BX r14
}

__asm void SET_PC(unsigned int addr)
{
  BX   R0
}
然后主函数里面调用这两句
SET_MSP(*(unsigned int*)0x08040000);    
SET_PC(*(unsigned int*)0x08040004);     
可以正常跳转,但是想知道为什么这样用
(*(unsigned int*)0x08040000 不是应该代表0x08040000地址中的数据吗?如此传递后为什么R0中存的就是0x0804000x这个数据了?
以及Keil MDK环境下 C语言中的形参在R0-12寄存器中是如何保存的?
或者说是自己对C语言中关于*(unsigned int*)的用法还是不了解,有没有人能帮我讲解一下,谢谢啦

最佳答案

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

4个参数以内,保存在r0-r3,超过4个参数压入栈中传递。 push {r4-r12,lr} ldr r4,[sp,#0x28];取出第5个参数 ... ... pop{r4-r12,pc}
我不会告诉你你也是大神的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-8-29
在线时间
5 小时
发表于 2015-9-4 23:28:45 | 显示全部楼层
4个参数以内,保存在r0-r3,超过4个参数压入栈中传递。
push {r4-r12,lr}

ldr r4,[sp,#0x28];取出第5个参数
...
...

pop{r4-r12,pc}
从不发帖,发帖必申酷。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-5 22:40:54 | 显示全部楼层
汇编不太熟,帮顶。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-9-6 09:47:02 | 显示全部楼层
.map文件



.bin文件


上面两个文件就是一个简单的ARM项目的生成代码和map文件,
看画红圈的地方,根据ARM的小端模式
地址00000000存放的数据为0x020008a0(__initial_sp)栈顶地址
地址00000004存放的数据为0x08000525(Reset_Handle)
如果你看过启动函数,


就可以知道这一段就是程序的入口。
所以在IAP里要将偏移为0x00的赋值给MSP, 偏移为0x04的赋值给pc。
*(unsigned char *)的用法第一个*是强制转换,将数转换为地址,第二个*是读取该地址内数据
当然在cortex-M3权威指南47页中也有说明,同上:




 
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-9-6 11:05:22 | 显示全部楼层
C语言中的形参在R0-12寄存器如果只有一个形参保存在R0,第二个在R1,依次类推,不过保存参数超过4个的好像有其它方式,这我不清楚,但
SET_MSP(*(unsigned int*)0x08040000);    
SET_PC(*(unsigned int*)0x08040004);    
这两个语句形参是一定保存在R0中的,所以直接复制!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 19:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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