0x1. 指令格式
- 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:程序计数器,保存下一条指令的地址