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-10-26 10:55

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 //------------------------------------------------------------
[单片机]
arm汇编语言调用C函数之参数传递
对于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的部分必须通过堆栈进行传递。 我们
[单片机]
arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程。这里不使用编译器自动生成的这部分汇编代码,因为编译器自动生成的代码会涉及环境变量的传递,参数的传递等等一系列问题。以ARM汇编来进行分析。使用一个启动汇编文件和一个main.c的文件,在ARM 2440板子上调试这段程序,使用JLinkExe借助jlink来调试: init.s: 1 .text 2 .global _start 3 _start: 4 ldr sp,=4096  @设置堆栈指针以便调用C函数 5 bl main 6 loop: 7 b
[单片机]
ARM汇编中调用C函数的参数传递方式
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard)标准,ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回。 不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。 我们先讨论一下形参个数为4的情况: 实例1 s// test_asm_args.asm //--------------------------------------------------------
[单片机]
ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。 而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有堆栈指针初始化这个动作。但是,从来只是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来没有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是经过一定的探究,试图来解释一下,为何要初始化堆栈,即: 为何C语言的函数调用要用到堆栈,而汇编却不需要初始化堆栈。 要明白这个问题,首先要了解堆栈的作用。 关于堆栈的作用,要详细讲解的话,要很长的篇幅,所以此处只是做简略介绍。 总的来说,堆栈的作用就是:保存现场/上下文,传递参数。 1.保存现场/上下文 现场
[单片机]
ARM汇编语言与C/C++的混合编程
ARM公司不生产芯片,而是出售核(如ARM9)给硬件厂商,硬件厂商添加一些外围器件,就成了芯片(如s3c2440)。 ARM汇编语言与C/C++的混合编程 - 在C/C++代码中嵌入汇编指令 在C/C++中使用内嵌的汇编指令语法格式: 使用关键字_ _asm来标识一段汇编指令程序 _ _asm {undefined 汇编语言程序 ~~~~~~~~~~ 汇编语言程序 } 例C1.C #include stdio.h void my_strcpy(const char *src, char *dest) {undefined char ch; _ _asm
[单片机]
ARM汇编语言学习笔记(一)介绍
目的 在看了某位大佬的文章之后也想写一点自己在学习汇编的时候的学习笔记。 新手入门,主要基于韦东山老师的新一期代码来实现操作,掌握汇编的基础操作。 以一个菜鸟的角度来看待汇编代码问题,希望可以了解代码的具体运作过程。 把问题拿出来,分析总结。希望方便后来的自己和后来学习的伙伴,不要做 double work。 一、汇编语言是什么 这是百度百科的介绍:汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过
[单片机]
ARM汇编语言学习笔记(二)跑个灯程序以及.s文件分析
一、汇编语言怎么写 我们都知道,c语言可以写成c语言然后编译。那么汇编语言了? 汇编语言用汇编语言写,然后写出来为.s文件。所以我们只需要任意一款可以编写.s文件的编辑器就可以啦,例如:source insight、notepad等。 二、写一个试试 /* * 点亮LED1: gpf4 */ .text .global _start _start: /* 配置GPF4为输出引脚 * 把0x100写到地址0x56000050 */ ldr r1, =0x56000050 ldr r0, =0x100 /* mov r0, #0x100 */ str r0, /* 设置GPF4输出
[单片机]
<font color='red'>ARM</font><font color='red'>汇编语言</font>学习笔记(二)跑个灯程序以及.s文件分析
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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