图解分析汇编代码以理解计算机是如何工作的

孙业毅 原创作品 转载请注明出处

《Linux内核分析》MOOC课程:在线课程链接http://mooc.study.163.com/course/USTC-1000029000 

第一讲 计算机是如何工作的? 课堂笔记 

@2015.03

---------------------------------------------------------------------------------------------------------------------------------------------------------------


冯诺依曼体系结构的计算机,又叫存储程序计算机,从硬件的角度来看,其工作模型是CPU依次读取内存中的指令来完成工作。但它具体是如何完成程序员编写的非线性执行的程序呢?本次课的实验,以一段汇编代码为例,详细介绍了CPU计算模块、寄存器和内存是如何配合工作的!


1 知识准备

1.1  汇编语言的五种寻址模式

·        寄存器寻址 registermode: %寄存器 例如:%edx 访问寄存器edx

·        立即寻址 immediate: $数字例如:$0x123 数值0x123

·        直接寻址 direct:数字 例如:0x123访问地址0x123指向的内存

·        间接寻址 indirect: (%寄存器) (%ebx) 例如:访问寄存器ebx中的地址指向的内存

·        变址寻址 displaced:偏移量(%寄存器) 4(%ebx):访问寄存器ebx中的地址再加4指向的内存;

1.2 几个重要的汇编指令

Example instruction

What it does

Pushl %eax

Subl $4, %esp   //栈顶指针减4,栈在向下生长一个位置

Movl %eax, (%esp) //将eax中的值放入栈顶指针指向的内存位置

Popl %eax

Movl (%esp), %eax //从栈顶指针指向的内存中的值放入eax中

Addl $4, %esp //栈顶指针加4,栈在向上收缩

Call 0x12345

Pushl %eip //ip压栈

Movl $0x12345, %eip //将0x12345放入eip中

Ret

Popl %eip //ip出栈


2. 实验

2.1 实验环境

Ubuntu 12.4 LTS 操作系统,vi 编辑器,gcc 编译器

2.2 实验步骤

vi main.c 输入以下代码


  1. int g(int x)
  2. {
  3.   return x + 3;
  4. }
  5.  
  6. int f(int x)
  7. {
  8.   return g(x);
  9. }
  10.  
  11. int main(void)
  12. {
  13.   return f(8) + 1;
  14. }


保存退出。

在命令行使用下面的命令,将这段c代码编译成汇编代码


gcc –S –o main.s main.c -m32


vi main.s 打开汇编代码文件,删除其中以符号点 开头的语句,得到如下可被计算机执行的汇编代码:

接下来,就以图解的方式来分析这段分析代码。


3. 汇编代码分析

对照c代码,很容易就知道,这段汇编代码也有三个函数,代码的执行从main函数的第一条语句开始。汇编代码共有22行可执行的代码,下面就用22张图来展示每一条语句执行后,主要寄存器的指向和堆栈的状态。其中,第0张图,是程序还未执行时的状态;第1张图,是程序执行完第一条语句后的情形;第2张图,是程序执行完第22条语句后的情形;依次类图,直到第21张图。最后一条语句是执行main函数中的 ret 语句,即将跳出了main函数,没有给出示意图。

在开始看图之前,这里先给出图示中的一些说明:

  • 内存中堆栈是向下生长的,即堆栈丁的地址<=堆栈底的地址;这里为了方便描述,在程序开始执行时的,我们假定堆栈底和堆栈顶对应的地址编号是0,堆栈向下每增加一个位置,编号加1;
  • EAX 寄存器用于存储函数的返回值,图示中会标出其值;其他三个寄存器EIP、EBP、ESP分别用箭头来表示其当前值;EIP就是指令寄存器,太总是指向当前正在执行的汇编指令的下一条汇编指令;EBP、ESP分别指向当前堆栈的底部和顶部;
  • 图片中左边为汇编源代码,其中加粗的一行,表示当前正在执行的语句;图0中没有加粗的代码行,那是当然的,图0是程序准备执行第一条语句时的初始状态;
  • 图片有点长,谢谢您的耐心 :)

再啰嗦下:旁白已经够多了,如果还不是很明白,强烈推荐您去看在线视频http://mooc.study.163.com/course/USTC-1000029000,那里是动态的,而且孟老师讲得非常详细。


好了,上图:





展开阅读全文

没有更多推荐了,返回首页