编码模式:
Lua虚拟机指令可以分为四类
分别对应四种编码模式(Mode):
1.iABC(39个)
携带A B C三个操作数,分别占用8 9 9个比特
2.iABx(3个)
携带A Bx两个操作数,分别占用8 18个比特
3.iAsBx(4个)
携带A sBx两个操作书,分别占用8 18个比特
4.iAx(1个)
携带Ax一个操作数,占用全部26个比特
大部分都是iABC的
eg:
OP_MOVE、OP_LOADK、OPLOADKX、OP_LOADBOOL...
操作数:
是指令的参数,每条指令可以携带1到3个操作数
A主要用来表示目标寄存器索引
其他的按照其表示的信息,分为四种类型:
a.OpArgN
不表示任何信息,表示不会被使用
(Move操作符只需要AB操作数,C不用,就是这个类型)
b.OpArgU
表示布尔值、整数值、upvalue索引、子函数索引等等
c.OpArgR
在iABC模式下表示寄存器的索引,在iAsBx模式下表示跳转偏移
d.OpArgK
表示常量表索引或者寄存器的索引
指令表:
为了便于代码中使用,Lua官方实现把每一条指令的基本信息(包括编码模式、是否设置寄存器A、操作数B和C的使用类型等)都编成了一个子节
指令解码
提取操作码:
int(self & 0x3F)
提取iABC参数:
a=int(self >> 6 & 0xFF)
c=int(self >>14 & 0x1FF)
b=int(self >> 23 & 0x1FF)
提取iABx参数
a = int(self >> 6 & 0xFF)
bx = int(self >> 14)
提取iAx参数
a = int(self >> 6)
网友评论