子程序& GoTo设计

时间:2010-04-02 11:45:36

标签: programming-languages assembly language-design

我有一个关于子程序的奇怪问题:因为我正在创建一个最小的语言,我不想添加像whilefor这样的高级循环,我计划只添加一些getos保持图灵完整。

现在我想,eww - gotos - 如果我不得不经常使用gotos,我不想用那种语言编程。所以我考虑过添加子程序。

我看到的区别如下:

  • gotos

    • 转到(明显的队长)先前定义的点并继续从那里执行程序。导致难以理解和错误的代码,我认为这是事实。
  • 子程序

    • 类似:你在某个地方定义了他们的起点,正如你所说的那样程序在那里跳转 - 但是子程序可以回到返回时调用的点

好。为什么我不添加更多功能更好看的子程序?这是因为:

如果我从其他子程序中的子程序中调用子程序,为了使返回工作,我必须使用堆栈,其中包含当前运行的子程序来自顶部的点。 / p>

那就意味着,如果我使用子程序创建循环,最终会得到一个非常占用内存,溢出的堆栈和返回位置。不好。

不要将我的子程序视为函数。它们只是重新回到它们被调用的地方,它们实际上并没有像今天几乎所有语言中的return x;语句那样回馈它们。

现在我的实际问题:

  • 如何通过子程序循环堆栈溢出来解决上述问题?我是否必须在没有goto选项的情况下添加单独的return语言构造?

  • 汇编程序没有循环但是我看到myJumpPoint:,jnzjzretn。这对我来说意味着必须有一个包含所有返回位置的堆栈。

    • 我是对的吗?
    • 那么长时间运行的循环呢?那么它们不会溢出堆栈/吃内存吗?
    • 我在汇编程序中的retn符号完全错了吗?如果是,请向我解释。

2 个答案:

答案 0 :(得分:1)

jnzjz只是“转到”。

另外,我认为将所有循环实现为子程序不仅仅是添加goto而不是优雅的解决方案。你似乎对goto有偏见。这只是一个词。它不会伤害你。

答案 1 :(得分:0)

好吧,你不能用条件跳转来解决这个问题吗?循环检查某些条件以查看是否必须再次运行。使用您的子程序,但添加一个条件返回,返回到调用点,或者根据条件的评估返回到例程的开头。