本文提供了用于EVM的Ethers ASM Dialect快速、高级的概述, 它是由Ethers ASM Dialect Grammar定义的。
一旦一个程序被高级语言编译成ASM(汇编),或者直接在ASM中进行手动编码,它就需要被编译成字节码。
编译过程执行非常小的操作集,并且有意简化,这与底层EVM字节码密切相关。
操作包括在程序中的嵌入程序(例如,部署辅助程序中嵌入了runtime)和计算跳转操作所需的偏移量。
命令行汇编器可用于编译Ethers ASM Dialect文件或将字节码反汇编为人类可读的操作码和文字。
操作码(Opcodes)可以提供功能性语法(functional syntax)或指导性语法(functional syntax)。 对于需要参数的操作码,推荐使用功能性语法,指导性语法会发出警告。
@TODO: Examples
标签是程序中可以跳转到的位置。一个JUMPDEST
会自动添加到汇编输出中的这个点。
@TODO: Examples
一个字面量(Literals)执行PUSH
操作,表示将数据放入栈中。
提供一个字面量(Literals)能以DataHexString或十进制的字节值的形式。
@TODO: examples
要在Ethers ASM Dialect中输入注释,分号(即 ; )后面的任何文本都会被汇编程序忽略。
以太坊的常见情况是将一个程序嵌入到另一个程序中。
最常见的用法是在部署字节码中嵌入一个合约运行时字节码,这个字节码可以用作初始化代码(init code)。
当程序部署到以太坊时,将使用init transaction。init transaction的to
字段的地址为空, data
的字段数据中包含字节码。 data
字段里的字节码就是程序,执行时返回其他字节码作为结果(result),返回的结果就是要被安装的字节码。
因此,重要的是,嵌入式代码使用相对于自身的跳转,而不是相对于它所嵌入的整个程序, 这也意味着跳转只能针对它自己的作用域,而不能针对父作用域或子作用域。这是由汇编程序强制执行的。
作用域可以访问任何子数据段(Data Segment)或子作用域 的偏移量(相对于自身而言),也可以访问程序中任何位置的数据段(Data Segment)或作用域的长度。
在Ethers ASM Dialect中的每个程序都有一个最高等级的作用域_
。
数据段 允许将任意数据嵌入到程序中,这对于查找表或部署常量很有用。
空的数据段也可以在一个需要带标签的位置中使用,没有JUMPDEST(标签所添加的)。
@TODO: Example
一个 链接 允许访问作用域, 数据段(Data Segment) or 标签.
要访问一个标记项的字节偏移量,使用$foobar
。
对于标签,目标(target)必须在此范围内是直接可达的。 对于数据段(Data Segment)或作用域,它可以位于同一作用域或任何子作用域内。
对于数据段(Data Segment)或标签, 还有一种附加类型的链接,它分别提供数据或字节码的长度。Length Link 可以通过#foobar
获得, 并作为字面量压入栈中。
@TODO: exampl