原文: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语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。
程序开始时的堆栈情况
_______________________
几乎所有有计算功能的电子设备,其核心功能基本可以用冯诺依曼体系结构来描述。冯诺依曼体系结构就是指存储程序计算机,从硬件的角度看,逻辑上可以抽象看做是一部分是CPU,一部分是内存,通过总线连接。CPU中有很多寄存器,比较重要的寄存器是IP,指向内存中的代码段,CPU根据CS、IP读取执行指令。从程序员的角度看,CPU可以抽象成一个不断执行下一条指令的循环结构,内存存储指令和数据,CPU 解释和执行指令。
CPU识别什么样的指令,除了API,CPU还有一个ABI(ApplicationBinaryInterface)--应用二进制接口,这里只要关注汇编语言,指令的编码,指令中寄存器的使用约定等。那么单任务计算机是怎么工作的,这里通过分析汇编代码来理解。
1.知识准备
用到的汇编指令的作用
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,以.开始的代码行是用于链接的辅助信息,不会被实际执行,删掉这些行得到干净的汇编代码如下
4.对汇编代码分析
用gdb调试跟踪,观察汇编指令执行后,寄存器的情况变化,分析计算机的执行变化。
gcc -g -o main main.c -m32
gdb main
b main
r
layout split
然后通过si单步调试,得到下面这些图,并利用堆栈分析。图中黑色背景的指令,表示下一步要执行的指令,也是eip指向的地址。用r命令调试时,main函数执行的是一条c语句,前四条汇编语句执行后寄存器的结果不能用图显示,这里也用堆栈分析。