6502第一次上电后,是否将FF放入堆栈指针寄存器?


8

我正在阅读来自6502.org的许多链接的6502处理器指令集,一个教程指出:

堆栈指针(S)指向第1页上的一个字节,即指向地址为0100到01FF的字节,其中最后两位数字由S提供。当在堆栈上按下一个字节时,它被写入在S的地址,然后S递减。

S寄存器是1个字节,所以它显然保持从00到FF的值,但是由于它在按下时递减,当还没有按下时,它必须从FF开始。当芯片获得第一次电源时,芯片中的物理硬件(晶体管)是否将该寄存器中的所有位设置为“1”?

我只想知道低级细节。


什么是有人真正知道这个的过度/不足,我想知道... :)
Shinrai 2011年

Answers:


3

基于6502的每个ROM和我见过的兼容代码在RESET例程期间初始化堆栈指针(LDX #$FFTXS)。你也应该。

以后可能会对6502版本(即Apple II中的65C02)进行明确初始化,以及65816 16位变体及更高版本。

我敢打赌,这.S是原始6502和Commodore 64中的6510上升的随机值,甚至可能是NES中的2A07。

通常任何6502重置例程也从以下开始,通常作为前两个指令:

SEI ;disable interrupts (set interrupt disable flag)
CLD ;turn decimal mode off

1
实际上,Apple I和II重置不会设置SP。说大多数ROM设置它可能更安全,但在大多数情况下并不需要它。
Dennis Munsie 2013年

有意思......老实说,如果你打算将它用作JSR,PLA,PHA等的堆栈,并且永远不要将它直接引用为LDA等存储器(并且确实有256字节的RAM - Atari例如2600只有$ 80- $ FF的128字节 - 它“开始”的位置并不重要。 - 除非你想在某个时候“清除”它。Bet Woz只想在他的ROM中保存3个字节。
LawrenceC 2013年

3

如果您观看迈克尔斯蒂尔关于逆向工程6502(http://www.youtube.com/watch?v=fWqBmmPQP40)的演示,您将在42:15左右看到他解释了当RESET发生时会发生什么。作为RESET处理的一部分,6502实际上确实推动了PC和P值。堆栈指针从0x100开始,在推送这三个字节后,由于这个原因,最终在0x1fd。


2

http://forum.6502.org/viewtopic.php?t=468&sid=ccdf15a560f1520a347ba896ae89767f声称它没有指定。

http://whats.all.this.brouhaha.com/2011/07/07/stack-usage-in-the-apple-1-monitor/也声称没有明确说明,如果你没有说明没关系不关心该页面内堆栈的确切位置。无论它在哪里开始它都会换行,所以只要你不使用超过256个字节的堆栈就可以了。

http://visual6502.org/JSSim/是实际硬件的晶体管级仿真,似乎启动SP设置为FD; 你可以跟踪那里的实际寄存器,并确定这是故意还是仅仅是巧合。

(在这种情况下,“监视器”意味着低级控制程序而不是显示器)


“如果你不关心堆栈的确切位置就没关系”:如果你使用堆栈存储本地或函数参数,你将关心堆栈的确切位置。例如,如果堆栈指针为0,则从堆栈读取第二个局部到累加器(TSX / LDA $ 00FF,X)将失败,因为您将从$ 00FF而不是$ 01FF读取。如果堆栈的地址太低,很容易发生这种情况。但是,仅当您使用绝对索引寻址访问堆栈时,此问题才适用。
snarf

0

对于软件应用程序,它通常无关紧要。如果您的程序不会恢复到基本状态,您可以按照上面的说法进行操作,这可以自己控制SP。如果你将返回基本,那么你应该确保你在程序启动之前的状态下返回堆栈,否则BASIC会崩溃。

上面的Snarfblam的回应在技术上是误导性的,首先是因为“读第二个本地”没有特别的意义,但是因为使用TSX,LDA $ 00FF,X将从任何高于$ 01FE的地址开始从不LDA,因为X的最大值是$ FF:$ 00FF + FF = $ 01FE。此外,如果您希望累加器读取推送到堆栈的先前值,PLA就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.