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

本文共 2876 字,大约阅读时间需要 9 分钟。

Linux环境下(mac)


gcc -g -c -o main.o main.c
objdump -S -d main.o > main.o.s


#include <stdio.h>int arrayT(int b[2]){    b[0] = 10;    b[1] = 11;    return  0;}int main(int argc, const char * argv[]) {    int a[2];    a[0] = 1;    a[1] = 2;    arrayT(a);    return 0;}

main函数反汇编


0000000000000030 _main:; int main(int argc, const char * argv[]) {      30: 55                           	pushq	%rbp      31: 48 89 e5                     	movq	%rsp, %rbp      34: 48 83 ec 20                  	subq	$32, %rsp      38: 48 8d 45 f0                  	leaq	-16(%rbp), %rax   ;将a数组第一个元素的地址赋值给寄存器rax      3c: 48 8b 0d 00 00 00 00         	movq	(%rip), %rcx      43: 48 8b 09                     	movq	(%rcx), %rcx      46: 48 89 4d f8                  	movq	%rcx, -8(%rbp)      4a: c7 45 ec 00 00 00 00         	movl	$0, -20(%rbp)      51: 89 7d e8                     	movl	%edi, -24(%rbp)      54: 48 89 75 e0                  	movq	%rsi, -32(%rbp);     a[0] = 1;      58: c7 45 f0 01 00 00 00         	movl	$1, -16(%rbp)     ;a数组第一个元素的首地址;     a[1] = 2;      5f: c7 45 f4 02 00 00 00         	movl	$2, -12(%rbp)     ;a数组第二个元素的首地址;     arrayT(a);      66: 48 89 c7                     	movq	%rax, %rdi        ;调用函数_arrayT之前将rax(a数组第一个元素的地址)赋值给寄存器rdi      69: e8 00 00 00 00               	callq	0 <_main+0x3e>    ;调用函数_arrayT      6e: 48 8b 0d 00 00 00 00         	movq	(%rip), %rcx      75: 48 8b 09                     	movq	(%rcx), %rcx      78: 48 8b 55 f8                  	movq	-8(%rbp), %rdx      7c: 48 39 d1                     	cmpq	%rdx, %rcx      7f: 0f 85 08 00 00 00            	jne	8 <_main+0x5d>      85: 31 c0                        	xorl	%eax, %eax;     return 0;      87: 48 83 c4 20                  	addq	$32, %rsp      8b: 5d                           	popq	%rbp      8c: c3                           	retq      8d: e8 00 00 00 00               	callq	0 <_main+0x62>      92: 0f 0b                        	ud2

 arrayT函数反汇编


; int arrayT(int b[2]){       0: 55                           	pushq	%rbp       1: 48 89 e5                     	movq	%rsp, %rbp       4: 31 c0                        	xorl	%eax, %eax       6: 48 89 7d f8                  	movq	%rdi, -8(%rbp)    ;在函数_arrayT之内,将rdi(a数组第一个元素的地址)赋值给地址为rbp-8的栈内存处;     b[0] = 10;       a: 48 8b 4d f8                  	movq	-8(%rbp), %rcx    ;在函数_arrayT之内,将地址为rbp-8的栈内存处的值赋值给rcx,                                                                  ;就这样寄存器rcx的值就是实参a数组第一个元素的地址 (%rcx)就能取到实参a数组第一个元素的值       e: c7 01 0a 00 00 00            	movl	$10, (%rcx)       ;     b[1] = 11;      14: 48 8b 4d f8                  	movq	-8(%rbp), %rcx      18: c7 41 04 0b 00 00 00         	movl	$11, 4(%rcx);     return  0;      1f: 5d                           	popq	%rbp      20: c3                           	retq      21: 66 2e 0f 1f 84 00 00 00 00 00	nopw	%cs:(%rax,%rax)      2b: 0f 1f 44 00 00               	nopl	(%rax,%rax)

 

上一篇:PN结在高掺杂的情况下,耗尽层宽度为什么变窄
下一篇:c语言(基本数据类型)实参与形参传值 用汇编理解

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月15日 06时01分37秒