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

5 stack 6502

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

6502 堆栈结构的特点之一是,当堆栈指针到达堆栈末尾时,它会回绕,但我什至不明白这个功能是如何工作的。

比方说,我们有64个最大值堆栈如果我们推值xyz压入堆栈,我们现在有以下结构。堆栈指针指向 address 0x62,因为这是压入堆栈的最后一个值。

+-------+
|   x   | 0x64
+-------+
|   y   | 0x63
+-------+
|   z   | 0x62 <-SP
+-------+
|       | ...
+-------+
Run Code Online (Sandbox Code Playgroud)

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

+-------+
|       | 0x64 <-SP
+-------+
|       | 0x63
+-------+
|       | 0x62
+-------+
|       | ...
+-------+
Run Code Online (Sandbox Code Playgroud)

如果我们第四次弹出堆栈,堆栈指针会环绕指向 address 0x00,但是当0x00??没有值时,这样做还有什么意义?堆栈中什么都没有,那么将堆栈指针包裹起来有什么意义????

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

有人可以解释一下,因为它没有意义。

Ste*_*n C 7

如果我们第四次弹出堆栈,堆栈指针会回绕到指向地址 0x00,但是当 0x00 处没有值时,这样做还有什么意义呢?堆栈中没有任何内容,那么将堆栈指针包裹起来有什么意义???

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

6502 采用 1975 年芯片技术1设计,价格低廉且简单。不快。不复杂。编程不容易2


1 - 根据维基百科,原始设计有约 3200 或约 3500 个晶体管。6502 的卖点之一是它比竞争对手便宜。更少的晶体管意味着更小的芯片、更高的产量和更低的生产成本。
2 - 当然,这是相对的。与某些 ISA 相比,6502 很简单,因为它简单且正交,而且可供选择的选项很少。但与其他方法相比,看似简单的限制实际上却使其变得困难。例如,堆栈页中最多有 256 个字节必须由所有内容共享。如果您正在实现线程或协程,这会变得很尴尬。将此与 ISA 进行比较,其中 SP 是 16 位寄存器,或者堆栈可以位于任何位置。