堆栈 pop push

1.什么是堆栈

1.1堆栈

堆栈可以看作程序的心脏 所有重要的数据都会在这个里面体现(比如运算一道算术题,虽然还没算出最终答案,但是你在算出最终结果前的一些过程值可以放进堆栈)

堆栈这块内存比较特殊,他是由大地址往小地址用

1.2栈指针寄存器ESP

假设现在程序的堆栈用到0018FF8C

当我们想使用一个程序停止之后的堆栈空间,

可以使用指令:mov dword ptr ds:[18FF88] ,1

        mov dword ptr ds:[18FF84] ,2

但是 因为程序可能接着会执行,所以你得告诉程序,堆栈使用到哪个地方了

所以sub esp,8(栈指针寄存器-8)(相当于完成需要一个mov 一个sub)

如果现在不想用了 ,那么直接add esp,8

之后程序会直接覆盖

2.push指令

这个指令好哇,功能如下

指令格式:

于是 我们正常使用堆栈的时候要 写入数据,然后修改ESP(记录栈顶)

但是现在push一条指令直接搞定 直接push 3 就行

可以push 立即数 也可以push寄存器比如push EAX(把EAX的值写到堆栈中并且更新栈顶(ESP))

还可以push内存,把指定内存的值存入堆栈并且更新栈顶(ESP)。

例子:

假如现在ECX的值为

但是现在 我只想执行十次,那他原来的值,就可以push ECX(这样就把ECX的值放到了堆栈中)

然后再对ECX存入值,mov ecx,10.

如果想把存在堆栈中 的00000111再拿回ECX

可以mov ECX,dword ptr ds:[堆栈内存编号]

  mov ECX,dword ptr ds:[esp]

  最后记得给ESP+4,返回之前的堆栈栈顶位置

3.pop指令(把栈顶的值拿出来存到指定的寄存器中)

相当于 一个mov 一个add

总结:堆栈就是一块特殊的内存 而pop和push 就是释放和使用这块内存的指令

学习指令的时候要不要流于形式,要把指令的本质,它做的什么事情搞清楚!

原文地址:https://www.cnblogs.com/cat47/p/12257394.html

时间: 2024-10-11 21:59:51

堆栈 pop push的相关文章

queue for max elem, pop, push

个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 博客内容:queue for max elem, pop, push; 博客时间:2014-4-15; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008 32位编译器; 制图工具:office 2010 ppt; 硬件信息:7G-3 笔记本; my words Don

栈 pop push show

栈(stack)是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈. 栈又称为后进先出(LastIn First Out)的线性表,简称LIFO结构. 栈元素具有线性关系,即前驱后继关系.只不过它是一种特殊的线性表而已.定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底. 堆叠数据结构使用两种基本操作:推入(push)和弹出(pop): 推入:将数据放入堆叠的顶端(阵列形式或串列形式

js array filter pop push shift unshift方法

JavaScript Array filter() 方法  JavaScript Array 对象 实例 返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33, 16, 40]; function checkAdult(age) {    return age >= 18;} function myFunction() {    document.getElementById("demo").innerHTML = ages.filter(c

大根堆pop push详细注释

//大根堆procedure push(x:longint);//元素x入堆 O(log t)var  tx,i:longint;begin  inc(t);//堆顶top加1  a[t]:=x;//将x放入堆的最后一个节点  i:=t;  while (i>1)and(a[i>>1]<a[i]) do//将元素x一层一层向上传递直到 到达根或上一层大于本身<=>找到x应在的位置    begin    tx:=a[i>>1];     a[i>>

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

一.Array 1.some()和every() some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true. every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true. var array = [1,3,5,7,9,11,13,15,17] undefined array.some(function(item,index){ return item>9 }) //true 返回 true var array = [1,3,5,7

ios8以后,使用UIAlertViw时pop/push页面后,键盘闪一下的问题

代码为 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"感谢你对我们提出的意见或建议,你的支持就是我们进步的动力!" delegate:self cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil]; [alert show]; -(void)alertView:(UIAlertView *)alertV

下拉弹窗 pop push动画实现

- (void)popTitleView:(UIButton *)btn { if (popView.superview ==self.view) { CATransition *animation =[CATransition animation]; animation.delegate=self; animation.duration=0.3; animation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaT

第29题:判断一个序列是否是另一个push序列的pop序列

github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的.比如输入的push序列是 1.2.3.4.5,那么4.5.3.2.1 就有可能是一个pop序列,因为可以有如下的push和pop序列:push 1, push 2, push 3, push 4,pop, push 5, pop, pop, pop

UINavigationController 多次连续 Push Pop 问题

最近要实现一个 连续 pop 两次 又 Push 一个新的 MVC 的需求,所以把经历写出来分享一下. NavgationController 是 iOS 中最常用的控制器了,先看官网文档: The UINavigationController class implements a specialized view controller that manages the navigation of hierarchical content. This navigation interface m