CP1251 code
page document.
Technical
support e-mail : mktmk<at>narod.ru.
Home
page : http://mktmk.narod.ru.
Конвертор exe файлов
Описание применения
v1.00
Аннотация
В документе
описан порядок применения программы конвертации DOS-exe
(MZ формат) файлов в формат, пригодный для загрузки по
абсолютным адресам в ПЗУ
(rom). Для этого вся сегментная
информация из заголовка (relocation table)
*.exe файла корректируется в
соответствии с начальным адресом загрузки.
Подразумевается, что после такой обработки файл должен
быть записан в ПЗУ и
запущен. Также в документе приведены краткие сведения о
структуре программы.
Программа может
быть использована при создании BIOS, расширений BIOS для
плат ввода-вывода и другого ПО для встраиваемых систем,
построенных на
платформе x86.
Программа
отличается от утилиты exe2bin из состава DOS тем, что может
обрабатывать *.exe файлы
большой длины (больше, чем 64К).
Содержание
1. Общие сведения
2. Функциональное назначение
3. Условия применения и используемые технические
средства, вызов и загрузка
4. Описание задачи
5. Состав проекта
6. Входные данные
7. Выходные данные
1. Общие сведения
Программа имеет
интерфейс командной строки. Программа отлажена на BC++ 5.02.
Библиотека потоков istream BC++
версии 5.02 обеспечивает корректную работу с
шестнадцатеричными числами с лидирующими символами
"0x".
2. Функциональное
назначение
Программа
предназначена для преобразования формата DOS-exe в
формат,
пригодный для загрузки по абсолютным адресам.
3. Условия
применения
Программа
предназначена для выполнения на IBM PC. Программа транслируется
для выполнения как консольное Win
приложение. Для использования на другой
платформе необходимо скорректировать объявления типов:
typedef unsigned int exe2rom_32;
typedef unsigned short int
exe2rom_16;
typedef unsigned char exe2rom_8;
из файла exe2rom.h и перетранслировать проект.
4. Описание
задачи
Необходимо
обеспечить преобразование формата DOS-exe в формат,пригодный
для загрузки по абсолютным адресам. Для этого вся
сегментная информация из
заголовка DOS-exe файла
корректируется в соответствии с начальным адресом
загрузки. Также возможно задать вывод некоторой
статистики о файле
(аналогично tdump.exe) и занесение в файл некоторой
дополнительной информации
(контрольной суммы файла, его длины, состояния SS:SP,
CS:IP).
5. Состав проекта
Программа
поставляется в файлах:
1. exe2rom.exe
- исполняемый файл
2. exe2rom.cpp
- функции-члены класса exe2rom_convert.
3. exe2rom1.cpp
- main и функции-члены класса exe2rom_err.
4. exe2rom.h
- h-файл проекта.
5. comline.cpp - функции для работы с ключами командной
строки.
6. comline.h - h-файл для comline.cpp.
7. alfserv.h - h-файл с описанием структуры
дополнительной информации
для rom формата.
8. clerr.h - h-файл с описанием класса для
обработки ошибок
9. readrus.txt
- описание на русском языке
10.
readeng.txt - описание на английском
языке
6. Входные данные
Входные данные
задаются в виде командной строки. Формат командной строки:
exe2rom
[-sw1 -sw2 ... -swn] input_filename
output_filename report_filename
где:
sw1...swn - ключи программы
exe2rom
- имя программы
input_filename - имя входного DOS-exe
файла
output_filename - имя выходного rom-файла
report_filename - имя выходного файла отчета
Шестнадцатиричные цифры в
ключах должны задаваться с лидирующим 0x, как
принято в языке С.
Возможные ключи программы:
-s0xXXXXX - абсолютный адрес (пять hex
цифр), с которого будет загружаться
программа. Все сегментные ссылки из relocation
table будут приведены в
соответствие с этим адресом. Величина XXXXX задается в hex формате. Перед
началом модификации сегментных ссылок значение XXXXX
приводится к формату
адреса сегмента (16 разрядов) путем отбрасывания младших
8 бит. Но задавать
нужно все пять цифр. Если последняя цифра абсолютного
адреса не ноль, то она
обнуляется самой программой.
-l0xXXXXX - длина файла образа (пять hex
цифр), до которой будет дополнен
выходной файл. Если файл больше указанного значения то
дополнения не
происходит. Если ключ не указан то дополнения не
происходит. Величина XXXXX
задается в hex формате.
-a0xXX - значение, которым будет заполнен конец файла в
случае, если его
длина меньше указанной ключом -l.
Величина XX(байт) задается в hex формате. По
умолчанию XX=0x00.
-t - если задан этот ключ, то в
конец файла записывается структура, содержащая
дополнительную информацию. Формат этой структуры:
template
<class T32,class T16,class T8> struct alfserv{
T32 loadadr;
T32 lenfile;
T16 ss;
T16 sp;
T16 ip;
T16 cs;
T16
reserved;
T8 csum;
T8 lastbyte;
};
где TXX беззнаковое целое с
соответствующим количеством разрядов.
Структура alfserv записывается сразу после загружаемого образа, перед
заполнением, заданным ключом -l.
Назначение полей
структуры alfserv:
loadadr - в это поле заносится величина, заданная
ключом -s
lenfile - длина файла (32 разряда с длиной структуры alfserv и без длины
заполнения, заданного ключом -l)
ss - значение сегмента стека из DOS-exe файла (16
разрядов)
sp - значение указателя стека из DOS-exe файла (16
разрядов)
ip - значение указателя команды из DOS-exe файла (16 разрядов)
cs - значение сегмента кода из DOS-exe файла (16
разрядов)
reserved - резервное поле
(равно 0x0001)
csum - контрольная сумма загружаемого файла (8
разрядов). Она считается
путем
суммирования всех байт файла. Байты заполнения, заданные
ключом -l, не суммируются. При суммировании перенос игнорируется.
Начальное значение контрольной суммы 0x01 (определяется константой
ALFSERV_STARTCSUM). Байты структуры alfserv
(если заданы
ключи -t или -f) включаются в
контрольное суммирование, в том числе
и поле lastbyte включается в контрольное суммирование. Таким
образом,
контрольное суммирование производится по уже
скорректированному файлу.
lastbyte - последний байт
структуры alfserv. Служит для отделения
информационной части файла от заполнения, заданного ключом -l.
Значение
этого байта задается ключом -bXX.
Если
ключ -bXX не задан, lastbyte
равен 0x01.
-bXX - значение последнего
байта структуры alfserv. Величина XX(байт) задается
в hex формате. По умолчанию
XX=0x01.
Пример:
exe2rom
-s0x40000 example.exe example.rom
В этом примере из файла example.exe создается файл example.rom. Файл
example.rom должен быть
загружен с физического адреса 0x40000.
-f - если задан этот ключ, то
структура alfserv записывается в начало файла.
Если заданы оба ключа (-t и -f), то работает ключ -f.
7. Выходные данные
Выходные данные
выводятся на экран и в файл отчета, если он задан.
Программа не анализирует формат DOS-exe
файла и не проверяет его на
допустимость, поэтому при попытке конвертации
файла не DOS-exe формата
возможны непредсказуемые последствия (зацикливание программы,
получение
слишком большого выходного файла и т.д.)