2011-10-29 19 views
3

我在這裏學習到了,我已經進入了返回堆棧操作。返回堆棧操作在Gforth中產生「無效內存地址」0.7

因此,使用在Ubuntu控制檯11.04 64我試圖讓TOS到返回堆棧,但出現這種情況:

1 2 3 4 5 ok 
>r 
:36: Invalid memory address 
>R>>><<< 
Backtrace: 

我在做什麼錯在這裏?

+1

你已經有了一個'> r'無與倫比用'R>'那裏,所以你會期待什麼呢?你不應該玩這樣的回報堆棧。 (至少,這是我收集的內容。) –

回答

2

>r本身就是一個詞,需要返回給解釋器。當在問題中執行> r時,它會添加一個新的返回地址,一個無效的地址。 (新)字內的> r。請注意,添加到返回堆棧的項目必須在該單詞結束之前移除 - 返回堆棧必須與單詞開始執行時處於相同狀態。

循環實際上是返回堆棧的話中的應用程序的例子(因此你自己的使用返回堆棧必須也只是因爲它必須在一個字內進行平衡循環中保持平衡)。

1

你想要做的事情沒有多大意義。第四臺機器執行一系列字,將要執行的下一個字的地址存儲在一個特殊的寄存器NEXT(想象它像CPU的指令指針)。

需要返回堆棧,因爲,如果調用到本身就是詞的螺紋表中的詞做,那麼你最終會在擦洗原來的地址NEXT寄存器 - 以阻止這種情況發生時, NEXT寄存器的當前內容被壓入返回堆棧。

如果我理解正確> r將數據的頂層元素壓入返回堆棧;在這種情況下,'5'無效,因爲在地址'5'處沒有指令。

正如別人指出你不需要關心返回堆棧,除非你正在實現新的控制結構。

+2

返回堆棧可用於在執行單詞期間臨時存儲數據。這有時可以簡化代碼,否則這些代碼將非常複雜,僅使用單個數據堆棧。 –

1

您可以使用Gforth返回堆棧在命令行(這是一個非標準的功能),有一個限制:它必須在一行內平衡。在行結束時,行解釋器將返回,因此,返回堆棧必須包含預期的返回地址。

所以嘗試像

1 2 3 4 5 >r + r> .s 

這應該給你

1 2 7 5