c语言(基本数据类型)实参与形参传值 用汇编理解

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值