为了方便讲述,这里规定了一些名称:

T-1表示栈顶对象

T-2表示栈顶元素的下一个对象

T-3表示T-2的下一个对象

 

push系列:

 

【PUSHNIL】 将一个nil对象放置到栈顶。

【PUSH0】 将数字0放置到栈顶

【PUSH1】 将数字1放置到栈顶

【PUSH2】 将数据2放置到栈顶

【PUSHBYTE b】 将字节b放置到栈顶(这个版本中BYTE为:unsigned char)

【PUSHWORD w】 将一个字w放置到栈顶(这个版本中WORD为:unsigned short)

【PUSHFLOAT f 】 将一个浮点数f放置到栈顶(这个版本中FLOAT为:float)

【PUSHSTRING w】 将一个索引为w的字符串放置到栈顶(索引w是指lua内部的一个全局的符号表中的索引)

【PUSHFUNCTION f】 将一个函数翻译过后的字节码串的地址放到栈顶

【PUSHGLOBAL w】 将全局变量放置到栈顶(w表示这个全局变量在全局变量表中的索引)

【PUSHINDEXED】 T-2是关联数组,令h = T-2[T-1]并将T-2和T-1弹出然后将h压入栈中

【PUSHSELF】 (暂无解释)

 

 

【PUSHLOCAL0】 将第一个局部变量放置到栈顶。

【PUSHLOCAL1】  将第二个局部变量放置到栈顶。

...

【PUSHLOCAL9】 将第十个局部变量放置到栈顶

【PUSHLOCAL num】 将第(num+1)个局部放置到栈顶

*说明:“pushlocal”系列性指令的用途在于将局部变量放置到栈顶,需要注意的是,这些局部变量都是在栈中,第n个局部变量比第n+1个变量的更靠近栈底。

 

 

store系列:

 

【STOREGLOBAL w】 将T-1的值保存到全局变量中(w表示这个全局变量再全局变量表中的索引)

 

【STORELOCAL0】 将T-1的值保存到第一个局部变量中

【STORELOCAL1】            将T-1的值保存到第二个局部变量中

...

【STORELOCAL9】 将T-1的值保存到第十个局部变量中

【STORELOCAL num】      将T-1的值保存到第(num+1)个局部变量中

 

【STORERECORD n w[n]】 这个指令比较复杂,大概的意思是这样:在栈上有个数组a,它距离栈顶有n个对象的距离,

注意的是w[0]对应的是T-1,w[1]对应的是T-2,依此类推即可。

 

【STOREINDEXED0】 T-3为关联数组,那么这个指令就是T-3[T-2] = T-1,指令结束之后将T-1、T-2和T-3从栈中弹出

 

【STOREINDEXED n】 T-n-3为关联数组,T-n-3[T-n-2] = T-1

 

【STORELIST0 n】 T-n-1为关联数组A,那么这个操作是这样:A[n] = T-1,栈顶出栈;A[n + 1] = T-1,栈顶出栈;

直到栈顶为A的时候停止

【STORELIST m n】 T-n-1为关联数组A,那么这个操作是这样:A[n + m *40] = T-1,栈顶出栈;A[n + 1 + m * 40] = T-1, 栈顶出栈;直到栈顶为A的时候停止

 

*说明:“storelocal”系列是“pushlocal”系列的反过程

 

 

 

【CREATEARRAY size】 在栈顶创建一个关联数组,size指定了关联数组的初始容量

 

【EQOP】 对比T-1和T-2,对比之后将这两个对象从栈中弹出并将结果放置到

栈顶(如果相等则是一个值为1的数字对象,否则是一个nil对象)

【LTOP】 判断T-1是否小于T-2,结果和EQOP一致

【LEOP】 判断T-1是否小于或等于T-2,结果和EQOP一致

【GTOP】 判断T-1是否大于T-2,结果和EQOP一致

【GEOP】 判断T-1是否大于或等于T-2,结果和EQOP一致

 

【JMP w】 向后跳转w个字节(在指令字节串中跳转)

【UPJMP w】 向前跳转w个字节(在指令字节串中跳转)

【IFFJM P w】 如果栈顶为nil对象,则向后跳转w个字节(在指令字节串中跳转)

【IFFUPJUMP w】 如果栈顶为nil对象,则向前跳转w个字节(在指令字节串中跳转)

 

【ONTJMP w】  

【ONFJMP w】     如果T-1部不是nil对象则在指令字节串中向后跳转w个字节

 

 

【POP】 将栈顶的对象弹出

 

计算系列

 

【ADDOP】 将(T-1 + T-2)的结果放置到栈顶,放置 之前需要将T-1和T-2弹出,这个指令有个需要注意的

地方是当T-1或T-2中至少有一个不是数字对象时,lua将调用其内部的"add"函数来计算

【SUBOP】 将(T-1 - T-2)的结果放置到栈顶,放置之前需要将T-1和T-2弹出,这个指令有个需要注意的

地方是当T-1或T-2中至少有一个不是数字对象时,lua将调用其内部的"sub"函数来计算

【MULTOP】 将(T-1 * T-2)的结果放置到栈顶,放置之前需要将T-1和T-2弹出,这个指令有个需要注意的

地方是当T-1或T-2中至少有一个不是数字对象时,lua将调用其内部的"mul"函数来计算

【DIVOP】 将(T-1 / T-2)的结果放置到栈顶,放置之前需要将T-1和T-2弹出,这个指令有个需要注意的

地方是当T-1或T-2中至少有一个不是数字对象时,lua将调用其内部的"div"函数来执行计算

【POWOP】 (T-1^T-2)并将结果放置到栈顶,放置之前需要将T-1和T-2弹出,lua调用内部函数"div"执行

计算

【CONCOP】 连接字符串对象T-1和T-2并将结果放置到栈顶,放置之前需要将T-1和T-2弹出,如果两者中

至少有一个不是字符串对象的时候,lua将调用内部函数来执行操作

【MINUSOP】 为数字对象T-1取负,如果T-1不是数字对象,lua将调用内部函数unm来执行操作

 

【NOTOP】 如果T-1为空则弹出T-1并在栈顶放置数字对象且值为1,否则放置nil对象

 

【ADJUEST0】 调整栈顶:这个指令其实已经清空栈

【ADJUEST w】 调整栈顶到距栈底w个对象的地方

 

【SETFUNCTION code fn】 向函数栈中压入一个函数节点(FuncStackNode),并将这个函数作为下一个将要执行的函数

code表示这个函数的指令字节码,w表示这个函数再全局变量表中的索引

【RESET】 将一个函数从函数栈中弹出,弹出之后的当前栈顶函数将成为当前函数

 

【CALLFUNC np nr】 驱动在T-np-1的位置的函数对象工作,np表示参数数量,nr表示返回值数量。

 

【RETCODE0】 每个函数在执行的时候都会以栈的某个偏移量为基准位置作为自己的运行时栈,这里姑且将这个基准

位置称为base,RETCODE0这个指令要求函数执行之后以base为起点放置返回值

【RETCODE n】 要求函数执行之后以base+n为起点放置返回值