Stack(s),ActionScript ByteCode AVM2中的寄存器,哪些都在那里?

时间:2011-03-24 16:03:14

标签: actionscript-3 bytecode avm2

从AVM2概述PDF中我遇到了两种类型的堆栈的引用 - Scope Stack和Operand Stack。

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

2)pushstring“hello” - 这将推动内存地址的开始,其中“hello”字符串位于Operand Stack上。正确?

3)setlocal 0 - 这将通过弹出它将堆栈(上面)中的值存储到register0中。对?

4)PushScope() - 嗯,docs说堆栈的pop值,将值推到Scope Stack上。为什么呢?

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

1 个答案:

答案 0 :(得分:5)

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

  1. 只有2个堆栈,你提到的两个:范围和操作数。
  2. 是的,pushstring“hello”会将字符串推送到操作数堆栈。
  3. 另外,正确。 setlocal0将从堆栈中弹出“hello”并将其存储在reg 0。
  4. 范围堆栈由需要对范围进行名称查找的所有操作使用,例如闭包和异常。通常在ASM代码中,您会看到getlocal_0后面紧跟一个pushscope。这很常见。您可以将其视为将“this”对象添加到作用域堆栈中,以供将来在方法调用,闭包范围等中引用。
  5. 我强烈建议下载Tamarin源并在那里玩反编译器。此外,Yogda看起来非常方便学习:http://www.yogda.com/