本文共 2569 字,大约阅读时间需要 8 分钟。
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
转载地址:http://lmnwz.baihongyu.com/