Примечание. Я разместил это на форумах CC здесь.
На самом деле вам не хватает байта 0x00. В качестве «Инструкции» у вас есть 00 00 00 01 01 00 00 1E 00 00 1E 00
Глядя на Введение в 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 к последней инструкции, она будет читаться как 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 для приема фрагментов с обратным порядком байтов он выдавал ошибку в байт-коде, когда вы его опубликовали, но нормально работал с байт-кодом, если он был изменен так, как вы предложили, или я предложил.
person
AgentE382
schedule
07.06.2014