第五周博客实践分析

第五周博客实践分析

补充内容

用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|
原文地址:https://www.cnblogs.com/ZouJR/p/6128734.html