Привет, ребята, у меня есть вопрос о передаче байт-кода формата файла.
Что такое {label,1} и {line,1} для инструкций?
И есть ли у кого-нибудь хороший веб-сайт/лист, где я могу прочитать о файлах реверсивного луча?
Спасибо
Привет, ребята, у меня есть вопрос о передаче байт-кода формата файла.
Что такое {label,1} и {line,1} для инструкций?
И есть ли у кого-нибудь хороший веб-сайт/лист, где я могу прочитать о файлах реверсивного луча?
Спасибо
Из compile
документации модуля Erlang:
Обратите внимание, что формат файлов ассемблера не документирован и может меняться между выпусками.
Тем не менее, инструкция label
отмечает местоположение для целей ветвления и вызова, а инструкция line
предоставляет информацию о местоположении источника и номере строки.
Вы можете изучить документацию по абстрактному формату.
.S
и используйте erlc
, чтобы скомпилировать его в файл .beam
.
- person Steve Vinoski; 02.07.2016
beam_disasm:file/1
возвращает запись #beam_file
, содержащую имя модуля, экспорт, атрибуты, информацию о компиляции и код, и эта запись не соответствует формату файла .S
. Вместо этого вы можете взглянуть на beam_lib
и узнать, как извлечь абстрактный формат из луча файл.
- person Steve Vinoski; 02.07.2016
{beam_file,Mod,Exp,Attr,Info,Code} = beam_disasm:file("yourfile.beam").
, а затем beam_listing:module(user, {Mod,Exp,Attr,Code,NumLabels}).
, где NumLabels
— это количество меток, найденных в Code
. Это напечатает модуль в формате .S
в поток user
. Вы можете подсчитать метки, используя что-то вроде этой функции: lc([], Acc) -> Acc; lc(label,Acc) -> Acc+1; lc([H|T],Acc) -> lc(T, lc(H,Acc)); lc(Tuple, Acc) when is_tuple(Tuple) -> lists:foldl(fun(X,A) -> lc(X,A) end, Acc, tuple_to_list(Tuple)); lc(_,Acc) -> Acc.
Вызовите это так: NumLabels = lc(Code,0).
- person Steve Vinoski; 02.07.2016
erl
это будет: Count = fun Count([], Acc) -> Acc; Count(label,Acc) -> Acc+1; Count([H|T],Acc) -> Count(T, Count(H,Acc)); Count(Tuple, Acc) when is_tuple(Tuple) -> lists:foldl(fun(X,A) -> Count(X,A) end, Acc, tuple_to_list(Tuple)); Count(_,Acc) -> Acc end.
Для вызова: NumLabels = Count(Code,0).
- person Steve Vinoski; 03.07.2016