Форум программистов, компьютерный форум CyberForum.ru

Поля MZ файла - C++

Восстановить пароль Регистрация
 
Norman4eg
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 6
12.06.2012, 03:04     Поля MZ файла #1
Добрыдень. У меня стоит задача разработать линковщик, который формирует MZ файлы и, сколько бы я не гуглил, повсюду натыкаюсь лишь на описание полей загловка данного файла. Мало того, что это наверняка далеко не всё содержимое данного файла, дак еще и не могу понять как заполняются поля данного заголовка имея изначально объектный файл. В данной теме мне хотелось бы раскрыть суть хотя бы второго вопроса. Итак, по порядку :
1. Количество байт в последней странице файла MZ-формата. Равно остатку от деления длины файла на значение 512.
2. Длина файла MZ-формата в 512-байтных страницах
Вопрос: как, уже на этапе формирования заголовка, узнать объем исполнительного файла?
3. Количество элементов в таблице размещения.
Вопрос: Со словосочетание "таблица размещения" у меня ассоциируется только FAT. Что вообще подразумевает это поле? Еще натыкался на определение "Количество элементов в таблице расположения сегментов". Значит ли это что в данном поле нужно просто указать количество сегментов в программе?
4. Длина заголовка в параграфах.
Вопрос: Здесь вроде всё просто, но непонятно зачем нужно это поле, если под каждое поле заголовка выделен фиксированный объем (2 байта). Или речь идет НЕ о заголовке MZ-файла?
5. Минимальное количество дополнительных параграфов, необходимых для исполнения программы.
6. Максимальное количество дополнительных парагра-фов, необходимых для исполнения программы.
Вопрос: Стыдно признаться, но даже никогда не задумывался о том, какой объем памяти запрашивает программа, опять же не понятно как узнать это на этапе формирования заголовка (Есть ли записи об этом в объектном файле?)
7. Начальное значение, загружаемое в регистр ss.
8. Начальное значение, загружаемое в регистр sp.
Вопрос: Собственно откуда брать эти значения? Понятно если в самом объектнике присутствует информация об этом, но для разработки своего компилятора объектных файлов у меня был достаточно простой пример без участия данных регистров в коде.
9. 0 или поразрядная дополненная контрольная сумма всех 16-битных слов в файле, за исключением данного поля.
Вопрос: Опять что-то из рубрики волшебных чисел. Не понимаю я как на этапе формирования заголовка получить такие данные.
10. Значение, загружаемое в регистр ip во время загрузки программы в память.
11. Значение, загружаемое в регистр cs во время загрузки программы в память (формируется загрузчиком)
Вопрос: здесь ВРОДЕ всё понятно. Но поправьте, если ошибаюсь: я вычисляю смещение, после которого началинается кодовый сегмент и записываю в CS, а в IP, я так понимаю, ничего кроме нулевого смещения быть не должно при загрузке программы?
12. Смещение от начала файла таблицы размещения или значение 40h.
Вопрос: если понимать таблицу размещения, как таблицу описания сегментов, то видимо просто указатель на то место в объектнике, где эта таблица содержится?
13. Номер оверлейного модуля.
Вопрос: совсем непонятно.
Пожалуйста только без домыслов, ато я и без этого запутался до невозможности..)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 03:04     Поля MZ файла
Посмотрите здесь:

C++ Перебор файла посимвольно, как организовать цикл, работающий до конца файла.
C++ В начало двоичного файла целого типа дописать нечетные элементы этого файла.
Можно ли считывать поля класса из двоичного файла одним fread C++
C++ Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла
Вывести данные из файла, заданные в виде битового поля C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21500 / 10253 / 1669
Регистрация: 12.02.2012
Сообщений: 17,139
12.06.2012, 10:15     Поля MZ файла #2
А для какой системы ты делаешь линкер? Для DOS или Win? Если для Win - ищи структуру PE-заголовка. Без нее - нечего даже пытаться. Таблица размещения - это отнюдь не FAT. Это таблица, содержащая поля исполняемого модуля, которые нужно модифицировать в зависимости от места загрузки. Посмотри вот здесь: http://www.helloworld.ru/texts/comp/.../syst/lek6.htm
Norman4eg
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 6
12.06.2012, 19:18  [ТС]     Поля MZ файла #3
Catstail, спасибо за ответ. У меня не стоит задачи разработать линкер для определенной системы. Мне нужно получить линкер, который просто делает exe-файл, запуск исполнительного файла не обязателен, достаточно получить правильный дамп. Не обязательно MZ, но мне показалось, что это наиболее простой вариант. А таблица размещения - это PSP (Program Segment Prefix) или что? Просто для меня такая теория как "поля исполняемого модуля" просачивается как вода в песок, мне оно плохо дается к пониманию) Спасибо за ссылку, но даже в ней я не вижу ответа на те вопросы, которые привел тут.
Catstail
Модератор
 Аватар для Catstail
21500 / 10253 / 1669
Регистрация: 12.02.2012
Сообщений: 17,139
12.06.2012, 21:12     Поля MZ файла #4
Нет. PSP - это префикс сегмента программы. Таблица перемещений - это другое. Кстати, она не в каждом модуле встречается.
Norman4eg
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 6
12.06.2012, 23:35  [ТС]     Поля MZ файла #5
Быть может мне лучше переадресовать эти вопросы в какой-нибудь другой раздел форума? Просто я не очень ориентируюсь)
Catstail
Модератор
 Аватар для Catstail
21500 / 10253 / 1669
Регистрация: 12.02.2012
Сообщений: 17,139
13.06.2012, 14:11     Поля MZ файла #6
Сначала советую хорошенько изучить структуру EXE-файла. Материалов на эту тему море.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 15:43     Поля MZ файла
Еще ссылки по теме:

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла) C++
C++ Считать строку из файла и разбить ее на поля

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Norman4eg
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 6
16.06.2012, 15:43  [ТС]     Поля MZ файла #7
Решил все же взять PE файлы. Информации по ним гораздо больше. Остался непонятым следующий момент: в заголовке PE существует указатель на начало кода. Если там простая последовательность инструкций, то всё понятно, но как быть, если присутствуют глобальные и локальные метки? (в объектном файле, к слову, локальные метки описаны сразу за телом сегмента, вопрос обстоит в том, как их правильно расположить в исполнительном)
Yandex
Объявления
16.06.2012, 15:43     Поля MZ файла
Ответ Создать тему
Опции темы

Текущее время: 20:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru