2013-05-14 161 views
0

所以我正在編寫一個程序是程序集,我試圖使用子程序,但我有一個問題。 我寫了一個類似開關盒的例程。它讀取一個輸入,並根據其值,將堆棧中的保留地址寫入以下子例程的地址。PDP-11程序集子程序

它看起來是這樣的:

1000 jsr r5,switchcase 
    // let the return address be 1004 
1004 jsr r5,@0(sp) 

第一JSR進入到交換機的情況下,其寫入首地址在堆棧中。 第二個跳轉到該地址。

我正在使用一個模擬器,每當它到達那條線就停止。我不知道出了什麼問題:/

任何幫助,將不勝感激。

+1

你是否認爲'jsr'將堆棧上的返回值壓入,從而改變了你需要使用的偏移? – 2013-05-14 16:37:29

+0

@Mark Ransom:實際上,jsr r5,...將r5推入堆棧,然後將當前PC分配給r5。 – 2013-05-15 04:49:40

回答

0

指令jsr r5,@0(sp)將舊的r5推入堆棧,並將當前的R7(PC)放入r5。因此,您的程序不會跳轉到堆棧中的地址,而是跳轉到存儲在r5中的地址,這是wharever。
因此,在您的示例中,第1條jsr指令將r5寫入堆棧,然後將1004指定爲r5
編輯:當程序返回rts時,它從堆棧恢復舊值r5
第二個jsr指令將這個值再次壓入堆棧,然後跳轉到這個地址,因爲它位於堆棧頂部(距離0)。
如果第一個jsr調用的子例程確實在堆棧頂部留下了子例程地址,並且第二個jsr應該跳到那裏,則必須使用jsr r5,@2(sp)來代替。但是我認爲這不是好的編程風格。
希望我這次得到了正確的結果......

+1

但是第二個jsr不會把1008寫入r5嗎?另外,從第一個子程序返回應該修復堆棧。 – JeremyP 2013-05-15 11:58:54

+0

@JeremyP:你完全正確,謝謝你指出這一點。對不起,我在30年前做過PDP11編程...我會編輯我的答案來糾正它。 – 2013-05-15 12:10:26