栈是一段连续的内存单元,也就是一段连续的内存地址。
需要特殊的访问形式--才能访问栈。
栈的模型就像一个箱子,通过"入栈","出栈"操作栈这个箱子, 这个箱子还有一个标记"栈顶",永远指向栈的顶部。
从内存角度看:
入栈: 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.
栈的作用:
1. 栈可以临时性保存数据。 2. 可以交换数据。
交换寄存器中的数据
交换两个内存中的数据