我在解析使用luaJ生成的lua字节码时遇到了问题。在指令计数和常量计数之间,有些地方出错了。好像少了一个字节。我使用的是LuaJ 2.0.3。
这是一个显示我的意思的六合点:

字节码是使用
string.dump(function() return "athin" end)常量计数显示250个常量,但应该只有一个。如果在常量计数和指令列表之间多出一个字节,它将完美地工作:
常量计数为1,第一个常量4(字符串)的类型,字符串的长度为6,结尾处为null。
为什么不起作用?为什么缺少一个字节?我该怎么做才能解决这个问题?
发布于 2014-06-07 12:23:08
备注:我首先在CC论坛这里上发布了这篇文章。
实际上,您丢失了一个0x00字节。作为“指令”,您有00 00 00 01 01 00 00 1E 00 00 1E 00
看看Lua5.1VM指令的不夸张介绍,这意味着:
LOADK 0 0 -- Load constant at index 0 into register number 0.
RETURN 0 2 -- Return 1 value, starting at register number 0.
MOVE 120 0 -- Copy the value of register number 120 into register number 0.最后一个没有任何意义。为什么字节码生成器会插入如此荒谬的指令,永远不会被执行?
如果在最后一条指令中添加一个0x00字节,它将读取as,00 00 00 01 01 00 00 1E 00 00 00 1E。
这意味着:
LOADK 0 0 -- Load constant at index 0 into register number 0.
RETURN 0 2 -- Return 1 value, starting at register number 0.
RETURN 0 0 -- Return all values from register number 0 to the top of the stack.如果您阅读PDF,您会发现字节码生成器总是在字节码的末尾添加一个返回语句,即使Lua源中已经有一个显式的返回语句。因此,这种拆卸是有意义的。
不管怎么说,如果你在那里多加了一个0x00字节,它就会把其余的字节移到上面,所以就像你说的那样,这是有意义的。只是缺失的0x00字节不在“指令”和“常量数”之间,而是指令的一部分。
现在,我不知道这对您有什么用处,因为输出直接来自CC (或LuaJ),但这就是问题所在。
备注:在修改ChunkSpy以接受大端块之后,当您发布字节码时,它在字节码上出错了,但是如果按您建议的方式修改或者我建议的话,它可以很好地处理字节码。
https://stackoverflow.com/questions/23978982
复制相似问题