栈是一段连续的内存单元,也就是一段连续的内存地址。

 需要特殊的访问形式--才能访问栈。

 

  栈的模型就像一个箱子,通过"入栈","出栈"操作栈这个箱子, 这个箱子还有一个标记"栈顶",永远指向栈的顶部。

 

 从内存角度看: 

  入栈: push,  将16位寄存器或者内存中的字型数据 ----->栈顶标记的上面。

  出栈: pop     将栈顶标记所标识的字型数据 -----> 16位寄存器或内存中。

 

在8086cpu中,在任意时刻,将段地址寄存器ss和偏移地址寄存器sp所组合出来的内存地址当做栈顶标记。

  push ax   # 修改sp寄存器中的数值,  SP = SP - 2

                     将ax中的字型数据 -----> SS:SP所组合出来的内存地址中,  入栈

 

  pop bx  # SS:SP所组合出来的内存地址中的字形数据 ---->  bx

                  修改栈顶标记, SP = SP + 2     出栈

 

改变ss,sp寄存器的内容

汇编:栈_出栈

栈的越界

      当sp为0了,然后接着执行push操作, ss的值并不会改变,而sp从0000变成FFFE,再执行push, sp就又减2个字节,变成FFFC...sp的变化范围就是0000-FFFF,也就是 2^16个字节,即64kb.

汇编:栈_数据_02

 

栈的作用:

   1. 栈可以临时性保存数据。 2. 可以交换数据。

     交换寄存器中的数据

汇编:栈_入栈_03

汇编:栈_数据_04

交换两个内存中的数据

汇编:栈_内存地址_05

汇编:栈_出栈_06