前期调试

我的程序代码是:

  • 首先,用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安装一个库即可

最新文章

  1. 2015微软MVP全球峰会见闻
  2. Android二维码识别 开源项目ZXing的编译
  3. XML的解析方式(DOM、SAX、StAX)
  4. Windows下Sublime Text 默认打开方式问题解决办法
  5. HTML5的Web SQL Database
  6. hdoj 2032 杨辉三角
  7. AndroidStaggeredGrid
  8. 回某位朋友问题备受phpcgi.exe煎熬现在cpu跑满(解决方案)
  9. android与PC互传文件 adb push
  10. SVN强制填写日志
  11. A Game of Thrones(13) - Tyrion
  12. Java依据Url下载图片
  13. 在nltk中调用stanfordparser处理中文
  14. Linux系统常见调用及其分类
  15. mysql 定期删除表中无用数据
  16. 附加题(一)——interesting的抄袭现象
  17. 01 while 循环输入1 2 3 4 5 6 8 9 10
  18. 字符串切分 String.Split 和 Regex.Split(小技巧)
  19. Rot13加密算法
  20. CSU 1968 Permutation Descent Counts

热门文章

  1. leveldb源码分析—Recover和Repair
  2. ASP.NET操作Cookie
  3. 基于WF4.0的公文管理系统
  4. 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境
  5. proxool详细配置
  6. linux: 获取监听指定端口的进程PID
  7. Hive get table rows count batch
  8. Linux的交叉编译 及configure配置
  9. 【Ext.Net学习笔记】06:Ext.Net GridPanel的用法(GridPanel 折叠/展开行、GridPanel Selection、 可编辑的GridPanel)
  10. UVA 10405 Longest Common Subsequence --经典DP