我正在为MOS6502处理器构建一个仿真器,目前我正在尝试在代码中模拟堆栈,但我真的无法理解堆栈在6502的上下文中是如何工作的。
6502的堆栈结构的一个特性是,当堆栈指针到达堆栈的末尾时,它将环绕,但我不知道这个功能是如何工作的。
假设我们将值x
,y
和z
推送到堆栈上,我们有一个包含64个最大值的堆栈,我们现在具有以下结构。堆栈指针指向地址0x62
,因为这是推入堆栈的最后一个值。
+-------+
| x | 0x64
+-------+
| y | 0x63
+-------+
| z | 0x62 <-SP
+-------+
| | ...
+-------+
一切都很好。但是现在如果我们从堆栈中弹出这三个值,我们现在有一个空堆栈,堆栈指针指向值0x64
+-------+
| | 0x64 <-SP
+-------+
| | 0x63
+-------+
| | 0x62
+-------+
| | ...
+-------+
如果我们第四次弹出堆栈,堆栈指针会回绕指向地址0x00
,但是当0x00
没有值时,甚至可以做到这一点。堆栈中没有任何内容,所以将堆栈指针包裹在????
我可以在推送值时理解这个过程,如果堆栈已满并且需要将值推送到堆栈,它将覆盖堆栈上存在的最旧值。这不适用于弹出。
有人可以解释一下这是因为没有意义。
答案 0 :(得分:4)
如果我们第四次弹出堆栈,堆栈指针会回绕指向地址0x00,但是当0x00处没有值时,甚至可以做到这一点。堆栈中没有任何内容,所以将堆栈指针包裹在????
的重点是什么
这不是出于功能原因。 6502架构的设计使得可以通过递增8位SP寄存器来完成推送和弹出,而无需任何额外的检查。检查SP寄存器的上溢或下溢将涉及更多的硅来实现它们,更多的硅来实现堆栈上溢/下溢处理......以及关键路径中的额外门延迟。
6502的设计既便宜又简单。不快不复杂。编程 1
并不容易1 - 当然,这是相对的。与某些ISA相比,6502很简单,因为它简单且正交,您可以选择的选项很少。但与其他人相比,使其变得简单的局限性实际上使其变得困难。例如,堆栈页面中最多有256个字节必须由所有内容共享。如果你正在实现线程或协程,它会变得很尴尬。将其与ISA进行比较,其中SP是16位寄存器,或者堆栈可以在任何位置。