堆和栈(heap和stack)篇
一、相同点:
堆(heap)与栈(stack也叫堆栈)都是为了临时储存某些信息而在内存中开辟的一个连续内存块。
二、不同点
1、堆(heap)是树型的数据结构,而栈(stack)是线性的,是一种按后进先出的次序组织的数据结构。
2、堆(heap)是系统中可供程序自由动态分配的内存空间,无法自动释放占用的内存。比如c++中用new TYPE来从堆中取得TYPE类型的一块内
存,用delete删除;而栈可以在程序中自己建立,是系统调用函数时临时分配的内存空间,用来保留一些必要的数据,函数运行后会自动释放
占用的内存。
3、heap一般是动态分配内存,而Stack一般是静态分配内存。例如我们经常使用的 string 类型变量,之所以把 string 变量存储在 Heap 中
,是因为字符串的长度是可变的,无法直接在堆栈中分配内存空间,因为堆栈是静态分配内存的。
三、操作stack的指令
1、PUSH进栈指令
格式为:PUSH SRC
执行的操作:(SP)<-(SP)-2 //先将栈顶(高地址)的指针下移2个单位
((SP)+1,(SP))<-(SRC) //然后先将高地址位的一个字节放到高地址,接着把较低地址的一个字节放到比它低一个字节的内存单元
例如:
push 1234h
第一步:
操作数 1234h中的12h是高地址位,这与我们的习惯相同,因此,先将栈指针下移一个单元,然后先将12h先入栈顶(即高地址位0008h),在把
栈指针又下移一个单元
|--------|-----------------|-----------------|
| | | 12 |
|--------|-----------------|-----------------|
低 0006 0007 0008 高
↑
目前的SP
第二步:
然后再把栈指针又下移一个单元,把低地址位入栈到较低的内存单元。
|--------|-----------------|-----------------|
| | 34 | 12 |
|--------|-----------------|-----------------|
低 0006 0007 0008 高
↑
现在的SP
2、POP出栈指令
格式为:POP DST
执行的操作:(DST)<-((SP+1),(SP))
(SP)<-(SP)+2
操作过程正好与 push 指令相反,先入操作数再上移栈指针。
push 和 pop 指令常用来中断和函数调用前后的保护和恢复现场,当然并不是只用于这些场合,还可以用于:
比如:我想把获得的句柄另行给个别名什么的,可以用2次mov指令实现:
例如:
mov eax,hWin ;注意:mov 指令不支持直接内存传送,因此,通过2次mov指令用寄存器桥接才能实现,并不是多此一举用2个mov指令
mov hWnd,eax
但也可以用push和pop组合指令实现。
push hWin
pop hWnd
这样的结果就是hWnd就是hWin,当然很有很多在编程中通过这2个指令的组合实现技巧,自己琢磨吧!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!