
Отличия форматов файлов сом и ехе модулей
Какова структура файла COM? С какого адреса располагается код?
- код и данные в одном сегменте (а стек создаётся автоматически с конца сегмента). Код располагается с адреса 0h.
2) Какова структура файла «плохого» EXE? С какого адреса располагается код? Что располагается с адреса 0?
- в «плохом» EXE данные и код содержатся в одном сегменте.
С адреса 0h идёт таблица настроек (Relocation table). Код располагается с адреса 300h.
Какова структура файла «хорошего» EXE? Чем он отличается от файла
«плохого» EXE?
- в «хорошем» .exe файле код, данные и стек находятся в разных сегментах. Также в «плохом» .exe адресация кода начинается с 300h, так как он получается из .com файла, в котором изначально сегмент кода смещён на 100h, а при создании «плохого» .exe к этому смещению добавляется размер PSP равный 200h. А в «хорошем» .exe присутствует только смещение для PSP, поэтому код начинается с 200h.
Загрузка сом модуля в основную память
1) Какой формат загрузки модуля COM? С какого адреса располагается код?
- .com файл помещается в память, начиная с адреса (внутри сегмента) 0100h. После загрузки .com программы сегментные регистры CS, DS, ES и SS указывают на адрес сегмента программы (в данном случае 543Bh), SP указывает на конец сегмента программы, там находится вершина стека (который растёт вниз – по убыванию адреса). Регистр IP содержит 100H (фактическое начало программы)
2) Что располагается с адреса 0?
- Program Segment Prefix (PSP) размером в 100h байт
3) Какие значения имеют сегментные регистры? На какие области памяти они указывают?
- При загрузке программы они указывают на начало сегмента программы.
Как определяется стек? Какую область памяти он занимает? Какие адреса?
- стек автоматически помещается в конец сегмента и растёт по
убыванию адреса (смещения) относительно сегмента.
Загрузка «хорошего» ехе модуля в основную память
Как загружается «хороший» EXE? Какие значения имеют сегментные регистры?
- регистры CS и SS (отвечающие за сегмент кода и стека), в данном
случае они имеют значения 543Bh и 546Fh соответственно и инициализированы сразу (после загрузки программы), а регистр сегмента данных DS устанавливается уже во время исполнения с помощью последовательности команд :
mov ax, @data
mov ds, ax
Регистр SP содержит указатель на вершину стека 100h (именно такого размера сегмент стека был указан в программе)
На что указывают регистры DS и ES?
- DS и ES – регистр сегмента данных и дополнительный сегментный регистр соответственно, по умолчанию (при загрузки программы) они указывают на сегмент программы (начало PSP).
3) Как определяется стек?
- стек имеет собственный сегмент (указан в регистре SS), его размер указывается командой .stack
4) Как определяется точка входа?
- директива end <имя> определяет точку входа в программу (метка с именем точки должна быть объявлена выше)
Выводы:
В ходе лабораторной работы были исследованы структуры организации загрузочных .com и .exe модулей, написаны исходные коды программ (собранных в эти два типа модулей) выводящих информацию о типе компьютера и версии ОС (для DOS). Также было исследована загрузка этих типов загрузочных модулей в оперативную память с помощью отладчика.