计算机是如何工作的

反汇编一个简单的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的堆栈;

最新文章

  1. linux mysql 安装配置
  2. OpenGL Common Mistakes
  3. java工厂-积木系列
  4. 卖萌的极致!脸部捕捉软件FaceRig让你化身萌宠
  5. django安装和卸载
  6. 浅谈 OneAPM 在 express 项目中的实践
  7. POJ3080Blue Jeans
  8. jsp--文本框正则表达式
  9. Linux下设置最大文件打开数nofile及nr_open、file-max
  10. php定时执行任务的几个方法
  11. 工程师必知ZigBee技术问答精华汇总
  12. TCP状态转换图
  13. .net mvc ajax list post
  14. iOS基础 - 多媒体
  15. hibernate和ibatis的区别
  16. 港交所OMD-C对接笔记
  17. 记一次阿里云ECS服务器图片资源迁移至 阿里云 oss
  18. NC 数据库操作
  19. AIX中PV,VG,LV及FS常用相关命令
  20. 【推荐】使用Ultrapico Expresso学习正则表达式

热门文章

  1. Note: Time clocks and the ordering of events in a distributed system
  2. php设计模式-注册树模式
  3. 函数参数<二>
  4. Selenium 2自动化测试实战7(定位元素)
  5. 阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
  6. CentOS mysql安装
  7. 使程序在Linux下后台运行,程序运行前后台切换
  8. linux判断httpd端口是否打开
  9. java:JQuery(声明,JQ和JS对象的区别,prop,attr,addClass,offset,trigger,dblclick和change事件,hide,show,toggle,slideUp,slideDown,slideToggle,三种选择器,标签的获取,三张图片的放大与缩小)
  10. Gin框架中文文档