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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Norman4eg
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 6
#1

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

12.06.2012, 03:04. Просмотров 682. Ответов 6
Метки нет (Все метки)

Добрыдень. У меня стоит задача разработать линковщик, который формирует 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. Номер оверлейного модуля.
Вопрос: совсем непонятно.
Пожалуйста только без домыслов, ато я и без этого запутался до невозможности..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 03:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поля MZ файла (C++):

Считать строку из файла и разбить ее на поля - C++
нужно считать из файла строки, каждая строка представляет собой набор типо имя дата описание, так вот нужно (имя дата описание )...

Чтение определенного поля в строке из файла - C++
Всем привет. Вопрос следующий: Есть файл, в нем строки, нужно его открыть и считать определенную часть строки. Строка в файле...

Вывести данные из файла, заданные в виде битового поля - C++
Задание, вывести данные из нескольких первых строк файла, причем эти данные должны быть заданны в виде битового поля. Какие форматы имеют...

Можно ли считывать поля класса из двоичного файла одним fread - C++
Можно ли считывать поля класса из двоичного файла одним fread? fread(this, sizeof(*this), 1, myFile); Слышал, что компиляторы по...

Чтение из файла определенного поля без записи в буфер предыдущих полей - C++
как на чистом си считать конкретное поле при этом не заводить переменные. формат такой: %d %s %c %d ..... если использовать...

Битовые поля. Поля без типа и имени - C++
Вчера сделал очень интересную и болезненную ошибку (с точки зрения времени, так как искал я ее долго)... представьте структуру (битовое...

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

Как в поля Ассеss'а импортировать поля из файла *.txt ? - MS Access
Помогите пожалство: У меня в Ассеss(2000,2002)tables срочно нужно поместить информацию из текстовых файлов(их много).Подскажите как эт...

Зависимые поля (список значений одного поля зависит от значения другого поля) - MS Access
Здравствуйте, Уважаемые участники форума, изучив множество подобных вопросов на разных форумах, не смог найти для себя нужный вариант....

Как связать между собой два поля (список значений одного поля зависит от значения другого поля) - MS Access
Есть таблица: предмет, КодТипаМатериала (список), КодМатериала (список) для примера: стул, ткань, чёрное сукно ...

Изминение поля типизированного файла - Pascal ABC
Всем привет! необходима помощь с редактированием типизированного файла. у меня возникла сложность с данной процедуройreset(f2); ...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
16.06.2012, 15:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru