反汇编一个简单的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值赋给ebp

15.movl 8(%ebp),%eax,将ebp上两格的装的值赋给eax

16.addl $5,%eax,给eax加5

17.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程序(杨光)的更多相关文章

  1. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

  2. 反汇编一个简单的C程序

    一.实验截图 二.汇编代码分析: cpu首先执行main函数里的pushl %ebp和movl %esp %ebp.如下图: esp减去4就是向上移动4位到1,如下图: 把1赋值给esp,如下图: c ...

  3. 利用JSP编程技术实现一个简单的购物车程序

    实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...

  4. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    秦鼎涛  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验一 通过汇编一个简单的C程序,分析汇编代码 ...

  5. 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  6. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  7. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  8. 一个简单的flask程序

    初始化 所有Flask程序都必须创建一个程序实例. 程序实例是Flask类的对象,经常使用下述代码创建: from flask import Flask app = Flask(__name__) F ...

  9. 输出多行字符的一个简单JAVA小程序

    public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...

随机推荐

  1. 关于MVC开发时,无法找到area的问题记录

    解决方法: 检查area=admin 的dll是否生成,一般都是admin域生成dll导致

  2. 聊聊MySQL的子查询

    1. 背景 在之前介绍MySQL执行计划的博文中已经谈及了一些关于子查询相关的执行计划与优化.本文将重点介绍MySQL中与子查询相关的内容,设计子查询优化策略,包含半连接子查询的优化与非半连接子查询的 ...

  3. 网络侦查与网络扫描-P201421410029

    中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告   实验一 网络侦查与网络扫描     学生姓名 李政浩 年级 2014 ...

  4. CSS2.0实现面包屑

    CSS2.0实现面包屑 面包屑这样的 我们以前都是用背景图片做这块工作,但是直到大概2个星期之前在新浪微博上看到用css3.0实现这样的面包屑 但是目前情况下IE6-8并不支持css3.0 只有标准游 ...

  5. 编程检查d:\test.txt文件是否存在,若在则显示该文件的名称和内容。

    下面放两种方法 老师写的: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  6. Vue表单输入绑定(文本框和复选框)

    文本框 <!DOCTYPE html><html>    <head>        <meta charset="utf-8">  ...

  7. Android 在测试阶段当出现多个测试服务器地址时打包的小技巧

    前提:服务端没有做特殊处理 在开发android网络客户端项目时,不可避免的会用到“测试服务器地址”和“云端服务器地址”等.(有时可能会有多个) 这时在打包给测试那帮哥们时,你就需要一个服务器地址打上 ...

  8. CUDA2.4-原理之性能优化及浮点运算

    本部分来自于<大规模并行处理器编程实战>第六章.第七章.打算不再看这本书了,准备看<programming massively parallel processors 2nd> ...

  9. 虚拟机上不能使用CUDA

    虚拟机的显卡是虚拟的,不能使用CUDA(至少很难),搞了一天才晃过神来: lspci 查找目前主机的硬件配备 用 grep -i 进行大小写无关的搜索

  10. 【实战】verilog中`define的使用记录

    背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...