0%

汇编语言学习笔记(六)

3.6栈

操作规则:LIFO(后进先出)

8086CPU提供的入栈和出栈的指令:

  • Push(入栈)

    push ax:将寄存器ax中的数据送入栈中

  • Pop(出栈)

    push ax:从栈顶取出数据送入ax。

8086CPU的入栈和出栈操作都是以字为单位进行的

截屏2021-06-16 上午8.13.13

  • CPU如何知道当前要执行的指令所在的位置?

    寄存器CS和IP中存放着当前指令的段地址和偏移地址

  • 执行push和pop的时候,如何知道哪个单元是栈顶单元?

    8086CPU中,有两个寄存器:

    • 段寄存器SS 存放栈顶的段地址
    • 寄存器SP 存放栈顶的偏移地址

    任何时刻,SS:SP指向栈顶元素

push ax时:

  • SP = SP - 2

  • 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶

    截屏2021-06-16 上午8.23.02

  • 将10000H~1000FH这段空间当做栈,初始状态栈是空的,此时,SS=1000H,SP=多少?

    截屏2021-06-16 上午8.25.46

    pop指令的执行过程

pop ax

  • 将SS:SP指向的内存单元处的数据放入ax中;
  • SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

截屏2021-06-22 上午8.14.47

注意:

  • 出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH处的2266H依然存在,但是,它已不再栈中。
  • 当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。