文档章节

ARM参数传递规则

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 560
阅读 1
收藏 0

 

1.       r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。

 

2.       函数内部通用的入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

// body of ASM code

LDMFD sp!,{r4-r11,pc}

如果函数并没有用到那么多的寄存器,则没有必要把所有的寄存器入栈。如果函数要调用子函数,则r0,r1,r2,r3,r12,r14这些寄存器里面值将被改变,必须小心处理这些寄存器,一种可行的方法是,修改被调用子函数的入栈出栈代码为:

STMFD sp!,{r0-r12,lr}

// body of ASM code

LDMFD sp!,{r0-r12,pc}

 

3.       如果函数内部变量太多,这时候要考虑使用堆栈,这是入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// body of ASM code

ADD sp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

 

4.       如果函数的参数多于4个,则函数内部的参数在堆栈中的位置依入栈出栈代码而定:

STMFD sp!,{r4-r11,lr}

LDR r4,[sp,#36]            //5个参数在堆栈中的位置

LDR r5,[sp,#40]            //6个参数在堆栈中的位置

// ……

// body of ASM code

LDMFD sp!,{r4-r11,pc}

 

5.       如果第5个参数是要传递地址,函数调用完以后要使用之前传进去的第5个参数,则要预留更多的堆栈空间。可参考下面代码:

//other C code

     butterfly32a_16(x2m[0], x2m[1], *ptr1--, tmpSineTable8m, &rx, &ix);

    //other C code

     这个C函数总共有6个参数,在调用之前要预留4个堆栈单元。代码如下:

sp_0      EQU      0

sp_1      EQU      sp_0 + 4

var_rx    EQU      sp_1 + 4

var_ix    EQU      var_rx+4

stacksize EQU      var_ix+4

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// other ASM code

 

ADD        r4, sp, #var_rx             

ADD        r5, sp,# var_ix

STR         r4, [sp,#sp_0]

STR         r5, [sp,#sp_1]

// assume the r0,r1,r2,r3 are prepared well

BL           butterfly32a_16

 

LDR        r4, [sp, #var_rx]            //r4 is the value of rx

LDR        r5, [sp, #var_ix]            //r5 is the value of ix

 

// other ASM code

ADD sp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

本文转载自:http://www.cnblogs.com/celerychen/archive/2009/11/03/3588226.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
函数调用时参数传递规则

ARM函数调用时参数传递规则 之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器 R0传递第一个参数, R1传递到第二个.. 一直到R3传递第四个参数. 但是 实际上有时可能...

Baiqq
03/07
0
0
linux内核中的fastcall和asmlinkage宏

linux内核中的fastcall和asmlinkage宏 内核版本:2.6.14 嵌入式开发交流群:289195589,欢迎加入! 在linux内核中我们都会经常见到FASTCALL和armlinkage,它们各有什么不同呢?下面我们来具体...

长平狐
2013/06/03
49
0
C语言函数和汇编函数相互调用(转)

在C程序main函数中,接收用户输入任意个整数,然后在main中调用使用ARM汇编编写的函数(在该函数中完成对这些整数的排序功能),然后再在C程序main函数中输出这些排好顺序的整数。 //main.c...

卜霞森
2013/03/29
0
0
05-ARM体系结构与常用汇编指令

一、ARM体系结构  ARM(Advanced RISC Machines) ,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。ARM 处理器是一种低功耗高性能的 32 位R...

梦想成大牛
01/05
0
0
GCC中同时使用动态和静态库链接的编译

如何同时同时使用动态和静态库链接,在GCC指令参数中具体参数如下: -Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib 具体用途解释:...

晓亮1210
2013/10/30
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Pure-ftpd搭建FTP

12月11日任务 15.4 xshell使用xftp传输文件 15.5 使用pure-ftpd搭建ftp服务 使用pure-ftpd搭建FTP服务 轻量的ftp软件 安装pure-ftpd并修改配置文件 # pure-ftpd为epel扩展库里的软件[root...

robertt15
21分钟前
2
0
开源 serverless 产品原理剖析(二) - Fission

背景 本文是开源 serverless 产品原理剖析系列文章的第二篇,关于 serverless 背景知识的介绍可参考文章开源 serverless 产品原理剖析(一) - Kubeless,这里不再赘述。 Fission 简介 Fiss...

阿里云官方博客
27分钟前
2
0
Android面试整理(附答案)

面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二。以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组...

终端研发部
32分钟前
3
0
Vue 改变数组触发视图更新

Vue 改变数组触发视图更新 以下方法调用会改变原始数组 push(), pop(), shift(), unshift(), splice(), sort(), reverse()push()push() 方法可向数组的末尾添加一个或多个元素,并返回新的...

不负好时光
37分钟前
2
0
计算机系统要素 C5

本章值得一提的是组织计算机的结构。Hack 的指令和数据是分开存储的,因此它的 CPU 有两个 input: IN inM[16], // M value input (M = contents of RAM[A]) instruction[16],...

lionets
53分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部