ARM程序调用规则(ATPCS)分析

来源:互联网 发布:淘宝假冒伪劣无需退货 编辑:程序博客网 时间:2024/05/17 20:29

研究的是V4版本ARM内核的函数调用规则。

MDK4.2、J-Link armV4.34、J-Link硬件仿真器V8版本。

ATPCS规定寄存器的使用规则如下:
1.子程序通过R0~R3来传递参数

2.子程序使用R4~R11来保存局部变量

3.寄存器R12用作scratch寄存器,记为ip(发现Linux内核中的汇编直接使用ip这个

符号)

4.R13为SP

5.R14为LR

6.R15为PC


截取自己工程中的代码片段:


这是在函数中调用uartInit()。

可以发现在正式跳转到子函数

BL uartInit

之前还执行了三步操作。

MOV R2,#_...

LDR R1,[PC,#...]

MOV R0,R2

首先第一条执行第一条命令可以获得uartInit函数的第一个参数UART1,但暂时将

参数保存在R2中,最后通过

MOV R0,R2

将第一个参数保存在R0寄存器中。

然后通过LDR执行第二条执行,将第二个参数保存在R1寄存器中。

通过计算可以知道R1中的值是0x4000009c

这个就是程序中定义的cUartArg变量的内存地址

第三个参数为NULL,所以不用执行。参数保存到R0、R1后开始跳转到子函数执行

可以发现函数在执行子函数代码之前显示将R4~R6以及R14寄存器保存在栈中,然后再将

R0、R1、R2的值赋值给R4~R6,因为在函数中形参是局部变量,ATPCS规则规定子程序

要使用R4~R11寄存器来保存局部变量,所以这里进行了赋值操作。并且在跳转的时候也将

LR寄存器进行了设置。

所有这些操作完毕然后执行子程序代码。

最后函数的返回值通过R0寄存器进行传递。


当参数大于4个时通过堆栈来传递参数。
更加具体的解释参考杜春雷<ARM体系结构与编程>


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 仔兔十五天母兔没奶怎么办 兔子刚生下兔宝宝该怎么办 兔子不吃草超瘦怎么办 兔子喝水喝多了怎么办 狗吃了变质食物怎么办 狗崽20天没睁眼怎么办 刚生的小狗缺氧怎么办 狗狗生出来了怎么办 刚生的小狗狗死了怎么办 母狗生的死狗怎么办 狗生宝宝都死了奶水怎么办 狗狗生出来不动怎么办 兔子喝了84水怎么办 小狗喝了84水怎么办 天气热宝宝不爱喝水怎么办 狗脐带掉了出血怎么办 刚生的小狗没奶怎么办 家兔在笼子里下崽怎么办 小兔子不吃东西 精神不好怎么办 兔子要生宝宝了怎么办 宝宝让兔子咬了怎么办 兔子的右耳坏了怎么办 被小兔子咬了怎么办 打老鼠被老鼠咬了了怎么办 制作棒棒糖时木棍翘起怎么办 兔子被打后怕我怎么办 兔子后腿摔断了怎么办 兔子腿骨头断了怎么办 减肥老是控制不住吃怎么办 不爱吃主食爱吃零食怎么办 猫咪奶涨的很硬怎么办 斩魂技能乱加的怎么办 狗狗不吃东西还拉稀怎么办 狗狗拉稀不吃饭怎么办 狗狗几天不吃东西怎么办 狗狗不吃不喝怎么办 拖鞋洗了有臭味怎么办 拖鞋湿水了很臭怎么办 棉被上渗了酸奶怎么办 酸奶弄在衣服上怎么办 孩子把褥子尿湿怎么办