简单C程序生成的汇编代码分析
首先给出完整的C代码:
int g(int x)
{
return x+;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f()+;
}
使用命令:gcc –S –o hw001.s hw001.c -m32
对应生成的IA32汇编代码如图所示:



暂不分析以“.”开头的行,得到程序如下:
g:
pushl %ebp
movl %esp ,%ebp
movl (%ebp) ,%eax
addl $ ,%eax
popl %ebp
ret
f:
pushl %ebp
movl %esp ,%ebp
subl $ ,%esp
movl (%ebp) ,%eax
movl %eax ,(%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp ,%ebp
subl $ ,%esp
movl $ ,(%esp)
call f
addl $ ,%eax
leave
ret
接下来逐行分析汇编代码,主要分析堆栈指针的变化情况:
- pushl %ebp
- movl %esp ,%ebp
- subl $4 ,%esp
- movl $8 ,(%esp)
- call f
- pushl %ebp
- movl %esp ,%ebp
- subl $4 ,%esp
- movl 8(%ebp) ,%eax
- movl %eax ,(%esp)
- call g
- pushl %ebp
- movl %esp ,%ebp
- movl 8(%ebp) ,%eax
- addl $11 ,%eax
- popl %ebp
- ret
- leave
- ret
- addl $1 ,%eax
- leave
- ret


by昆仑雪狐
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
简单C程序生成的汇编代码分析的更多相关文章
- 一个简单C程序的汇编代码分析
几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 int g(int x) { ; } int f(int ...
- 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码
1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...
- start_kernel之前的汇编代码分析
start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...
- STM32F103 ucLinux开发之二(内核启动汇编代码分析)
start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...
- 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业
署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...
- STM8S汇编代码分析
转载:http://blog.csdn.net/u010093140/article/details/50021897使用STVD建立完汇编工程项目之后(具本建立方法可以看我的另一篇博文http:// ...
- 关于rt-thread调度器实现的底层代码分析
本文使用了rt-thread自带的钩子函数和显示函数进行了实验,从rt-thread自带的延时函数rt_thread_delay()函数入手,对rt-thread系统的调度器进行分析.主要参考资料 ...
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
随机推荐
- 20169212《Linux内核原理与分析》第七周作业
实验 给MenuOS增加time和time-asm命令的方法: 更新menu代码到最新版 再main()函数中增加MenuConfig 增加对应的Time函数和TimeAsm函数(这里的函数要换成我们 ...
- react native 页面跳转
React Native目前有几个内置的导航器组件,一般来说我们首推Navigator.它使用纯JavaScript实现了一个导航栈,因此可以跨平台工作 场景简单来说其实就是一个全屏的React组件. ...
- innodb log file size 配置估算以及修改
root@localhost:(none) 06:22:17>pager grep seq PAGER set to 'grep seq' root@localhost:(none) 06:30 ...
- blade and soul Group Combos
Group Combos A martial artist always make friends along their way. They learn how to work and fight ...
- 浏览器主页被hao123贱贱的篡改的一种方式
今天打开一个PDF文件(正经文件,不要想歪了),误点了一个“编辑”按钮,出来发现浏览器主页被篡改了,包括chrome和IE.通过一个网址"www.qquuu8.com"跳转到hao ...
- Windows7 安装vs2015 之后 调试Web项目IIS启动不了 aspnetcore.dll未能加载
安装windows企业版,整整折腾了两天了,一个本身家里网络环境不好,时不时掉线,终于披荆斩棘,克服了所有困难,结果VS2015 EnterPrise 版本在调试Web环境的时候,始终在任务栏里找不到 ...
- 几个实用的mysql函数
在工作中,处理数据时候往往使用php要废很多脑筋和写很多东西,如果不考虑代码的阅读性试试几个mysql的函数可以解决许多常见需求: 1.截取字符串函数: left() 从左开始截取字符串 right ...
- swift 自定义图片轮播视图
Swift封装图片轮播视图: import UIKit class XHAdLoopView: UIView { private var pageControl : UIPageControl? pr ...
- Qt中2D绘图问题总结(二)----------坐标系统
坐标系统 使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标. 逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数.QPainter的viewport ...
- TCP Socket 通讯(客户端与服务端)
/*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...