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

Ska*_*Ska 5 bytecode actionscript-3 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和多个堆栈的整个概念感到困惑.

svo*_*sen 5

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

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

我强烈建议下载Tamarin源并在那里玩反编译器.此外,Yogda看起来非常方便学习:http://www.yogda.com/