ARM系统中函数调用时参数传递规则

发布者:水手谷水手最新更新时间:2016-04-20 来源: eefocus关键字:ARM系统  函数调用  参数传递 手机看文章 扫描二维码
随时随地手机看文章
在嵌入式软件编程中,经常会用到函数调用,之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第二个..一直到R3传递第四个参数.但是实际上有时可能传递的参数非常多,超过8个,或是参数中有浮点数之类,参数也会超过4个寄存器,对于超出的部份并不使用R4,而是使用堆栈的方式,但具体是如何的方式很多网站就没了下文了。

对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books ——Developer Guide的2.1节。这篇文档要讲的是汇编代码中对C函数调用时如何进行参数的传递以及如何从C函数正确返回

不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。

我们先讨论一下形参个数为4的情况.
实例1:
test_asm_args.asm
//——————————————————————————–
IMPORT test_c_args ;声明test_c_args函数
AREA TEST_ASM, CODE, READONLY
EXPORT test_asm_args
test_asm_args
STR lr, [sp, #-4]! ;保存当前lr
ldr r0,=0×10 ;参数 1
ldr r1,=0×20 ;参数 2
ldr r2,=0×30 ;参数 3
ldr r3,=0×40 ;参数 4
bl test_c_args ;调用C函数
LDR pc, [sp], #4 ;将lr装进pc(返回main函数)
END
test_c_args.c
//——————————————————————————–
void test_c_args(int a,int b,int c,int d)
{
printk(“test_c_args:n”);
printk(“%0x %0x %0x %0xn”,a,b,c,d);
}
main.c
//——————————————————————————–
int main()
{
test_asm_args();
for(;;);
}

程序从main函数开始执行,main调用了test_asm_args,test_asm_args调用了test_c_args,最后从test_asm_args返回main.
代码分别使用了汇编和C定义了两个函数,test_asm_args 和 test_c_args,test_asm_args调用了test_c_args,其参数的传递方式就是向R0~R3分别写入参数值,之后使用bl语句对test_c_args进行调用。其中值得注意的地方是用红色标记的语句,test_asm_args在调用test_c_args之前必须把当前的lr入栈,调用完test_c_args之后再把刚才保存在栈中的lr写回pc,这样才能返回到main函数中。

如果test_c_args的参数是8个呢?这种情况test_asm_args应该怎样传递参数呢?
实例2:
test_asm_args.asm
//——————————————————————————–
IMPORT test_c_args ;声明test_c_args函数
AREA TEST_ASM, CODE, READONLY
EXPORT test_asm_args
test_asm_args
STR lr, [sp, #-4]! ;保存当前lr
ldr r0,=0×1 ;参数 1
ldr r1,=0×2 ;参数 2
ldr r2,=0×3 ;参数 3
ldr r3,=0×4 ;参数 4
ldr r4,=0×8
str r4,[sp,#-4]! ;参数 8 入栈
ldr r4,=0×7
str r4,[sp,#-4]! ;参数 7 入栈
ldr r4,=0×6
str r4,[sp,#-4]! ;参数 6 入栈
ldr r4,=0×5
str r4,[sp,#-4]! ;参数 5 入栈
bl test_c_args_lots
ADD sp, sp, #4 ;清除栈中参数 5,本语句执行完后sp指向 参数6
ADD sp, sp, #4 ;清除栈中参数 6,本语句执行完后sp指向 参数7
ADD sp, sp, #4 ;清除栈中参数 7,本语句执行完后sp指向 参数8
ADD sp, sp, #4 ;清除栈中参数 8,本语句执行完后sp指向 lr
LDR pc, [sp],#4 ;将lr装进pc(返回main函数)
END
test_c_args.c
//——————————————————————————–
void test_c_args(int a,int b,int c,int d,int e,int f,int g,int h)
{
printk(“test_c_args_lots:n”);
printk(“%0x %0x %0x %0x %0x %0x %0x %0xn”,
a,b,c,d,e,f,g,h);
}
main.c
//——————————————————————————–
int main()
{
test_asm_args();
for(;;);
}

这部分的代码和实例1的代码大部分是相同的,不同的地方是test_c_args的参数个数和test_asm_args的参数传递方式。
在test_asm_args中,参数1~参数4还是通过R0~R3进行传递,而参数5~参数8则是通过把其压入堆栈的方式进行传递,不过要注意这四个入栈参数的入栈顺序,是以参数8->参数7->参数6->参数5的顺序入栈的。
直到调用test_c_args之前,堆栈内容如下:
sp->+———-+
| 参数5 |
+———-+
| 参数6 |
+———-+
| 参数7 |
+———-+
| 参数8 |
+———-+
| lr |
+———-+
test_c_args执行返回后,则设置sp,对之前入栈的参数进行清除,最后将lr装入pc返回main函数,在执行 LDR pc, [sp],#4 指令之前堆栈内容如下:
+———-+
| 参数5 |
+———-+
| 参数6 |
+———-+
| 参数7 |
+———-+
| 参数8 |
sp->+———-+
| lr |
+———-+

上面是转自http://lionwq.spaces.eepw.com.cn/articles/article/item/17475/

但实际上可能不同的编译器可能用着不同的处理方式,于我们所使用的编译器我们可以写一个简单的代码,调用10个参数的函数,然后升成汇编再查看它是如何处理,这样再根据编译器进行特殊的优化.


关键字:ARM系统  函数调用  参数传递 引用地址:ARM系统中函数调用时参数传递规则

上一篇:S3C2410内置的UART控制器
下一篇:ARM GNU 汇编伪指令简介

推荐阅读最新更新时间:2024-03-16 14:51

关于GCC中断调用函数名的问题
问: 嗯。。最近学习AVR,我用的编译软件是GCC。。。 觉的网上这个方面的资料还是比较少的,用ICC的比较多。 如我用外部中断时,写中断函数用的中断函数名为 ISR(INTO_vect) 想知道用到其他函数时用的什么函数名!! 在库函数里,找了下没有找到。 答: 还可以按以下路径: WINAVR安装目录- avr- include- avr 可以找到对应各个型号的头文件,比如iom8.h对应mega8,里面有如下一段: #define INT0_vect _VECTOR(1) #define SIG_INTERRUPT0 _VECTOR(1) #define INT1_vect _VECTOR(2)
[单片机]
基于嵌入式ARM的LCD图像显示系统设计
0 引 言    随着嵌入式技术迅猛发展和Linux在信息行业中广泛应用,利用嵌入式Linux系统实现图像采集处理已有可能。实时获得图像数据是实现这些应用的重要环节。本文使用的系统硬件平台采用Samsung公司的处理器S3C2410,并以此为基础,在基于嵌入式Linux系统平台上设计了建立图像视频的一种方法。 1 系统硬件电路设计    S3C2410芯片处理器内部集成了ARM公司ARM920T处理器核的32位微控制器,资源丰富,带独立的16 kB的指令Cache和16 kB数据Cache、LCD(液晶显示器)控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的定时器、并行I/O口、8路10位
[单片机]
基于嵌入式<font color='red'>ARM</font>的LCD图像显示<font color='red'>系统</font>设计
基于ARM-Linux的高清数字机顶盒软件系统设计与实现
数字电视特别是数字高清晰度电视的诞生应该说是电视界的一场深刻变革 。电视系统已进入数字化的进程,数字机顶盒是该系统的关键部件,特别是其软件系统的设计和开发。但无论是模拟彩电还是数字处理电视,都不具备对全数字电视信号进行解码的功能,所以一种能够接收数字电视信号并能够解码输出用于显示的中间设备——机顶盒,就显得很有必要了 。 目前国内机顶盒以有线标清为主,欧洲以卫星和地面的机顶盒为主,美国以高清地面机顶盒产品为主 。随着技术的发展,机顶盒已不只单纯接收数字电视节目,还要接收大量的数据,而且用户和电视机之间还要实现互动 。目前国内还没有一种成熟的交互式应用,所谓的交互式应用基本上都还停留在本地交互的基础上 。本文研究的机顶盒可以支
[单片机]
基于<font color='red'>ARM</font>-Linux的高清数字机顶盒软件<font color='red'>系统</font>设计与实现
基于ARM嵌入式系统的微波热疗仪控制系统设计
引言 随着科学技术的发展,各种医疗设备相继问世并得到广泛应用。微波治疗疾病的原理比较复杂,由国内外目前研究结果可见微波治疗疾病主要是通过热效应和生物效应来实现的。由于极性分子间存在磁阻对振荡产生阻尼作用,从而消耗微波能量而生热,利用这些热量达到治病之目的,这就是微波治疗的热效应。 通过研究和实验表明,用微波照射病变部位,其治疗效果远远超过其它热敷方法。人体的组成成分大部分是碳水化合物,碳水化合物的分子都是极性分子,极性分子在微波场作用下,随微波频率改变其极性称作极性振荡,极性振荡的频率与微波频率相同,其振幅与微波强度成正比。 大家知道,中医通过热敷、针灸可以治疗寒症和局部炎症;通过人体自身发热,可以达到自身免疫功能。微波是指频率为
[单片机]
基于<font color='red'>ARM</font>嵌入式<font color='red'>系统</font>的微波热疗仪控制<font color='red'>系统</font>设计
华清远见ARM Cortex-A9 四核平台嵌入式系统教学
近日,华清远见研发中心对外宣布—FS4412 ARM Cortex-A9 四核教学平台投入量产并全面应用于嵌入式系统的教学实训。该平台采用的处理器是Samsung最新的ARM Cortex-A9四核CPU的Exynos4412, 主频达到1.4~1.6GHz。该处理器已经广泛应用于多个领域。在我们熟悉的智能手机中,如:三星Galaxy SIII,魅族、联想、纽曼等等,都有基于Exynos4412的产品。由于芯片采用了最新的32nm的先进工艺制程,功耗方面有了明显的降低。 FS4412教学平台    作为华清远见研发中心精心设计的新一代教学实验平台,FS4412可以有效满足ARM处理器、Linux操作系统、Andro
[嵌入式]
华清远见<font color='red'>ARM</font> Cortex-A9 四核平台嵌入式<font color='red'>系统</font>教学
基于ARM的蓝牙实时数据采集系统的硬件与软件设计
1 引言 随着计算机技术的发展,尤其是无线技术广泛深入到人们生活的各个方面,使人们的生 活发生了深刻的变化。就工业数据采集、测量领域来讲,由于测量种类多、数据量大,且存 在许多条件恶劣、人们不易到达或不能时刻停留的地方偶尔采集一些现场数据,因而不但需 要花费大量的人力、物力和财力进行设备的维护,同时给采集带来很多不必要的麻烦。 为了解决上述问题,本文提出了一种基于ARM 的蓝牙实时数据采集系统。采用嵌入式 操作系统Windows CE,对通过蓝牙无线传输方式集中的传感器采集数据,进行控制、显示、 处理,实现工业实时数据的采集。ARM 技术为内核的微控制器指令周期短,处理能力强, 接口丰富,能成功运行操作系统,为控制系统的应用程
[单片机]
基于ARM的可重构数控系统设计
引言 数控系统的开放性、可重构设计、模块化、网络化是当前数控技术领域研究的热点。开放式数控的技术本质是标准化,它的目标是把复杂的数控技术产品体系分割开,形成公认的模块化构件,让更多的厂商能够参与到数控技术的广阔市场中来。显然,模块化是开放式控制的原始基础和技术雏形,而实现这一目标的前提是共同制定一个产品的标准,准确地说,就是制定一个共同遵循接口的标准,以实现庞大数控系统架构的分解和集成。 可重构数控的技术本质是柔性化。其实际上和原有的柔性制造系统一脉相承,只不过加入了管理学和运筹学的技术内容。不同的是,这种管理过程不是完全由人来主导,而是在人预先定义的决策下,由控制系统本身按照某种程度的自动化来实施的,其目标是系统实现
[单片机]
基于<font color='red'>ARM</font>的可重构数控<font color='red'>系统</font>设计
基于ARM9与Win CE系统的车辆GPS定位信息采集
GPS可提供连续、高精度、实时的时间基准、三维位置、三维速度、整周模糊度等数据,具有性能好、精度高的特点,因而广泛应用于GPS载波相位测姿、精确制导、SINS/GPS组合导航、嵌入式车辆导航监控等军事与民用领域。而嵌入式系统以其低功耗、小体积、高稳定性和便携等优势,在GPS的应用中占据重要的位置。本文研究基于ARM920T内核的嵌入式微处理器S3C2440和WindowsCE 5.0(简称WindowsCE)的某型军车GPS定位信息的采集与处理。 1 系统硬/软件平台概述     车辆GPS定位信息采集系统的硬件平台结构如图l所示。     该平台可以分为3大模块:     1)微系统核心模块 由基于ARM920T的3
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved