5

在 AVM2 概述 PDF 中,我遇到了对两种类型堆栈的引用 - 范围堆栈和操作数堆栈。

1)我假设这是两个不同的内存堆栈,每个处理不同的事情。还有更多的堆栈吗?

2) pushstring "hello" - 这会将 "hello" 字符串所在的内存地址的起始地址推送到操作数堆栈上。正确的?

3) setlocal 0 - 这会将堆栈(上图)中的值通过弹出来存储到 register0 中。正确的?

4)PushScope() - 嗯,文档说堆栈的弹出值,将值推送到范围堆栈上。为什么?

我知道一点 NASM,但 ABC 似乎比这更复杂。特别是我对范围堆栈和多个堆栈的整个概念感到困惑。

4

1 回答 1

5

我不是 AVM2 专家,但这是我所知道的:

  1. 只有2个堆栈,您提到的两个:范围和操作数。
  2. 是的,pushstring "hello" 会将字符串压入操作数堆栈。
  3. 还有,正确。setlocal0 将从堆栈中弹出“hello”并将其存储在 reg 0 中。
  4. 范围堆栈被所有需要名称查找范围的操作使用,例如闭包和异常。通常在 ASM 代码中,您会看到 getlocal_0 紧随其后的是 pushscope。这很常见。您可以将其视为将“this”对象添加到范围堆栈以供将来在方法调用、闭包范围等中引用。

我强烈建议下载 Tamarin 源代码并在那里使用反编译器。此外,Yogda 看起来很适合学习:http ://www.yogda.com/

于 2011-03-25T00:11:45.197 回答