x86 子函数调用过程分析
2016-02-25 00:02
134 查看
name:罗雄
原创作品转载请注明出处
课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000工作系统:深度操作系统 15.1
工作环境: gcc version 5.3.1 20160114 (Debian 5.3.1-6)
GNU gdb (Debian 7.10-1+b1) 7.10
1)c代码:
/** * Author: lxhuster * Abstract: */ int foo( int x) { return (x + 2); } void main() { foo(5); }
2)编译C代码
3)对应汇编代码:
.file "main.c" main: pushl %ebp movl %esp, %ebp pushl $5 call foo addl $4, %esp nop leave ret foo: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $2, %eax popl %ebp ret
4)foo函数调用过程分析:
main函数通过栈传递参数“5”
总结:通过分析函数调用过程,
1)可以发现x86默认情况下使用的减满栈的堆栈生长方案。 2)在汇编代码中movl 8(%ebp), %eax之类访问%ebp指向地址之上的操作多半是在读取传入参数, 反之,读取%ebp指向地址之下的操作就是在操作局部变量。
疑问:恩,为什么x86木有使用寄存器来传递函数调用参数?
推荐图书:
1)深入理解计算机体系结构2)老“码”识途从机器码到框架
相关文章推荐
- 观察者模式
- Android SwipeRefreshLayout下拉刷新与上拉加载+滑动删除
- [leetcode] Burst Balloons
- Java9积极解决Linux中的GTK GUI难题
- 【分享】高手Java核心技术学习笔记
- Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结
- 【分享】 Windows 各种计时函数总结
- VIEWGOOD(远古)校园网多媒体系统的搭建
- 微信红包随机算法的实现
- oracle导入、导出
- HTTPClient模块的HttpGet和HttpPost
- 遍历Map的方式: Map.Entry 和 Map.entrySet()
- eclipse 中使用Git
- QSqlQuery::value: not positioned on a valid record
- VS2008中文乱码
- flexible
- mysql-5.7.11-winx64 免安装版(MySQL ZIP Archive版)配置及密码问题处理
- 检测点1.1
- 检测点2.1
- mysql递归查询treeview