
- •В.А. Афанасьев
- •Часть 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. Контрольные вопросы
- •Список использованной и рекомендуемой Литературы
- •Оглавление
А) Листинг prog_exe.Lst
Turbo Assembler Version 4.1
1
2 IDEAL
3 0000 MODEL small
4 0000 stack 32
5 0020 10*(3F) db 16 dup('?') ;Введено с целью просмотра сегмента
; стека программой – оболочкой
6 0030 DATASEG
7 0000 8F E0 AE A3 E0 A0 AC+ mes db 'Программа типа .exe',10,13,'$'
8 AC A0 20 E2 A8 AF A0+
9 20 2E 65 78 65 0A 0D+
10 24
11 0016 CODESEG
12 0000 B8 0000s Start: mov ax,@data ;Установка в ds адреса
13 0003 8E D8 mov ds,ax ;сегмента данных
14 0005 B4 09 mov ah,09h ;Вывод сообщения mes на экран
15 0007 BA 0000r mov dx,offset mes
16 000A CD 21 int 21h
17 000C B8 4C00 Exit: mov ax,04C00h
18 000F CD 21 int 21h ;Вызов DOS. Останов программы
19 END Start ;Конец программы/точка входа
Groups & Segments Bit Size Align Combine Class
Dgroup Group
Stack 16 0030 Para Stack Stack
_Data 16 0016 Word Public Data
_Text 16 011 Word Public Code
Б) Машинный код исполняемого файла prog_exe.Exe на диске объёмом 624 байта
Заголовок программы (512 байт)
00000: 4D 5A 70 00 02 00 01 00 20 00 00 00 FF FF 04 00 MZp ☻ ☺ ♦
00010: 30 00 00 00 00 00 00 00 3E 00 00 00 01 00 FB 71 0 > ☺ √q
00020: 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 jr
00030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ☺
00040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...................................
001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Загрузочный модуль: Сегмент кода (32 байта)
00200: B8 02 00 8E D8 B4 09 BA 00 00 CD 21 B8 00 4C CD ╕☻ o╪┤o║ ═!╕ L=
00210: 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 !
Сегмент данных (32 байта)
00220: 8F E0 AE A3 E0 A0 AC AC A0 20 E2 A8 AF A0 20 2E Программа типа .
00230: 65 78 65 0A 0D 24 00 00 00 00 00 00 00 00 00 00 exe◙♪$
Сегмент стека (48 байт)
00240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00260: 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????
Рис. П.1.3_2. Листинг и машинный код программы типа .exe
Таблица П.1.3_2
Формат заголовка исполняемого .Exe – файла на диске
Смещение |
Число байтов |
Описание |
00h |
2 |
Сигнатура "MZ" (Mark Zbikowski) или код 4D5A |
02h |
2 |
Остаток от деления размера загрузочного модуля на 512. (для нашего примера 624 -512=112=70h) |
04h |
2 |
Размер файла в блоках по 512 байт, округленный в большую сторону |
06h |
2 |
Число элементов таблицы настройки адресов |
08h |
2 |
Размер заголовка в параграфах |
0Ah |
2 |
Минимальное число параграфов, требуемых программе дополнительно к её образу на диске |
0Ch |
2 |
Максимальное число параграфов, требуемых программе дополнительно к её образу на диске (по умолчанию FFFFh) |
0Eh |
2 |
Смещение в параграфах сегмента стека в загрузочном модуле (SS0) |
10h |
2 |
Значение регистра SP0 |
12h |
2 |
Поразрядная контрольная сумма EXE- файла |
14h |
2 |
Значение регистра IP0 при входе в программ |
16h |
2 |
Смещение в параграфах сегмента кода в загрузочном модуле (CS0) |
18h |
2 |
Расстояние в байтах от начала файла до первого элемента таблицы настройки адресов |
1Ah |
2 |
Содержат «0», если программа является резидентной, или отличное от нуля число, если данная часть программы является оверлейной |
1Ch |
6 |
Различные сигнатуры, в том числе версия Tlink (смещение 1Fh) |
Действия MS DOS при запуске .exe-программы отличаются от действий при запуске программы типа .com, хотя в обоих случаях используется одна и та же функция Exec.
Запускаемой программе отводится вся свободная в данный момент оперативная память, в которой определяется начальный сегментный адрес программы (NS0).
По нулевому смещению в выделенном для программы сегменте памяти Exec создаёт служебную структуру – префикс программного сегмента PSP. Его размер, как и для COM-программ, равен 256 байт.
Вслед за PSP размещается загрузочный модуль программы, а заголовок и таблица настройки в память не копируются. После этого выполняется так называемая настройка адресов.
Суть настройки состоит в следующем: компоновщик (Tlink или какой-либо другой) строит exe-модуль относительно некоторого "базового адреса" (в MS DOS программы могут загружаться в произвольную область памяти). Поэтому при загрузке программы к каждому сегментному адресу прибавляется значение начального сегмента программы (NS0). Элементы, требующие настройки, указываются в таблице настройки. Таким образом, устанавливаемые значения регистров для программы рис. П.1.3_2 примут следующие значения:
DS = ES = NS0;
CS = NS0 + 10h + CS0=NS0 +10h;
SS = NS0 + 10h + SS0=NS0 + 14h;
IP = IP0 =00h , SP = SP0 = 30h
Здесь CS0, SS0, IP0 и SP0 берутся загрузчиком Exec из заголовка exe-файла, а значение 10h – резервирует пространство (в параграфах) для PSP.
После загрузки программы начинается процесс её исполнения, для чего Exec передает управление по адресу cs:ip.
7. ЛАБОРАТОРНАЯ РАБОТА № 2
СИСТЕМНЫЕ ФУНКЦИИ DOS ВВОДА-ВЫВОДА ИНФОРМАЦИИ. ОБРАБОТКА СТРОКОВЫХ ПЕРЕМЕННЫХ
7.1. Целевые установки
Освоение стандартных способов ввода-вывода DOS.
Разработка программ по обработке символьной информации с использованием строковых команд.
7.2. Методические рекомендации
7.2.1. Вызовы функций MS-DOS для ввода-вывода символьной информации
Для того чтобы написать простую, но законченную программу, необходимо знать три вещи – как вводить данные, как выводить результат и как остановить выполнение программы. В языках высокого уровня имеются специальные операторы ввода/вывода, которые позволяют в удобной форме реализовать эти функции. В системе команд процессора ix86 также имеются команды ввода/вывода, но они реализуют эти операции на самом низком, физическом уровне, т.е. обеспечивают обращение к портам ввода/вывода по конкретным адресам. Для обеспечения ввода/вывода информации на этом уровне программист должен знать номера портов каждого устройства, а также протоколы или алгоритмы обслуживания этих устройств. Операционная система MS DOS реализует ряд сервисных функций ввода/вывода на логическом уровне, которые выступают как пронумерованные функции прерывания Int 21h. При этом прикладная программа пользователя должна сообщить необходимые для данной функции параметры и передать управление DOS, которая и осуществит все необходимые операции по управлению устройством на физическом уровне (где-то, возможно, обратится за помощью к BIOS), а затем вернёт управление прикладной задаче, сообщив, успешно ли завершилась операция или же была допущена ошибка.
Прерывания, в основном, можно разделить на два основных типа: аппаратные (hardware) и программные (software interrupt). Аппаратные прерывания вызываются сигналами от периферийных устройств, требующими обслуживания процессором, а программные, через посредство команды Int, вызывающей какую-либо сервисую функцию (процедуру) DOS или BIOS. Перечень функций, выполняемых операционной системой DOS, подробно изложен в п. 3.
Упрощенная схема обработки прерывания изображена на рис. 2.1. Процессор выполняет команду прерывания, используя таблицу векторов, где содержатся все адресные указатели обработчиков (аппаратных и программных) прерываний. Действия процессора при переходе на выполнение подпрограммы-обработчика (инициируемое командой Int n) и последующем возврате обратно (при встрече команды Iret) в точку выхода из основной программы показаны на рис. 2.1 цифрами в кружках. Одно и то же прерывание может выполнять несколько различных функций, код которых помещается в регистр ah, а дополнительные параметры заносятся в другие регистры РОН. Возвращаемая обработчиком информация содержится в регистре al или ax, если флаг cf=0. Флаг cf устанавливается в 1, если произошла какая-либо ошибка, код которой заносится в регистр ax (так называемый код возврата ошибки). Возможные коды ошибок приводятся в руководствах по DOS [4, 10, 12].
Рис. 2.1. Упрощенная схема обработки программного прерывания Int n
Функции информационного обмена MS DOS в своём развитии изменялись от специализированных программ обмена для каждого типа устройства на основе блока управления файлами FCB (File Control Block) до унификации обмена на основе файловой системы через дескрипторы. Дескриптор или логический номер файла идентифицирует файл или устройство, с которым должна работать прикладная программа. Это упрощает программирование операций ввода/вывода, т.к. позволяет осуществлять обмен информации независимо от природы файла (устройства). Существует пять стандартных дескрипторов файлов, которые предоставляются прикладной программе:
0 – стандартный ввод с консоли (обычно клавиатура);
1 – стандартный вывод на консоль (обычно экран дисплея);
2 – устройство вывода ошибок (всегда дисплей);
3 – внешнее устройство обмена AUX (асинхронный адаптер COM1);
4 – стандартный принтер (первый параллельный порт LPT1).
Стандартный ввод (как и стандартный вывод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном (обычно дескриптор 2 используют для вывода диагностических сообщений). Перенаправление ввода или вывода программы осуществляет командный процессор Command.com. Если, допустим, в программе prog предусмотрен ввод данных через дескриптор стандартного ввода 0, а вывод данных через дескриптор вывода 1, то при обычном запуске программы командой prog.exe программа будет требовать входные данные с клавиатуры и выводить результаты своей работы на экран. Если, однако, при запуске программы использовать символ перенаправления
prog.exe > file.txt,
то система сама создаст файл file.txt, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой
prog.exe < file.dat
приведёт к тому, что программа всю требуемую ей информацию попытается ввести из файла file.dat. Поэтому этот файл должен быть подготовлен пользователем заранее. Вывод программы опять поступит на экран. Наконец, команда
prog.exe < file.dat > file.txt
заставит программу выполняться в режиме ввода информации из файла file.dat и вывода в файл file.txt. Ни экран, ни клавиатура использоваться не будут. Сама программа ничего не знает об этих перенаправлениях – она во всех случаях обращается к стандартному устройству ввода данных и к стандартному устройству вывода данных. Просто DOS как бы подставляет ей на входе и выходе другие устройства.