0x1. 指令格式


image.png

  • A,B,C:寄存器索引,也就是在栈里面的偏移
  • Bx:常量数组的偏移
  • sBx:有符号整数,用于跳转偏移

0x2. 指令类型


lua的指令一共有30多条,这里仅仅挑几个典型的指令来看看lua支持的指令类型。具体可以查看源码lopcode.h中的定义。

指令类型 指令参数 指令定义
OP_MOVE A,B R(A) := R(B)
OP_LOADK A,Bx R(A) := Kst(Bx)
OP_GETUPVAL A,B R(A) := upvalue[B]
OP_GETGLOBAL A,Bx R(A) := Gbl[Kst(Bx)]
OP_ADD A,B,C R(A) := RK(B) + RK(C)
OP_TEST A,C if not (R(A) == C) then
pc++
OP_JMP sBx pc += sBx
OP_CALL A,B call R(A)(R(A+1), R(A+2)…. R(A+B-1))
OP_RETURN A,B return R(A), R(A+1)…R(A+B-2)
  • R(A),R(B):以A,B为相对函数基地址的偏移对应的对象
  • Kst(Bx):以Bx为相对函数常量数组的偏移对应的对象
  • upvalue[B]:upvalue数组的第B个数据
  • Gbl:全局符号表
  • RK(B):对应的可能是R(B)或者Kst(B)
  • pc:程序计数器,保存下一条指令的地址