2011-10-29 18 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