汇编代码分析
来源:互联网 发布:赫尔辛基大学知乎 编辑:程序博客网 时间:2024/05/08 01:00
zhang 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
代码如下:
该代码运行中主要涉及以下寄存器ebp(指向栈底),esp(指向栈顶),eax(存放返回值),eip(指向运行代码)
接下来按运行顺序来分析(假定ebp,esp开始指向0,并将堆栈每隔32位从高到底依次命名为1,2,3...)
pushl %ebp 在1位置存入ebp地址0,esp指向1
movl %esp, %ebp 使ebp指向esp指向地址(1)
subl $4, %esp esp指向2
movl $8, (%esp) 在2位置存入8
call f 先将eip当前地址(addl $1, %eax所在行)存入堆栈(3位置),然后将f位置存到eip中
f: 顺序往下执行
pushl %ebp 在4位置存入ebp地址0,esp指向4
movl %esp, %ebp同上,此时ebp与esp指向4
subl $4, %espesp指向5
movl 8(%ebp), %eax 将ebp(4)-8/4 = 2位置的值给eax,eax=8
movl %eax, (%esp)在5位置存入8
call g 先将eip当前地址(leave所在行)存入堆栈(6位置),,esp指向6,然后将g位置存到eip中
g: 顺序往下执行
pushl %ebp
movl %esp, %ebp同上,此时ebp与esp指向7
movl 8(%ebp), %eaxeax = 8
addl $3, %eaxeax = 8 + 3 = 11
popl %ebp ebp指向4,esp指向6
ret 将6位置的地址存入eip,eip指向了f中的leave,然后esp指向5
leave 将ebp(4)存入esp,弹出ebp,ebp指向0,esp执行3
ret 将3位置的地址存入eip,eip指向addl $1, %eax,esp指向2
addl $1, %eax eax = 11 + 1 = 12
leave ebp(0)存入esp,弹出ebp,ebp指向0,,esp指向0
ret eip没有下一条指令,运行结束
总结:计算机通过堆栈来存储数据,在堆栈空间中通过ebp设定不同的栈底指针来进行函数跳转以及恢复现场,函数内的操作通过esp来完成。eip负责保存下一条需要执行的指令。
- ARMv7汇编代码分析
- 汇编代码分析
- 反汇编代码分析
- STM8汇编代码分析
- sdram汇编代码分析
- 反汇编代码分析
- 1.汇编代码分析
- 一段汇编代码的分析
- U-boot汇编代码分析
- 函数调用汇编代码分析
- C++反汇编代码分析
- 汇编代码的简单分析
- system_call的汇编代码分析
- 单片机汇编代码分析示例
- Linux内核分析【1】--分析汇编代码
- 反汇编一个简单的C程序,分析汇编代码
- 高级语言的一段汇编代码分析
- 汇编代码对应的高级语言分析
- Android网络编程
- Looper(循环者介绍)
- VELT-0.1.5开发:在vs2013下调试Linux GUI程序
- 645348122493209651
- IOS开发之实现App消息推送(最新)
- 汇编代码分析
- LA3263 平面图的欧拉公式
- 前端页面在@cshtml下动态生成 复选框的方式
- iOS 报错Collection <__NSArrayM: 0x7fdf0b8154c0> was mutated while being enumerated.'
- UVa 512 - Spreadsheet Tracking (模拟)
- 自定义异常 例子
- Sublime Text 3 快捷键汇总
- Trie树 Codeforces Round #291 (Div. 2) C. Watto and Mechanism
- 预测建模、监督机器学习和模式分类概览