C++ 将lua脚本转换为与之等效的指令(操作码)?
如果我有一个lua脚本C++ 将lua脚本转换为与之等效的指令(操作码)?,c++,lua,C++,Lua,如果我有一个lua脚本 print("Hello, world!") 我如何获得与之相当的指令或操作码?(用于luaV_execute)您几乎不需要对Lua的解释器进行小的编辑。首先,我们将导出的文件: 现在,我们需要编辑lvm.c文件: ~/Desktop/lua_modified $ nano lvm.c 然后搜索luaV_execute()函数,并通过添加以下内容对其进行修改: printf("%s %x %d\n",__FUNCTION__, i, GET_OPCODE(i));
print("Hello, world!")
我如何获得与之相当的指令或操作码?(用于luaV_execute)您几乎不需要对
Lua的解释器进行小的编辑。首先,我们将导出的文件:
现在,我们需要编辑lvm.c
文件:
~/Desktop/lua_modified $ nano lvm.c
然后搜索luaV_execute()
函数,并通过添加以下内容对其进行修改:
printf("%s %x %d\n",__FUNCTION__, i, GET_OPCODE(i));
在第一次vmfetch()调用之后。让我们使用makefile
(在运行make
之前,我已经将CC=clang-3.8
编辑为CC=gcc
):
然后,在编译源代码之后,我们就可以使用修改后的解释器进行测试了
~/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;
typedef枚举{
/*----------------------------------------------------------------------
名称参数描述
------------------------------------------------------------------------*/
行动/*A B R(A):=R(B)*/
OP_LOADK,/*A Bx R(A):=Kst(Bx)*/
OP_LOADBOOL,/*A B C R(A):=(Bool)B;如果(C)pc++*/
OP_LOADNIL,/*abr(A):=…:=R(B):=nil*/
OP_GETUPVAL,/*abr(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_可设置,/*A B C R(A)[RK(B)]:=RK(C)*/
OP_NEWTABLE,/*abcr(A):={}(size=B,C)*/
OP_SELF,/*ABCCR(A+1):=R(B);R(A):=R(B)[RK(C)]*/
加上/*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)*/
行动组/*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):=非R(B)*/
OP_LEN,/*A B R(A):=R(B)的长度*/
OP_CONCAT,/*A B C R(A):=R(B)…R(C)*/
OP_JMP,/*sBx pc+=sBx*/
OP_EQ,/*abc如果((RK(B)==RK(C))~=A)那么pc++*/
如果((RK(B) OP_LE,/*A B C if((RK(B)luac-l test.lua
?我指的是一个包含所有操作码的变量。你指的是lua_load
、string.dump
,还是我的lbci?
~/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;