
- •В.А. Афанасьев
- •Часть 1 Лабораторный практикум
- •Предисловие
- •1. Краткая характеристика операционной среды ms-dos в компьютерах с операционной системой Windows
- •2. Составные части ms-dos и её инициализация
- •3. Взаимодействие Ассемблерной программы с ms-dos и аппаратными средствами Компьютера
- •4. Сегментированная организация памяти в реальном режиме. Виды памяти в среде ms-dos
- •Распределение первого мегабайта памяти компьютера
- •Содержание некоторых полей области данных bios
- •5. Программная модель 32-разрядных процессоров i80x86
- •Назначения сегментных регистров
- •6.2.2. Путь выполнения команды
- •6.2.3. Трансляция программы. Опции командной строки
- •6.2.4. Структура программы для .Exe- и .Com-файлов. Образ программы в памяти
- •Сегменты упрощенной модели памяти Small
- •%Title "Имя exe-файла программы"
- •%Title "Имя com – файла программы"
- •6.2.5. Работа с отладчиком Turbo Debugger (td)
- •6.2.6. Форматы машинных команд и их кодирование
- •Определение эффективного адреса
- •Косвенные виды адресации
- •6.2.6.2. Использование 32-битных регистров
- •6.2.7. Работа над синтаксическими ошибками при ассемблировании программы
- •6.3. Задание к работе. Порядок выполнения
- •6.4. Контрольные вопросы
- •Приложения к лабораторной работе № 1 п.1.1. Машинные коды команд базового процессора i8086
- •Машинные коды команд базового процессора i8086
- •П.1.2. Демонстрационные файлы
- •П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
- •А) Листинг prog_com. Lst
- •Содержимое префикса программы psp
- •А) Листинг prog_exe.Lst
- •Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
- •Формат заголовка исполняемого .Exe – файла на диске
- •7.2.2. Ввод с клавиатуры символьной информации
- •7.2.2.1. Буфер ввода данных с клавиатуры
- •7.2.2.2. Системные функции dos ввода данных с клавиатуры
- •Сравнительная характеристика функций dos ввода с клавиатуры
- •7.2.3. Функции dos вывода данных на экран
- •7.2.4. Расширенные коды ascii и управление программой с клавиатуры
- •Расширенные коды для функциональных клавиш
- •7.2.5. Строковые команды. Общая характеристика
- •Команды обработки строк
- •7.3. Задания к работе. Подготовка и выполнение
- •7.4. Контрольные вопросы
- •Приложения к лабораторной работе № 2 Приложение п.2.1. Примеры реализаций типового задания
- •Приложение п.2.2. Esc-последовательности
- •Параметры Esc-последовательности
- •Приложение п.2.3. Таблица символов в кодировке ascii
- •8.2.2. Прямое программирование видеобуфера в текстовом режиме
- •8.2.3. Справочные данные по функциям bios
- •8.2.3.1. Прерывание int 10h. Видеофункции bios
- •Текстовые видеорежимы и страницы в стандарте vga, поддерживаемые современными видеоконтроллерами
- •8.2.3.2. Рекомендации по использованию видеосервиса bios
- •8.2.3.3. Прерывание int 16h
- •8.2.3.4. Задержка программных операций
- •Int 15h, функция 86h
- •8.3. Варианты индивидуального задания
- •8.4. Контрольные вопросы
- •Приложения к работе № 3 Примеры реализаций типовых заданий п.3.1. Листинг 3.4. Программа получения скан-кодов клавиш клавиатуры
- •П.3.2. Листинг 3.5. Демонстрационная программа использования функций bios для работы с экраном и клавиатурой
- •9.2.1. Представление знаковых и беззнаковых чисел в 16-разрядном компьютере
- •Представление чисел в 16- разрядном компьютере
- •9.2.2. Преобразование ascii-кодов чисел с произвольным основанием в двоичное число
- •9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию
- •9.2.4. Задание к работе. Порядок выполнения
- •Варианты заданий 1-7
- •Варианты заданий 8-14
- •9.2.5. Вопросы построения многомодульных программ
- •9.2.6. Ассемблирование и компоновка отдельных модулей в программу. Создание библиотеки объектных модулей
- •9.3. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
П.1.3. Форматы исполняемых файлов .Exe и .Com на диске
Программы типа .exe и .com различаются не только форматом исходного текста и процедурой создания исполняемого файла при трансляции, но и форматом загрузочного файла на диске. Программы загружаются в память для выполнения с помощью функции DOS Exec (Int 21h, функция 4Bh), играющей роль системного загрузчика. При этом, если имя программы вводится в командную строку с клавиатуры, то функция Exec вызывается командным процессором Command.com.
В дальнейшем изложении для сравнительной оценки параметров программ, выполненных в разных форматах, взята одна и та же простая программа с минимально возможным набором команд (с целью экономии места, отводимого для иллюстраций).
Загрузка и выполнение .COM-программы
Программы типа .com после загрузки в память представляют собой немодифицированное представление программы на машинном языке на диске. Листинг трансляции и машинный код программы на диске приведён на рис П.1.3_1. Особенностью данного формата является тот факт, что, несмотря на местоположение данных в тексте программы, компоновщик Tlink размещает их в исполняемом файле после кода программы (рис. П.1.3_1, б).
Действия функции Exec при запуске программы типа .com выглядят следующим образом.
Запускаемой программе отводится вся свободная в данный момент оперативная память, в которой определяется начальный сегментный адрес программы.
По нулевому смещению в выделенном для программы сегменте памяти Exec создаёт специальную служебную структуру – префикс программного сегмента PSP, в котором содержится информация для DOS об окружении программы. Впрочем, некоторые поля PSP используются и прикладными программистами, например, при разработке резидентных программ. Размер PSP всегда равен 100h или 256 байт.
А) Листинг prog_com. Lst
Turbo Assembler Version 4.1
1
2 Ideal
3 0000 Model tiny
4 0000 Dataseg
5 0000 8F E0 AE A3 E0 A0 AC+ mes db 'Программа типа .com',10,13,'$'
6 AC A0 20 E2 A8 AF A0+
7 20 2E 63 6F 6D 0A 0D+
8 24
9 0016 Codeseg
10 org 100h
11 0100 proc main
12 0100 B4 09 mov ah,09h ;Вывод сообщения mes на экран
13 0102 BA 0000r mov dx,offset mes
14 0105 CD 21 int 21h
15 0107 B8 4C 00 exit: mov ax,04C00h ;Функция DOS 4Сh
16 010A CD 21 int 21h ;Вызов DOS. Останов
17 010C endp main
18 end main ;Конец программы/точка входа
Groups & Segments Bit Size Align Combine Class
Dgroup Group
_Data 16 0016 Word Public Data
_Text 16 010C Word Public Code
б) Машинный код исполняемого файла prog_com.com на диске объёмом 32 байта
00000: B4 09 BA 0C 01 CD 21 B8 00 4C CD 21 8F E0 AE A3 ┤○║♀☺=!╕ L=!Прог
00010: E0 A0 AC AC A0 20 E2 A8 AF A0 20 2E 63 6F 6D 0A рамма типа .com◙
00020: 0D 24 ♪$
Рис. П.1.3_1. Листинг и машинный код программы типа .com
Таблица П.1.3_1
Содержимое префикса программы psp
Смещение |
Число байтов |
Описание |
00h |
2 |
Инструкция INT 20h |
02h |
2 |
Сегментный адрес первого свободного байта за пределами программы |
0Ah |
4 |
Адрес перехода в Command после завершения программы (Int 22h) |
0Eh |
4 |
Адрес обработчика Ctrl+C (Int 23h) |
12h |
4 |
Адрес обработчика критической ошибки (Int 24h) |
16h |
2 |
Сегмент PSP родителя |
18h |
20 |
Таблица файлов задания (Job file Table – JFT) |
2Ch |
2 |
Сегментный адрес блока окружения программы |
2Eh |
4 |
SS:SP на входе в последний вызов int 21h |
32h |
2 |
Количество байтов в JFT (по умолчанию 20) |
34h |
4 |
Адресный указатель на JFT (по умолчанию PSP:0018h) |
80h |
1 |
Длина командной строки в байтах |
81h |
127 |
Параметры командной строки при запуске программы ) и 0Dh |
Сразу вслед за PSP загружается сама com-программа со следующей настройкой регистров процессора: cs = ds = ss = es указывают на начальный сегмент программы, регистр ip инициализируется числом 100h (это размер PSP), а регистр sp – числом 0fffeh. При этом образ программы в памяти после PSP в точности соответствует машинному коду программы на диске (рис. П.1.3_1, б). Таким образом, программный код, данные и стек com-программы размещаются в одном сегменте оперативной памяти объёмом 64 Кбайта, так как регистр указателя вершины стека инициализируется числом 0FFFEh.
Для исполнения загруженной com -программы Exec передает управление по адресу cs:100h (по этому адресу обязательно должна находиться первая исполняемая команда). После завершения программы управление передается обратно в Exec, а оттуда – родительской программе – "предку" (при запуске из командной строки – командному процессору Command.com).
Загрузка и выполнение .exe-программы
В настоящее время существуют три формата .exe-программ:
MZ-формат (разработан фирмой Microsoft для поддержки многосегментных программ в среде MS DOS);
NE-формат (Windows 3.1);
PE-формат (Windows 95/98/2000).
MZ-формат, построенный компоновщиком и хранимый на диске, состоит из заголовка и собственно загрузочного модуля (рис. П.1.3_2).
В заголовке, состоящем из одного или нескольких блоков размером 512 байт, содержится информация для настройки значений сегментных регистров (в том числе регистров ip и sp) процессора, используемая при загрузке программы в память для её исполнения. Формат заголовка приведён в табл. П.1.3_2.