-
Notifications
You must be signed in to change notification settings - Fork 2
Лабораторная работа 7
- MZ — 16-битный формат, основной формат файлов .EXE в DOS.
EXE-файлы для Windows и OS/2 используют другие форматы для основной
части программы, но всё равно начинаются с заглушки в формате MZ, которая, как
правило, при попытке запустить файл в DOS выводит сообщение This program cannot
be run in DOS mode. («Эту программу невозможно запустить в режиме DOS») и
завершает выполнение, хотя теоретически может запускать некий произвольный код,
работоспособный в DOS.
- NE — 16-битный формат, использовался в Windows 3.x[2], OS/2 и MS-DOS.
- LE — смешанный 16- и 32-битный формат, ранее использовался в OS/2 и Windows (VxD).
- LX — 32-битный формат, используется в OS/2.
-
PE — 32- и 64-битный формат, используется в современных версиях Windows, начиная с Windows NT и Windows 95.
(ц) Википедия
Заголовок начинается с двухбайтной сигнатуры (аббревиатура MZ), далее идут поля размера образа задачи (т.е. части файла, которая будет загружена в память и станет выполняемой программой), размера заголовка, начальные значения SP
и IP
и т.д.
Также заголовок содержит таблицу настройки адресов, с помощью которой DOS при загрузке программы в память подставляет в нужные места сегмента кода реальные сегментные адреса, например, сегмента данных.
Префикс программного сегмента (PSP - Program Segment Prefix) - структура данных, которая используется в DOS для сохранения состояния программы.
- ссылки на области памяти, связанные с вызвавшей программой (чаще всего - командного интерпретатора или оболочки командной строки);
- указатель на область памяти с переменными среды;
- двойное слово для сохранения
SS
иSP
программы обработчиком 21-го прерывания; - параметры командной строки;
- и т. д.
Размер PSP - 256 байт, отсюда в COM-программах начальное смещение при запуске 100h, т.е. размер PSP.
Резидентная программа (TSR - Terminate and Stay Resident) - в операционной системе MS-DOS программа, вернувшая управление операционной системе, но оставшаяся в оперативной памяти компьютера.
Резидентная программа активизируется каждый раз при возникновении прерывания, вектор которого эта программа изменила на адрес одной из своих процедур.
При работе с MS-DOS резидентные программы широко использовались для достижения различных целей (например, русификаторы клавиатуры, программы доступа к локальной сети, менеджеры отложенной печати).
В многозадачных ОС резидентными иногда называют программы, загруженные постоянно и работающие в фоновом режиме, но такое применение этого термина некорректно.
Для завершения программы с сохранением в памяти в DOS предусмотрено 2 способа:
- int
27h
- для com-программ, размером до 64 Кб. ВDX
должно находиться количество байтов, которые следует оставить от начала PSP. Другими словами, вDX
требуется загрузить смещение команды, начиная с которой фрагмент программы может быть удалён из памяти.CS
должен указывать на PSP программы (как при работе com-программы). - Функция
31h
прерывания int21h
.AL
- код завершения,DX
- количество параграфов, которые нужно оставить в памяти. Ограничения на размер программы из п.1 нет.
Сначала в памяти располагаются данные и подпрограммы обработчиков прерываний, затем секция инициализации (которая имеет точку входа INIT и именно в эту точку передается управление при запуске программы). Основная задача секции инициализации — установить резидент в памяти (она нужна лишь при установке программы, потом её из памяти удаляют). Эту секцию располагают в старших адресах (так как «обрезать» мы можем только старшие адреса).
Для замены вектора прерывания на свой адрес можно либо переопределить его напрямую в памяти таблицы векторов, либо использовать функции 25h
и 35h
.
Для взаимодействия с внешними устройствами в архитектуре x86 предусмотрен так называемый механизм ввода-вывода через порты, для которого предназначены команды процессора IN
и OUT
.
В частности, для работы с клавиатурой задействованы порты 61h
и 60h
. Порт 60h
доступен для записи и обычно принимает пары байтов последовательно: первый - код команды, второй - данные. В частности, команда F3h
отвечает за параметры режима автоповтора нажатой клавиши. Её байт данных имеет следующее значение:
- 7 бит (старший) - всегда 0
- 5,6 биты - пауза перед началом автоповтора (250, 500, 750 или 1000 мс)
- 4-0 биты - скорость автоповтора (от 0000b (30 символов в секунду) до 11111b - 2 символа в секунду).