Lua5.3指令集详解

本文详细介绍了Lua虚拟机的指令集,包括各种操作,如数据移动、加载常量、算术运算、条件判断、表操作等。通过对这些指令的理解,读者能够深入认识Lua的内部工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指令名称类型操作码操作数示例描述
EXTRAARGiAx0x2EAx为常量表索引(最大索引值为2^26)。Ax:67108864获取指定常量表索引处的常量。
MOVEiABC0x00A为目标寄存器索引,B为源寄存器索引,C表示不被使用。B:1 C A:3将指定源寄存器索引处的数值移动到指定目标寄存器索引处,通常用于局部变量赋值和函数参数传递。
LOADKiABx0x01A为目标寄存器索引,Bx为常量表索引(最大索引值为2^18 - 1)。Bx:2 A:4将指定常量表索引处的常量加载到指定目标寄存器索引处。
LOADKXiABx0x02A为目标寄存器索引,Bx表示不被使用。Ax:67108864 Bx A:4LOADKX指令要和EXTRAARG指令配合使用。表示将指定常量表索引处的常量加载到指定目标寄存器索引处。
LOADBOOLiABC0x03A为目标寄存器索引,B为存储布尔值的寄存器,C为存储跳转值的寄存器。B:0 C:1 A:2将B中存储的布尔值加载到指定目标寄存器索引处。当C中存储的跳转值为非0的话,就跳过下一条指令。
LOADNILiABC0x04A为目标寄存器起始索引,B为目标寄存器终止索引,C表示不被使用。B:4 C A:0将目标寄存器中起始索引到终止索引处都设置成nil。通常用于连续给n个局部变量设置nil。
GETUPVALiABC0x05A为目标寄存器索引,B为上值表索引,C表示不被使用。B:1 C A:3将指定上值表索引处的上值拷贝到指定目标寄存器索引处。
SETUPVALiABC0x09A为寄存器索引,B为上值表索引,C表示不被使用。B:0 C A:3将指定寄存器索引处的上值拷贝到指定上值表索引处。
GETTABUPiABC0x06A为目标寄存器索引,B为表所在的上值表索引,C为键所在的寄存器或者常量表索引。B:0 C:0x002 A:3首先从表所在的上值表索引处获取表;然后从键所在的寄存器或者常量表索引处获取键;最后将指定表中指定键关联的上值拷贝到目标寄存器上。
SETTABUPiABC0x08A为上值表索引,B为键所在的寄存器或者常量表索引,C为上值所在的寄存器或者常量表索引。B:0x002 C:0x003 A:0首先从指定的上值表索引处获取上值表;接着从键所在的寄存器或者常量表索引处获取键;然后从上值所在的寄存器或者常量表索引处获取上值;最后将指定上值设置到指定上值表中的指定键处。
GETTABLEiABC0x07A为目标寄存器索引,B为表所在的寄存器索引,C为键所在的寄存器或者常量表索引。B:1 C:0x002 A:3首先从表所在的寄存器索引处获取表;然后从键所在的寄存器或者常量表索引处获取键;最后将指定表中指定键关联的值拷贝到目标寄存器上。
SETTABLEiABC0x0AA为表所在的寄存器索引,B为键所在的寄存器或者常量表索引,C为值所在的寄存器或者常量表索引。B:0x002 C:0x003 A:1首先从表所在的寄存器索引处获取表;接着从键所在的寄存器或者常量表索引处获取键;然后从值所在的寄存器或者常量表索引处获取值;最后将指定值设置到指定表中的指定键处。
NEWTABLEiABC0x0BA为目标寄存器索引,B为数组部分容量,C为哈希部分容量。B:0 C:2 A:4首先创建一个空表;接着通过B中存储的数值来初始化空表的数组部分容量;然后通过C中存储的数值来初始化空表的哈希部分容量;最后将初始化后的空表加载到指定目标寄存器索引处。
SELFiABC0x0CA为目标寄存器起始索引,B为对象所在的寄存器索引,C为函数名所在的常量表索引。B:1 C:0x100 A:2首先从对象所在的寄存器索引处获取对象;接着从函数名所在的常量表索引处获取函数名;然后从指定对象中获取指定函数名对应的函数值;最后将指定的函数值拷贝到指定目标寄存器起始索引处以及将指定对象拷贝到指定目标寄存器起始索引加一处。
ADDiABC0x0DA为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相加得到的数值存储到指定目标寄存器索引处。
SUBiABC0x0EA为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相减得到的数值存储到指定目标寄存器索引处。
MULiABC0x0FA为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相乘得到的数值存储到指定目标寄存器索引处。
MODiABC0x10A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求模运算得到的数值存储到指定目标寄存器索引处。
POWiABC0x11A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求幂运算得到的数值存储到指定目标寄存器索引处。
DIViABC0x12A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行相除得到的数值存储到指定目标寄存器索引处。
IDIViABC0x13A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行相整除得到的数值存储到指定目标寄存器索引处。
BANDiABC0x14A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求与操作得到的数值存储到指定目标寄存器索引处。
BORiABC0x15A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求或操作得到的数值存储到指定目标寄存器索引处。
BXORiABC0x16A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求异或操作得到的数值存储到指定目标寄存器索引处。
SHLiABC0x17A为目标寄存器索引,B为数值所在的寄存器或者常量表索引,C为位数所在的寄存器或者常量表索引。B:0x001 C:0x100 A:4首先从数值所在的寄存器或者常量表索引处获取数值;然后从位数所在的寄存器或者常量表索引处获取位数;最后将指定数值左移指定位数得到的结果存储到指定目标寄存器索引处。
SHRiABC0x18A为目标寄存器索引,B为数值所在的寄存器或者常量表索引,C为位数所在的寄存器或者常量表索引。B:0x001 C:0x100首先从数值所在的寄存器或者常量表索引处获取数值;然后从位数所在的寄存器或者常量表索引处获取位数;最后将指定数值右移指定位数得到的结果存储到指定目标寄存器索引处。
UNMiABC0x19A为目标寄存器索引,B为源寄存器索引,C表示不被使用。B:1 C A:3首先获取源寄存器索引处的数值;然后将该数值求负后得到的结果移动到目标寄存器索引处。
BNOTiABC0x1AA为目标寄存器索引,B为源寄存器索引,C表示不被使用。B:1 C A:3首先获取源寄存器索引处的数值;然后将该数值求反后得到的结果移动到目标寄存器索引处。
NOTiABC0x1BA为目标寄存器索引,B为源寄存器索引,C表示不被使用。B:1 C A:3首先获取源寄存器索引处的数值;然后将该数值求非后得到的结果移动到目标寄存器索引处。
LENiABC0x1CA为目标寄存器索引,B为源寄存器索引,C表示不被使用。B:1 C A:3首先获取源寄存器索引处的数值;然后将该数值求长度后得到的结果移动到目标寄存器索引处。
CONCATiABC0x1DA为目标寄存器索引,B为寄存器起始索引,C为寄存器终止索引。B:2 C:4 A:1首先将寄存器起始索引到寄存器终止索引之间存储的所有数值进行拼接操作;然后将拼接后得到的结果移动到目标寄存器索引处。
JMPiAsBx0x1EA要么不被使用,要么为上值表索引;sBx为跳转值。sBx:-1 A sBx:0 A:0x001当sBx的值为0时,就会不跳转并继续执行后面指令。如:首先获取上值表索引处的上值;然后把即将销毁的局部变量数值更新到该上值中。当sBx的值不为0时,就会进行无条件跳转,其中sBx的值为-1时,就会死循环的执行当前指令。
EQiABC0x1FA为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:1首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否等于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
LTiABC0x20A为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:1首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否小于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
LEiABC0x21A为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。B:0x001 C:0x100 A:1首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否小于等于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
TESTiABC0x22A为寄存器索引;B表示不被使用;C为判定值。B C:0 A:1首先从指定的寄存器索引处获取数值并转换成布尔值;然后当布尔值和C的判定值不相等时,就跳过下一条指令。
CALLiABC0x24A为函数所在的寄存器索引;B为参数个数;C为返回值个数。B:5 C:4 A:0首先从函数所在的寄存器索引处获取函数;然后当B的参数个数大于0时,就将函数所在的寄存器索引处加一作为参数起始索引,将函数所在的寄存器索引处加B的参数个数作为参数终止索引,并获取参数起始索引到参数终止索引处的参数列表。当B的参数个数等于0时,就将其他函数的返回值作为参数列表;最后调用函数并传递参数列表:当C的返回值个数等于0时,就将函数返回值依次递增存储在函数所在的寄存器索引处;当C的返回值个数等于1时,就不处理函数返回值;当C的返回值个数大于1时,就将C的返回值个数-1个函数返回值依次递增存储在函数所在的寄存器索引处。
TAILCALLiABC0x25A为函数所在的寄存器索引;B为参数个数;C为返回值个数。B:5 C:4 A:0跟CALL指令一致。不同点就是:被调函数可以重用主调函数的操作栈,进而避免递归调用函数时出现栈溢出的问题。
RETURNiABC0x26A为返回值所在的寄存器起始索引;B为返回值个数;C表示不被使用。B:4 C A:2当B的返回值个数等于1时,就不需要返回任何值。当B的返回值个数大于1时,就首先从返回值所在的寄存起始索引处递增获取B-1个返回值;然后将获取到的返回值复制到栈顶。当B的返回值个数等于0时,表示一部分返回值已经复制到栈顶,只需要将剩下的返回值复制到栈顶即可。
FORLOOPiAsBx0x27A为初始值所在的寄存器索引;sBx为跳转偏移。sBx:-3 A:0首先从初始值所在的寄存器索引处获取初始值、从初始值所在的寄存器索引加一处获取上限值、从初始值所在的寄存器索引加二处获取步长值、从初始值所在的寄存器索引加三处获取循环变量。然后循环执行以下流程:首先将初始值累加步长值;然后判定初始值是否在限制值的范围内:如果是的话,就会将指令跳转sBx的偏移值并将初始值存储到循环变量中;如果不是的话,就会结束循环。
FORPREPiAsBx0x28A为初始值所在的寄存器索引;sBx为跳转偏移。sBx:2 A:0首先从初始值所在的寄存器索引处获取初始值、从初始值所在的寄存器索引加一处获取上限值、从初始值所在的寄存器索引加二处获取步长值、从初始值所在的寄存器索引加三处获取循环变量。然后将初始值累减步长值并将指令跳转sBx的偏移值。最后循环执行以下流程:首先将初始值累加步长值;然后判定初始值是否在限制值的范围内:如果是的话,就会将指令跳转sBx的偏移值并将初始值存储到循环变量中;如果不是的话,就会结束循环。
TFORCALLiABC0x29A为迭代器所在的寄存器索引;B表示不被使用;C为偏移值。B C:2 A:0首先从迭代器所在的寄存器索引处获取迭代器、从迭代器所在的寄存器索引加一处获取状态变量、从迭代器所在的寄存器索引加二处获取控制变量、从迭代器所在的寄存器索引加三处获取key变量、从迭代器所在的寄存器索引加二加C的偏移值处获取value变量。然后调用迭代器并传递状态变量和控制变量,并将返回结果分别存储到key变量和value变量中。
TFORLOOPiAsBx0x2AA为控制变量所在的寄存器索引;sBx为跳转偏移。sBx:-6 A:2首先从控制变量所在的寄存器索引减二处获取迭代器、从控制变量所在的寄存器索引减一处获取状态变量、从控制变量所在的寄存器索引处获取控制变量、从控制变量所在的寄存器索引加一处获取key变量、从控制变量所在的寄存器索引加二处获取value变量。然后循环执行以下流程:首先调用迭代器并传递状态变量和控制变量,并将返回结果分别存储到key变量和value变量中;然后判定key变量是否等于nil:如果是的话,就会结束循环;如果不是的话,就会将key变量复制到控制变量中,并将指令跳转sBx的偏移值。
SETLISTiABC0x2BA为表所在的寄存器索引;B为数值个数;C为批次数。B:4 C:1 A:0当C操作数 > 0时,批次数就等于C操作数 - 1。否则,批次数就等于EXTRARRG指令中的Ax操作数。首先从表所在的寄存器索引处获取表。然后执行循环变量从1开始到B的数值个数结束的循环遍历:首先按照批次数乘以50加上循环变量来获取key变量;然后从表所在的寄存器索引加循环变量处来获取value变量;最后将value变量存储到表中key变量处。
CLOSUREiABx0x2CA为目标寄存器索引;Bx为子函数表索引。Bx:1 A:4首先从指定的子函数表索引处获取子函数。然后将子函数实例化成闭包。最后将闭包存储到指定目标寄存器索引处。
VARARGiABC0x2DA为目标寄存器索引;B为参数个数;C表示不被使用。B:5 C A:1当操作数B等于0时,就不做任何处理。当操作数B不等于0时,就将可变参数中的B - 1个参数依次复制到目标寄存器索引递增位置处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值