第五周博客实践分析
补充内容
用vim编辑器编写代码:
查看汇编文件:
去掉以.开头的语句后的汇编代码:
分析如下:
从main:
开始执行,保存%ebp
,并设置新的帧指针
pushl %ebp
movl %esp,%ebp
pushl $8
```分配4字节的栈空间,并且设置arg1=8,相当于
subl $4,%esp
movl $8,(%esp)
call调用```f```:
```f```同样初始化帧指针,分配栈空间
pushl %ebp
movl %esp,%ebp
```pushl 8(%ebp)```将```%esp```中的8存入栈中,相当于
subl $4,%esp
movl 8(%ebp),%eax
call调用g:
g被调用,初始化栈指针,分配栈空间
将 %eax 与立即数 4 相加
addl $4,%eax
在a结束前弹栈
popl %ebp
ret返回f中call的调用位置
f也结束,return返回main中call调用的位置
main继续 %eax 加2的操作
addl $2,%eax
leave为返回准备栈,相当于%ebp出栈,最后ret结束
###图示如下
![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161203150037662-311386705.png)
##GDB调试
使用```gcc - g example.c -o example -m32```指令产生32位汇编,然后使用```gdb shiyanlou```指令进入gdb调试器:
![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161204102922740-1650365938.png)
进入之后先在```main```函数处设置一个断点,再run一下,使用```disassemble```指令获取汇编代码,用```i(info) r(registers)```指令查看各寄存器的值:
![](http://images2015.cnblogs.com/blog/877170/201612/877170-20161206184921944-1702270414.png)
依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
1、使用si指令单步跟踪一条机器指令
2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
3、使用x/na %esp对应的值指令查看堆栈变化
|指令| %eip| %ebp| %esp| %eax |堆栈|
| -------- | :----------------:|:----------------:|:---------------: |:-----:|:-----:|
|push $0x13| 0x80483f9| 0xffffd058| 0xffffd058| 0xf7fbadbc| 0x00000000|
|call 0x80483e6| 0x80483fb| 0xffffd058| 0xffffd054| 0xf7fbadbc| 0x13 0x0|
|push %ebp |0x80483e6| 0xffffd058| 0xffffd050| 0xf7fbadbc| 0x8048400 0x13 0x0|
|mov %esp,%ebp| 0x80483e7| 0xffffd058| 0xffffd04c| 0xf7fbadbc| 0xffffd058 0x8048400 0x13 0x0|
|pushl 0x8(%ebp)| 0x80483e9| 0xffffd04c| 0xffffd04c| 0xf7fbadbc| 0xffffd058 0x8048400 0x13 0x0|
|call 0x80483db |0x80483ec| 0xffffd04c| 0xffffd048| 0xf7fbadbc| 0x13 0xffffd058 0x8048400 0x13 0x0|
|push %ebp| 0x80483db| 0xffffd04c| 0xffffd044| 0xf7fbadbc| 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|mov %esp,%ebp| 0x80483dc| 0xffffd04c| 0xffffd040| 0xf7fbadbc| 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|mov 0x8(%ebp),%eax| 0x80483de| 0xffffd040| 0xffffd040| 0xf7fbadbc| 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|add $0x13,%eax| 0x80483e1| 0xffffd040| 0xffffd040| 0x13| 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|pop %ebp| 0x80483e4| 0xffffd040| 0xffffd040| 0x26| 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|ret| 0x80483e5| 0xffffd04c| 0xffffd044| 0x26| 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0|
|add $0x4,%esp| 0x80483f1| 0xffffd04c| 0xffffd048| 0x26| 0x13 0xffffd058 0x8048400 0x13 0x0|
|leave| 0x80483f4| 0xffffd04c| 0xffffd04c| 0x26| 0xffffd058 0x8048400 0x13 0x0|
|ret| 0x80483f5| 0xffffd058| 0xffffd050| 0x26| 0x8048400 0x13 0x0|
|add $0x4,%esp| 0x8048400| 0xffffd058| 0xffffd054| 0x26| 0x13 0x0|
|add $0x13,%eax| 0x8048403| 0xffffd058| 0xffffd058| 0x26| 0x0|
|leave |0x8048406| 0xffffd058| 0xffffd058| 0x39|
|ret| 0x8048407| 0x0| 0xffffd05c| 0x39|