Lua5.3指令集详解

指令名称 类型 操作码 操作数 示例 描述
EXTRAARG iAx 0x2E Ax为常量表索引(最大索引值为2^26)。 Ax:67108864 获取指定常量表索引处的常量。
MOVE iABC 0x00 A为目标寄存器索引,B为源寄存器索引,C表示不被使用。 B:1 C A:3 将指定源寄存器索引处的数值移动到指定目标寄存器索引处,通常用于局部变量赋值和函数参数传递。
LOADK iABx 0x01 A为目标寄存器索引,Bx为常量表索引(最大索引值为2^18 - 1)。 Bx:2 A:4 将指定常量表索引处的常量加载到指定目标寄存器索引处。
LOADKX iABx 0x02 A为目标寄存器索引,Bx表示不被使用。 Ax:67108864 Bx A:4 LOADKX指令要和EXTRAARG指令配合使用。表示将指定常量表索引处的常量加载到指定目标寄存器索引处。
LOADBOOL iABC 0x03 A为目标寄存器索引,B为存储布尔值的寄存器,C为存储跳转值的寄存器。 B:0 C:1 A:2 将B中存储的布尔值加载到指定目标寄存器索引处。当C中存储的跳转值为非0的话,就跳过下一条指令。
LOADNIL iABC 0x04 A为目标寄存器起始索引,B为目标寄存器终止索引,C表示不被使用。 B:4 C A:0 将目标寄存器中起始索引到终止索引处都设置成nil。通常用于连续给n个局部变量设置nil。
GETUPVAL iABC 0x05 A为目标寄存器索引,B为上值表索引,C表示不被使用。 B:1 C A:3 将指定上值表索引处的上值拷贝到指定目标寄存器索引处。
SETUPVAL iABC 0x09 A为寄存器索引,B为上值表索引,C表示不被使用。 B:0 C A:3 将指定寄存器索引处的上值拷贝到指定上值表索引处。
GETTABUP iABC 0x06 A为目标寄存器索引,B为表所在的上值表索引,C为键所在的寄存器或者常量表索引。 B:0 C:0x002 A:3 首先从表所在的上值表索引处获取表;然后从键所在的寄存器或者常量表索引处获取键;最后将指定表中指定键关联的上值拷贝到目标寄存器上。
SETTABUP iABC 0x08 A为上值表索引,B为键所在的寄存器或者常量表索引,C为上值所在的寄存器或者常量表索引。 B:0x002 C:0x003 A:0 首先从指定的上值表索引处获取上值表;接着从键所在的寄存器或者常量表索引处获取键;然后从上值所在的寄存器或者常量表索引处获取上值;最后将指定上值设置到指定上值表中的指定键处。
GETTABLE iABC 0x07 A为目标寄存器索引,B为表所在的寄存器索引,C为键所在的寄存器或者常量表索引。 B:1 C:0x002 A:3 首先从表所在的寄存器索引处获取表;然后从键所在的寄存器或者常量表索引处获取键;最后将指定表中指定键关联的值拷贝到目标寄存器上。
SETTABLE iABC 0x0A A为表所在的寄存器索引,B为键所在的寄存器或者常量表索引,C为值所在的寄存器或者常量表索引。 B:0x002 C:0x003 A:1 首先从表所在的寄存器索引处获取表;接着从键所在的寄存器或者常量表索引处获取键;然后从值所在的寄存器或者常量表索引处获取值;最后将指定值设置到指定表中的指定键处。
NEWTABLE iABC 0x0B A为目标寄存器索引,B为数组部分容量,C为哈希部分容量。 B:0 C:2 A:4 首先创建一个空表;接着通过B中存储的数值来初始化空表的数组部分容量;然后通过C中存储的数值来初始化空表的哈希部分容量;最后将初始化后的空表加载到指定目标寄存器索引处。
SELF iABC 0x0C A为目标寄存器起始索引,B为对象所在的寄存器索引,C为函数名所在的常量表索引。 B:1 C:0x100 A:2 首先从对象所在的寄存器索引处获取对象;接着从函数名所在的常量表索引处获取函数名;然后从指定对象中获取指定函数名对应的函数值;最后将指定的函数值拷贝到指定目标寄存器起始索引处以及将指定对象拷贝到指定目标寄存器起始索引加一处。
ADD iABC 0x0D A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相加得到的数值存储到指定目标寄存器索引处。
SUB iABC 0x0E A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相减得到的数值存储到指定目标寄存器索引处。
MUL iABC 0x0F A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值相乘得到的数值存储到指定目标寄存器索引处。
MOD iABC 0x10 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求模运算得到的数值存储到指定目标寄存器索引处。
POW iABC 0x11 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求幂运算得到的数值存储到指定目标寄存器索引处。
DIV iABC 0x12 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行相除得到的数值存储到指定目标寄存器索引处。
IDIV iABC 0x13 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行相整除得到的数值存储到指定目标寄存器索引处。
BAND iABC 0x14 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求与操作得到的数值存储到指定目标寄存器索引处。
BOR iABC 0x15 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求或操作得到的数值存储到指定目标寄存器索引处。
BXOR iABC 0x16 A为目标寄存器索引,B为第一个值所在的寄存器或者常量表索引,C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;然后从第二个值所在的寄存器或者常量表索引处获取第二个值;最后将第一个值和第二个值进行求异或操作得到的数值存储到指定目标寄存器索引处。
SHL iABC 0x17 A为目标寄存器索引,B为数值所在的寄存器或者常量表索引,C为位数所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:4 首先从数值所在的寄存器或者常量表索引处获取数值;然后从位数所在的寄存器或者常量表索引处获取位数;最后将指定数值左移指定位数得到的结果存储到指定目标寄存器索引处。
SHR iABC 0x18 A为目标寄存器索引,B为数值所在的寄存器或者常量表索引,C为位数所在的寄存器或者常量表索引。 B:0x001 C:0x100 首先从数值所在的寄存器或者常量表索引处获取数值;然后从位数所在的寄存器或者常量表索引处获取位数;最后将指定数值右移指定位数得到的结果存储到指定目标寄存器索引处。
UNM iABC 0x19 A为目标寄存器索引,B为源寄存器索引,C表示不被使用。 B:1 C A:3 首先获取源寄存器索引处的数值;然后将该数值求负后得到的结果移动到目标寄存器索引处。
BNOT iABC 0x1A A为目标寄存器索引,B为源寄存器索引,C表示不被使用。 B:1 C A:3 首先获取源寄存器索引处的数值;然后将该数值求反后得到的结果移动到目标寄存器索引处。
NOT iABC 0x1B A为目标寄存器索引,B为源寄存器索引,C表示不被使用。 B:1 C A:3 首先获取源寄存器索引处的数值;然后将该数值求非后得到的结果移动到目标寄存器索引处。
LEN iABC 0x1C A为目标寄存器索引,B为源寄存器索引,C表示不被使用。 B:1 C A:3 首先获取源寄存器索引处的数值;然后将该数值求长度后得到的结果移动到目标寄存器索引处。
CONCAT iABC 0x1D A为目标寄存器索引,B为寄存器起始索引,C为寄存器终止索引。 B:2 C:4 A:1 首先将寄存器起始索引到寄存器终止索引之间存储的所有数值进行拼接操作;然后将拼接后得到的结果移动到目标寄存器索引处。
JMP iAsBx 0x1E A要么不被使用,要么为上值表索引;sBx为跳转值。 sBx:-1 A sBx:0 A:0x001 当sBx的值为0时,就会不跳转并继续执行后面指令。如:首先获取上值表索引处的上值;然后把即将销毁的局部变量数值更新到该上值中。当sBx的值不为0时,就会进行无条件跳转,其中sBx的值为-1时,就会死循环的执行当前指令。
EQ iABC 0x1F A为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:1 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否等于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
LT iABC 0x20 A为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:1 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否小于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
LE iABC 0x21 A为判定数值;B为第一个值所在的寄存器或者常量表索引;C为第二个值所在的寄存器或者常量表索引。 B:0x001 C:0x100 A:1 首先从第一个值所在的寄存器或者常量表索引处获取第一个值;接着从第二个值所在的寄存器或者常量表索引处获取第二个值;然后比较第一个值是否小于等于第二个值;最后当比较结果和A的判定值相等时,就跳过下一条指令。
TEST iABC 0x22 A为寄存器索引;B表示不被使用;C为判定值。 B C:0 A:1 首先从指定的寄存器索引处获取数值并转换成布尔值;然后当布尔值和C的判定值不相等时,就跳过下一条指令。
CALL iABC 0x24 A为函数所在的寄存器索引;B为参数个数;C为返回值个数。 B:5 C:4 A:0 首先从函数所在的寄存器索引处获取函数;然后当B的参数个数大于0时,就将函数所在的寄存器索引处加一作为参数起始索引,将函数所在的寄存器索引处加B的参数个数作为参数终止索引,并获取参数起始索引到参数终止索引处的参数列表。当B的参数个数等于0时,就将其他函数的返回值作为参数列表;最后调用函数并传递参数列表:当C的返回值个数等于0时,就将函数返回值依次递增存储在函数所在的寄存器索引处;当C的返回值个数等于1时,就不处理函数返回值;当C的返回值个数大于1时,就将C的返回值个数-1个函数返回值依次递增存储在函数所在的寄存器索引处。
TAILCALL iABC 0x25 A为函数所在的寄存器索引;B为参数个数;C为返回值个数。 B:5 C:4 A:0 跟CALL指令一致。不同点就是:被调函数可以重用主调函数的操作栈,进而避免递归调用函数时出现栈溢出的问题。
RETURN iABC 0x26 A为返回值所在的寄存器起始索引;B为返回值个数;C表示不被使用。 B:4 C A:2 当B的返回值个数等于1时,就不需要返回任何值。当B的返回值个数大于1时,就首先从返回值所在的寄存起始索引处递增获取B-1个返回值;然后将获取到的返回值复制到栈顶。当B的返回值个数等于0时,表示一部分返回值已经复制到栈顶,只需要将剩下的返回值复制到栈顶即可。
FORLOOP iAsBx 0x27 A为初始值所在的寄存器索引;sBx为跳转偏移。 sBx:-3 A:0 首先从初始值所在的寄存器索引处获取初始值、从初始值所在的寄存器索引加一处获取上限值、从初始值所在的寄存器索引加二处获取步长值、从初始值所在的寄存器索引加三处获取循环变量。然后循环执行以下流程:首先将初始值累加步长值;然后判定初始值是否在限制值的范围内:如果是的话,就会将指令跳转sBx的偏移值并将初始值存储到循环变量中;如果不是的话,就会结束循环。
FORPREP iAsBx 0x28 A为初始值所在的寄存器索引;sBx为跳转偏移。 sBx:2 A:0 首先从初始值所在的寄存器索引处获取初始值、从初始值所在的寄存器索引加一处获取上限值、从初始值所在的寄存器索引加二处获取步长值、从初始值所在的寄存器索引加三处获取循环变量。然后将初始值累减步长值并将指令跳转sBx的偏移值。最后循环执行以下流程:首先将初始值累加步长值;然后判定初始值是否在限制值的范围内:如果是的话,就会将指令跳转sBx的偏移值并将初始值存储到循环变量中;如果不是的话,就会结束循环。
TFORCALL iABC 0x29 A为迭代器所在的寄存器索引;B表示不被使用;C为偏移值。 B C:2 A:0 首先从迭代器所在的寄存器索引处获取迭代器、从迭代器所在的寄存器索引加一处获取状态变量、从迭代器所在的寄存器索引加二处获取控制变量、从迭代器所在的寄存器索引加三处获取key变量、从迭代器所在的寄存器索引加二加C的偏移值处获取value变量。然后调用迭代器并传递状态变量和控制变量,并将返回结果分别存储到key变量和value变量中。
TFORLOOP iAsBx 0x2A A为控制变量所在的寄存器索引;sBx为跳转偏移。 sBx:-6 A:2 首先从控制变量所在的寄存器索引减二处获取迭代器、从控制变量所在的寄存器索引减一处获取状态变量、从控制变量所在的寄存器索引处获取控制变量、从控制变量所在的寄存器索引加一处获取key变量、从控制变量所在的寄存器索引加二处获取value变量。然后循环执行以下流程:首先调用迭代器并传递状态变量和控制变量,并将返回结果分别存储到key变量和value变量中;然后判定key变量是否等于nil:如果是的话,就会结束循环;如果不是的话,就会将key变量复制到控制变量中,并将指令跳转sBx的偏移值。
SETLIST iABC 0x2B A为表所在的寄存器索引;B为数值个数;C为批次数。 B:4 C:1 A:0 当C操作数 > 0时,批次数就等于C操作数 - 1。否则,批次数就等于EXTRARRG指令中的Ax操作数。首先从表所在的寄存器索引处获取表。然后执行循环变量从1开始到B的数值个数结束的循环遍历:首先按照批次数乘以50加上循环变量来获取key变量;然后从表所在的寄存器索引加循环变量处来获取value变量;最后将value变量存储到表中key变量处。
CLOSURE iABx 0x2C A为目标寄存器索引;Bx为子函数表索引。 Bx:1 A:4 首先从指定的子函数表索引处获取子函数。然后将子函数实例化成闭包。最后将闭包存储到指定目标寄存器索引处。
VARARG iABC 0x2D A为目标寄存器索引;B为参数个数;C表示不被使用。 B:5 C A:1 当操作数B等于0时,就不做任何处理。当操作数B不等于0时,就将可变参数中的B - 1个参数依次复制到目标寄存器索引递增位置处。

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/128429114