C语言的运行机制
目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识
实验代码

1 #include <stdio.h>
2
3 int g(int x)
4 {
5 return x + 3;
6 }
7
8 int f(int x)
9 {
10 return g(x);
11 }
12
13 int main(void)
14 {
15 return f(8) + 1;
16 }

实验过程
编译
1.使用cd Desktop切换至桌面
2.使用touch 1-1.c在桌面建立1-1.c这个文件
3.在1-1.c这个文件中输入我们的代码,保存
4.使用此命令gcc –S –o main.s main.c -m32编译成汇编代码。
结果
逐行分析
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语言的运行机制的更多相关文章
- 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制
内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...
- java语言的运行机制
计算机高级编程语言按其程序的执行方式可分为编译型语言和解释型语言. 编译型语言是指使用专门的编译器,针对特定的操作系统将源程序代码一次性翻译成计算机能识别的机器指令.例如C.C++等都属于编译型语言. ...
- 谈谈java的运行机制
1.高级语言的运行机制 我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写的 ...
- javascript运行机制之执行顺序详解(转)
转自http://www.admin10000.com/document/3385.html JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言, ...
- 浅谈C++/JAVA/C#运行机制和执行效率
估计有很多同学都对C++/JAVA/C#这三大热门语言的运行机制和执行效率有或多或少的困惑,自己也有,但是经过前期的学习,了解了三者在这两方面的区别,就废话不说了,进入主题吧. 一.运 ...
- JavaScript 运行机制之执行顺序详解
JavaScript是一种描述型脚本语言,它不同于 Java 或 C# 等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解 JavaScript 语言的运行机制 ...
- 理解JAVA与C的运行机制
1.java的运行机制 java的编译过程,将java的源程序(扩展名为.java的文件),由java编译程序将java的字节码文件(.class文件)在jvm上运行,机器码有cpu运行, jvm编译 ...
- 1、Java语言概述与开发环境——Java程序运行机制
Java语言是一种特殊的高级语言,它既有解释型语言的特性,也具有编译型语言的特征,因为Java要经过先编译后解释两个步骤. 一.高级语言的运行机制 计算机高级语言按程序的执行方式可以分为编译型和解释型 ...
- 浅析Go语言的Interface机制
前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...
随机推荐
- Qt Creator Valgrind内存分析前端(分析Nginx内存)
Linux上使用Qt Creator进行C/C++开发http://my.oschina.net/eechen/blog/166969Qt Creator GDB调试前端(调试Nginx):http: ...
- Linxu安装Lamp环境
安装MySQL数据库 sudo apt-get install mysql-server mysql-client 下图为提示输入数据库密码,然后回车,之后还有提示,再重复输入一次,再回车 最后安装完 ...
- 14.5.2.2 autocommit, Commit, and Rollback
14.5.2.2 autocommit, Commit, and Rollback 在InnoDB,所有的用户活动发生在一个事务里, 如果自动提交模式是启用的, 每个SQL语句形成一个单独的事务.默认 ...
- Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞
漏洞名称: Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞 CNNVD编号: CNNVD-201307-488 发布时间: 201 ...
- 数学(矩阵乘法):HDU 4565 So Easy!
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- C#代码实现隐藏任务栏、开始菜单和禁用任务管理
一:截图,主要是调用系统接口和更改注册表实现功能 二:代码 using System; using System.Collections.Generic; using System.Linq; usi ...
- HDOJ 3466 Proud Merchants
Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...
- How To Create a New User and Grant Permissions in MySQL
How to Create a New User Let’s start by making a new user within the MySQL shell: CREATE USER 'newus ...
- [Locked] Binary Tree Vertical Order Traversal
Binary Tree Vertical Order Traversal Given a binary tree, return the vertical order traversal of its ...
- 简单的FIRST+集演示程序
/* * 该程序用于计算某个非终结符的 FIRST+ 集合 * RexfieldVon * 2013年6月30日16:02:47 */ #include <stdio.h> #includ ...