简单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 ...
随机推荐
- [转]JavaScript快速检测浏览器对CSS3特性的支持
转自:https://yuguo.us/weblog/detect-css-support-in-browsers-with-javascript/ ------------------------- ...
- JS学习笔记--仿手机发送内容交互
学习JS笔记----记录上课中学习的知识点,分享下老师教的内容: 1.html内容 <div id="box"> <div id="message&qu ...
- Java 设计模式之代理模式
1. 定义:为其它对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 2. 类图:代理对象和被代理 ...
- [转载]GlassFish 的安装及设置命令
移步: http://blog.csdn.net/joyous/article/details/8008870
- Bootstrap <基础十八>面包屑导航(Breadcrumbs)
面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...
- 1、WIN2D学习记录(win2d实现JS雨天效果)
一.Win2D Win2D是微软开源的项目 它的github地址是 https://github.com/Microsoft/Win2D 里面有详细的文档 http://microsoft.githu ...
- CDH5.4.5运行Phoenix导入CSV文件
1.安装phoenix 在界面上设置Phoenix的parcel包: http://52.11.56.155:7180/cmf/settings?groupKey=config.scm.parcel. ...
- win下Redis安装使用
官网上没有windows版本的Redis,好在github上有大牛写的win版本.地址如下https://github.com/dmajkic/redis/downloads 解压后运行目录下的red ...
- Access restriction: The type TaskTopicResolver is not accessible due to restrict
Access restriction: The type TaskTopicResolver is not accessible due to restrict : Eclipse 默认把这些受访问 ...
- PL/SQL Developer记住用户名密码
在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQL Developer ->tools-> ...