2011-03-24 84 views
5

从AVM2概述PDF中,我遇到了对两种类型堆栈的引用 - 范围堆栈和操作数堆栈。堆栈(s),ActionScript中的寄存器ByteCode AVM2,哪里都有?

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

2)pushstring“hello” - 这会将“hello”字符串所在的内存地址的开始推到操作数堆栈上。对?

3)setlocal 0 - 这将通过弹出它将堆栈(上面)中的值存储到register0中。对? 4)PushScope() - hmm,docs说栈的弹出值,将值推送到范围堆栈。为什么?

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

回答

5

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

  1. 只有2堆,两个你提到:范围和操作数。
  2. 是的,pushstring“hello”会将字符串压入操作数堆栈。
  3. 此外,正确。 setlocal0将从堆栈中弹出“hello”并将其存储在reg 0中。
  4. 范围堆栈被所有需要查找作用域的操作的操作使用,例如关闭和异常。通常在ASM代码中,您将看到getlocal_0后面紧跟着一个pushscope。这很常见。你可以种把它当作加入“此”对象在方法调用,范围为封闭备查范围堆栈等

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

+0

Wohooo,Yogda看起来史诗。也感谢其他答案,我看到使用PushScope和NewActivation--稍后由Adobe编译器完成,因此我非常困惑。我想这些情况只是从他们身边而来的。 – Ska 2011-03-29 02:38:25

+0

是的,我注意到编译器经常这样做并不总是必要的。许多人抱怨mxmlc,例如Joa Ebert。他更像是AVM2的专家。绝对看看他一直在努力的设备框架:http://code.google.com/p/apparat/ – svoisen 2011-03-29 20:22:44

+0

我看到的ABC越多,我就会注意到更多未使用的操作。 例如(这太搞笑了): Dup的, SETLOCAL 2, PushScope, PopScope, 杀2,\t 我看着阿帕拉特也,谢谢。至于Yogda,它似乎完全是我需要的工具,但是......它只是Windows :( – Ska 2011-04-01 13:46:10

相关问题