文档章节

堆栈平衡(子程序调用)

梦想游戏人
 梦想游戏人
发布于 2015/06/15 20:03
字数 437
阅读 202
收藏 1
点赞 0
评论 0

堆栈平衡就是在调用子程序的时候, 为了让子程序执行前后 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


© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 34
博文 402
码字总数 115594
作品 0
成都
ARM 内核SP,LR,PC寄存器

原创: http://blog.sina.com.cn/s/blog_6e116ab90101774l.html 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。 1、堆栈指针r13(SP):每一种异常模式都有其自己独立...

菜鸟养成记 ⋅ 2017/06/01 ⋅ 0

Win32汇编语言核心

一. Win32汇编源程序的结构 hello world程序 .386 .model flat, stdcall option casemap: none include windows.inc include user32.inc includelib user32.lib include kernel32.inc inclu......

呼噜呼噜睡翻天 ⋅ 2014/04/02 ⋅ 0

函数调用约定

.. 参数传递顺序 1.从右到左依次入栈:stdcall,cdecl,thiscall,fastcall 2.从左到右依次入栈:pascal 主要说明stdcall 和 cdecl 区别 1...stdcall 被调用的 函数本身负责堆栈平衡 2...cd...

梦想游戏人 ⋅ 2015/06/15 ⋅ 0

只要3分钟,Python生成器原理详解

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

马哥教育 ⋅ 2017/10/26 ⋅ 0

DLL补丁劫持制作

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

i春秋学院 ⋅ 2017/04/21 ⋅ 0

反汇编学习

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

长平狐 ⋅ 2013/03/12 ⋅ 0

Windbg查看调用堆栈(k*)

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

nothingfinal ⋅ 2017/11/18 ⋅ 0

编程语言--Forth

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

匿名 ⋅ 2009/12/29 ⋅ 0

使用Ptrace跟踪进程收到的异常信号(信号SIGTRAP是通过traceme后wait得到的)

以下是使用Ptrace跟踪进程收到的异常信号的正文内容,本文是网友投稿或本站会员创作,不代表本站观点: 最初的想法,我们在调试程序的时候,程序有时会出现进程收到SIGSEGV信号,异常退出。如...

地狱的烈火 ⋅ 2013/05/23 ⋅ 0

深入lua栈交互—cpp调用lua数据

用原生API来交互 lua是通过lua_state这个栈来和c 交互的 栈pop问题:lua_pop(x) ;x 为 pop的个数 ,一般调用函数后 pop(1) 因为一般返回值只有一个 ps:调用函数的时候 不会堆栈平衡,返回...

梦想游戏人 ⋅ 2015/10/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring Email

一、普通邮件 maven依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.6.RELEASE</version>......

BobwithB ⋅ 11分钟前 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 15分钟前 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 15分钟前 ⋅ 0

IT行业的变革就像世界杯德国对战墨西哥一样难以预测[图]

最近在观看世界杯,尤其是昨天的比赛,上一届卫冕冠军德国队居然0:1告负墨西哥,这创造了历史,首先是墨西哥从来没赢过德国队,其次是德国队36年来首站没输过,再差也是打平,而这次,德国队...

原创小博客 ⋅ 34分钟前 ⋅ 0

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 44分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部