CPU提供的栈机制

来源:互联网 发布:vwap算法公式 编辑:程序博客网 时间:2024/06/06 23:51

http://blog.sina.com.cn/s/blog_4caf02490100eqn3.html

CS:IP 中存放这当前指令的段地址和偏移地址。段寄存器SS:SP 指向栈顶元素。

3.7 CPU提供的栈机制

  现今的 CPU 中都有栈的设计, 8086 CPU 也不例外。 8086 CPU 提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于 8086 CPU 编程的时候,可以将一段内存当作栈来使用。

  8086 CPU 提供入栈和出栈指令,最基本的两个是 PUSH (入栈) 和 POP (出栈).比如: push ax 表示将寄存器 ax 中的数据送入栈中. pop ax 表不从栈顶取出数据送入 ax。 8086cpU 的入栈和出栈操作都是以字为单位进行的。

  下面举例说明,我们可以将 10000H ~ 1O00FH 这段内存当作栈来使用。

  图 3.9 描述了下面一段指令的执行过程:

CPU提供的栈机制

mov ax, 0123h
push ax
mov bx, 2266h
push bx
mov cx, 1122h
push cx
pop ax
pop bx
pop cx

  注意,字型数据用两个单元存放,高地址单元放高 8 位,低地址单元放低 8 位.

  读者看到图 3.9 所描述的 push 和 pop 指令的执行过程,是否有一些疑惑?总结一下,大概是这两个问题:

  其一,我们将 10000H ~ 1O00FH 这段内存当作栈来使用, CPU 执行 push 和 pop 指令时,将对这段空间按照栈的后进先出的规则进行访问。但是,一个重要的问题是, CPU 如何知道 10000H ~ 1O00FH 这段空间被当作栈来使用?

  其二, push ax 等入栈指令执行时,要将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素; pop ax 等指令执行时,要从栈顶单元中取出数据,送入寄存器中.显然, push 、pop 在执行的时候,必须知道哪个单元是栈项单元,可是,如何知道呢?

  这不禁让我们想起另外一个讨论过的问题,就是, CPU 如何知道当前要执行的指令所在的位置?我们现在知道答案,那就是 CS : IP 中存放这当前指令的段地址和偏移地址。现在的问题是: CPU 如何知道栈顶的位置?显然,也应该有相应的寄存器来存放栈顶的地址, 8086CPU 中,有两个寄存器,段寄存器 SS 和寄存器 SP ,栈顶的段地址存放在 SS 中,偏移地址存放在 SP 中。任意时刻, SS : SP 指向栈顶元素。 push 指令和 pop 指令执行时, CPU 从 SS 和 SP 中得到栈顶的地址。

  现在,我们可以完整地描述 push 和 pop 指令的功能了,例如 push ax :

  push ax 的执行,由以下两步完成:

  (1) SP = SP - 2 , SS : SP 指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
  (2) 将ax中的内容送入 SS : SP 指向的内存单元处. SS : SP 此时指向新栈顶.

  图 3.10 描述了 8086CPU 对 push 指令的执行过程。

CPU提供的栈机制


  从图中我们可以看出,8086CPU中,入栈时,栈顶从高地址向低地址方向增长。