IT DOS версии 3.0 и страше содержит команду INT 62H, загружаю щую в регистр BX адрес текущего PSP, который можно использо вать для доступа к данным в PSP. ВЫПОЛНЕНИЕ COM-ПРОГРАММЫ ------------------------------------------------------------ В отличие от EXE-файла, COM-файл не содержит заголовок на диске. Так как организация COM-файла намного проще, то для DOS необходимо "знать" только то, что тип файла - COM. Ассемблер для IBM PC. Глава 22 38 Как описано выше, загруженным в память COM- и EXE-файлам предшествует префикс программного сегмента. Первые два байта этого префикса содержат команду INT 20H (возврат в DOS). При загрузке COM-программы DOS устанавливает в четырех сегментных регистрах адрес первого байта PSP. Затем устанавливается указатель стека на конец 64 Кбайтового сегмента (шест.FFFE) или на конец памяти, если сегмент не достаточно большой. В вершину стека заносится нулевое слово. В командный указатель помещается шест.100 (размер PSP). После этого управление передается по адресу регистровой пары CS:IP, т.е. на адрес непосредственно после PSP. Этот адрес является началом выполняемой COM-программы и должен содержать выполнимую команду. При выходе из программы команда RET заносит в регистр IP нулевое слово, которое было записано в вершину стека при инициализации. В этом случае в регистровой паре CS:IP получается адрес первого байта PSP, где находится команда INT 20H. При выполнении этой команды управление передается в резидентную часть COMMAND.COM. (Если программа завершается по команде INT 20H вместо RET, то управление непосредственно передается в COMMAND.COM). ВЫПОЛНЕНИЕ EXE-ПРОГРАММЫ ------------------------------------------------------------ EXE-модуль, созданный компановщиком, состоит из следующих двух частей: 1) заголовок - запись, содержащая информацию по управлению и настройке программы и 2) собственно загрузоч ный модуль. В заголовке находится информация о размере выполняемого модуля, области загрузки в памяти, адресе стека и относитель ных смещениях, которые должны заполнить машинные адреса в соответствии с относительными шест. позициями: 00 Шест.4D5A. Компановщик устанавливает этот код для иден тификации правильного EXE-файла. 02 Число байтов в последнем блоке EXE-файла. 04 Число 512 байтовых блоков EXE-файла, включая заголо вок. 06 Число настраиваемых элементов. 08 Число 16-тибайтовых блоков (параграфов) в заголовке, (необходимо для локализации начала выполняемого модуля, следующего после заголовка). OA Минимальное число параграфов, которые должны находится после загруженной программы. OC Переключатель загрузки в младшие или старшие адреса. При компановке программист должен решить, должна ли его программа загружаться для выполнения в младшие адреса памяти или в старшие. Обычным является звгрузка в млад шие адреса. Значение шест.0000 указывает на загрузку в старшие адреса, а шест.FFFF - в младшие. Иные значения определяют максимальное число параграфов, которые должны находиться после загруженной программы. Ассемблер для IBM PC. Глава 22 39 OE Относительный адрес сегмента стека в выполняемом модуле. 10 Адрес, который загрузчик должен поместить в регистр SP перед передачей управления в выполнимый модуль. 12 Контрольная сумма - сумма всех слов в файле (без учета переполнений) используется для проверки потери данных. 14 Относительный адрес, который загрузчик должен поместить в регистр IP до передачи управления в выполняемый модуль. 16 Относительный адрес кодового сегмента в выполняемом модуле. Этот адрес загрузчик заносит в регистр CS. 18 Смещение первого настраиваемого элемента в файле. 1A Номер оверлейного фрагмента: нуль обозначает, что заго ловок относится к резидентной части EXE-файла. 1C Таблица настройки, содержащая переменное число настраиваемых элементов, соответствующее значению по смещению 06. Заголовок имеет минимальный размер 512 байтов и может быть больше, если программа содержит большое число настраи ваемых элементов. Позиция 06 в заголовке указывает число элементов в выполняемом модуле, нуждающихся в настройке. Каждый элемент настройки в таблице, начинающейся в позиции 1C заголовка, состоит из двухбайтовых величин смещений и двухбайтовых сегментных значений. Система строит префикс программного сегмента следом за резидентной часью COMMAND.COM, которая выполняет операцию загрузки. Затем COMMAND.COM выполняет следующие действия: ъ Считывает форматированную часть заголовка в память. ъ Вычисляет размер выполнимого модуля (общий размер файла в позиции 04 минус размер заголовка в позиции 08) и загружает модуль в память с начала сегмента. ъ Считывает элементы таблицы настройки в рабочую область и прибавляет значения каждого элемента таблицы к началу сегмента (позиция OE). ъ Устанавливает в регистрах SS и SP значения из заголовка и прибавляет адрес начала сегмента. ъ Устанавливает в регистрах DS и ES сегментный адрес префикса программного сегмента. ъ Устанавливает в регистре CS адрес PSP и прибавляет вели чину смещения в заголовке (позиция 16) к регистру CS. Если сегмент кода непосредственно следует за PSP, то смещение в заголовке равно 256 (шест.100). Регистровая пара CS:IP содержит стартовый адрес в кодовом сегменте, т.е. начальный адрес программы. После инициализации регистры CS и SS содержат правильные адреса, а регистр DS (и ES) должны быть установлены в программе для их собственных сегментов данных: 1. PUSH DS ;Занести адрес PSP в стек 2. SUB AX,AX ;Занести нулевое значение в стек Ассемблер для IBM PC. Глава 22 40 3. PUSH AX ; для обеспечения выхода из программы 4. MOV AX,datasegname ;Установка в регистре DX 5. MOV DS,AX ; адреса сегмента данных При завершении программы команда RET заносит в регистр IP нулевое значение, которое было помещено в стек в начале выполнения программы. В регистровой паре CS:IP в этом случае получается адрес, который является адресом первого байта PSP, где расположена команда INT 20H. Когда эта команда будет выполнена, управление перейдет в DOS. ПРИМЕР EXE-ПРОГРАММЫ ------------------------------------------------------------ Рассмотрим следующую таблицу компановки (MAP) программы: Start Stop Length Name Class 00000H 0003AH 003BH CSEG CODE 00040H 0005AH 001BH DSEG DATA 00060H 0007FH 0020H STACK STACK Program entry point at 0000:0000 Таблица MAP содержит относительные (не действительные) адреса каждого из трех сегментов. Символ H после каждого значения указывает на шестнадцатиричный формат. Заметим, что компановщик может организовать эти сегменты в последователь ности отличного от того, как они были закодированы в програм ме. В соответствии с таблицей MAP кодовый сегмент CSEG нахо дится по адресу 00000 - этот относительный адрес является началом выполняемого модуля. Длина кодового сегмента составляет шест.003B байтов. Следующий сегмент по имени DSEG начинается по адресу шест.00040 и имеет длину шест.001B. Адрес шест.00040 является первым после CSEG адресом, выров ненным на границу параграфа (т.е. это значение кратно шест.10). Последний сегмент, STACK, начинается по адресу шест.00060 - первому после DSEG, адресу выровненному на границу параграфа. С помощью отладчика DEBUG нельзя проверить содержимое заголовка, так как при загрузке программы для выполнения DOS замещает заголовок префиксом программного сегмента. Однако, на рынке программного обеспечения имеются различные сервис ные утилиты (или можно написать собственную), которые позво ляют просматривать содержимое любого дискового сектора в шестнадцатиричном формате. Заголовок для рассматриваемого примера программы содержит следующую информацию (содержимое слов представлено в обратной последовательности байтов). 00 Шест.4D5A. 02 Число байтов в последнем блоке: 5B00. 04 Число 512 байтовых блоков в файле, включая заголовок: 0200 (шест.0002х512=1024). Ассемблер для IBM PC. Глава 22 41 06 Число элементов в таблице настройки, находящейся после форматированной части заголовка: 0100, т.е. 0001. 08 Число 16 байтовых элементов в заголовке: 2000 (шест.0020=32 и 32х16=512). 0C Загрузка в младшие адреса: шест.FFFF. 0E Относительный адрес стекового сегмента: 6000 или шест. 60. 10 Адрес для загрузки в SP: 2000 или шест.20. 14 Смещение для IP: 0000. 16 Cмещение для CS: 0000. 18 Cмещение для первого настраиваемого элемента: 1E00 или шест.1E. После загрузки программы под управлением отладчика DEBUG регистры получают следующие значения: SP = 0020 DS = 138F ES = 138F SS = 13A5 CS = 139F IP = 0000 Для EXE-модулей загрузчик устанавливает в регистрах DS и ES адрес префикса программного сегмента, помещенного в доступной области памяти, а в регистрах IP, SS и SP - значения из заголовка программы. Регистр SP Загрузчик использует шест.20 из заголовка для инициализа ции указателя стека значением длины стека. В данном примере стек был определен, как 16 DUP (?), т.е. 16 двухбайтовых полей общей длиной 32 (шест.20) байта. Регистр SP указывает на текущую вершину стека. Регистр CS В соответствии со значением в регистре DS после загрузки программы, адрес PSP равен шест.138F(0). Так как PSP имеет длину шест.100 байтов, то выполняемый модуль, следующий непо средственно после PSP, находится по адресу шест.138F0+100= 139F0. Это значение устанавливается загрузчиком в регистре CS. Таким образом, регистр CS определяет начальный адрес кодовой части программы (CSEG). С помощью команды D CS:0000 в отладчике DEBUG можно просмотреть в режиме дампа машинный код в памяти. Обратите внимание на идентичность дампа и шестнадцатиричной части ассемблерного LST файла кроме операндов, отмеченных символом R. Регистр SS Для установки значения в регистре SS загрузчик также использует информацию из заголовка: Начальный адрес PSP (см.DS) 138F0 Длина PSP 100 Ассемблер для IBM PC. Глава 22 42 Относительный адрес стека 60 Адрес стека 13A50 Регистр DS Загрузчик использует регистр DS для установки начального адреса PSP. Так как заголовок не содержит стартового адреса, то регистр DS необходимо инициализировать в программе следую щим образом: 0004 B8 ---- R MOV AX,DSEG 0007 8E D8 MOV DS,AX Ассемблер оставляет незаполненным машинный адрес сегмента DSEG, который становится элементом таблицы настройки в заго ловке. С помощью отладчика DEBUG можно просмотреть завершен ную команду в следующем виде: B8 A313 Значение A313 загружается в регистр DS в виде 13A3. В результате имеем Регистр Адрес Смещение CS 139F0 00 DS 13A30 40 SS 13A50 60 В качестве упражнения выполните трассировку любой вашей скомпанованной программы под управлением отладчика DEBUG и обратите внимание на изменяющиеся значения в регистрах: Команда Изменяющиеся регистры PUSH DS IP и SP SUB AX,AX IP и AX (если был не нуль) PUSH AX IP и SP MOV AX,DSEG IP и AX MOV DS,AX IP и DS Регистр DS содержит теперь правильный адрес сегмента данных. Можно использовать теперь команду D DS:00 для просмотра содержимого сегмента данных DSEG и команду D SS:00 для просмотра содержимого стека. ФУНКЦИИ ЗАГРУЗКИ И ВЫПОЛНЕНИЯ ПРОГРАММЫ ------------------------------------------------------------ Рассмотрим теперь, как можно загрузить и выполнить программу из другой программы. Функция шест.4B дает возможность одной программе загрузить другую программу в память и при необходимости выполнить. Для этой функции необходимо загрузить адрес ASCIIZ-строки в регистр DX, а Ассемблер для IBM PC. Глава 22 43 адрес блока параметров в регистр BX (в действительности в регистровую пару ES:BX). В регистре AL устанавливается номер функции 0 или 3: AL=0. Загрузка и выполнение. Данная операция устанавлива ет префикс программного сегмента для новой программы, а также адрес подпрограммы реакции на Cntrl/Break и адрес передачи управления на следующую команду после завершения новой программы. Так как все регистры, включая SP, изменяют свои значения, то данная операция не для новичков. Блок параметров, адресуемый по ES:BX, имеет следующий формат: Смещение Назначение 0 Двухбайтовый сегментный адрес строки параметров для передачи. 2 Четырехбайтовый указатель на командную строку в PSP+80H. 6 Четырехбайтовый указатель на блок FCB в PSP+5CH. 10 Четырехбайтовый указатель на блок FCB в PSP+6CH. AL=3. Оверлейная загрузка. Данная операция загружает программу или блок кодов, но не создает PSP и не начинает выполнение. Таким образом можно создавать оверлейные программы. Блок параметров адресуется по регистровой паре ES:BX и имеет следующий формат: Смещение Назначение 0 Двухбайтовый адрес сегмента для загрузки файла. 2 Двухбайтовый фактор настройки загрузочного модуля. Возможные коды ошибок, возвращаемые в регистре AX: 01, 02, 05, 08, 10 и 11. Программа на рис.22.2 запрашивает DOS выполнить команду DIR для дисковода D. Выполните эту программу, как EXE-модуль. (Автор благодарен журналу PC Magazine за эту идею). ------------------------------------------------------------ ------------------------------------------------------------ Рис.22.2. Выполнение команды DIR из программы. Ассемблер для IBM PC. Глава 23 55 ГЛАВА 23. Прерывания BIOS и DOS ------------------------------------------------------------ Прерывания BIOS и DOS Цель: Описать функции, доступные через прерывания BIOS и DOS. ВВЕДЕНИЕ ------------------------------------------------------------ Прерывание представляет собой операцию, которая приоста навливает выполнение программ для специальных системных действий. Необходимость прерываний обусловлено двумя основными причинами: преднамеренный запрос таких действий, как операции ввода-вывода на различные устройства и непредвиденные программные ошибки (например, переполнение при делении). Система BIOS (Basic Input/Output System) находится в ROM и управляет всеми прерываниями в системе. В предыдущих главах уже использовались некоторые прерывания для вывода на экран дисковых операций ввода-вывода и печати. В этой главе описаны различные BIOS- и DOS-прерывания, резидентные программы и команды IN и OUT. ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЙ ------------------------------------------------------------ В компьютерах IBM PC ROM находится по адресу FFFF0H. При включении компьютера процессор устанавливает состояние сброса, выполняет контроль четности, устанавливает в регистре CS значение FFFFH, а в регистре IP - нуль. Первая выполняемая команда поэтому находится по адресу FFFF:0 или FFFF0, что является точкой входа в BIOS. BIOS проверяет различные порты компьютера для определения и инициализации подключенных устрой ств. Затем BIOS создает в начале памяти (по адресу 0) таблицу прерываний, которая содержит адреса обработчиков прерываний, и выполняет две операции INT 11H (запрос списка присоединенного оборудования) и INT 12H (запрос размера физической памяти). Следующим шагом BIOS определяет имеется ли на диске или дискете операционная система DOS. Если обнаружена системная дискета, то BIOS выполняет прерывание INT 19H для доступа к первому сектору диска, содержащему блок начальной загрузки. Этот блок представляет собой программу, которая считывает системные файлы IBMBIO.COM, IBMDOS.COM и COMMAND.COM с диска в память. После этого память имеет следующее распределение: Таблица векторов прерываний Данные BIOS IBMBIO.COM и IBMDOS.COM Резидентная часть COMMAND.COM Ассемблер для IBM PC. Глава 23 56 Доступная память для прикладных программ Транзитная часть COMMAND.COM Конец RAM (ОЗУ) ROM BASIC ROM BIOS Внешние устройства передают сигнал внимания через контакт INTR в процессор. Процессор реагирует на этот запрос, если флаг прерывания IF установлен в 1 (прерывание разрешено), и (в большинстве случаев) игнорирует запрос, если флаг IF установлен в 0 (прерывание запрещено). Операнд в команде прерывания, например, INT 12H, содержит тип прерывания, который идентифицирует запрос. Для каждого типа система содержит адрес в таблице векторов прерываний, начинающейся по адресу 0000. Так как в таблице имеется 256 четырехбайтовых элементов, то она занимает первые 1024 байта памяти от шест.0 до шест.3FF. Каждый элемент таблицы указывает на подпрограмму обработки указанного типа прерывания и содержит адрес кодового сегмента и смещение, которые при прерывании устанавливаются в регистры CS и IP соответственно. Список элементов таблицы векторов прерываний приведен на рис. 23.1. Прерывание заносит в стек содержимое флагового регистра, регистра CS и регистра IP. Например, для прерывания 12H (которое возвращает в регистре AX размер памяти) адрес элемента таблицы равен шест.0048 (шест.12 х 4 = шест.48). Операция выделяет четырехбайтовый элемент по адресу шест. 0048 и заносит два байта в регистр IP и два байта в регистр SS. Адрес, который получается в регистровой паре CS:IP, представляет собой адрес начала подпрограммы в области BIOS, которая получает управление. Возврат из этой подпрограммы осуществляется командой IRET (Interrupt Return), которая восстанавливает флаги и регистры CS и IP из стека и передает управление на команду, следующую за выполненной командой прерывания. ПРЕРЫВАНИЯ BIOS ------------------------------------------------------------ В данном разделе представлены основные прерывания BIOS. INT 05H (Печать экрана). Приводит к передаче содержимого экрана на печатающее устройство. INT 05H применяется для внутренних целей, т.е. из программ, клавиши Ctrl/PrtSc активизируют печать с клавиатуры. Данная операция маскирует прерывания и сохраняет позицию курсора. ------------------------------------------------------------ Адрес Функция прерыаний (шест) (шест) 0-3 0 Деление на нуль 4-7 1 Пошаговый режим (трассировка DEBUG) Ассемблер для IBM PC. Глава 23 57 8-B 2 Немаскированное прерывание (NMI) C-F 3 Точка останова (используется в DEBUG) 10-13 4 Переполнение регистра 14-17 5 Печать экрана 18-1F 6,7 Зарезервировано 20-23 8 Сигнал от траймера 24-27 9 Сигнал от клавиатуры 28-37 A,B,C,D Используются в компьютерах AT 38-3B E Сигнал от дискетного дисковода 3C-3F F Используется для принтера 40-43 10 Управление дисплеем (см.гл. 8, 9, 10) 44-47 11 Запрос оборудования (см.гл.9) 48-4B 12 Запрос размера памяти (см.гл.2) 4C-4F 13 Дисковые операции ввода-вывода (см.гл.18) 50-53 14 Управление коммуникационным адаптером 54-57 15 Кассетные операции и спец. функции AT 58-5B 16 Ввод с клавиатуры (см.гл.9) 5C-5F 17 Вывод на принтер (см.гл.19) 60-63 18 Обращение к BASIC, встроенному в ROM 64-67 19 Перезапуск системы 68-6B 1A Запрос и установка времени и даты 6C-6F 1B Прерывание от клавиатуры 70-73 1C Прерывание от таймера 74-77 1D Адрес таблицы параметров дисплея 78-7B 1E Адрес таблицы параметров дисковода 7C-7F 1F Адрес таблицы графических символов 80-83 20 Нормальное завершение программы (DOS) 84-87 21 Обращение к функциям DOS 88-8B 22 Адрес обработки завершения задачи (DOS) 8C-8F 23 Адрес реакции по Ctrl/Break (DOS) 90-93 24 Адрес реакции на фатальную ошибку (DOS) 94-97 25 Абсолютное чтение с диска (DOS) 98-9B 26 Абсолютная запись на диск (DOS) 97-9F 27 Создание резидентной программы (DOS) AO-FF 28-3F Другие функции DOS 100-1FF 40-7F Зарезервировано 200-217 80-85 Зарезервировано для BASIC 218-3C3 86-F0 Используются BASIC-интерпретатором 3C4-3FF F1-FF Зарезервировано Примечание: Прерывания 00-1F относятся к BIOS, прерывания 20-FF относятся к DOS и BASIC. ------------------------------------------------------------ Рис.23.1. Таблица адресов прерываний. ПРЕРЫВАНИЯ BIOS ------------------------------------------------------------ В данном разделе приведены основные прерывания BIOS. Ассемблер для IBM PC. Глава 23 58 INT 05H Печать экрана. Выполняет вывод содержимого экрана на печатающее устройство. Команда INT 05H выполняет данную операцию из программы, а нажатие клавишей Ctrl/PrtSc - с клавиатуры. Операция запрещает прерывания и сохраняет позицию курсора. INT 10H Управление дисплеем. Обеспечивает экранные и кла виатурные операции, детельно описанные в главе 9. INT 11H Запрос списка присоединенного оборудования. Опре деляет наличие различных устройств в системе, результирующее значение возвращает в регистре AX. При включении компьютера система выполняет эту операцию и сохраняет содержимое AX в памяти по адресу шест.410. Значения битов в регистре AX: Бит Устройство 15,14 Число подключенных принтеров 13 Последовательный принтер 12 Игровой адаптер 11-9 Число последовательных адаптеров стыка RS232 7,6 Число дискетных дисководов, при бите 0=1: 00=1, 01=2, 10=3 и 11=4 5,4 Начальный видео режим: 00 = неиспользуется 01 = 40х25 плюс цвет 10 = 80х25 плюс цвет 11 = 80х25 черно-белый режим 1 Значение 1 говорит о наличии сопроцессора 0 Значение 1 говорит о наличии одного или более дисковых устройств и загрузка операционной системы должна осуществляться с диска INT 12H Запрос размера физической памяти. Возвращает в регистре AX размер памяти в килобайтах, например, шест.200 соответствует памяти в 512 К. Данная операция полезна для выравнивания размера программы в соответствии с доступной памятью. INT 13H Дисковые операции ввода-вывода. Обеспечивает опе рации ввода-вывода для дискет и винчестера, рассмотренные в главе 16. INT 14H Управление коммуникационным адаптером. Обеспечи вает последовательный ввод-вывод через коммуникационный порт RS232. Регистр DX должен содержать номер (0 или 1) адаптера стыка RS232. Четыре типа операции, определяемые регистром AH, выполняют прием и передачу символов и возвращают в регистре AX байт состояния коммуникационного порта. INT 15H Кассетные операции ввода-вывода и специальные функции для компьютеров AT. Обеспечивает операции ввода- вывода для касетного магнитофона, а также расширенные операции для компьютеров AT. Ассемблер для IBM PC. Глава 23 59 INT 16H Ввод с клавиатуры. Обеспечивает три типа команд ввода с клавиатуры, подробно описанные в главе 9. INT 17H Вывод на принтер. Обеспечивает вывод данных на пе чатающее устройство. Подробно рассмотрено в главе 19. INT 18H Обращение к BASIC, встроенному в ROM. Вызывает BASIC-интерпретатор, находящийся в постоянной памяти ROM. INT 19H Перезапуск системы. Данная операция при доступном диске считывает сектор 1 с дорожки 0 в область начальной загрузки в памяти (сегмент 0, смещение 7C00) и передает управление по этому адресу. Если дисковод не доступен, то операция передает управление через INT 18H в ROM BASIC. Данная операция не очищает экран и не инициализирует данные в ROM BASIC, поэтому ее можно использовать из программы. INT 1AH Запрос и установка текущего времени и даты. Считы вает и записывает показание часов в соответствии со значением в регистре AH. Для определения продолжительности выполнения программы можно перед началом выполнения установить часы в 0, а после считать текущее время. Отсчет времени идет примерно 18,2 раза в секунду. Значение в регистре AH соответствует следующим операциям: AH=00 Запрос времени. В регистре CX устанавливается стар шая часть значения, а в регистре DX - младшая. Если после последнего запроса прошло 24 часа, то в регистре AL будет не нулевое значение. AH=01 Установка времени. Время устанавливается по регист рам CX (старшая часть значения) и DX (младшая часть значе ния). Коды 02 и 06 управляют временем и датой для AT. INT 1FH Адрес таблицы графических символов. В графическом режиме имеется доступ к символам с кодами 128-255 в 1К таблице, содержащей по восемь байт на каждый символ. Прямой доступ в графическом режиме обеспечивается только к первым 128 ASCII-символам (от 0 до 127). ПРЕРЫВАНИЯ DOS ------------------------------------------------------------ Во время своей работы BIOS использует два модуля DOS: IBMBIO.COM и IBMDOS.COM. Так как модули DOS обеспечивают большое количество разных дополнительных проверок, то операция DOS обычно проще в использовании и менее машинно зависимы, чем их BIOS аналоги. Модуль IBMBIO.COM обеспечивает интерфейс с BIOS низкого уровня. Эта программа выполняет управление вводом-выводом при чтении данных из внешних устройств в память и записи из памяти на внешние устройства. Ассемблер для IBM PC. Глава 23 60 Модуль IBMDOS.COM содержит средства управления файлами и ряд сервисных функций, таких как блокирование и деблокиро вание записей. Когда пользовательская программа выдает запрос INT 21H, то в программу IBMDOS через регистры передается определенная информация. Затем программа IBMDOS транслирует эту информацию в один или несколько вызовов IBMBIO, которая в свою очередь вызывает BIOS. Указанные связи приведены на следующей схеме: Пользовательский Высший Низший ROM Внешний уровень уровень уровень уровень +-----------+ +----------+ +----------+ |Программный| | DOS | | DOS | +----+ +----------+ |запрос в/в ||IBMDOS.COM||IBMBIO.COM||BIOS||Устройство| +-----------+ +----------+ +----------+ +----+ +----------+ Как показано выше, прерывания от шест.20 до шест.62 зарезервированы для операций DOS. Ниже приведены наиболее основные из них: INT 20H Завершение программы. Запрос завершает выполнение программы и передает управление в DOS. Данный запрос обычно находится в основной процедуре. INT 21H Запрос функций DOS. Основная операция DOS, вызыва ющая определенную функцию в соответствии с кодом в регистре AH. Назначение функций DOS описано в следующем разделе. INT 22H Адрес подпрограммы обработки завершения задачи. (см.INT 24H). INT 23H Адрес подпрограммы реакции на Ctrl/Break. (см.INT 24H). INT 24H Адрес подпрограммы реакции на фатальную ошибку. В этом элементе и в двух предыдущих содержатся адреса, которые инициализируются системой в префиксе программного сегмента и, которые можно изменить для своих целей. Подробности приве дены в техническом описании DOS. INT 25H Абсолютное чтение с диска. См.гл.17. INT 26H Абсолютная запись на диск. См.гл.17. INT 27H Завершение программы, оставляющее ее резедентной. Позволяет сохранить COM-программу в памяти. Подробно данная операция рассмотренна в последующем разделе "Резиденные прогарммы". ФУНКЦИИ ПРЕРЫВАНИЯ DOS INT 21H ------------------------------------------------------------ Ассемблер для IBM PC. Глава 23 61 Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH: 00 Завершение программы (аналогично INT 20H). 01 Ввод символа с клавиатуры с эхом на экран. 02 Вывод символа на экран. 03 Ввод символа из асинх. коммуникационного канала. 04 Вывод символа на асинх. коммуникационный канал. Ассемблер для IBM PC. Приложения 1 ПРИЛОЖЕНИЕ 1 ----------------------------------------------------------- Коды ASCII-символов Ниже представлены первые 128 символов ASCII-кода. В руко водстве по языку BASIC приведены остальные 128 символов. На помним, что шест.20 представляет стандартный символ пробела. ПРИЛОЖЕНИЕ 2 ------------------------------------------------------------ Шестнадцатерично-десятичные преобразования В данном приложении представлены приемы преобразования между шестнадцатеричным и десятичным форматами. В первом разделе показан пример преобразования шест. A7B8 в десятичное 42936, а во втором - 42936 обратно в шест. A7B8. Преобразование шестнадцатеричного формата в десятичный --------------------------------------------------------- Для перевода шест. A7B8 в десятичное число необходимо последовательно, начиная с самой левой шест. цифры (A), умножать на 16 и складывать со следующей цифрой. Так как операции выполняются в десятичном формате, то шест. числа от A до F необходимо преобразовать в десятичные от 10 до 15. Первая цифра: A (10) 10 Умножить на 16 *16 160 Прибавить следующую цифру, 7 7 167 Умножить на 16 *16 2672 Прибавить следующую цифру, B (11) 11 2683 Умножить на 16 *16 42928 Прибавить следующую цифру, 8 8 Десятичное значение 42936 Можно использовать также таблицу преобразования. Для шест. числа A7B8 представим правую цифру (8) как позицию 1, следующую влево цифру (B) как позицию 2, следующую цифру (7) как позицию 3 и самую левую цифру (A) как позицию 4. Из таблицы B-1 выберем значения для каждой шест. цифры: Для позиции 1 (8), столбец 1 8 Для позиции 1 (8), столбец 1 176 Для позиции 1 (8), столбец 1 1792 Для позиции 1 (8), столбец 1 40960 Ассемблер для IBM PC. Приложения 2 Десятичное значение 42936 Преобразование десятичного формата в шестнадцатеричный --------------------------------------------------------- Для преобразования десятичного числа 42936 в шестнадцате ричный формат необходимо сначала исходное число 42936 разделить на 16; число, получившееся в остатке, (6) является младшей шестнадцатеричной цифрой. Затем полученное частное необходимо снова разделить на 16 и полученный остаток (11 или B) дает следующую влево шестнадцатеричную цифру. Продол жая таким образом деления до тех пор, пока в частном не получится 0, получим из остатков все необходимые шестнадцате ричные цифры. Частное Остаток Шест. 42936 / 16 2683 8 8 (младшая цифра) 2683 / 16 167 11 B 167 / 16 10 7 7 10 / 16 0 10 A (старшая цифра) Для преобразования чисел из десятичного формата в шестнад цатеричный можно также воспользоваться таблицей B-1. Для десятичного числа 42936 необходимо найти в таблице число равное или ближайшее меньшее исходному, и записать соот ветствующую шестнадцатеричную цифру и ее позицию. Затем следует вычесть найденное десятичное число из 42936 и с полу ченной разностью проделать проделать ту же операцию: Дес. Шест. Исходное десятичное число 42936 Вычесть ближайшее меньшее 40960 A000 Разность 1976 Вычесть ближайшее меньшее 1792 700 Разность 184 Вычесть ближайшее меньшее 176 B0 Разность 8 8 Результирующее шест. число 7 A7B8 ПРИЛОЖЕНИЕ 3 ------------------------------------------------------------ Зарезервированные слова Большинство из следующих зарезервированных слов при ис пользовании их для определении элементов данных могут привес ти к ошибкам ассемблирования (в ряде случаев - к весьма грубым): Имена регистров AH BH CH DH CS SS BP AL BL CL DL DS SI SP Ассемблер для IBM PC. Приложения 3 AX BX CX DX ES DI Мнемокоды AAA DIV JLE JS OR SBB AAD ESC JMP JZ OUT SCAS AAM HLT JNA LAHF POP SHL AAS IDIV JNAE LDS POPF SHR ADC IMUL JNB LEA PUSH STC ADD IN JNBE LES PUSHF STD AND INC JNE LOCK RCL STI CALL INT JNG LODS RCR STOS CBW INTO JNGE LOOP REP SUB CLC IRET JNL LOOPE REPE TEST CLD JA JNLE LOOPNE REPNE WAIT CLI JAE JNO LOOPNZ REPNZ XCHG CMC JB JNP LOOPZ REPZ XLAT CMP JBE JNS MOV RET XOR CMPS JCXZ JNZ MOVS ROL CWD JE JO MUL ROR DAA JG JP NEG SAHF DAS JGE JPE NOP SAL DEC JL JPO NOT SAR Директивы ассемблера ASSUME END EXTRN IFNB LOCAL PURGE COMMENT ENDIF GROUP IFNDEF MACRO RECORD DB ENDM IF IF1 NAME REPT DD ENDP IFB IF2 ORG SEGMENT DQ ENDS IFDEF INCLUDE OUT STRUC DT EQU IFDIF IRP PAGE SUBTTL DW EVEN IFE IRPC PROC TITLE ELSE EXITM IFIDN LABEL PUBLIC Прочие элементы языка BYTE FAR LENGTH MOD PRT THIS COMMENT GE LINE NE SEG TYPE CON GT LT NEAR SHORT WIDTH DUP HIGH LOW NOTHING SIZE WORD EQ LE MASK OFFSET STACK Ассемблер для IBM PC. Программы. 9 Двоич. Дес. Шест. Двоич. Дес. Шест. 0000 0 0 1000 8 8 0001 1 1 1001 9 9 0010 2 2 1010 10 A 0011 3 3 1011 11 B 0100 4 4 1100 12 C 0101 5 5 1101 13 D 0110 6 6 1110 14 E 0111 7 7 1111 15 F +======================+ I D O S I I I +---------+ г - - - - - - - - - - -╤ + SS | Адрес +------->I Сегмент стека I | + - - - - + I I | DS | Адрес +----+ г - - - - - - - - - - -╤ | Переме- + - - - - + +-->I Сегмент данных I | щаемые CS | Адрес +---+ I I | в +---------+ | г - - - - - - - - - - -╤ | памяти +--->I Сегмент кода I | Сегментные I I | регистры г - - - - - - - - - - -╤ + I I I I I I I I +======================+ Память Ассемблер для IBM PC. Программы. 10 | ОУ: Операционное | ШИ: Шинный интерфейс устройство | | +--------+--------+ | | AH | AL | | +--------+--------+ | | BH | BL | | +--------+--------+ | | CH | CL | | +--------+--------+ | Управление | DH | DL | | программами +--------+--------+ | +-----------------+ | SP | | | CS | +-----------------+ | +-----------------+ | BP | | | DS | +-----------------+ | +-----------------+ | SI | | | SS | +-----------------+ | +-----------------+ | DI | | | ES | +-----------------+ | +-------+---------+ Л | | | | | +-------+ V | V | Управ-| Шина ======================ь==============>| ление |<==> 8088 Л | Л | шиной | | | | +-------+ V | | +-----------------+ | +---+---+ | АЛУ: Арифметико-| | +---+ 1 | Очередь | логическое | | | +-------+ команд | устройство | | | | 2 | (Четыре байта) +->+ - - - - - - - - + | | +-------+ | | УУ: Устройство | | | | 3 | | | управления | | | +-------+ | + - - - - - - - - + | | | 4 | | | Флаговый регистр| | | +-------+ | +-----------------+ | | | | | | +-----------------+ | | +--+ Командный |<--+--+ | указатель | | +-----------------+ | | Ассемблер для IBM PC. Программы. 11 Начальный адрес Память Дес. Шест. +-----------------------------+ 0K 00000 | RAM 256K основная оператив- | | ная память | +-----------------------------+ 256K 40000 | RAM 384K расширение опера- | | тивной памяти в канале I/O | +-----------------------------+ 640K A0000 | RAM 128K графический/экран- | | ный видео буфер | +-----------------------------+ 768K C0000 | ROM 192K дополнительная | | постоянная память | +-----------------------------+ 960K F0000 | ROM 64K основная системная | | постоянная память | +-----------------------------+ Ассемблер для IBM PC. Программы. 12 D>DEBUG -E CS:100 B8 23 01 05 25 00 -E CS:106 8B D8 03 D8 8B CB -E CS:10C 2B C8 2B C0 90 CB -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC 13C6:0100 B8230 MOV AX,0123 -T AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0103 NV UP EI PL NZ NA PO NC 13C6:0103 052500 ADD AX,0025 -T AX=0148 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0106 NV UP EI PL NZ NA PE NC 13C6:0106 8BD8 MOV BX,