Lua指令编码与解码

编码模式:

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值