关于8086汇编栈空栈满的问题

来源:互联网 发布:手机网络时钟不同步 编辑:程序博客网 时间:2024/05/24 01:36

    刚开始学习汇编,学习了8086 CPU提供的栈机制后,就在这里写一点自己的心得吧,也许这不足以登上大雅之堂,就算是对自己学习的知识做一个总结吧。

      栈是一种用特殊方式访问的存储空间,特殊之处在于它是符合后进先出的规则(Last in First out),,8086 CPU提供了入栈和出栈的指令,有push(入栈)和pop(出栈),正如我们知道的,我们用ss:sp来指向栈顶元素,所以当我们用push把数据压入堆栈时,先把sp-2,指向栈顶前面的元素,再把寄存器中的数据放进ss:sp指向的地址处,所以ss:sp重新指向栈顶元素。我们用pop把栈顶元素提取出来,先将ss:sp指向的栈顶元素送入指定的寄存器中,再把sp+2,重新指向下面的元素,并以下面的元素为新的栈顶。

      我们已经了解了栈的工作原理,那么我们就研究一下关于栈空和栈满的问题。

      定义一段地址为一个栈,这段地址是10000~1FFFF,当栈满时,问题很简单,ss=1000,sp=0,使ss:sp指向栈顶元素,但是当栈空时,没有一个元素,sp等于多少呢?

      由此我们先来研究一个简单的问题,假设有一个只能放一个数据的栈,从10000到10001,只能放一个数据,当栈空时,要指向栈顶元素,为了符合前面提到的push的规则,就是送入数据时要把sp+2,所以就只好指向10001下面那个地址了,也就是1000:0002,这样也就符合了push的规则。

      所以我们就可以来研究上面那个问题了,栈空时,sp应该指向1FFFE下面那个数据的地址这时偏移地址sp=FFFE+2=10000,因为一个寄存器只能存储4位的16进制数,所以发生了溢出,sp=0000,所以这时栈顶元素的地址是1000:0,从栈空时的sp=0,一直压栈直到栈满时sp=0;如果再次压栈,栈顶将形成循环,覆盖了原来栈中的内容,所以8086 CPU的栈机制是循环的,而且栈的最大空间是64KB。

     可以在DOS下进行实验,进入DOS输入debug,用a命令写下如下代码

            mov   ax,1000       

            mov   ss,ax

            mov   sp,0000             (定义了一个从10000到1FFFE的栈)

            mov ax,0001

            push ax

            mov ax,0002

            push ax

     然后可以用r查看一下各个寄存器的情况,然后再用t命令一步一步进行验证,这样更有助于理解。

     这就是我对栈空栈满的一点分析。

 
原创粉丝点击