博客
关于我
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/

你可能感兴趣的文章
【Java】寻找数组中“主要元素”
查看>>
达梦数据库主备部署
查看>>
P1455 搭配购买(并查集+dp)
查看>>
P3367 【模板】并查集(并查集)
查看>>
线段树练习题一(离散化)
查看>>
2020.9.12 SSL普及组模拟(第4题)(树)(暴力邻接表80)
查看>>
Codeforces 1400E Clear the Multiset(贪心 + 分治)
查看>>
JDBC连接数据库
查看>>
嵌入式系统设计师学习笔记⑥:存储器的层次架构及Cache详解
查看>>
codeforces255C.Almost Arithmetical Progression
查看>>
2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
查看>>
服务器下载部署配置nginx,实现nginx代理多个项目
查看>>
算法笔记之快速幂
查看>>
P1125 [NOIP2008 提高组] 笨小猴 (Java)
查看>>
HDU1559(二维前缀和模板 Java&C++)
查看>>
ASP.NET AJAX---UpdatePanel控件小实例(时间的局部更新&条件更新)
查看>>
ASP.NET javascript实现图片切换
查看>>
ASP.NET jQuery 小实例(实现图片的放大&缩小)
查看>>
IIS express web 无法启动服务器
查看>>
“/”应用程序中的服务器错误。
查看>>