Linux环境下(mac)
(基本数据类型)实参先传给寄存器,然后调用函数。在函数内形参先分配栈内存,然后将寄存器的值赋值给相应的形参栈内存,实现形参实参数值传递。
gcc -g -c -o main.o main.c
objdump -S -d main.o > main.o.s
#include <stdio.h>
int addSum(int d,int e,int f){
int g = d + e + f;
return g;
}
int main(int argc, const char * argv[]) {
int a = 1;
int b = 2;
int c = 3;
addSum(a,b,c);
return 0;
}
main函数反汇编
0000000000000020 _main:
; int main(int argc, const char * argv[]) {
20: 55 pushq %rbp
21: 48 89 e5 movq %rsp, %rbp
24: 48 83 ec 20 subq $32, %rsp
28: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
2f: 89 7d f8 movl %edi, -8(%rbp)
32: 48 89 75 f0 movq %rsi, -16(%rbp)
; int a = 1;
36: c7 45 ec 01 00 00 00 movl $1, -20(%rbp)
; int b = 2;
3d: c7 45 e8 02 00 00 00 movl $2, -24(%rbp)
; int c = 3;
44: c7 45 e4 03 00 00 00 movl $3, -28(%rbp)
; addSum(a,b,c);
4b: 8b 7d ec movl -20(%rbp), %edi ; 实参 a 传给寄存器 edi
4e: 8b 75 e8 movl -24(%rbp), %esi ; 实参 b 传给寄存器 esi
51: 8b 55 e4 movl -28(%rbp), %edx ; 实参 c 传给寄存器 edx
54: e8 00 00 00 00 callq 0 <_main+0x39> ; 调用addSum
59: 31 c9 xorl %ecx, %ecx
5b: 89 45 e0 movl %eax, -32(%rbp)
; return 0;
5e: 89 c8 movl %ecx, %eax
60: 48 83 c4 20 addq $32, %rsp
64: 5d popq %rbp
65: c3 retq
addSum函数反汇编
0000000000000000 _addSum:
; int addSum(int d,int e,int f){
0: 55 pushq %rbp
1: 48 89 e5 movq %rsp, %rbp
4: 89 7d fc movl %edi, -4(%rbp) ;edi寄存器传给d所在的栈内存
7: 89 75 f8 movl %esi, -8(%rbp) ;esi寄存器传给e所在的栈内存
a: 89 55 f4 movl %edx, -12(%rbp) ;edx寄存器传给f所在的栈内存
; int g = d + e + f;
d: 8b 45 fc movl -4(%rbp), %eax
10: 03 45 f8 addl -8(%rbp), %eax
13: 03 45 f4 addl -12(%rbp), %eax
16: 89 45 f0 movl %eax, -16(%rbp) ;累加的数值赋值给变量g所在的栈内存,并且赋值给eax
; return g;
19: 8b 45 f0 movl -16(%rbp), %eax ;函数返回值赋值给寄存器eax
1c: 5d popq %rbp
1d: c3 retq
1e: 66 90 nop