2

luaJ を使用して生成された lua バイトコードの解析に問題があります。命令カウント定数カウントの間に何か問題があります。バイトが足りないようです。LuaJ 2.0.3 を使用しています。


これが私が何を意味するかを示す 16 進ダンプです: 16進ダンプ

バイトコードは以下を使用して生成されました

string.dump(function() return "athin" end)



定数カウントには 250 個の定数が表示されますが、定数は 1 つだけである必要があります。定数カウントと命令リストの間に 1 バイト以上あれば、完全に機能します

。定数カウントは 1 で、最初の定数 4 (文字列) の型は、文字列の長さが 6 になります。最後にヌル。


なぜそれが機能しないのですか?バイトが欠落しているのはなぜですか?これを修正するにはどうすればよいですか?

4

1 に答える 1

2

注:最初にここの CC フォーラムに投稿しました。

実際、0x00 バイトがありません。「指示」として、あなたは持っています00 00 00 01 01 00 00 1E 00 00 1E 00

A No-Frills Introduction to Lua 5.1 VM Instructionsを見ると、次のようになります。

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 バイトを 1 つ追加すると、次のように読み取られ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 ソースに明示的な return ステートメントが既に存在する場合でも、バイトコード ジェネレーターは常に return ステートメントをバイトコードの最後に追加することがわかります。したがって、この分解は理にかなっています。

とにかく、そこに余分な 0x00 バイトを追加すると、残りのバイトコードがシフトされるので、あなたが言ったように意味があります。欠落している 0x00 バイトが「命令」と「定数の数」の間にないというだけで、命令の一部です。

出力は CC (または LuaJ) から直接行われるため、これがどのように役立つかはわかりませんが、それが問題です。

注:ビッグエンディアンのチャンクを受け入れるように ChunkSpy を変更した後、投稿したバイトコードでエラーが発生しましたが、提案された方法または私が提案した方法で変更すると、バイトコードで問題なく動作しました。

于 2014-06-07T12:23:08.993 に答える