SS和SP
CPU一般都有栈的设计,并提供相关指令以栈的方式来访问内存。8086CPU中对堆栈的描述主要使用SS和SP寄存器,SS:SP始终指向栈顶,SS是段寄存器,SP是偏移地址。
push和pop指令
PUSH是入栈指令,POP是出栈指令。如 push ax将ax寄存器中的数据入栈,pop ax将栈顶元素取出放入ax寄存器中。8086CPU中入栈和出栈操作都是以字(word,一个字表示两个字节)为单位进行。
push和pop除了操作通用寄存器外,主要有以下使用方式:
push/pop 寄存器 ;将一个寄存器数据入栈和出栈。
push/pop 段寄存器 ;将一个段寄存器数据入栈和出栈
push/pop 内存单元 ; 将内存中的字单元(2Byte,注意高低字节顺序)入栈和出栈。
前面说了SS:SP总是指向栈顶元素,那么一个PUSH指令操作如push axCPU将做以下过程:
SP = SP - 2 ; 伪代码,push和pop指令是以字单元为单位,所以是减2
mov SS:SP, ax ; 伪代码,将ax数据传送到SS:SP说指向的内存空间
同理pop axCPU将做的过程如下:
mov ax, SS:SP ; 伪代码,将当前栈顶字单元数据传送到ax寄存器中。
SP = SP + 2 ; 伪代码,弹出栈顶数据,指向新的栈顶元素。
栈顶溢出
堆栈通过SS:SP描述,每次push后栈的空间SP将减少2,多次push后,可能导致SP为0,再次push后则栈顶溢出, 8086CPU中SP寄存器为0减2后为FFFE,这样会导致覆盖数据等异常情况,8086CPU不检测栈顶溢出,需要程序编写者自己控制。