注:最初にここの 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 を変更した後、投稿したバイトコードでエラーが発生しましたが、提案された方法または私が提案した方法で変更すると、バイトコードで問題なく動作しました。