文档章节

堆栈平衡(子程序调用)

梦想游戏人
 梦想游戏人
发布于 2015/06/15 20:03
字数 437
阅读 212
收藏 1

堆栈平衡就是在调用子程序的时候, 为了让子程序执行前后 esp(栈顶指针寄存器)  ebp (存取堆栈指针) 的数据一样(恢复子程序执行前的状态),保证持续正确运行

push 也就是保护现场(当前栈指向位置), pop 恢复现场


..

/*源代码.cpp*/

int  a(int aa,int v1)
{

		return 5;
}

int main()
{
	int x = 5;
	int t=a(5, 4);

	return 0;
}



/*    debug 反汇编         */

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
int main()
{
00213AB0  push        ebp  
00213AB1  mov         ebp,esp  
00213AB3  sub         esp,0D8h  
00213AB9  push        ebx  
00213ABA  push        esi  
00213ABB  push        edi  
00213ABC  lea         edi,[ebp-0D8h]  
00213AC2  mov         ecx,36h  
00213AC7  mov         eax,0CCCCCCCCh  
00213ACC  rep stos    dword ptr es:[edi]  
	int x = 5;
00213ACE  mov         dword ptr [x],5  
	int t=a(5, 4);
00213AD5  push        4 /*第二参数入栈*/
00213AD7  push        5  /*第一参数入栈*/
00213AD9  call        a (021142Eh)   /*调用a*/
00213ADE  add         esp,8  /*  esp 恢复正确位置,参数占用8字节,  为__cdecl 调用 (调用者 堆栈平衡) */
00213AE1  mov         dword ptr [t],eax  /*函数返回值位于eax寄存器内*/

	return 0;
00213AE4  xor         eax,eax  /*清空eax*/
}

00213AE6  pop         edi  
00213AE7  pop         esi  
00213AE8  pop         ebx  
00213AE9  add         esp,0D8h  
00213AEF  cmp         ebp,esp  
00213AF1  call        __RTC_CheckEsp (02112DFh)  
00213AF6  mov         esp,ebp  
00213AF8  pop         ebp  
00213AF9  ret








/*函数a内 反汇编*/

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
#include "iostream"
using namespace std;

int  a(int aa,int v1)
{
013241A0  push        ebp  /*保护缺点ebp 状态*/
013241A1  mov         ebp,esp  /*ebp指向栈顶(esp 指向 变量aa )*/
013241A3  sub         esp,0C0h  /*预留 192 字节空间*/
013241A9  push        ebx  
013241AA  push        esi  
013241AB  push        edi  
013241AC  lea         edi,[ebp-0C0h]  
013241B2  mov         ecx,30h  
013241B7  mov         eax,0CCCCCCCCh  
013241BC  rep stos    dword ptr es:[edi]  

		return 5;
013241BE  mov         eax,5  /*返回值保存eax寄存器中*/
}
013241C3  pop         edi  
013241C4  pop         esi  
013241C5  pop         ebx  
013241C6  mov         esp,ebp  /恢复现场  恢复函数a执行前的 栈顶 (esp)*/
013241C8  pop         ebp  
013241C9  ret


© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 36
博文 428
码字总数 122335
作品 0
成都
只要3分钟,Python生成器原理详解

翻译:你逗比 segmentfault.com/a/1190000011330511 这篇文章是对 500 Lines or Less 一书中高效爬虫一章的部分翻译,原文:How Python Generators Work。建议结合《流畅的 Python》食用。 ...

马哥教育
2017/10/26
0
0
DLL补丁劫持制作

DLL: 由于输入表中只包含 DLL 名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL 文件。首先会尝试从当前程序所在的目录加载 DLL,如果没找到,则在Windows 系统目录中查找,最后是在环...

i春秋学院
2017/04/21
122
0
反汇编学习

(转:http://www.kuqin.com/assemble/20071122/2492.html) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x...

长平狐
2013/03/12
632
0
Windbg查看调用堆栈(k*)

https://www.52pojie.cn/thread-664189-1-1.html 无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈。学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义...

nothingfinal
2017/11/18
0
0
编程语言--Forth

Forth是六十年代末期,由Charles H. Moore发展出来在天文台 使用的电脑自动控制系统及程序设计语言,允许使用者很容易组合系统已有的简单指令,定义成为功 能较复杂的高阶指令。由于其结构精...

匿名
2009/12/29
3.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

可爱的python测试开发库(python测试开发工具库汇总)

欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 相关书籍下载 测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链...

python测试开发人工智能安全
今天
2
0
Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部