堆栈

堆栈 pop push

倖福魔咒の 提交于 2020-02-03 22:10:48
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的值放到了堆栈中)

函数调用规范

喜你入骨 提交于 2020-02-03 14:08:58
当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个、什么样的参数。即计算机不知道怎么给这个函数传递参数, 传递参数的工作必须由函数调用者和函数本身来协调 。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明: 1) 当参数个数多于一个时,按照什么顺序把参数压入堆栈; 2) 函数调用后,由谁来把堆栈恢复原装。 3)函数的返回值放在什么地方 在高级语言中,通过函数 调用规范(Calling Conventions) 来说明这两个问题。常见的调用规范有: stdcall cdecl fastcall thiscall naked call stdcall调用规范 stdcall很多时候被称为pascal调用规范,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定是stdcall。在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK。 stdcall调用规范声明的语法为: int __stdcall

IL指令详细

旧巷老猫 提交于 2020-02-02 12:31:56
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上。 Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上。 Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上。 And 计算两个值的按位“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法的参数列表的非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。 Beq.S 如果两个值相等,则将控制转移到目标指令(短格式)。 Bge 如果第一个值大于或等于第二个值,则将控制转移到目标指令。 Bge.S 如果第一个值大于或等于第二个值,则将控制转移到目标指令(短格式)。 Bge.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 Bge.Un.S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 Bgt 如果第一个值大于第二个值,则将控制转移到目标指令。 Bgt.S 如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 Bgt.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 Bgt.Un.S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。

类与结构的差别

谁说胖子不能爱 提交于 2020-02-02 01:57:10
二 .类与结构的差别 1. 值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注: 1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 2.继承性 结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样 例如:结构实现接口 interface IImage { void Paint(); }

堆栈详情

偶尔善良 提交于 2020-02-02 01:45:43
今天来讲讲什么是堆什么是栈 var a=4 var b=a var a=10 console.log(a,b) 这会输出什么,先把a赋值给了b先当与一个栈就是一块空间,a=4在最上面,把b=a,就像相当与把b上面 一层的a赋值给了b,a在前面,b在后面,之后a又出现变化,这样b是不会变化的,栈使用完数据会自动清除自己 栈中自己保存数据用完自动清理自己的数据,但是还有一种叫做堆 var obj={ a:1 b:5 } var obj1=obj; var obj.a=10 console.log(obj1.a) 你觉的是怎么一个运算结果 这就堆的赋值原理,对象是存储在堆中的,只有字符串,数值型,还有Boolean是不存储在栈里的,在栈中(a:1,b:5)这些是在堆中的,而obj和obj1在栈中只有存放的地址,如果你改变量堆中的数值,栈中的地址是指向堆中的数值的,那么调用obj1.a只是调用堆中的地址罢了所以obj1.a等于10 还有一个原理就是栈中用完一个数据就会自动清空,而堆中则会一直保留,你用一个他就多一个,当内存到达一定程度的时候,他就溢出了,牛逼一点的名字就叫内存溢出 基本上都是堆溢出,为什么叫堆栈溢出了,因为栈中有堆的地址,他们之间就有了关联所以就叫堆栈溢出 最后在说一个垃圾回收机制把,js中没有手动垃圾回收机制,只要有对象的地址还在引用堆中的数值,就不会自动清理堆中的数值

堆栈模拟队列

大兔子大兔子 提交于 2020-02-01 10:27:43
设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或0; int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0; void Push(Stack S, ElementType item ):将元素item压入堆栈S; ElementType Pop(Stack S ):删除并返回S的栈顶元素。 实现队列的操作,即入队void AddQ(ElementType item)和出队ElementType DeleteQ()。 输入格式: 输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。 输出格式: 对输入中的每个D操作,输出相应出队的数字,或者错误信息 ERROR:Empty 。如果入队操作无法执行,也需要输出 ERROR:Full 。每个输出占1行。 输入样例: 3 2 A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T 输出样例: ERROR:Full 1 ERROR:Full 2 3 4 7 8 ERROR:Empty 思路

全程图解交换机和路由器的应用

社会主义新天地 提交于 2020-01-31 20:48:52
http://blog.csdn.net/yanhuohy/archive/2005/12/23/559744.aspx 说到交换机和路由器有的则根本搞不清楚它们各自到底有什么用,而有的则是弄不清它们之间的到底有什么区别,特别是在各媒体大肆宣扬三层交换机的“路由”功能的背景下。其实说到这里,我自己也不得不承认,现在交换机与路由器区别是越来越模糊了,它们之间的功能也开始相互渗透。      不仅三层交换机具有了部分原来独属于路由器的“路由”功能,而且现在宽带和高端企业级路由器中也开始兼备交换机的“交换”功能了。可谓是相互渗透,于是有人就预言,将来交换机和路由器很可能会合二为一,笔者也坚信这一点。      因为现在从技术上看,实现这一目标根本没有太大难度,同时对用户来说也是迫切需求的。一方面可以简化网络结构,另一方面用户不必购买两种价格那么昂贵的设备,何乐而不为呢?但就目前来说,它们之间还是存在着较大区别的,当然这不仅体现在技术理论上,更主要体现在应用上。本文就要全面向大家解读交换机与路由器在应用的主要区别。       一、 交换机的星形集中连接      我们知道,交换机的最基本功能和应用就是集中连接网络设备,所有的网络设备(如服务器、工作站、PC机、笔记本电脑、路由器、防火墙、网络打印机等),只要交换机的端口支持相应设备的端口类型都可以直接连接在交换机的端口,共同构成星形网络

L3-002 特殊堆栈 (30分)

徘徊边缘 提交于 2020-01-29 23:02:46
L3-002 特殊堆栈 (30分) 堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。 输入格式: 输入的第一行是正整数 N(≤10​5​​)。随后 N 行,每行给出一句指令,为以下 3 种之一: Push key Pop PeekMedian 其中 key 是不超过 10​5​​ 的正整数; Push 表示“入栈”; Pop 表示“出栈”; PeekMedian 表示“取中值”。 输出格式: 对每个 Push 操作,将 key 插入堆栈,无需输出;对每个 Pop 或 PeekMedian 操作,在一行中输出相应的返回值。若操作非法,则对应输出 Invalid 。 输入样例: 17 Pop PeekMedian Push 3 PeekMedian Push 2 PeekMedian Push 1 PeekMedian Pop Pop Push 5 Push 4 PeekMedian Pop Pop Pop Pop 输出样例: Invalid Invalid 3 2 2 1 2 4 4 5 3 Invalid 思路: 树状数组

第二~五章小结 (2017-08-28 00:48:04)

微笑、不失礼 提交于 2020-01-29 02:53:21
第二章 x86处理器架构 中央处理单元(CPU)处理算术和逻辑运算。它包含了有限数量的存储位置,即寄存器,一个高频时钟用于同步其操作,一个控制单元和一个算术逻辑单元。内存存储单元在计算机程序运行时,保存指令和数据。总线是一组并行线路,在计算机不同部件之间传输数据。 一条机器指令的执行可以分为一系列独立的操作,称为指令执行周期。3个主要操作分别为取值、译码和执行。指令周期中的每一步都至少要花费一个系统时钟单位,即时钟周期。加载和执行过程描述了程序如何被操作系统定位,加载入内存,再由操作系统执行。 x86处理器系列有三种基本操作模式:保护模式、实地址模式和系统管理模式。此外,还有一个虚拟8086模式是保护模式的一个特例。Intel 64处理器系列有两种基本操作模式: 兼容模式和64位模式。在兼容模式下处理器可以运行16位和32位应用程序。 寄存器位CPU内的存储位置进行命名,其访问速度比常规内存要快很多。以下是对寄存器的简要说明: l 通用寄存器主要用于算术运算、数据传输和逻辑操作。 l 段寄存器存放预先分配的内存区域的基址,这些内存区域就是段。 l 指令指针寄存器存放的是下一条要执行指令的地址。 l 标志寄存器包含的独立二进制位于控制CPU的操作,并反映ALU操作的结果。 x86有一个浮点单元(FPU)专门用于高速浮点指令的执行。 微型计算机的心脏是它的主板,主板上有CPU

android 堆内存和栈内存详解

Deadly 提交于 2020-01-29 01:38:07
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。 堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! java中内存分配策略及堆和栈的比较 1 内存分配策略 按照编译原理的观点