实验---反汇编一个简单的C程序(杨光)
反汇编一个简单的C程序
攥写人:杨光 学号:20135233
( *原创作品转载请注明出处*)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )
实验要求:
实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用
gcc –S –o main.s main.c -m32 命令编译成汇编代码,
代码如下:
int g(int x)
{
return x + 5;
} int f(int x)
{
return g(x);
} int main(void)
{
return f(33) + 1;
} 实验过程及截图:
1.进入实验楼,进入Code文件夹
2.使用vi创建yangguang.c文件
3.完成代码写入,使用wq命令保存退出
4.使用gcc -S -o yangguang.s yangguang.c -m32 将yangguang.c编译成汇编代码yangguang.s
5.使用vi打开yangguang.s
6.将以"."开头的行删去,得到纯净的汇编代码实验分析:栈的变化 (代码的橘黄下划线代表当前eip执行位置)
1.开始时eip指向19行,ebp esp都在0位置(右边的01234是为了方便分析所设)
2.pushl %ebp,将ebp值压栈
3.movl %esp,%ebp,将esp值赋给ebp
4.subl $4,%esp,将esp向下移一格
5.movl $33,(%esp),将33存入此时esp所指的位置
6.call f,调用f函数,将eip 24压栈,此时eip指向f函数
7.pushl %ebp,将此时ebp值压栈
8.movl %esp,%ebp,将esp值赋给ebp
9.subl $4,%esp,esp向下移一格
10.movl 8(%ebp),%eax,将ebp向上两格装的值赋给eax
11.movl %eax,(%esp),将eax的值赋给esp此时指向的格
12.call g,调用g函数,eip 16压栈,此时eip指向g函数
13.pushl %ebp,将此时ebp值压栈14.movl %esp,%ebp,将esp值赋给ebp15.movl 8(%ebp),%eax,将ebp上两格的装的值赋给eax16.addl $5,%eax,给eax加517.popl %ebp,弹栈,此时ebp赋值为栈中所存的ebp 4,esp缩进退一格
18.ret,弹栈,此时eip赋值为栈中所存eip 16,esp缩进一格
19.leave(leave指令为如下步骤)
故先 movl %ebp,%esp,将ebp赋值给esp
然后弹栈,此时ebp指向弹栈的ebp 1,esp缩进一格
20.ret,弹栈,此时eip指向弹栈的eip 24.
21.addl $1,%eax,将eax加1
22.leave操作(先 movl %ebp,%esp,将ebp赋值给esp)
然后弹栈,此时ebp指向弹栈的ebp 0,esp缩进一格综上,就是该程序在执行时,栈的变化的图片分析及步骤说明 总结 这次实验让我明白了,在一个程序运行的过程中,计算机究竟是如何工作的。实际上就是cpu中的ip寄存器,(16位是ip 32位是eip 64位是rip)自加的情况下一条接一条的实行内存中的指令的过程。
本次课程不算困难,但是由于实验报告需要分析每一步的栈的变化,所以画图画的我有一些焦灼,不过能学到知识,我还是很开心的~
实验---反汇编一个简单的C程序(杨光)的更多相关文章
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http: ...
- 反汇编一个简单的C程序
一.实验截图 二.汇编代码分析: cpu首先执行main函数里的pushl %ebp和movl %esp %ebp.如下图: esp减去4就是向上移动4位到1,如下图: 把1赋值给esp,如下图: c ...
- 利用JSP编程技术实现一个简单的购物车程序
实验二 JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
秦鼎涛 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Go开发一个简单的服务器程序
最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...
- 一个简单的flask程序
初始化 所有Flask程序都必须创建一个程序实例. 程序实例是Flask类的对象,经常使用下述代码创建: from flask import Flask app = Flask(__name__) F ...
- 输出多行字符的一个简单JAVA小程序
public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...
随机推荐
- python openpyxl.md
Openpyxl 创建一个工作簿 下面是创建一个工作簿.而每个工作簿至少一个工作表我们可以通过active获取正在运行的工作表. In [1]: from openpyxl import Workbo ...
- 【转】form data和request payload的区别
HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: <form action="form_action.asp&qu ...
- oracle中over函数
1.oracle中按一个字段分组排序后取第一条数据. SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字符 D ...
- Tomcat主页404错误
单独启动Tomcat正常,但是通过Eclipse启动(这时启动也是正常的)后,访问Tomcat主页报404错误. 在网上找到了解决办法:http://www.jb51.net/article/8283 ...
- 用ESP8266+android,制作自己的WIFI小车(ESP8266篇)
整体思路ESP8266作为TCP服务器,,手机作为TCP客户端,自己使用Lua直接做到了芯片里面,省了单片机,,节约成本,其实本来就是个单片机(感觉Lua开发8266真的很好,甩AT指令好几条街,,而 ...
- C#抽象类与抽象方法--就是类里面定义了函数而函数里面什么都没有做的类
看一下代码应该就可以了 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...
- Mac软件推荐
其他: AP文档浏览器+代码片段管理工具:Dash 抓包工具:Charles 使用教程:http://www.cnblogs.com/dsxniubility/p/4621314.html 音乐播放 ...
- 03-Maven坐标管理
1.什么是坐标? 2.坐标的详细概念 3.Maven包引用
- 大数据入门第二十四天——SparkStreaming(一)入门与示例
一.概述 1.什么是spark streaming Spark Streaming is an extension of the core Spark API that enables scalabl ...
- 20155206 Exp8 WEB基础实践
20155206 Exp8 WEB基础实践 基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以 ...





实验分析:栈的变化 (代码的橘黄下划线代表当前eip执行位置)























综上,就是该程序在执行时,栈的变化的图片分析及步骤说明
总结
这次实验让我明白了,在一个程序运行的过程中,计算机究竟是如何工作的。实际上就是cpu中的ip寄存器,(16位是ip 32位是eip 64位是rip)自加的情况下一条接一条的实行内存中的指令的过程。