文档章节

ARM参数传递规则

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 560
阅读 0
收藏 0
点赞 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
粉丝 60
博文 6195
码字总数 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
混合编程接口规范

一般地,在Linux或者其他操作系统中,一个模块都有一个总入口和多个具体的接口集,例如驱动、中间件等。上层应用调用总入口,并传递具体接口对应的命令号cmd和具体的接口参数,总入口负责分发...

yueqian_scut
2017/10/14
0
0
在ARM中使用Ramdisk

在ARM中使用Ramdisk Linux启动时,initrd可以在内存中,也可以在 Flash或其它可用的设备上; initrd文件格式为: romfs/Minix/ext2/gzip;相关的函数:drivers/block/rd.c: identifyramdisk...

长平狐
2013/06/03
167
0
交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和我有同样困惑的兄弟..... 原文链接http://www.hi-beiyu.com/archives/312 一. 什么是ABI和E...

cubieboard
2014/08/10
0
0
C/C++中函数调用规则(约定)__cdecl __stdcall __thiscall __vectorcall __fastcall

相关文献 stdcall https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx C语言函数可变参数详解 - ranpanf的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/ranpanf/article/details/......

zray4u
2016/06/22
181
0
如何通过xmake进行交叉编译

xmake 提供了方便灵活的交叉编译支持,大部分情况下,都不需要配置很复杂的toolchains前缀,例如: 什么的 只要这个toolchains目录满足如下结构(大部分的交叉工具链都是这个结构): 那么,...

ruki
2016/07/22
11
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
8分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
11分钟前
0
0
Java NIO:浅析I/O模型

也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念...

yzbty23
12分钟前
0
0
了解iOS消息推送一文就够:史上最全iOS Push技术详解

本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表。 1、引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会...

JackJiang-
13分钟前
0
0
Mysql汉子转拼音

update t_app_city SET CITY_NAME_BEGIN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(CITY_NAME USING gbk),1)),16,10), 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, 0xBFA......

尘叙缘
15分钟前
0
0
大数据构建智慧城市“新引擎”,加速推进新旧动能转换

——“大数据与智慧城市”技术交流分享会——济南站召开 7月13日,“大数据携手智慧城市,助力山东新旧动能转换”技术交流分享会——济南站在山东信息通信技术研究院会议室成功举办,此次会议...

左手的倒影
17分钟前
2
0
tomcat 学习笔记之 Session管理

1、Catalina 通过一个 Session 管理器的组件来管理建立的Session 对象 该组件由 org.apache.catalina.Manager 接口表示 Session 管理器必须与一个 Context 关联 Session 管理器负责,创建、更...

职业搬砖20年
18分钟前
0
0
jquery获取input框的几种方式

//如何用jquery获取<input id="test" name="test" type="text"/>中输入的值?$(" #test ").val()$(" input[ name='test' ] ").val()$(" input[ type='text' ] ").val()$(" input[ ......

gulf
21分钟前
0
0
gradle的环境变量的配置

gradle的环境变量的配置 1.首先下载jdk,并且配置jdk的环境变量. 2.找到自己AS安装gradle的目录 我自己的目录为:F:\Android Studio3.1.3\gradle\gradle-4.4 创建环境变量:GRADLE_PATH: F:\A...

android-key
27分钟前
0
0
saltstack配置apache

1.相关配置 #vim /etc/salt/master //打开如下内容的注释 file_roots: base: - /srv/salt #mkdir /srv/salt #vim /srv/salt/top.sls base: 'slaver.test.com': - apache 注意:若换成 '*',则......

硅谷课堂
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部