计算机是如何工作的

反汇编一个简单的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. SQL 表 数据备份

    insert into SMTTemporarySave select * from [MSV0CIMDB].[PICS_20170706].dbo.SMTTemporarySave

  2. 开源之TinyPinyin

    适用于Java和Android的快速.低内存占用的汉字转拼音库. https://github.com/promeG/TinyPinyin

  3. 第五章 SpringCloud之Eureka-Client使用RestTemplate实现服务之间的调用

    注意:这个章节,请结合前几章节一起使用,因为其要调用上一章节的服务 1.pom.xml <?xml version="1.0" encoding="UTF-8&qu ...

  4. flutter ListView嵌套高度问题

    ListView嵌套时高度无法自适应,需要设置高度才可以显示,设置以下属性可以解决上述问题 shrinkWrap: true, physics: NeverScrollableScrollPhysic ...

  5. 三十六:数据库之SQLAlchemy外建之一对一关系

    relationship()的uselist参数默认为True,即一对多,如果要一对一,则需让uselist=False 准备工作 from sqlalchemy import create_engi ...

  6. linux计划crontab

    linux计划crontab 启动crontab服务 一般启动服务用  /sbin/service crond start 若是根用户的cron服务可以用 sudo service crond sta ...

  7. 使用IDEA工具创建本地项目并且上传到码云

    需要条件: 1.码云/Github建好的git项目 2.IDEA编辑器 3.本地项目 步骤1:创建远程项目 步骤2:复制远程项目地址  注意:此处码云官方已经给出上传项目方法,不过用的是命令行的形式, ...

  8. windows 快捷键 部分

    1.快速启动任务栏锁定的任务 WIN+任务栏任务顺序(左侧开始数) 2.运行 WIN+R mstsc--->远程桌面链接 regedit--->注册表信息 services.msc---& ...

  9. 11.8 Springcloud项目简介

    各位领导好,我从毕业后做了两年Java开发工程师,刚开始都是一些SSM框架的项目,但是由于技术不断更新,微服项目成为必然的趋势,大约在做了1年的SSM框架,之后开始接触微服项目,前后经理过Dubbo和 ...

  10. 什么是redis?常用的命令有哪些?

    1.什么是redis? redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发.高扩展,大数据存储等一系列的问题而产生的数据库 ...