栈 箱子
箱子画在哪里是我决定的
箱子的容量大小也是我决定的
我们可以决定栈顶标记在哪里
栈在哪里(箱子在哪里) 栈的大小(箱子的大小)
SP=10H
16byte=8个字型数据 push可以操作8次
栈是如何设置的:
(建议设置成16的倍数)自己的一个约定 防止一些稀奇古怪的问题
起始地址+你说设定栈的大小的字节数(假设把第一排16个字节设置为栈的大小)
0000 + 16(10H) =10H SS,SP所组合出的栈顶标记
栈的越界问题:
栈顶超界是危险的: 因为我们既然将一段空间安排为栈 ,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,
这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。(毕竟一个计算机系统并不是只有我们自己的程序在运行)
但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。 我们当然希望CPU 可以帮我们解决这个问题,
比如说在CPU中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围 ,
然后 ,CPU 在执行push指令的时候靠检测栈顶上限寄存器,在执行pop 指令的时候靠检测栈顶下限寄存器保证不会超界。
实际情况:8086CPU中并没有这样的寄存器。
栈的极限大小
一个栈 最大的空间能设置为多少?
SP寄存器的变化范围 0~FFFFH 32768个字型数据
SS=2000H SP=0
就是设置了一个可以存放32768个字型数据的箱子
SP又等于0了 再入栈 覆盖了原来栈中的内容
64KB