我在这里学习 Forth,我已经开始返回堆栈操作。
因此,在 Ubuntu 11.04 x64 上使用控制台我试图将 TOS 放到返回堆栈上,但会发生这种情况:
1 2 3 4 5 ok
>r
:36: Invalid memory address
>R>>><<<
Backtrace:
我在这里做错了什么?
我在这里学习 Forth,我已经开始返回堆栈操作。
因此,在 Ubuntu 11.04 x64 上使用控制台我试图将 TOS 放到返回堆栈上,但会发生这种情况:
1 2 3 4 5 ok
>r
:36: Invalid memory address
>R>>><<<
Backtrace:
我在这里做错了什么?
>r本身就是一个词,需要返回给解释器。当>r在问题中执行时,它会添加一个新的返回地址,一个无效的地址。
而是在(新)单词中使用>r 。请注意,添加到返回堆栈的项目必须在该单词结束之前删除 - 返回堆栈必须处于与单词开始执行时相同的状态。
循环实际上是在单词中应用返回堆栈的一个示例(因此您自己对返回堆栈的使用也必须在循环中平衡,就像它必须在单词中平衡一样)。
你试图做的事情并没有多大意义。第四台机器执行一系列字,要执行的下一个字的地址存储在一个名为NEXT的特殊寄存器中(将其想象为 CPU 的指令指针)。
需要一个返回堆栈,因为如果调用本身就是一个线程的单词列表的单词,那么您最终会清理NEXT寄存器中的原始地址 - 为了阻止这种情况发生,NEXT寄存器的当前内容被推入返回堆栈。
如果我理解正确>r将数据的顶部元素推入返回堆栈;在这种情况下,'5' 无效,因为地址 '5' 处没有指令。
正如其他人指出的那样,您不需要关心返回堆栈,除非您正在实现新的控制结构。
您可以在命令行中使用 Gforth 中的返回堆栈(这是一项非标准功能),但有一个限制:它必须在一行内平衡。在行尾,行解释器将返回,因此,返回堆栈必须包含预期的返回地址。
所以尝试类似的东西
1 2 3 4 5 >r + r> .s
这应该给你
1 2 7 5