博客
关于我
c语言(基本数据类型)实参与形参传值 用汇编理解
阅读量:372 次
发布时间:2019-03-05

本文共 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/

你可能感兴趣的文章
十大排序算法之三:插入排序(Python)
查看>>
利用Python实现循环队列
查看>>
利用递归实现二叉树的前中后序遍历(Python)
查看>>
Python刷题输入输出
查看>>
冒泡排序又来啦(C/C++版本)
查看>>
python负数存储
查看>>
求二维数组中最大值的位置
查看>>
python中sort和sorted的区别
查看>>
vue中echart数据动态切换,一看就懂
查看>>
maven安装
查看>>
合并两个有序数组
查看>>
Ubuntu 环境下使用中文输入法
查看>>
聊聊我的五一小假期
查看>>
面向对象之异常处理:多路捕获
查看>>
Python简易五子棋
查看>>
MySQL8.0.19 JDBC下载与使用
查看>>
Vue新建项目——页面初始化
查看>>
Cent OS 7.6 服务器软件安装(这篇博客主要是为了方便我配置云主机的)
查看>>
Node.js包使用系列(一)——修改NPM全局下载和缓存路径
查看>>
TDengine使用(一)——TDengine下载与安装
查看>>