2014-01-30 203 views
2

我來回答關於6502彙編語言以下問題:6502彙編 - RTS命令和堆棧

「在堆棧中,有以下值(頂級元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06 在地址0xc000是指令jsr 0xABCD。在取/執行週期後哪個值將被存儲在程序計數器中,堆棧的頂部元素是什麼?

我知道程序計數器將是0xABCD,但我對堆棧元素感到困惑。我知道在6502架構中,堆棧從頂部到底部(從0x01FF0x0100)增長。所以,我認爲,堆棧指針指向元素0x01,對吧?現在

,返回地址應該是program counter + 3,因爲在next命令,所以我會說,0xc003會在堆棧上推,但在小尾數順序,因此c0將是第一項。那是對的嗎?

+0

我會調用堆棧(0x1ff)的底部和0x100頂部的起點。在LE機器中_consistent_模型將存儲'03'在較小的地址。 –

+2

只是警告:在6502中,JSR將(返回地址-1)推入堆棧。也就是說,RTS在拉動後遞增。 – cyco130

回答

1

我相信發生在一個JSR是

stack[stack_pointer] = return_high 
stack_pointer-- 
stack[stack_pointer] = return_low 
stack_pointer-- 
pc = jsr address 

所以如果你是否認爲你的堆棧指針在0×01指點和0×02是一個低級/小地址,然後0×01和0×02將被覆蓋,當你打你的子程序堆棧將指向0x03。

+0

答案會更清晰,有一個表...地址 - >值 – Core

+0

是的,問題會更清晰地表...地址 - >值,是的... –

3

S寄存器開始,等於$F9,表示之後在$0100頁面中的所有內容都是堆棧。內存內容如下:

$01FA: 01 02 03 04 05 06 

$ABCD: A6 23  LDX $23 
; rest of the body of the subroutine 
$AC03: 60   RTS 

$C000: 20 CD AB JSR $ABCD 
$C003: BD 40 06 LDA $0640,X 

JSR指令將指令的最後一個字節的地址。在這種情況下,最後一個字節的地址是$C002。首先按下高位字節,使低位字節位於低位地址:按$C0,然後按$02,然後跳轉到$ABCD。在此之後,堆棧看起來像這樣,在頂端小寫字節順序$C002S已成爲$F7

$01F8: 02 C0 01 02 03 04 05 06 

$ABCD子程序將與RTS指令結束,在這裏$AC03所示。該指令可以提取程序計數器的低字節和高字節。然後,因爲返回地址指向前一條指令的最後一個字節,所以增加了1個$C002加上一位是$C003,即主叫方下一條指令的第一個字節的地址。