arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作
来源:互联网 发布:arttemlate渲染数据 编辑:程序博客网 时间:2024/05/22 17:11
下面来看个例子,很简单的一个例子,但子函数有大量的形参(10个),以此来看看函数调用过程是如何做形参和实参的复制。
//main.c
#include <stdio.h>
int fun(int n0,int n1,int n2,int n3,int n4,int n5,int n6,int n7,int n8,int n9)
{
int m;
m=n0+n1+n2+n3+n4+n5+n6+n7+n8+n9;
return m;
}
void main(void)
{
int num;
num=fun(1,2,3,4,5,6,7,8,9,10);
}
在Linux操作系统下,经过arm-linux-gcc -S main.c -o main.s后,得到main.s:
//main.s
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 18, 4
.file "main.c"
.text
.align 2
.global fun
.type fun, %function
fun:
@ Function supports interworking.
@ args = 24, pretend = 0, frame = 24
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #28
str r0, [fp, #-16]
str r1, [fp, #-20]
str r2, [fp, #-24]
str r3, [fp, #-28]
ldr r2, [fp, #-16]
ldr r3, [fp, #-20]
add r2, r2, r3
ldr r3, [fp, #-24]
add r2, r2, r3
ldr r3, [fp, #-28]
add r2, r2, r3
ldr r3, [fp, #4]
add r2, r2, r3
ldr r3, [fp, #8]
add r2, r2, r3
ldr r3, [fp, #12]
add r2, r2, r3
ldr r3, [fp, #16]
add r2, r2, r3
ldr r3, [fp, #20]
add r2, r2, r3
ldr r3, [fp, #24]
add r3, r2, r3
str r3, [fp, #-8]
ldr r3, [fp, #-8]
mov r0, r3
add sp, fp, #0
ldmfd sp!, {fp}
bx lr
.size fun, .-fun
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4 #这里是关键
sub sp, sp, #32 #这里是关键
mov r3, #5
str r3, [sp, #0]
mov r3, #6
str r3, [sp, #4]
mov r3, #7
str r3, [sp, #8]
mov r3, #8
str r3, [sp, #12]
mov r3, #9
str r3, [sp, #16]
mov r3, #10
str r3, [sp, #20]
mov r0, #1 #这里是关键
mov r1, #2 #这里是关键
mov r2, #3 #这里是关键
mov r3, #4 #这里是关键
bl fun
mov r3, r0
str r3, [fp, #-8]
sub sp, fp, #4
ldmfd sp!, {fp, lr}
bx lr
.size main, .-main
.ident "GCC: (ctng-1.6.1) 4.4.3"
.section .note.GNU-stack,"",%progbits
就是说,在arm编程里,函数调用过程中,子函数的参数值传递按顺序存放在r0,r1,r2,r3里,超过4个参数值传递放栈帧里(不多说了,有兴趣自己慢慢去看了)。
- arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作
- arm编程,关于C函数中嵌入汇编和寄存器变量的混合使用方法。用汇编透视c语法操作
- C函数形参列表与汇编寄存器的对应关系
- 关于函数形参和实参关系的理解
- 关于C和C++中函数调用时的形参和实参
- 关于volatile关键字的用法,从汇编透视C语法操作
- ATPCS和内嵌汇编:arm处理器上函数调用寄存器的使用规则
- 关于函数调用过程中的实参和形参问题
- C的形参和实参的关系
- ARM下的C语言函数和对应的汇编代码
- C语言中函数调用、实参、形参的选择
- 一段C语言和汇编的对应分析,揭示函数调用的本质
- 关于函数实参和形参的地址传送
- 关于C语言形参和实参
- 函数调用,形参实参的变化
- ARM汇编与C语言混合编程之汇编调用C函数
- 8.3 C语言函数的形参和实参
- 关于C语言中一,二级指针函数中的使用和c语言中和函数发生调用时,实参和形参都会占用内存吗?
- 树莓派搭建Openvpn(二)使用UserPass方式登录
- JS数组排序-面试经常遇到的问题
- make出现遗漏分隔符是必须要明白的小知识以及解决之道
- hdu3555 模板化数位dp
- C++中引用与指针的区别(详细介绍)
- arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作
- 有关java并发程序同步概念的全部意义
- cmake使用多线程
- bzoj 2154: Crash的数字表格
- redhat6.5双网卡bond
- Codeforce 429B(递推)
- 计算几何之基础篇
- 面试题05:求子数组的最大和
- Android基础控件 - ListView