- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个 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/
我有一个递归函数 emit : Map -> exp -> unit哪里il : ILGenerator对函数来说是全局的,并且 exp是一个判别联合,表示带有大小写 InstanceCall of
我正在使用 ASM 框架进行 java 字节码操作。 ASM中出现两次的一些操作码助记符,它们以“H_”为前缀: Opcodes.H_GETFIELD vs. Opcodes.GETF
谁能告诉我以下段错误究竟意味着什么? Unhandled dwarf expression opcode 0x93 它在solaris 10 i386上。 任何建议表示赞赏。 最佳答案 如果您的 GD
在构建芯片 8 仿真器时,我遇到了芯片 8 信息的 2 个主要来源似乎不同的问题,这对整个芯片 8 解释器有影响。 一方面,我们有 wikipedia , 在操作码 FX65 下告诉我们 “用从地址
在intel software developers manual volumen 2A chapter 2.1.2说 Two-byte opcode formats for general-purp
.NET Framework 4.0 向 Reflection API 引入了多项内容,这些内容对我的工作从极其有用到至关重要。其中包括 Assembly、Module、MethodBody 和 Lo
我正在使用 Kony Studio 开发应用程序。我已经使用 Eclipse 完成了登录验证,以编写用于创建 Web 服务以连接到 oracle10g 数据库的代码。但是在前端,当我尝试将前端连接到
当您在堆栈顶部引用 (B) 的实例时,是否有必要发出 OpCode.CastClass(typeof(A)),其中 B 是派生自 A 的类,当准备调用方法时类型 A 的参数? 添加: interfac
如果我有一个 lua 脚本,比如 print("Hello, world!") 我如何获得与之等效的指令或操作码? (用于 luaV_execute) 最佳答案 您几乎不需要对 Lua 的解释器做一个
我们的计算机体系结构教授给了我们一个示例程序,要求输入密码。任务是在比较输入的密码并决定是否正确后更改跳转操作码。我编写了一个程序,可以更改给定二进制文件中特定位置的任何字节。 这是密码程序的代码:
我有一个包含以下代码的汇编程序。 这段代码对于英特尔处理器来说编译得很好。但是,当我使用 PPC(交叉)编译器时,我收到一个错误,提示无法识别操作码。我试图找出是否有 PPC 架构的等效操作码。 .f
这可能是一个非常奇怪的问题,但我一直在小人电脑上做一些工作,这让我有点恼火,不仅没有操作代码 4,而且互联网上也绝对没有关于为什么。 操作码从 0 到 9 但跳过 4。从来没有任何以 4 开头的三位数
我正在阅读Go源代码,就像读过一样,当我阅读fastrand()函数时(对于我的机器,该函数位于asm_amd64.s文件中),我遇到了以下片段: XORL $0x88888eef, D
我设置了一个简单的 Geth (v1.10.2-stable-97d11b01) 专用网络(下面的 genesis.json 配置)。我编译并部署了这个简单的测试合约(solidity版本:0.8.4
我对此很陌生。我试图以清晰的方式理解上述术语之间的区别,但是,我仍然感到困惑。这是我发现的: 在计算机汇编语言中,助记符是操作的缩写。它被输入到每个汇编程序指令的操作码字段中。例如 AND AC,37
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在尝试为属性生成动态代理。 生成的代理源 self 们要代理的类型。当代理需要访问其派生类型的(虚拟)属性时,不能使用 OpCodes.Callvirt - 它会导致无限递归。因此我们需要调用Op
有什么办法可以改变OpCodes.Ret跳转到的地址吗? IL 中的方法可以更改 C# 使用的调用堆栈吗? 据我所知,在 C++ 中,您可以访问堆栈上的值并更改返回地址等。在 IL 中,除了“Inva
我已经在我的 linuxbox 上安装了 Zend OpCache。我使用以下命令安装扩展: sudo pecl install zendopcache-7.0.2 现在,无需修改我的 php.ini
许多框架利用 spl_autoload_register() 来动态加载类(即 Controller 和模型)。有几篇关于自动加载和操作码缓存问题的帖子。特别是一篇帖子有@cletus 的回复,其中引
我是一名优秀的程序员,十分优秀!