ARM 汇编与C调用的若干问题(一般函数调用情况)
ARM 汇编与C之间的函数调用需要符合ATPCS,建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。
R0 用来存放函数的第一个参数,R1用来存放第二个参数,R2用来存放第三个参数,R3用来存放第四个参数。其中R0还用来返回函数的调用结果,对应C函数里面的return value语句中的value 存放在R0中。
ARM堆栈的是满栈FULL STACK,SP指针指向的位置是存放有效数据的地方,若压栈新的数据,必须先改变SP,再向SP里面压入数据。下面结合博客http://blog.sina.com.cn/s/blog_3e5694650100tsbf.html,的内容进行分析。
情景(一)函数形参的个数<= 4
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.栈是满递减栈FD,首先调整SP指针,然后压入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函数) ,PC = LR,SP = SP+4,恢复原来的栈。
END
void test_c_args(int a,int b,int c,int d)
{
printk("test_c_args:\n");
printk("%0x %0x %0x %0x\n",a,b,c,d);
}
int main()
{
test_asm_args();
for(;;);
}
情景二:函数的参数是8个
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 %0x\n",
a,b,c,d,e,f,g,h);
}
main.c
//--------------------------------------------------------------------------------
int main()
{
test_asm_args();
for(;;);
}
ARM 汇编与C调用的若干问题(一般函数调用情况)的更多相关文章
- ARM 汇编与C之间 的调用
一. 汇编调用 C 1. 初始化栈 2. 初始化BSS段 (BSS 段是C语言存放未初始化的全局变量,或者初始化为0 的全局变量) 3 .使用 r0 ,r1, r2, r3 给函数传参,如果多于 4 ...
- GNU ARM 汇编指令
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...
- GNU风格 ARM汇编语法指南
汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 1. GNU汇编语言语句格式 任何Linux汇编 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM 汇编的一些规范
A.5.1 文件格式 ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码. 在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编 ...
- iOS 逆向之ARM汇编
最近对iOS逆向工程很感兴趣. 目前iOS逆向的书籍有: <Hacking and Securing IOS Applications>, <iOS Hacker's Handboo ...
- linux驱动系列之arm汇编
在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.b ...
随机推荐
- 新建 Spring Mvc Web + Maven 的 maven 错误 (二)
新建项目后,可能由于哪边配置不正确,或也可能是编码问题,就有可能在创建初始就可能发生错误: 这是 pom.xml 中提示的错误,有的人说要删除 maven 的本地仓库位置:c:\用户[Users]\A ...
- Linux - trap 命令
trap 命令用于指定在接收到信号后将要采取的动作,常见的用途是在脚本程序被中断时完成清理工作.当shell接收到sigspec指定的信号时,arg参数(命令)将会被读取,并被执行. trap 信号参 ...
- linux:根据名称杀死进程
参考网址:https://www.cnblogs.com/foohack/p/5359985.html pkill -f "process_name_pattern"
- centos7 部署 docker swarm
=============================================== 2019/4/9_第3次修改 ccb_warlock 更新说 ...
- Android工程方法数超过65535的解决办法
Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.com.android.build.api.transfo ...
- [java笔记]JDK的安装和配置
1.JDK安装下载java JDK:点击下载(http://www.oracle.com/technetwork/java/javase/downloads/index.html )JDK(Java ...
- 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)(转)
前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...
- .NetCore中使用ExceptionLess 添加操作日志
上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...
- hdu 5443 (2015长春网赛G题 求区间最值)
求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 2 ...
- Docker 简介与shell操作使用
一.Docker概述 1.Docker简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术:Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去 ...