文档章节

ARM参数传递规则

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 560
阅读 0
收藏 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
粉丝 62
博文 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
46
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

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部