通过反编译一个简单的C程序,解释堆栈的变化
来源:互联网 发布:大数据对行业的影响 编辑:程序博客网 时间:2024/05/21 22:46
- 作者:沈鑫 原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
本次我们使用的示例程序如下
int g (int x){ return x + 4;}int f (int x){ return g(x);}int main (void){ return f(6) + 1;}
使用的反汇编指令为:gcc -S -o main.s main.c (文件名写自己的,如果使用的是32位系统的话在指令后面加上 -m32)
得到的汇编程序经过处理后如下所示:
g: pushl %ebp //esp-4指向7,ebp入栈 movl %esp, %ebp //esp的值赋给ebp,ebp指向7 movl 8(%ebp), %eax //将ebp+8后指向的栈地址内的数(即6)赋值给eax addl $4, %eax //将eax内数加上4并存入eax,此时eax值为10 popl %ebp //将栈7出栈放入ebp,即ebp指向栈4,esp+4指向6 ret //将栈6出栈放入eip,esp+4指向5,回到f方法f: pushl %ebp //esp-4指向4,ebp入栈 movl %esp, %ebp //esp的值赋给ebp,ebp指向4 subl $4, %esp //esp-4指向5 movl 8(%ebp), %eax //将ebp+8后指向的栈地址内的数(即6)赋值给eax movl %eax, (%esp) //eax将数值赋给esp当前所指位置,即栈5 call g //esp-4指向6,将eip入栈,调转到g方法 leave //将ebp的值赋给esp,esp指向4,将栈4出栈放入ebp,ebp指向1,esp+4指向3 ret //将栈3出栈放入eip,esp+4指向2,回到main方法main: pushl %ebp //此时ebp指向0,esp-4指向1,ebp入栈 movl %esp, %ebp //esp的值赋给ebp,ebp指向1 subl $4, %esp //esp-4指向2 movl $6, (%esp) //将6存入栈2中 call f //将eip入栈,esp-4指向3调转到f方法 addl $1, %eax //将eax的值加1(即10+1),存入eax中 leave //将ebp的值赋给esp,esp指向1,将栈1出栈放入ebp,ebp指向0,esp+4指向0 ret //将eip出栈放入eip,然后就是main方法的上层方法了
首先说明一下,leave 指令相当于:
movl %ebp, %esp
popl %ebp
call指令相当于:
pushl eip
movl f,eip
ret指令相当于:
popl eip(*)
总结:计算机通过eip来存储下一条指令的地址,
通过eax传递函数返回值,
每次调用一个方法时重新开辟一个新的栈空间
0 0
- 通过反编译一个简单的C程序,解释堆栈的变化
- 一个简单C程序的反编译。
- 一个c#Framework模拟堆栈的程序
- 函数调用时程序堆栈的变化
- lua c函数的堆栈变化标记
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- C函数调用与堆栈的变化
- c函数调用的堆栈变化
- Cocos2d-x3.2 双击事件
- char能表示(-128~127)
- android分享图片文字
- AndroidStudio 生成APP中文显示乱码
- SGU102 Coprimes
- 通过反编译一个简单的C程序,解释堆栈的变化
- hdu 1429 胜利大逃亡(续) bfs+状态压缩
- 奋斗是一辈子的事情
- c++复合语句
- 在编程的过程中,认识自己感觉是比较重要的
- Android Dairy:Android SDK Manager 不显示 uninstall 的内容
- 史上最全的Chrome使用技巧集锦
- 内存分配
- SSH配置总结