Lua5.3 虚拟机指令分析(一)概述

Lua5.3 虚拟机指令分析(一)概述概述Lua VM 使用的是 Register based VM。 指令都是在已经分配好的寄存器中存取操作数。 add a b c 将 寄存器 b 与 寄存器 c 中的值相加,结果存在 寄存器 a 中。 标准的三地址指令,每条指令的表达能力很强,并有效的减少了内存赋值操作。#if LUAI_BITSINT >= 32typedef unsigne
摘要由CSDN通过智能技术生成

Lua5.3 虚拟机指令分析(一)概述

概述

Lua VM 使用的是 Register based VM。 指令都是在已经分配好的寄存器中存取操作数。
add a b c 将 寄存器 b 与 寄存器 c 中的值相加,结果存在 寄存器 a 中。 标准的三地址指令,每条指令的表达能力很强,并有效的减少了内存赋值操作。

#if LUAI_BITSINT >= 32
typedef unsigned int Instruction;
#else
typedef unsigned long Instruction;
#endif

OpCode

Lua 的指令使用一个 32bit 的无符号整数表示,其中低 6 位 表示操作码,所以最多支持 2 ^ 6 = 64 条指令。所有的指令定义如下:

typedef enum {
/*----------------------------------------------------------------------
name        args    description
------------------------------------------------------------------------*/
OP_MOVE,/*  A B R(A) := R(B)                    */
OP_LOADK,/* A Bx    R(A) := Kst(Bx)                 */
OP_LOADKX,/*    A   R(A) := Kst(extra arg)              */
OP_LOADBOOL,/*  A B C   R(A) := (Bool)B; if (C) pc++            */
OP_LOADNIL,/*   A B R(A), R(A+1), ..., R(A+B) := nil        */
OP_GETUPVAL,/*  A B R(A) := UpValue[B]              */

OP_GETTABUP,/*  A B C   R(A) := UpValue[B][RK(C)]           */
OP_GETTABLE,/*  A B C   R(A) := R(B)[RK(C)]             */

OP_SETTABUP,/*  A B C   UpValue[A][RK(B)] := RK(C)          */
OP_SETUPVAL,/*  A B UpValue[B] := R(A)              */
OP_SETTABLE,/*  A B C   R(A)[RK(B)] := RK(C)                */

OP_NEWTABLE,/*  A B C   R(A) := {} (size = B,C)             */

OP_SELF,/*  A B C   R(A+1) := R(B); R(A) := R(B)[RK(C)]     */

OP_ADD,/*   A B C   R(A) := RK(B) + RK(C)               */
OP_SUB,/*   A B C   R(A) := RK(B) - RK(C)               */
OP_MUL,/*   A B C   R(A) := RK(B) * RK(C)               */
OP_MOD,/*   A B C   R(A) := RK(B) % RK(C)               */
OP_POW,/*   A B C   R(A) := RK(B) ^ RK(C)               */
OP_DIV,/*   A B C   R(A) := RK(B) / RK(C)               */
OP_IDIV,/*  A B C   R(A) := RK(B) // RK(C)              */
OP_BAND,/*  A B C   R(A) := RK(B) & RK(C)               */
OP_BOR,/*   A B C   R(A) := RK(B) | RK(C)               */
OP_BXOR,/*  A B C   R(A) := RK(B) ~ RK(C)               */
OP_SHL,/*   A B C   R(A) := RK(B) << RK(C)              */
OP_SHR,/*   A B C   R(A) := RK(B) >> RK(C)              */
OP_UNM,/*   A B R(A) := -R(B)                   */
OP_BNOT,/*  A B R(A) := ~R(B)                   */
OP_NOT,/*   A B R(A) := not R(B)                */
OP_LEN,/*   A B R(A) := length of R(B)              */

OP_CONCAT,/*    A B C   R(A) := R(B).. ... ..R(C)           */

OP_JMP,/*   A sBx   pc+=sBx; if (A) close all upvalues >= R(A - 1)  */
OP_EQ,/*    A B C   if ((RK(B) == RK(C)) ~= A) then pc++        */
OP_LT,/*    A B C   if ((RK(B) <  RK(C)) ~= A) then pc++        */
OP_LE,/*    A B C   if ((R
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值