3.6栈
我们研究栈的角度:
栈是一种具有特殊的访问方式的的存储空间。它的特殊性就在于,最后进入这个空间的数据最先出去。
可以用一个盒子和三本书来描述。
一个开口的盒子就可以看作一个栈空间,现有三本书,《高等数学》,《C语言》,《软件工程》,把他们放到盒子中过程如图所示:
栈有两个基本操作:入栈和出栈。
入栈:将一个新的元素放到栈顶;
出栈:从栈顶取出一个元素。
栈顶元素总是最后入栈,需要出栈时,又最先被从栈中取出。
栈的操作原则:LIFO(Last In First Out,后进先出)
3.7 CPU提供的栈机制
现今的CPU都有栈的设计。
8086CPU提供相关的指令来以栈的方式访问内存空间。
这就意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。
8086提供的入栈和出栈指令(最基本的):
push(入栈)
pop(出栈)
push ax:将寄存器ax中的数据送入栈中;
pop ax:从栈顶取出数据送入ax。
8086CPU的入栈和出栈操作都是以字为单位进行的。
下面举例说明,我们可以将10000H~1000FH这段内存当作栈来使用。
下面一段指令的执行过程:
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx,1122H
push cx
pop ax
pop bx
pop cx
注意:字型数据用两个单元存放,高地质单元放高8位,低地址单元放低8位
两个疑惑:
1、CPU如何知道一段内存空间被当作栈使用?
(个人猜想:CS和IP指向的是指令,段寄存器DS和偏移地址指向的是数据,应该有一个特殊的段寄存器,叫做栈的使用的寄存器。)
2、执行push和pop的时候,CPU如何知道哪个单元是栈顶单元?
分析:
(1)CPU如何指导当前要执行的指令所在的位置?
答:寄存器CS和IP中存放着当前指令的段地址和偏移地址。
8086CPU中,有两个寄存器:
段寄存器SS:存放栈顶的段地址
寄存器SP:存放栈顶的偏移地址
结论:任意时刻,SS:SP指向栈顶元素。
push指令的执行过程
push ax
(1)SP=SP-2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
问题:如果我们将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时SS=1000H