【问题标题】:Return stack operations generate "invalid memory address" in Gforth 0.7返回堆栈操作在 Gforth 0.7 中生成“无效的内存地址”
【发布时间】:2011-10-29 17:30:04
【问题描述】:

我在这里学习 Forth,我已经开始返回堆栈操作了。

所以在 Ubuntu 11.04 x64 上使用控制台,我试图将 TOS 放入返回堆栈,但发生了这种情况:

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

我在这里做错了什么?

【问题讨论】:

  • 您的&gt;rr&gt; 不匹配,那么您期望什么?你不应该像那样玩返回堆栈。 (至少,这是我收集到的。)

标签: forth


【解决方案1】:

>r 本身就是一个词,需要返回给解释器。当 >r 像问题一样被执行时,它会添加一个新的返回地址,一个无效的返回地址。

改为在(新)单词中使用 >r。请注意,添加到返回堆栈的项目必须在该单词结束之前删除 - 返回堆栈必须处于与单词开始执行时相同的状态。

循环实际上是在单词中应用返回堆栈的示例(因此您自己对返回堆栈的使用也必须在循环中平衡,就像它必须在单词中平衡一样)。

【讨论】:

    【解决方案2】:

    您尝试做的事情并没有多大意义。第四台机器执行一系列字,要执行的行中下一个字的地址存储在一个名为 NEXT 的特殊寄存器中(将其视为 CPU 的指令指针)。

    需要一个返回堆栈,因为如果对本身是一个单词线程列表的单词进行调用,那么您最终会清理 NEXT 寄存器中的原始地址 - 以停止此操作发生这种情况时,NEXT 寄存器的当前内容被压入返回堆栈。

    如果我理解正确 >r 将数据的顶部元素推入返回堆栈;在这种情况下,'5' 无效,因为地址 '5' 处没有指令。

    正如其他人指出的那样,您不需要关心返回堆栈,除非您正在实现新的控制结构。

    【讨论】:

    • 返回栈可以在一个word执行过程中用于临时存储数据。这有时可以简化仅使用单个数据堆栈的代码。
    【解决方案3】:

    您可以在命令行中使用 Gforth 中的返回堆栈(这是一项非标准功能),但有一个限制:它必须在一行内平衡。在行尾,行解释器将要返回,因此返回堆栈必须包含预期的返回地址。

    所以试试类似的东西

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

    这应该给你

    1 2 7 5
    

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多