计算机是如何工作的

反汇编一个简单的C程序

1、在实验环境下,创建main.c,并进入该文件进行代码的编写

在VIM文本编辑器中编写完代码后按“Shift”+“:”,发现没有进入预想的命令模式,查阅后发现需要先按“Esc”进入命令模式,再按“Shift”+“:”,然后输入“wq”即可进行保存。

2、对main.c文件进行直接编译,并查看程序的返回值

从下图可以看到开始时输入查看程序返回值的命令后一直没有正确返回,起初认为main.c没有编译成功,但是查看后a.out文件是存在的,最后发现在输入echo $?命令时少了“?”。所以一个小小的问题都会引起结果的错误,在输入命令时要格外认真。

3、将main.c编译成汇编代码


对main.s进行简化,以便分析汇编代码,结果如下:

4、分析汇编代码

整个程序包含main、f、g三个函数,在运行过程堆栈的变化如下:


程序从main 函数开始执行,具体过程如下:

  • 第18行:pushl %ebp,ESP的地址减4即ESP指向标号1,将EBP寄存器的值放到栈顶;
  • 第19行:movl %esp,%ebp,将EBP指向ESP所指的位置即标号1;
  • 第20行:subl $4,%esp,ESP寄存器减4 即ESP指向标号2;
  • 第21行:movl $1,(%esp) ,将立即数1放入到ESP所指向的位置,为即将调用的f函数做准备;
  • 第22行:call f, 把EIP的值23压入栈顶,再将函数f的第一条指令的位置9放到EIP中,ESP指向标号3;
  • 第9行:pushl %ebp, ESP指向标号4,将EBP寄存器的值放到栈顶;
  • 第10行:movl %esp,%ebp, 将EBP指向ESP所指的位置即标号4;
  • 第11行:subl $4,%esp,ESP寄存器指向标号5;
  • 第12行:movl $8(%ebp),%eax ,EBP寄存器变址寻址,EBP寄存器的值加8,指向立即数为1的位置,将立即数1放到EAX寄存器中;
  • 第13行:movl %eax,(%esp), 将EAX中存储的立即数1放到ESP所指的位置;
  • 第14行:call g,把EIP的值即15压入栈顶,再将函数g的第一条指令的位置2放到EIP中,ESP指向标号6;
  • 第2行:pushl %ebp, ESP指向标号7,将EBP寄存器的值放到栈顶;
  • 第3行:movl %esp,%ebp,将EBP指向ESP所指的位置,并且EIP的值加一,指向8(%ebp),%eax。
  • 第4行:movl 8(%ebp),%eax,EBP寄存器变址寻址,EBP寄存器的值加8,指向立即数为1的位置,将立即数1放到了EAX寄存器中;
  • 第5行:addl $5,%eax,将立即数5加到EAX中,EAX的值即1+5为6;
  • 第6行:popl %ebp,恢复函数f的函数调用堆栈基址EBP寄存器,即EBP指向标号4,ESP指向标号6;
  • 第7行:ret ,将ESP寄存器所指向的栈空间存储单元放到EIP寄存器中,即EIP指向第15行指令,ESP指向标号5;
  • 第15行:leave ,撤销函数堆栈,EBP指向标号1,ESP指向标号3;
  • 第16行:ret ,将ESP寄存器所指向的内容放到EIP寄存器中,即EIP指向第23行指令,ESP指向标号2;
  • 第23行:add $9,%eax, 把EAX寄存器立即数加9,即6+9为15。EAX存储器是默认存储函数返回值的寄存器;
  • 第24行:leave,撤销函数main的堆栈;

2019-2020-1 20199319《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 黑马lavarel教程---7、文件上传

    黑马lavarel教程---7.文件上传 一.总结 一句话总结: 在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的. 1.在lavar ...

  2. 鬼知道NOI会不会成为下一个奥数

    认真写作文不可能的,这辈子不可能认真写作文的. (月考,期末考,高考即将到达战场,真香警告) 以下应该成为原稿!!! 真.喜欢写感悟,但我感觉我可能把它写的有点商业化,商业化的文章不可能放的,所以我尽 ...

  3. java中常见异常总汇,附解释

    Java Exception: 1.Error 2.Runtime Exception 运行时异常3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系统 ...

  4. Linux_基础指令

    目录 目录 前言 cd和pwd ls cat du mkdir touch rm cp mv which whereis find ln head和tail wc tar vim useradd 添加 ...

  5. linux配置多个ip

    linux配置多个ip /sbin/ifconfig eth0:1 172.19.121.180 broadcast 172.19.121.255  netmask 255.255.255.0 up ...

  6. 新增存储用Parted分区并建LVM卷

    新增存储用Parted分区并建LVM卷 一,Parted分区 1,parted分区  www.ahlinux.com # parted /dev/sda GNU Parted 2.1 使用 /dev/ ...

  7. 大觅网07day

    分布式日志环境的构建(ELK+Kafka) 主要是搭建分布式日志环境,由ELK+Kafka实现,分为以下四步实现: 一.Elasticsearch环境的搭建和测试 1.删除已经存在的ES容器和镜像,如 ...

  8. 【Ruby on Rails 学习六】Ruby 类 的入门

    1.什么是类 2.类与实例的区别 3.自定义简单的类 生活中的垃圾分类,是集合上的概念 比如数学上的   1  a  2  b  c  4  5分类为数字1 2 4 5 ,字母  a  b  c ir ...

  9. c++工厂模式和多线程结合

    void a::create() { Function *f1 = m_functionmanager.CreateFunction(1);Function *f2 = m_functionmanag ...

  10. Hbase的几个关键问题(转自log.csdn.net/javastart/article/details/43772575)

    什么是HBase?何时用HBase?与Hive.Pig的区别?HBase的结构为何HBase速度很快?HBase常用的操作有哪些?HBase的一些配置和监控 什么是HBase? HBase,是Hado ...