第三章 --- 第五节

POP AX 指令的执行过程

(1)将SS:SP指向的内存单元处的数据送入AX中。

(2)SP = SP + 2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

第三章 --- 第五节_第1张图片

注意:

1、出栈后,SS:SP指向新的栈顶,1000EH,POP操作前的栈顶元素,1000CH处的2266H依然存在,但是,它已经不在栈中。

2、当再次执行PUSH入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。

 

《栈顶超界的问题》

SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶,可是,如何保证在入栈和出栈时,栈顶不会超出栈空间呢?

当栈满的时候再使用PUSH指令入栈或当栈空的时候再使用POP指令出栈,都将发生栈顶超界问题。

当栈满的时候再使用PUSH指令入栈:

第三章 --- 第五节_第2张图片

 

当栈空的时候再使用POP指令出栈:

第三章 --- 第五节_第3张图片

 

 

栈顶超界是危险的:

因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的(毕竟一个计算机系统并不是只有我们自己的程序在运行),但是由于我们在入栈出栈时的不小心而将这些数据、代码意外的改写,将会引发一连串的错误(但如果是可以的……那么……呵呵……)

我们当然希望CPU可以帮我们解决这个问题,实际情况是8086CPU中并没有栈的越界检查。

结论:

我们在编程的时候要自己操心栈顶超界的问题(向上超界和向下超界),要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;

执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。

 

PUSH和POP指令时可以在寄存器和内存之间传送数据的。

PUSH和POP指令的格式:

栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。

PUSH和POP指令的格式(1)

PUSH  寄存器:将一个寄存器中的数据入栈。

POP    寄存器:用一个寄存器接收出栈的数据。

例如:

PUSH AX

POP   BX

PUSH和POP指令的格式(2)

PUSH  段寄存器:将一个段寄存器中的数据入栈。

POP    段寄存器:用一个段寄存器接收出栈的数据。

例如:

PUSH  DS

POP     ES

PUSH和POP指令的格式(3)

PUSH  内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)

POP    内存单元:用一个内存字单元接收出栈的数据

例如:

PUSH  [0]

POP    [2]

指令执行时,CPU要知道内存单元的地址,可以在PUSH、POP指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从DS中取得。

你可能感兴趣的:(第三章 --- 第五节)