GDB调试汇编栈堆过程的学习
前期调试
我的程序代码是:

- 首先,用
gcc g gdb.c -o gdb -m32产生32位汇编。

- 输入gdb gdb进入gdb调试器
- 在main函数处设置一个断点:
b main

- 用
disassemble指令获取汇编代码

- 输入
i r查看个寄存器的值

- 输入
display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化

用si、i r、x/na %esp指令对每一步进行分析
输入si执行一步

调用f函数
输入i r看寄存器的值

用x/2a %esp查看栈堆里的值。因为执行了push $0x8,将0x8推入栈中。esp的值减4。

再输入si执行一步,并输入i r,x/na %esp



call指令会将下一条指令的地址入栈。因此,栈堆又增加了一个值,esp的值也相应的减4
重复上述三步



因为mov指令不会使栈堆发生变换,所以栈堆中的值不变,esp的值也不变



执行push指令,将0x8入栈,esp值减4。调用g函数



执行call指令,下一条指令的地址入栈,esp减4



push ebp 将%ebp的值入栈,esp减4









mov和add没有出栈入栈操作。栈堆不发生变化






pop、ret指令进行弹栈操作,栈顶的先出栈。完成一次出栈操作,esp的值加4



add $0x4,%esp 将esp的值加4,指针上移,相当于从栈堆弹出一个值

退出f函数。栈顶的值完成出栈操作



程序结束,栈堆中所有值都完成出栈,栈堆中为空
汇总表:

问题解决
第一次输入gcc g gdb.c -o gdb -m32报错。
解决方法:sudo apt-get install libc6-dev-i386安装一个库即可
GDB调试汇编栈堆过程的学习的更多相关文章
- GDB调试汇编堆栈
GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- 20145202马超GDB调试汇编堆栈过程分析
20145202马超GDB调试汇编堆栈过程分析 esc :w保存,:wq保存并退出 x:删除错误的单个字母 dw:删除整个单词 gcc hello.c -o hello:运行hello.c gcc - ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- GDB调试汇编分析
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...
- 20145233 GDB调试汇编分析
GDB调试汇编分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long ad ...
- 20145310 GDB调试汇编堆栈分析
GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
随机推荐
- Python yield 使用浅析(iterable generator )
http://blog.csdn.net/preterhuman_peak/article/details/40615201 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递 ...
- javascript/jquery 常见功能实现(持续更新...)
1. input 只能输入整数数字和字母 $(document).on('keyup','#no',function(){ var val = $.trim($(this).val()); if(va ...
- MFC分类
屏幕截图(带光标) MFC Button控件自绘 WM_CTLCOLOR消息 MFC窗口创建.销毁消息流程 DDX_Control.SubclassWindow和SubclassDlgItem 隐藏系 ...
- js获取页面传过来的参数
//接收页面传过来的值 //RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i" ...
- jsp中的四种对象作用域
page:当前页面,也就是只要挑到别的页面就失效了,可以近似理解为java的this对象 request:一次会话,简单的理解就是一次请求范围内有效,例如如果通过forward方式跳转,则forwar ...
- Loj 1003–Drunk(拓扑排序)
1003 - Drunk PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB One of my fr ...
- Hive get table rows count batch
项目中需要比对两种方法计算生成的数据情况,需要做两件事情,比对生成的中间表的行数是否相同,比对最后一张表的数据是否一致. 在获取表的数据量是一条一条地使用select count(*) from ta ...
- [转]VS2015 cordova尝试-camera
本文转自:http://blog.csdn.net/greystar/article/details/47973837 1. 确保环境正常,如出现错误 ,安下载android sdk 相关版本,我在这 ...
- 《TCP/IP详解 卷一》读书笔记-----TCP persist &Keeplive timer
1.persist timer:当接收方建议的窗口大小为0时,发送方就会停止发送,直到接收方有缓存空间时再用一个窗口值非零的ACK提示发送方可以继续发送.但是这个称为window update的ACK ...
- codeforces 477B B. Dreamoon and Sets(构造)
题目链接: B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input st ...