gpt4 book ai didi

c++ - 把lua脚本转换成等价的指令(opcode)呢?

转载 作者:行者123 更新时间:2023-11-30 02:25:30 30 4
gpt4 key购买 nike

如果我有一个 lua 脚本,比如

print("Hello, world!")

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

最佳答案

您几乎不需要对 Lua 的解释器做一个小的修改。首先,我们导出 repository的文件:

~ $ 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 %d\n",__FUNCTION__, i, GET_OPCODE(i));

在第一个 vmfetch() 调用之后。让我们使用 makefile(在运行 make 之前,我已经将 CC= clang-3.8 编辑为 CC= 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 头文件下。

关于c++ - 把lua脚本转换成等价的指令(opcode)呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44091949/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com