
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)
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月15日 06时01分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【HTTP】HTTP状态码图解
2019-03-05
《图解TCP/IP》学习——第六章TCP与UDP
2019-03-05
双系统基础上装三系统教程
2019-03-05
Android低级错误踩坑之Application
2019-03-05
android自定义无边框无标题的DialogFragment替代dialog
2019-03-05
获取android的所有挂载路径(转)
2019-03-05
记录一下写的一个java生成不带重复数的随机数组(算法没有详细设计,只实现功能)
2019-03-05
androidstudio同步的时候下载jcenter的库出错解决办法
2019-03-05
ButterKnife使用问题
2019-03-05
React学习笔记(一)
2019-03-05
低代码平台快速开发小程序
2019-03-05
vue学习笔记
2019-03-05
低代码后续发展路线图
2019-03-05
MobX 学习 - 04 TodoList 案例
2019-03-05
MobX 学习 - 06 异步任务、rootStore、数据监测
2019-03-05
react: antd 中 table 排序问题
2019-03-05
FPGA学习网站推荐
2019-03-05
LeetCode:面试题46. 把数字翻译成字符串(C语言)
2019-03-05