Конвертор inst.pl
Как Вы уже могли догадаться, я не руками формирую файл x86data.c. Эту идею я позаимствовал из Nasma - создаётся файл с данными, в удобном для обращения с ним формате, а уже из него генерируется файл на C. Для подобных манипуляций предназначен script на любимом мною Perlе inst.pl.
Он запускается примерно так:
perl inst.pl [параметры командной строки]
где параметры могут быть следующими:
- -c file
Проверить файл заголовков на наличие ошибок. В настоящее время реализованы только две проверки - на наличие дублирующихся itype, а также поиск пропущенных itype. Отчёт помещается в file.
- -d file
Задаёт имя файла данных. Имя по умолчанию - data
- -i file
Задаёт имя файла заголовков. Имя по умолчанию - x86.h
- -n file
Генерирует файл-шаблон file для дальнейшего заполнения его данными.
- -o file
Устанавливает имя выходного файла. Имя по умолчанию - x86data.c. Если выходной файл уже существует - программа сообщает об этом и завершает исполнение, существующий файл не модифицируется.
- -s
Игнорировать инструкции из файла заголовков, помеченные комментариями с тремя вопросительными знаками.
- -?
Показывает краткую инструкцию по использованию программы...
- cflags
Изменяемые инструкцией флаги. Можно указывать как большими, так и маленькими буквами. - rflags
Флаги, от которых зависит результат выполнения инструкции. Можно указывать как большими, так и маленькими буквами. - uflags
Флаги, состояние которых не определено после выполнения инструкции. Можно указывать как большими, так и маленькими буквами. - regs
Самое главное (собственно, ради чего и была написана библиотека) - регистры, изменяемые инструкцией. Можно указывать как большими, так и маленькими буквами. - op
Битовая маска операндов, изменяемых инструкцией. Для операнда 1 используется первый бит, для операнда 2 - второй, и т.д. - type
Тип инструкции (FPU, MMX и т.д.). Можно указывать как большими, так и маленькими буквами. - from
Указывает тип процессора, начиная с которого инструкция распознаётся. Можно указывать как большими, так и маленькими буквами. - fcflags
Флаги FPU, изменяемые инструкцией. В настоящее время не помещаются в выходной файл. Можно указывать как большими, так и маленькими буквами. - fuflags
Флаги FPU, состояние которых не определено после выполнения инструкции. В настоящее время не помещаются в выходной файл. Можно указывать как большими, так и маленькими буквами.
Эта замечательная программа сильно сокращает время создания файла с данными. Она автоматизирует проверку файла заголовков, может сгенерировать файл шаблон для дальнейшего заполнения его данными, и самое главное - она сама генерирует файл с данными, при этом проверяя его правильность и производя оптимизацию по размеру - структуры с одинаковыми данными представлены в выходном файле только один раз, используются несколько указателей на эти структуры. В случае же, если я (или кто-либо ещё) захочет добавить ещё какие-либо характеристики к каждой инструкции, script можно легко переписать для включения в него необходимой функциональности.
Формат входного файла для inst.pl:
# комментарии [имя инструкции] keyword: data ...
[имя инструкции] - это название инструкции, взятое из файла заголовков. Я не использую численных значений (хотя это было бы быстрее в обработке) по той причине, что Вам всё равно нужно будет для каждого численного значения находить мнемоническое имя из файла заголовков. Когда inst.pl запускается с ключом -n, она генерирует файл, в котором будут прописаны в таком виде мнемоники всех инструкций из файла заголовков.
keyword: data - характеристики инструкции. В настоящее время программа понимает следующие keyword:
Для cflags,rflags,uflags & regs производится проверка на наличие дублирующих данных (в случае их обнаружения они просто игнорируются). Каждый keyword должен присутствовать для одной инструкции не более одного раза.