c语言(基本数据类型)实参与形参传值 用汇编理解
发布日期:2021-05-08 07:47:54 浏览次数:9 分类:原创文章

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

 

上一篇:c语言(数组)实参与形参传值 用汇编理解
下一篇:汇编学习

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月19日 02时12分09秒