现今的 CPU 中都有栈的设计, 8086 CPU 也不例外。 8086 CPU 提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于 8086 CPU 编程的时候,可以将一段内存当作栈来使用。
8086 CPU 提供入栈和出栈指令,最基本的两个是 PUSH (入栈) 和 POP (出栈).比如: push ax 表示将寄存器 ax 中的数据送入栈中. pop ax 表不从栈顶取出数据送入 ax。 8086cpU 的入栈和出栈操作都是以字为单位进行的。
下面举例说明,我们可以将 10000H ~ 1O00FH 这段内存当作栈来使用。
图 3.9 描述了下面一段指令的执行过程:
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 此时指向新栈顶.
http://blog.sina.com.cn/s/blog_4caf02490100eqn3.htmlCS:IP 中存放这当前指令的段地址和偏移地址。段寄存器SS:SP 指向栈顶元素。3.7 CPU提供的栈机制 现今的 CPU 中都有栈的设计, 8086 CPU 也不例外。 8086 CPU 提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于 8086 C