编译AVM-字节码-变量

2019-11-08 17:44 栏目:经验之谈 来源: 查看()
现在我们讨论从另一种汇编语言如何编译成AVM,其实,没有什么不同。 让我们以IL为例,同为栈式虚拟机,IL指令和AVM指令有很多相似之处。

与AVM不同,伊利诺伊州仍然在职能层面保持模块化结构。i1没有连接成一个大字节[],但是每个函数对应一个字节[]。白细胞介素的调用是在功能级别。对应于每个函数的逻辑单元指令地址从零开始,并且逻辑单元的jmp已经被转换成一个地址。

编译AVM-字节码-变量

让我们仍然使用这个1+2的例子。 我们将上述代码编译成c# dll,并在调试模式下编译。他的白细胞介素代码应该是这样的:

编译AVM-字节码-变量

好吧,让我们一个接一个地谈谈。 nop 空指令 loc是NEOVM的PUSH stloc,用于将值放入变量列表 ldloc,用于从变量列表 add获取值,NEOVM ADD br是NEOVM的br指令JMP ret和NEOVM的RET。它是通过调试模式编译生成的,RELEASE模式编译将得到优化。主要使用RELEASE模式还会生成许多其他优化指令,这便于解释。让我们忽略这个br跳转。 这种br跳转是对下一条指令的毫无意义的跳转,没有任何副作用。 好吧,让我们刷新 普什图1 普什图0 普什图2 普什图1 ldloc 0 ldloc 1 添加 stloc 2 ldloc 2 ret 并考虑伪码//Inta=1普什图1 stloc 0//intb=2普什图2 stloc 1//return+bldlloc 0 ldloc 1 最后一个STLOC 2和LDLOC2是临时变量,这可以消除 编译器在调试模式下所做的工作: var c=a+b; 返回c; 如果你已经理解了前一篇文章,你就不需要再阅读它了,因为下面的处理是前一篇文章的后半部分。 IL代码直接将变量列表的概念应用于变量。在前一篇文章中,我们讨论了如何编译变量和添加变量列表。[的概念直接存在,所以我们直接翻译他的代码。在前一篇文章中,我们需要计算临时变量的数量。这次,我们不需要它。白细胞介素直接拥有这些数据。

编译AVM-字节码-变量

IL在中具有可变的表类型和索引。 这次代码在样本/编译器il01 中翻译非常简单。在大多数情况下,如果你已经把一种高级语言编译成AVM语。然后你对AVM做一个高级语言字节码编译,后半部分的工作内容是相似的。

编译AVM-字节码-变量

我们只需要直接处理大部分代码,逻辑与之前的编译相同。 但是在STLOC 这里有一点小麻烦,il指令是 //il code LDC . i4.1 ST loc . 0 但是我们预计翻译结果是 //AVM dupromalt stack//数组 push 0//索引 Push1//LDC.i4.1 设置STLOC代码需要的项 也许你应该考虑移交订单。不幸的是,这将使问题变得更加复杂 stloc的意思是取出计算堆栈顶部的值并将其放入变量列表中。例如,在这种情况下,上述三条指令的计算结果被放入变量列表,因此不可能任意改变代码顺序,我们该怎么办? //AVM·[/H/]PUSH 1//LDC . I 4.1[/H/]//STLOC . 0开始[/H/]DUPFORALTTSTACK//数组[/H/]PUSH 0//索引[/H/]PUSH 2[/H/]ROLL[/H/]SETITEM[/H/]//STLOC . 0结束[/H/]我们插入更多指令,并让NEOVM调整堆栈上的数据顺序。我们使用PUSH 2和ROLL 2指令来完成堆栈上的参数序列反转 例如,当堆栈上的值从底部到顶部是[1、变量数组、0/变量索引/] ROLL 2时,从堆栈顶部索引为2的值可以提升到堆栈顶部。在第二卷执行后,[变量数组,0,1],这符合我们的期望。 参考源位置:https://github . com/light zero/neovbook/tree/master/samples/compiler _ il01

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发