CPU的栈机制

http://orangelsk.zone/

内存中的一段连续空间,可以看作栈,以先进后出的方式存储信息。如果说栈是什么,最好的例子应该是手枪弹夹。这是一段连续的内存空间,由弹夹入口至弹夹底部,内存单元地址递增,假设入口处地址为10000H,每个子弹占据一块标准内存空间(1个字节),第二颗子弹起始位置就应该是10001H。假设一共有16颗子弹,那么整体占用的地址应该是从10000H~10010H。

栈空间是人为想象出来的,那么CPU怎么确定栈的入口和终点?

首先要明确栈顶的概念,栈顶(SP)是个指针,永远指向栈中“最高“位置处,栈顶指向的内存空间地址是不断减少的,栈空的时候,栈顶指向10010H(栈底的下一个单元)。

这里需要注意,对于栈顶并没有一个清晰的定义,有的人认为栈顶是栈的最高边界,有的人认为栈顶表示最高位置的元素地址(数据结构中成为top指针)。我这里认为栈顶就是top指针,即栈中“最高“位置处元素的地址。

之前说过通过CS:IP指向内存中要执行的CPU指令。这是CPU和内存中指令的交互。现在有SS:SP指针,SS是段寄存器,SP是可移动的指针,SS中存储栈的入口地址,SP中存储栈顶(离入口最近的子弹所占有的起始地址)

栈的出栈入栈过程?

入栈对应的指令为push ax,就是将ax中的值存入栈中。SP自身+2,然后将ax中两个字节的数据存放到SS:SP指向的字单元(连续的两个内存空间)中。

入栈过程

入栈过程

出栈指令为pop ax,就是将栈顶的值弹出,并存入ax中。现将SS:SP中指向的字单元中的数据存入ax,然后SP自身-2。数据虽然被存入ax中,但是本身并没有被销毁,仍然是写在内存空间中的,哪怕所有的值都被pop出去,栈中仍然是有数据的,再次push进栈时,直接将数据覆盖写入即可。

出栈过程

出栈过程

栈会不会溢出?

CPU只能根据SS:SP遍历栈空间,而SP不知道自己是不是还在栈之中,如果SP超过了栈的两个边界(“最高“和“最低“)那么极有可能将其他空间的数据覆盖。

事实上,8086CPU没有能力让SP在规定的范围内移动,也就是说CPU不保证不会发生栈溢出的情况,这就需要我们在编程时谨慎小心。

おすすめ

転載: blog.csdn.net/weixin_43237362/article/details/120003926