arm汇编语言调用含参数的C函数及有关实例

发布者:科技梦行者最新更新时间:2021-06-28 来源: eefocus关键字:arm  汇编语言  C函数 手机看文章 扫描二维码
随时随地手机看文章

简介:对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure CallStandard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回


不同于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,=0x10 ;参数 1

ldr r1,=0x20 ;参数 2

ldr r2,=0x30 ;参数 3

ldr r3,=0x40 ;参数 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,=0x1;参数 1

ldr r1,=0x2;参数 2

ldr r2,=0x3;参数 3

ldr r3,=0x4;参数 4

ldr r4,=0x8

str r4,[sp,#-4]! ;参数 8 入栈

ldr r4,=0x7

str r4,[sp,#-4]! ;参数 7 入栈

ldr r4,=0x6

str r4,[sp,#-4]! ;参数 6 入栈

ldr r4,=0x5

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 |

+----------+


关键字:arm  汇编语言  C函数 引用地址:arm汇编语言调用含参数的C函数及有关实例

上一篇:高效的C编程之:布尔表达式(上)
下一篇:嵌入式开发技巧:ARM的三种中断调试方法

推荐阅读最新更新时间:2024-11-17 14:37

ARM开发工具介绍
一、编辑编译工具: 1、ADS1.2 ADS是ARM公司的集成开发环境软件,它的功能非常强大。他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。特点: ADS1.2提供完整的WINDOWS界面开发环境; C编译器效率极高;支持C以及C++,使工程师可以很方便的使用C语言进行开发; 提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统; 配合FFT-ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握; ADS1.2需要硬
[单片机]
ARM裸机开发:按键输入实验
一、硬件平台: 正点原子I.MX6U阿尔法开发板 二、原理图分析 按键输入是配置GPIO作为输入,检测按键引脚电平,采用扫描的方式读取按键按下的信息,IMX6UL的按键引脚如下: 可以看到按键引脚接到 GPIO1_IO18 口,按键的原理就是默认接一个上拉电阻,按键按下接地,可以有效控制 IO 电平 三、配置代码 按键工程我们基于上一节工程进行开发,添加 BSP_KEY 工程文件 编写 bsp_key.h 文件 #ifndef __BSP_KEY_H #define __BSP_KEY_H #include fsl_iomuxc.h #include MCIMX6Y2.h #include bsp
[单片机]
<font color='red'>ARM</font>裸机开发:按键输入实验
基于ARM的智能综合监控基站方案设计
引言 传统的监控系统类似大体可以分为四种:防盗放火报警监控系统,门禁系统、考勤或巡更系统,环境检测系统,视频监视系统,目前市场上通常对某个区域(例如仓库)的全面监控管理是由以上四种类型的监控系统的简单相加,各分系统之间相对独立,到上层监控中心才进行综合,这样作势必会造成布线烦琐、维护力度大、升级困难、成本增加,而且系统的联网方式单一也可能造成系统的鲁棒性不高,处理突发事件的能力不强,针对这样一种现状,文中提高了一种基于32位高性能处理器AT91RM9200的智能综合监控基站方案。 1 系统结构 本基站最大的特点在于将各个子系统在底层进行综合集成,并且采用PSTN、GPRS和TCP/IC三种联网方式。无论从成本、智能化程度,还
[应用]
S3C2440A时钟结构分析(ARM9架构)
一、时钟树分析 S3C2440A时钟树 从上图的左上角我们可以得知,S3C2440A支持两种外部时钟源输入,一种是通过接在XTIpll与XTOpll上的外部振荡电路(一般由晶振为核心组成),还有一种是通过将现成的时钟频率通过EXTCLK输入。 时钟输入芯片后,送到MPLL(主锁相环)与UPLL(USB锁相环)进行倍频。MPLL出来的时钟信号称之为FCLK,一般直接用于给CPU核心提供时钟信号;UPLL出来的时钟信号称为UCLK,一般用于给USB提供时钟信号。FCLK经过HDIVN与PDIVN分频后会产生HCLK与PCLK,前者一般用于给AHB高速总线与高速外设提供时钟信号,比如USB模块、NAND FLASH控制器等;
[单片机]
S3C2440A时钟结构分析(<font color='red'>ARM</font>9架构)
ARM开发板系统移植-----u-boot的编译
本文和另外两篇姊妹篇都是为了说明如何裁剪出适合在mini2440 开发板上运行的Linux系统,以记录自己的学习成果。其中本文先介绍了嵌入式系统的软件组成部分,然后介绍编译出适合在mini2440开发板上运行的uboot的方法步骤。 说明:笔者使用的开发平台---RetHat linux系统,开发板---Friendly mini2440 在开始讲述系统移植的具体方法之前,先大致了解一下嵌入式系统的软件组成:    从上面这个图可以看出,嵌入式系统的软件组成主要包括bootloader、内核以及根文件系统。当然还有bootloader传给内核的参数列表以及没画出来的应用软件。其中bootloader在开发板一上电就会被硬
[单片机]
<font color='red'>ARM</font>开发板系统移植-----u-boot的编译
基于ARM的直流电机调速系统的设计与实现
   0 引言   在智能小车的研制开发中,很重要的一部分就是智能小车要能根据周围障碍物的情况自主的调节行驶速度和行驶方向。本文中所设计的直流电机调速系统是智能小车的一个重要组成部分,直流电机调速系统主要由S3C44B0X处理器和电机驱动芯片 L298N构成,主要功能是驱动小车的两个车轮,调节小车的行驶速,通过改变两个车轮的转速差调节行驶方向。    1 硬件设计   由ARM公司设计的采用RISC架构的ARM处理器性能强,功耗低,体积小,支持Thumb(16位)/ARM(32位)双指令集,指令执行速度快。目前ARM系列微处理器在32位RISC嵌入式产品中已经占据75%以上的市场份额。尤以ARM7TDMI系列应用最广,其性
[单片机]
ARM的2种工作状态,7种工作模式和37个寄存器
一、ARM处理器的两种工作状态: 1、ARM状态:32位,ARM状态执行字对齐的32位ARM指令。 2、Thumb状态,16位,执行半字对齐的16位 注:1、ARM和Thumb两种状态之间的切换不影响处理器的工作模式和寄存器的内容。 2、ARM处理器在处理异常时,不过处理器处于什么状态,则都将切换到ARM状态。 二、ARM处理器的7种模式: CPSR(当前程序状态寄存器)的低5位用于定义当前操作模式,如图示: 1、用户模式(User,usr) 说明:正常程序执行的模式 2、系统模式(System,sys) 说明:用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Sta
[单片机]
<font color='red'>ARM</font>的2种工作状态,7种工作模式和37个寄存器
学习ARM开发(20)
有了前面的Tick中断,那么基本的任务切换条件已经是“万事俱备,只欠东风”了。不过,这个“东风”也是很难搞得懂的,只有不断地通过实践才会找到合适的方法。现在我就需要去找这个东风了,就是解决不同的任务切换的问题。从简单到复杂,这是任何事物的认识过程,也是行之有效的方法。绝对不要一上来就搞一个很复杂的,因为人的理解能力还是有限的。最简单的任务切换,就是我需要实现的:只需要实现两个任务不断地来回切换,就已经说明可行了。那我先把这两个任务设置为最简单的,因此,就把任务的栈定下来,因为每个任务的栈是肯定不同的,所以我选择了固定地设置栈地址。比如第一个任务的栈地址是0x0c700000,第二个任务的栈地址是0x0c700200。接着就需要把任
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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