c语言背后的运行机制
2016-03-05 22:21
288 查看
目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识
实验代码
#include <stdio.h> int g(int x) { return x + 3; } int f(int x) { return g(x); } int main(void) { return f(8) + 1; }
实验过程
编译
1.使用cd Desktop切换至桌面2.使用touch 1-1.c在桌面建立1-1.c这个文件
3.在1-1.c这个文件中输入我们的代码,保存
4.使用此命令gcc –S –o main.s main.c -m32编译成汇编代码。
结果
![](http://images2015.cnblogs.com/blog/511266/201603/511266-20160305203545237-1354823002.png)
![](http://images2015.cnblogs.com/blog/511266/201603/511266-20160305203612096-1388636178.png)
![](http://images2015.cnblogs.com/blog/511266/201603/511266-20160305203633721-738011217.png)
![](http://images2015.cnblogs.com/blog/511266/201603/511266-20160305203657518-1396316552.png)
![](http://images2015.cnblogs.com/blog/511266/201603/511266-20160305203808752-1025874258.png)
逐行分析
main:pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)
movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位
subl $0x4,%esp 将栈顶向上移动一位
movl 8,(%esp) 将参数8放进esp指向的内存
call f 跳转到函数f
f:
pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)
movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位
subl $0x4,%esp 将栈顶向上移动一位
movl 8(%ebp),(%eax)将8这个数字赋给eax寄存器(eax用于函数返回值使用)
movl %eax,(%esp)将eax的值写入内存
call g 跳转到函数g
g:
pushl %ebp 栈顶向上,开辟出一块新的内存,将栈底的内存地址放到栈顶(运算完成时函数能跳转回来)
movl %esp,%ebp 将esp寄存器的值赋给给ebp,使栈底向上移一位
movl 8(%ebp),%eax 将8赋给eax
addl $3,eax 执行8+3
popl %ebp 退栈
ret 返回函数f
f:
leave 删除为函数参数建立的空间
ret 返回main函数
main:
addl $1,%eax eax+1
leave 删除为函数参数建立的空间
ret 返回
实验感悟
在计算机中通过对内存堆栈的操作函数的执行,跳转和参数的传递。另外通过对学习汇编能让我们理解程序运行的机制,帮助我们写出精简的代码,提高效率相关文章推荐
- 串及其操作(C语言版)
- 从C++到Qt(命令行编译,讲解原理)
- 智能指针下的多态
- C++知识小记
- C++编码规范
- C++设计模式之桥接模式
- c语言中数组与sizeof()
- C++ 实现一个日期类
- C++ volatile
- c++ 继承 多重继承 多态性 虚函数
- 重建二叉树(C++递归实现)
- C/C++中的sizeof运算符
- 单片机C语言 if与#if
- C++11 智能指针——unique_ptr
- C++多态与可变参数混搭的奇妙之处
- 怎么用C语言编 电影院售票系统
- C语言中易错的问题(持续更新)
- C++程序员面试宝典——基本概念易错题
- C++中引用与指针的区别(详细介绍)
- static 和 const