Ethers ASM Dialect

本文提供了用于EVM的Ethers ASM Dialect快速、高级的概述, 它是由Ethers ASM Dialect Grammar定义的。

一旦一个程序被高级语言编译成ASM(汇编),或者直接在ASM中进行手动编码,它就需要被编译成字节码。

编译过程执行非常小的操作集,并且有意简化,这与底层EVM字节码密切相关。

操作包括在程序中的嵌入程序(例如,部署辅助程序中嵌入了runtime)和计算跳转操作所需的偏移量。

命令行汇编器可用于编译Ethers ASM Dialect文件或将字节码反汇编为人类可读的操作码和文字。

操作码(Opcodes)

操作码(Opcodes)可以提供功能性语法(functional syntax)或指导性语法(functional syntax)。 对于需要参数的操作码,推荐使用功能性语法,指导性语法会发出警告。

@TODO: Examples

标签

标签是程序中可以跳转到的位置。一个JUMPDEST会自动添加到汇编输出中的这个点。

@TODO: Examples

字面量(Literals)

一个字面量(Literals)执行PUSH操作,表示将数据放入栈中。

提供一个字面量(Literals)能以DataHexString或十进制的字节值的形式。

@TODO: examples

注释

要在Ethers ASM Dialect中输入注释,分号(即 ; )后面的任何文本都会被汇编程序忽略。

作用域

以太坊的常见情况是将一个程序嵌入到另一个程序中。

最常见的用法是在部署字节码中嵌入一个合约运行时字节码,这个字节码可以用作初始化代码(init code)

当程序部署到以太坊时,将使用init transactioninit transactionto 字段的地址为空, data的字段数据中包含字节码。 data字段里的字节码就是程序,执行时返回其他字节码作为结果(result),返回的结果就是要被安装的字节码。

因此,重要的是,嵌入式代码使用相对于自身的跳转,而不是相对于它所嵌入的整个程序, 这也意味着跳转能针对它自己的作用域,而不能针对父作用域或子作用域。这是由汇编程序强制执行的。

作用域可以访问任何子数据段(Data Segment)或子作用域 的偏移量(相对于自身而言),也可以访问程序中任何位置的数据段(Data Segment)作用域的长度。

Ethers ASM Dialect中的每个程序都有一个最高等级的作用域_

数据段(Data Segment)

数据段 允许将任意数据嵌入到程序中,这对于查找表或部署常量很有用。

空的数据段也可以在一个需要带标签的位置中使用,没有JUMPDEST(标签所添加的)。

@TODO: Example

链接

一个 链接 允许访问作用域, 数据段(Data Segment) or 标签.

要访问一个标记项的字节偏移量,使用$foobar

对于标签,目标(target)必须在此范围内是直接可达的。 对于数据段(Data Segment)作用域,它可以位于同一作用域或任何子作用域内。

对于数据段(Data Segment)标签, 还有一种附加类型的链接,它分别提供数据或字节码的长度。Length Link 可以通过#foobar获得, 并作为字面量压入栈中。

堆栈占位符

@TODO: exampl

评价与执行