关于堆栈指针SP的理解
看过很多网络上对于空栈时SP+1的理解,举了很多例子,比如说打电话或者堆箱子,但是都不是很直观透彻,故写下这篇自己对于堆栈指针SP的理解,供以后参考。
首先需要明确,堆栈的操作方法的执行步骤。
对于PUSH AX操作来说,CPU分两步执行:
1、SP-1 -> SP
AH-> [SS*10H+SP]
2、SP-1->SP
AL -> [SS*10H+SP]
故完成一次PUSH操作,SP会变成SP-2;
同理对于POP BX操作来说,CPU也会分两步执行:
1、[SS*10H+SP] -> BL
SP+1 -> SP
2、[SS*10H+SP] -> BH
SP+1 -> SP
故完成一次POP操作,SP会变成SP+2。
这里解释一些为什么堆栈中的内容要用 [SS*10H+SP] 的方式进行访问:
8086处理器中对于堆栈采用段基址+偏移的方式进行寻址,这里堆栈段即SS段,SP表示的是偏移地址,而非有效地址,并且8086采用地址线和数据线复用的方式,内部寄存器、总线等均是16位,但是通过复用可以达到20位地址寻址,故 [SS*10H+SP] 表示堆栈中SP指针指向地址的内容。
回到正题,为什么每一次PUSH或者POP操作是SP-2 -> SP或者SP+2 ->SP,但是一开始SP要+1呢?
SP(起始) |
---|