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

原文:http://blog.sina.com.cn/s/blog_7608db8f0102vndr.html

gdb 调试还可以这样用!!    

__________________

.对汇编代码分析

      用gdb调试跟踪,观察汇编指令执行后,寄存器的情况变化,分析计算机的执行变化。

      gcc -g -o main main.c -m32

     gdb main

     b main

     r

     layout split

     然后通过si单步调试,得到下面这些图,并利用堆栈分析。图中黑色背景的指令,表示下一步要执行的指令,也是eip指向的地址。用r命令调试时,main函数执行的是一条c语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。

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

    程序开始时的堆栈情况

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

_______________________

几乎所有有计算功能的电子设备,其核心功能基本可以用冯诺依曼体系结构来描述。冯诺依曼体系结构就是指存储程序计算机,从硬件的角度看,逻辑上可以抽象看做是一部分是CPU,一部分是内存,通过总线连接。CPU中有很多寄存器,比较重要的寄存器是IP,指向内存中的代码段,CPU根据CS、IP读取执行指令。从程序员的角度看,CPU可以抽象成一个不断执行下一条指令的循环结构,内存存储指令和数据,CPU 解释和执行指令。
    CPU识别什么样的指令,除了API,CPU还有一个ABI(ApplicationBinaryInterface)--应用二进制接口,这里只要关注汇编语言,指令的编码,指令中寄存器的使用约定等。那么单任务计算机是怎么工作的,这里通过分析汇编代码来理解。

 
1.知识准备

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

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

2.实验环境
 实验楼64位linux虚拟机
3.实验步骤
使用c语言程序如下,命名为main.c 
int g(int x)
{
      return x + 1;
}
int f(int x)
{
      return g(x);
}
int main(void)
{
      return f(7) + 2;
}
终端输入
gcc -S -o main.s main.c -m32
把main.c程序编译成汇编代码main.s,以.开始的代码行是用于链接的辅助信息,不会被实际执行,删掉这些行得到干净的汇编代码如下

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

4.对汇编代码分析

      用gdb调试跟踪,观察汇编指令执行后,寄存器的情况变化,分析计算机的执行变化。

      gcc -g -o main main.c -m32

     gdb main

     b main

     r

     layout split

     然后通过si单步调试,得到下面这些图,并利用堆栈分析。图中黑色背景的指令,表示下一步要执行的指令,也是eip指向的地址。用r命令调试时,main函数执行的是一条c语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。

原文地址:https://www.cnblogs.com/oxspirt/p/14040245.html