《Linux内核分析》week1作业-分析一个简单c语言的汇编代码
1.C语言源码
#include <stdio.h>
int g(int x){
return x+;
}
int f(int x){
return g(x);
}
int main(){
return f()+;
}
2.生成汇编代码
gcc命令
gcc -S -o main.s main.c -m32

3.汇编代码分析
首先程序从main函数开始运行
pushl %ebp
movl %esp,%ebp 这两步是建立自己的堆栈,
subl $,%esp
movl $,(%esp) 这两步是将数值8放入%esp所指的栈内存中。
call f 进入f函数, call 等价于 push %eip movl f %eip,将指令23行入栈,然后将eip寄存器指向f函数首地址。
call f之后,eip指向f函数的首地址
pushl %ebp
movl %esp,%ebp //建立f函数自己的堆栈
subl $, %esp
movl (%ebp),%eax //将f函数中传来的参数8存入eax寄存器中。
movl %eax,(%esp) //将eax寄存器中的值(8)存入esp指向的栈内存中
call g //进入g函数 ,将g指令的下一行入栈,然后使eip寄存器指向g函数的首地址。
call g之后,eip指向g函数的首地址
前面的指令类似,
pop %ebp //将g函数的堆栈基地址重新复制给ebp.
ret //等价于 pop %eip,使得g函数返回至f上次最后执行的下一条指令
f继续执行leave ret两条指令 两条指令的作用就是让程序又重新回到main函数中上次执行的最后一条指令到下一条指令。
最后对exa 加1,获取最后计算的结果。
4.总结
通过上述的实验,让我更加深刻的理解了计算机程序存储工作的原理。计算机内存中顺序存放着指令,通过顺序执行指令来对数据进行操作而获取最后的结果。
《Linux内核分析》week1作业-分析一个简单c语言的汇编代码的更多相关文章
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
- 一个简单C程序的汇编代码分析
几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 int g(int x) { ; } int f(int ...
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
前言说明 本篇为网易云课堂Linux内核分析课程的第七周作业,本次作业我们将具体来分析exec*函数对应的系统调用处理过程,来分析Linux内核如何来执行一个可执行程序,由于有一个在网易云课堂共同学习 ...
- linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序
一.编译链接的过程和ELF可执行文件格式 vi hello.c gcc -E -o hello.cpp hello.c -m32 //预处理.c文件,预处理包括把include的文件包含进来以及宏替换 ...
- Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序
Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...
- linux内核SPI总线驱动分析(一)(转)
linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析 (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...
- 作业七:Linux内核如何装载和启动一个可执行程序
作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上 ...
- Linux内核态抢占机制分析(转)
Linux内核态抢占机制分析 http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive ...
随机推荐
- windows下bat批处理实现守护进程(有日志)
开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windo ...
- 14.3 InnoDB Multi-Versioning InnoDB 多版本
14.3 InnoDB Multi-Versioning InnoDB 多版本 InnoDB 是一个多版本的存储引擎,它保持信息关于改变的数据老版本的信息, 为了支持事务功能比如并发和回滚. 这些信息 ...
- !!!全球最流行开源硬件平台!不知道就OUT了!
全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...
- Centos6.5 qt 安装
1,centos linux系统必须预先以安装x Server(KDE or GNOME) 2,wget http://download.qt-project.org/official_release ...
- treap修订
#include<cstdio> #include<cmath> #include<algorithm> #include<ctime> #includ ...
- 修改CKFinder上传路径
一.CKFinder的若干问题 1.单独使用 ckfinder从原fckeditor分离出来以后可以单独使用,通常我习惯于在工具栏中添加ckfinder.dll,这样以后要使用ckfinder直接从工 ...
- C++ —— 类模板的分离式编译
目录 对于C++中类模板的分离式编译的认识 具体的实例 1.对于C++中类模板的分离式编译的认识 为什么C++编译器不能支持对模板的分离式编译(博文链接) 主要内容:编译器编译的一般工作原理.对模版的 ...
- ASP.NET MVC框架开发系列课程 (webcast视频下载)
课程讲师: 赵劼 MSDN特邀讲师 赵劼(网名“老赵”.英文名“Jeffrey Zhao”,技术博客为http://jeffreyzhao.cnblogs.com),微软最有价值专家(ASP.NET ...
- <五>读《《大话设计模式》》之工厂模式
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...
- Understand Rails Authenticity Token
翻译整理自: http://stackoverflow.com/questions/941594/understand-rails-authenticity-token 主要翻译的是第一个回答,另外结 ...