Lua指令编码与解码

2020-09-24  本文已影响0人  APP4x

编码模式:

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)

上一篇 下一篇

猜你喜欢

热点阅读