Страница:
непредвиденные программные ошибки (например, переполнение
при делении).
Система 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,AX
-T
AX=0148 BX=0148 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0108 NV UP EI PL NZ NA PO NC
13C6:0108 03D8 ADD BX,AX
-T
AX=0148 BX=0290 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010A NV UP EI PL NZ AC PO NC
13C6:010A 8BCB MOV CX,BX
-T
AX=0148 BX=0290 CX=0290 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010C NV UP EI PL NZ AC PO NC
13C6:010C 2BC8 SUB CX,AX
-T
AX=0148 BX=0290 CX=0148 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 AC PO NC
13C6:010E 2BC0 SUB AX,AX
-T
AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0110 NV UP EI PL ZR NA PO NC
13C6:0110 90 NOP
-T
AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0111 NV UP EI PL ZR NA PO NC
13C6:0111 CB RETF
-
Ассемблер для IBM PC. Программы. 13
-D CS:100
13C6:0100 B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0 .#..%.......+.+.
13C6:0110 90 CB 8D 46 14 50 51 52-FF 76 28 E8 74 00 8B E5 ...F.PQR.v(.t...
13C6:0120 B8 01 00 50 FF 76 32 FF-76 30 FF 76 2E FF 76 28 ...P.v2.v0.v..v(
13C6:0130 E8 88 15 8B E5 BF 36 18-12 FF 36 16 12 8B 76 28 ......6...6...v(
13C6:0140 FF 74 3A 89 46 06 E8 22-CE 8B E5 30 E4 3D 0A 00 .t:.F.."...0.=..
13C6:0150 75 32 A1 16 12 2D 01 00-8B 1E 18 12 83 DB 00 53 u2...-.........S
13C6:0160 50 8B 76 28 FF 74 3A A3-16 12 89 1E 18 12 E8 FA P.v(.t:.........
13C6:0170 CD 8B E5 30 E4 3D 0D 00-74 0A 83 06 16 12 01 83 ...0.=..t.......
-Q
Ассемблер для IBM PC. Программы. 14
D>DEBUG
-E DS:23 01 25 00 00
-E DS:2A 2A 2A
-E CS:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
-D DS:0
13C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...
13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........
13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.
13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............
13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-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 A10000 MOV AX,[0000] DS:0000=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 03060200 ADD AX,[0002] DS:0002=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=0107 NV UP EI PL NZ NA PE NC
13C6:0107 A30400 MOV [0004],AX DS:0004=9A00
-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=0108 NV UP EI PL NZ NA PO NC
13C6:010A CB RETF
-D DS:0
13C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...
13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........
13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.
13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............
13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-Q
CODESG SEGMENT PARA 'CODE'
BEGIN PROC FAR
1. ASSUME CS:CODESG,DS:DATASG,SS:STACKG
2. PUSH DS ;Записать DS в стек
3. SUB AX,AX ;Установить ноль в AX
PUSH AX ;Записать ноль в стек
Ассемблер для IBM PC. Программы. 15
4. MOV AX,DATASG ;Занести адрес
MOV DS,AX ; DATASG в DS
.
.
.
5. RET ;Возврат в DOS
BEGIN ENDP
CODESG ENDS
END BEGIN
page 60,132
TITLE EXASM1 (EXE) Пример регистровых операций
;------------------------------------------------
STACKSG SEGMENT PARA SACK 'Stack'
DB 12 DUP('STACKSEG')
STACKSG ENDS
;------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING
PUSH DS ;Записать DS в стек
SUB AX,AX ;Записать ноль
PUSH AX ; в стек
MOV AX,0123H ;Записать шест.0123 в AX
ADD AX,0025H ;Прибавить шест.25 к AX
MOV BX,AX ;Переслать AX в BX
ADD BX,AX ;Прибавить BX к AX
MOV CX,BX ;Переслать BX в CX
SUB CX,AX ;Вычесть AX из CX
SUB AX,AX ;Очистить AX
NOP
RET ;Возврат в DOS
BEGIN ENDP ;Конец процедуры
CODESG ENDS ;Конец сегмента
END BEGIN ;Конец программы
Ассемблер для IBM PC. Программы. 16
1 page 60,132
2 TITLE EXASM1 (EXE) Пример регистровых операций
3 ;------------------------------------------------
4 0000 STACKSG SEGMENT PARA SACK 'Stack'
5 0000 0C [ DB 12 DUP('STACKSEG')
6 53 54 41 43
7 4B 53 45 47
8 ]
9
10 0060 STACKSG ENDS
11 ;-------------------------------------------------
12 0000 CODESG SEGMENT PARA 'Code'
13 0000 BEGIN PROC FAR
14 ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING
15 0000 1E PUSH DS ;Записать DS в стек
16 0001 2B C0 SUB AX,AX ;Записать ноль
17 0003 50 PUSH AX ; в стек
18
19 0004 B8 0123 MOV AX,0123H ;Записать шест.0123 в AX
20 0007 05 0025 ADD AX,0025H ;Прибавить шест.25 к AX
21 000A 8B D8 MOV BX,AX ;Переслать AX в BX
22 000C 03 D8 ADD BX,AX ;Прибавить BX к AX
23 000E 8B CB MOV CX,BX ;Переслать BX в CX
24 0010 2B C8 SUB CX,AX ;Вычесть AX из CX
25 0012 2B C0 SUB AX,AX ;Очистить AX
26 0014 90 NOP
27 0015 CB RET ;Возврат в DOS
28 0016 BEGIN ENDP ;Конец процедуры
29
30 0016 CODESG ENDS ;Конец сегмента
31 END BEGIN ;Конец программы
--------------------------------------------------------------------------
Segments and Groups:
N a m e Size Align Combine Class
CODESG . . . . . . . . . . . . 0016 PARA NONE 'CODE'
STACKSG. . . . . . . . . . . . 0060 PARA STACK 'STACK'
Symbols:
N a m e Type Value Attr
BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0016
--------------------------------------------------------------------------
Ассемблер для IBM PC. Программы. 17
1 page 60,132
2 TITLE EXASM2 (EXE) Операции пересылки и сложения
при делении).
Система 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,AX
-T
AX=0148 BX=0148 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0108 NV UP EI PL NZ NA PO NC
13C6:0108 03D8 ADD BX,AX
-T
AX=0148 BX=0290 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010A NV UP EI PL NZ AC PO NC
13C6:010A 8BCB MOV CX,BX
-T
AX=0148 BX=0290 CX=0290 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010C NV UP EI PL NZ AC PO NC
13C6:010C 2BC8 SUB CX,AX
-T
AX=0148 BX=0290 CX=0148 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 AC PO NC
13C6:010E 2BC0 SUB AX,AX
-T
AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0110 NV UP EI PL ZR NA PO NC
13C6:0110 90 NOP
-T
AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0111 NV UP EI PL ZR NA PO NC
13C6:0111 CB RETF
-
Ассемблер для IBM PC. Программы. 13
-D CS:100
13C6:0100 B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0 .#..%.......+.+.
13C6:0110 90 CB 8D 46 14 50 51 52-FF 76 28 E8 74 00 8B E5 ...F.PQR.v(.t...
13C6:0120 B8 01 00 50 FF 76 32 FF-76 30 FF 76 2E FF 76 28 ...P.v2.v0.v..v(
13C6:0130 E8 88 15 8B E5 BF 36 18-12 FF 36 16 12 8B 76 28 ......6...6...v(
13C6:0140 FF 74 3A 89 46 06 E8 22-CE 8B E5 30 E4 3D 0A 00 .t:.F.."...0.=..
13C6:0150 75 32 A1 16 12 2D 01 00-8B 1E 18 12 83 DB 00 53 u2...-.........S
13C6:0160 50 8B 76 28 FF 74 3A A3-16 12 89 1E 18 12 E8 FA P.v(.t:.........
13C6:0170 CD 8B E5 30 E4 3D 0D 00-74 0A 83 06 16 12 01 83 ...0.=..t.......
-Q
Ассемблер для IBM PC. Программы. 14
D>DEBUG
-E DS:23 01 25 00 00
-E DS:2A 2A 2A
-E CS:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
-D DS:0
13C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...
13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........
13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.
13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............
13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-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 A10000 MOV AX,[0000] DS:0000=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 03060200 ADD AX,[0002] DS:0002=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=0107 NV UP EI PL NZ NA PE NC
13C6:0107 A30400 MOV [0004],AX DS:0004=9A00
-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=0108 NV UP EI PL NZ NA PO NC
13C6:010A CB RETF
-D DS:0
13C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...
13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........
13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.
13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............
13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-Q
CODESG SEGMENT PARA 'CODE'
BEGIN PROC FAR
1. ASSUME CS:CODESG,DS:DATASG,SS:STACKG
2. PUSH DS ;Записать DS в стек
3. SUB AX,AX ;Установить ноль в AX
PUSH AX ;Записать ноль в стек
Ассемблер для IBM PC. Программы. 15
4. MOV AX,DATASG ;Занести адрес
MOV DS,AX ; DATASG в DS
.
.
.
5. RET ;Возврат в DOS
BEGIN ENDP
CODESG ENDS
END BEGIN
page 60,132
TITLE EXASM1 (EXE) Пример регистровых операций
;------------------------------------------------
STACKSG SEGMENT PARA SACK 'Stack'
DB 12 DUP('STACKSEG')
STACKSG ENDS
;------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING
PUSH DS ;Записать DS в стек
SUB AX,AX ;Записать ноль
PUSH AX ; в стек
MOV AX,0123H ;Записать шест.0123 в AX
ADD AX,0025H ;Прибавить шест.25 к AX
MOV BX,AX ;Переслать AX в BX
ADD BX,AX ;Прибавить BX к AX
MOV CX,BX ;Переслать BX в CX
SUB CX,AX ;Вычесть AX из CX
SUB AX,AX ;Очистить AX
NOP
RET ;Возврат в DOS
BEGIN ENDP ;Конец процедуры
CODESG ENDS ;Конец сегмента
END BEGIN ;Конец программы
Ассемблер для IBM PC. Программы. 16
1 page 60,132
2 TITLE EXASM1 (EXE) Пример регистровых операций
3 ;------------------------------------------------
4 0000 STACKSG SEGMENT PARA SACK 'Stack'
5 0000 0C [ DB 12 DUP('STACKSEG')
6 53 54 41 43
7 4B 53 45 47
8 ]
9
10 0060 STACKSG ENDS
11 ;-------------------------------------------------
12 0000 CODESG SEGMENT PARA 'Code'
13 0000 BEGIN PROC FAR
14 ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING
15 0000 1E PUSH DS ;Записать DS в стек
16 0001 2B C0 SUB AX,AX ;Записать ноль
17 0003 50 PUSH AX ; в стек
18
19 0004 B8 0123 MOV AX,0123H ;Записать шест.0123 в AX
20 0007 05 0025 ADD AX,0025H ;Прибавить шест.25 к AX
21 000A 8B D8 MOV BX,AX ;Переслать AX в BX
22 000C 03 D8 ADD BX,AX ;Прибавить BX к AX
23 000E 8B CB MOV CX,BX ;Переслать BX в CX
24 0010 2B C8 SUB CX,AX ;Вычесть AX из CX
25 0012 2B C0 SUB AX,AX ;Очистить AX
26 0014 90 NOP
27 0015 CB RET ;Возврат в DOS
28 0016 BEGIN ENDP ;Конец процедуры
29
30 0016 CODESG ENDS ;Конец сегмента
31 END BEGIN ;Конец программы
--------------------------------------------------------------------------
Segments and Groups:
N a m e Size Align Combine Class
CODESG . . . . . . . . . . . . 0016 PARA NONE 'CODE'
STACKSG. . . . . . . . . . . . 0060 PARA STACK 'STACK'
Symbols:
N a m e Type Value Attr
BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0016
--------------------------------------------------------------------------
Ассемблер для IBM PC. Программы. 17
1 page 60,132
2 TITLE EXASM2 (EXE) Операции пересылки и сложения