将 lua 脚本转换为等效于它的指令(操作码)



如果我有一个lua脚本,说

print("Hello, world!")

如何获得等效的指令或操作码?(用于luaV_execute(

你几乎不需要对Lua的解释器进行小的编辑。首先,我们导出存储库的文件:

~ $ svn export https://github.com/lua/lua/trunk ~/Desktop/lua_modified
~ $ cd ~/Desktop/lua_modified/

现在,我们需要编辑lvm.c文件:

~/Desktop/lua_modified $ nano lvm.c

并搜索luaV_execute()函数并通过添加以下内容对其进行修改:

printf("%s %x %dn",__FUNCTION__, i, GET_OPCODE(i));

在第一次vmfetch()通话后。让我们使用makefile(我在运行make之前编辑了CC= clang-3.8CC= gcc(:

~/Desktop/lua_modified $ make -f makefile

然后,在编译源代码后,我们能够使用修改后的解释器进行测试。

~/Desktop/lua_modified $ ./lua # don't omit the `./` part, otherwise you'll run your original interpreter
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> print("Hello, world!")
luaV_execute 400006 6
luaV_execute 4041 1
luaV_execute 1000025 37
Hello, world!
luaV_execute 26 38
>

检查操作码:

typedef enum {
/*----------------------------------------------------------------------
name            args    description
------------------------------------------------------------------------*/
OP_MOVE,/*      A B     R(A) := R(B)                                    */
OP_LOADK,/*     A Bx    R(A) := Kst(Bx)                                 */
OP_LOADBOOL,/*  A B C   R(A) := (Bool)B; if (C) pc++                    */
OP_LOADNIL,/*   A B     R(A) := ... := R(B) := nil                      */
OP_GETUPVAL,/*  A B     R(A) := UpValue[B]                              */
OP_GETGLOBAL,/* A Bx    R(A) := Gbl[Kst(Bx)]                            */
OP_GETTABLE,/*  A B C   R(A) := R(B)[RK(C)]                             */
OP_SETGLOBAL,/* A Bx    Gbl[Kst(Bx)] := R(A)                            */
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_DIV,/*       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_UNM,/*       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,/*       sBx     pc+=sBx                                 */
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 ((RK(B) <= RK(C)) ~= A) then pc++            */
OP_TEST,/*      A C     if not (R(A) <=> C) then pc++                   */ 
OP_TESTSET,/*   A B C   if (R(B) <=> C) then R(A) := R(B) else pc++     */ 
OP_CALL,/*      A B C   R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
OP_TAILCALL,/*  A B C   return R(A)(R(A+1), ... ,R(A+B-1))              */
OP_RETURN,/*    A B     return R(A), ... ,R(A+B-2)      (see note)      */
OP_FORLOOP,/*   A sBx   R(A)+=R(A+2);
                        if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
OP_FORPREP,/*   A sBx   R(A)-=R(A+2); pc+=sBx                           */
OP_TFORLOOP,/*  A C     R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); 
                        if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++   */ 
OP_SETLIST,/*   A B C   R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B        */
OP_CLOSE,/*     A       close all variables in the stack up to (>=) R(A)*/
OP_CLOSURE,/*   A Bx    R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n))  */
OP_VARARG/*     A B     R(A), R(A+1), ..., R(A+B-1) = vararg            */
} OpCode;

lopcodes.h头文件下。

最新更新