我无法理解堆栈是如何工作的

时间:2018-03-02 22:05:19

标签: stack 6502

我正在为MOS6502处理器构建一个仿真器,目前我正在尝试在代码中模拟堆栈,但我真的无法理解堆栈在6502的上下文中是如何工作的。

6502的堆栈结构的一个特性是,当堆栈指针到达堆栈的末尾时,它将环绕,但我不知道这个功能是如何工作的。

假设我们将值xyz推送到堆栈上,我们有一个包含64个最大值的堆栈,我们现在具有以下结构。堆栈指针指向地址0x62,因为这是推入堆栈的最后一个值。

+-------+
|   x   | 0x64
+-------+
|   y   | 0x63
+-------+
|   z   | 0x62 <-SP
+-------+
|       | ...
+-------+

一切都很好。但是现在如果我们从堆栈中弹出这三个值,我们现在有一个空堆栈,堆栈指针指向值0x64

+-------+
|       | 0x64 <-SP
+-------+
|       | 0x63
+-------+
|       | 0x62
+-------+
|       | ...
+-------+

如果我们第四次弹出堆栈,堆栈指针会回绕指向地址0x00,但是当0x00没有值时,甚至可以做到这一点。堆栈中没有任何内容,所以将堆栈指针包裹在????

的重点是什么

我可以在推送值时理解这个过程,如果堆栈已满并且需要将值推送到堆栈,它将覆盖堆栈上存在的最旧值。这不适用于弹出。

有人可以解释一下这是因为没有意义。

1 个答案:

答案 0 :(得分:4)

  

如果我们第四次弹出堆栈,堆栈指针会回绕指向地址0x00,但是当0x00处没有值时,甚至可以做到这一点。堆栈中没有任何内容,所以将堆栈指针包裹在????

的重点是什么

这不是出于功能原因。 6502架构的设计使得可以通过递增8位SP寄存器来完成推送和弹出,而无需任何额外的检查。检查SP寄存器的上溢或下溢将涉及更多的硅来实现它们,更多的硅来实现堆栈上溢/下溢处理......以及关键路径中的额外门延迟。

6502的设计既便宜又简单。不快不复杂。编程 1

并不容易

1 - 当然,这是相对的。与某些ISA相比,6502很简单,因为它简单且正交,您可以选择的选项很少。但与其他人相比,使其变得简单的局限性实际上使其变得困难。例如,堆栈页面中最多有256个字节必须由所有内容共享。如果你正在实现线程或协程,它会变得很尴尬。将其与ISA进行比较,其中SP是16位寄存器,或者堆栈可以在任何位置。