【问题标题】:What does 'return from subroutine' mean?“从子程序返回”是什么意思?
【发布时间】:2017-07-07 07:03:43
【问题描述】:

我正在尝试使用 C 从头开始​​构建我的第一个 CHIP-8 仿真器。在为指令编写必要的代码时,我遇到了这个操作码:

00EE - RET
Return from a subroutine.

The interpreter sets the program counter to the address at the top of the stack, then subtracts 1 from the stack pointer.

(http://devernay.free.fr/hacks/chip8/C8TECH10.HTM)

我知道子程序基本上是一个函数,但是从子程序“返回”是什么意思?程序计数器、堆栈和堆栈指针分别发生了什么?

(另外一个问题):如果我创建了一个可以容纳 16 个值的数组来表示堆栈,那么“堆栈顶部”是 STACK[0] 还是 STACK[15]?我的堆栈指针应该在哪里?

【问题讨论】:

  • 其他问题应该是……嗯……另一个问题,这里没有附加。提问无需付费,因此请随意提问。
  • 它在您链接的文档和文本中明确说明。当调用函数时,程序计数器(返回)被放在栈顶,从函数返回时,返回地址在栈顶。
  • 在经典的 C hello 世界中从 main() 调用 printf 的函数返回是什么意思 printf 执行操作然后返回到 main。同样的事情。一个函数调用另一个函数,并且在返回时,您希望它在该函数调用之后继续运行函数中的代码...
  • 您提供的文档以及文本解释了堆栈,在调用时它递增,在返回时它递减堆栈指针,人们会假设它在达到 15 时滚动并递增它去 0 但也许它不是这样设计的。根据定义,栈顶是栈指针指向的地址(即使是向下增长的栈)。
  • 感谢您的回复。当我发布这个问题时,我对堆栈的运作方式没有完全、准确的理解。回顾参考手册,我现在可以清楚地看到为什么堆栈对于在执行函数后继续程序很重要。顺便说一句,似乎“无法推送更多数据的顶部边界”是堆栈 [15],但是是否有解释这个特定边界的官方术语?

标签: stack emulation opcode chip-8


【解决方案1】:

从子例程返回是将代码执行返回到调用子例程之前的位置。

因此,假设调用子程序会将当前地址 PC+2(+2 以跳过调用指令)压入堆栈。从子例程返回将通过从堆栈中弹出地址将执行返回到被压入堆栈的地址。 (例如 pc=stack[sp]; sp-=2;)

至于其他问题,这实际上取决于您将堆栈定义为升序还是降序。对于 CHIP-8,没有指定选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2012-09-06
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多