Путаница с байт-кодом LuaJ Lua

У меня проблема с разбором байт-кода lua, сгенерированного с использованием luaJ. Между счетчиком инструкций и счетчиком констант что-то идет не так. Кажется, что байта не хватает. Я использую LuaJ 2.0.3.


Вот шестнадцатеричный дамп, который показывает, что я имею в виду: hexdump

был сгенерирован байт-код с использованием

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



Счетчик констант показывает 250 констант, но должна быть только одна. Если бы между счетчиком констант и списком инструкций был еще 1 байт, все работало бы отлично:

Счетчик констант был бы 1, а тип первой константы 4 (строка), строка имела бы длина 6, включая ноль в конце.


Почему это не работает? Почему не хватает байта? Что мне нужно сделать, чтобы исправить это?


person ardera    schedule 01.06.2014    source источник
comment
Какой у Вас вопрос?   -  person dualed    schedule 01.06.2014
comment
Как возможно, что существует 250 констант? Если все так, как я сказал, это должно быть 00 00 00 01 для постоянного счетчика, но тогда для инструкций будет 11 байтов, а это не работает. Как мне заставить это работать? Почему не хватает 1 байта?   -  person ardera    schedule 02.06.2014


Ответы (1)


Примечание. Я разместил это на форумах 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
comment
Спасибо за ответ, только что опубликовал это для некоторых ученых пользователей здесь. Ответил вам на форумах CC. - person ardera; 08.06.2014