Berry 指令设计

柔情痞子 提交于 2019-12-03 00:04:31

Berry 脚本源代码需要被编译为字节码指令流才能被 Berry 虚拟机执行。本文将描述 Berry 字节码指令(下面简称指令)的定义,解释器源码中对指令的定义可以参考 be_opcode.h 文件。

指令的构成

一条指令占用 4 个字节,也就是一个 32 位的整数,准确地说应该是 32 位的无符号整数。一条指令由操作码(Operation Code)和若干操作数构成,不同操作码的指令可以有不同的操作数成分。任何情况下,指令可能是以下几种情况:

Mode 1 Mode 2 Mode 3 Mode 4 Mode 5
OP: 6 bits OP: 6 bits OP: 6 bits OP: 6 bits OP: 6 bits
A: 8 bits A: 8 bits A: 8 bits sAx: 26 bits Ax: 26 bits
B: 9 bits sBX: 18 bits Bx: 18 bits --- ---
C: 9 bits --- --- --- ---

其中模式 1 和模式 2 比较常用,模式 4 和模式 5 目前没有用到。在所有几种模式中,一条指令的 32 位被分为不同的字段,例如模式 1 中被分为 6 位的 OP 字段,8 位的操作数 A 字段,9 位的操作数 B 字段以及 9 位的操作数 C 字段。

每种字段都有一个名字,以下是各字段名称的含义:

字段 Bits 说明
OP 31:26 操作码,最多可容纳 64 种操作码
A 25:18 无符号操作数 A,一般用于表示寄存器的索引,取值范围为 0 ~ 255
B 17:9 无符号操作数 B,一般用于表示寄存器或者常量的索引,取值范围为 0 ~ 511
C 8:0 无符号操作数 C,一般用于表示寄存器或者常量的索引,取值范围为 0 ~ 511
sBx 17:0 有符号操作数 sBx,取值范围为 -13072 ~ 13071
Bx 17:0 无符号操作数 Bx,取值范围为 0 ~ 262143
sAx 25:0 有符号操作数 sAx,取值范围为 -33554432 ~ 33554431
Ax 25:0 无符号操作数 Ax,取值范围为 0 ~ 67108863

注意:指令字段并不是任意组合的,只能按上面表中的模式 1 到模式 5 中的 5 种方式组合。

指令的编解码

由于一条指令总是被封装为 32 位的整数,为了生成这些指令并由 VM 执行,必须进行指令的编码和解码。be_opcode.h 文件中给出了一些宏用于指令的编解码。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!