第三章:寄存器(内存访问)04
让编程改变世界
Change the world by program
栈
我们研究栈的角度:
栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。用一个盒子和3本书来描述栈的操作方式
出栈的方式
[caption id="attachment_287" align="aligncenter" width="150"]

出栈的方式
[caption id="attachment_289" align="aligncenter" width="150"]

栈有两个基本的操作:入栈和出栈。
入栈:将一个新的元素放到栈顶; 出栈:从栈顶取出一个元素。 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。 栈的操作规则:LIFO(Last In First Out,后进先出)CPU提供的栈机制
现今的CPU中都有栈的设计。 8086CPU提供相关的指令来以栈的方式访问内存空间。 这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。8086CPU提供入栈和出栈指令: (最基本的)
PUSH(入栈) POP (出栈) push ax:将寄存器ax中的数据送入栈中; pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以字为单位进行的。 下面举例说明,我们可以将10000H~1000FH这段内存当作栈来使用。 下面一段指令的执行过程: [codesyntax lang="asm"]mov ax,0123H push ax mov bx,2266H push bx mov cx,1122H push cx pop ax pop bx pop cx[/codesyntax] [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/3_8086CPU的栈操作.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"]

两个疑问
1、CPU如何知道一段内存空间被当作栈使用?
2、执行push和pop的时候,如何知道哪个单元是栈顶单元?
分析:任意时刻,SS:SP指向栈顶元素。
对于两个疑问的分析
CPU如何指导当前要执行的指令所在的位置? 答:寄存器CS和IP中存放着当前指令的段地址和偏移地址。8086CPU中,有两个寄存器:
段寄存器SS 存放栈顶的段地址
寄存器SP 存放栈顶的偏移地址
任意时刻,SS:SP指向栈顶元素。
push指令的执行过程
push axSP=SP–2;
将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
[caption id="attachment_292" align="aligncenter" width="300"]
