大灰狼之三——堆栈
CPU运行程序时需要将程序的局部变量或是参数存放在堆栈段中。堆栈是一种先进后出的数据结构,具体表现在内存中,也就是将一段连续的内存当做堆栈从高位向低位存放数据。
由于堆栈的数据都存放在内存中,CPU要访问内存中的数据,自然要通过寄存器。因此也就有了存放堆栈数据在内存中地址的寄存器,SS和SP寄存器。SS储存堆栈段的基地址,SP存放堆栈段的偏移地址。而SS:[SP]永远指向栈顶。
有了堆栈,也就有入栈出栈的操作。
入栈:PUSH AX
出栈:POP AX
把栈顶SS:[SP]的数据赋给AX寄存器。
出栈后新的栈顶地址是SP-2
CPU运行程序时需要将程序的局部变量或是参数存放在堆栈段中。堆栈是一种先进后出的数据结构,具体表现在内存中,也就是将一段连续的内存当做堆栈从高位向低位存放数据。
由于堆栈的数据都存放在内存中,CPU要访问内存中的数据,自然要通过寄存器。因此也就有了存放堆栈数据在内存中地址的寄存器,SS和SP寄存器。SS储存堆栈段的基地址,SP存放堆栈段的偏移地址。而SS:[SP]永远指向栈顶。
有了堆栈,也就有入栈出栈的操作。
入栈:PUSH AX
把AX寄存器的内容入栈。
出栈:POP AX
把栈顶SS:[SP]的数据赋给AX寄存器。
出栈后新的栈顶地址是SP-2
当栈满时入栈或是栈空时出栈都会造成数据的错误,叫做栈顶超界。由于堆栈段的低位是数据段,高位是代码段,因此很有可能在栈顶超界时对这两个段进行覆盖和读取,造成数据的损失或是错误。而8086CPU没有保证对栈的操作,因此需要程序员自己对栈进行维护。