Текст
                    THE INTEL MICROPROCESSORS
8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium II, Pentium III, and Pentium 4
Architecture, Programming, and Interfacing
Sixth Edition
BARRY B. BREY
DeVry Institute of Technology
Prentice
Hall
Upper Saddle River, New Jersey Columbus, Ohio
Барри Брэй
МИКРОПРОЦЕССОРЫ INTEL
8086/8088. 80186/80188. 80286 80386, 80486, PENTIUM, PENTIUM PRO PROCESSOR, PENTIUM II, PENTIUM III, PENTIUM 4
АРХИТЕКТУРА, ПРОГРАММИРОВАНИЕ И ИНТЕРФЕЙСЫ
ШЕСТОЕ
ИЗДАНИЕ
Санкт-Петербург «БХВ-Петербург» 2005
Брэй Б.
Б87 Микропроцессоры Intel: 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro Processor, Pentium II, Pentium III, Pentium 4. Архитектура, программирование и интерфейсы. Шестое издание: Пер. с англ. — СПб.: БХВ-Петербург, 2005. — 1328 с.: ил.
ISBN 5-94157-422-3
Приведено подробное описание микропроцессоров семейства i80x86, вариантов организации памяти, систем ввода-вывода, устройств аналого-цифрового и цифроаналогового преобразования, последовательного канала связи на базе микросхемы 16550, периферийных интерфейсных адаптеров, таймеров, контроллеров дисплея и клавиатуры, арифметического сопроцессора, интерфейсов и системных шин персонального компьютера на примере стандартов AGP, ISA, PCI, VESA и USB.
Для студентов и преподавателей вузов, специалистов в области информационных технологий
УДК 681.3.06
ББК 32.973.26-018
Группа подготовки издания:
Главный редактор
Зам. главного редактора
Зав. редакцией Перевод с английского
Редактор
Компьютерная верстка
Корректор
Дизайн обложки
Зав. производством
Екатерина Кондукова Татьяна Лапина Григорий Добин Андрея Жукова, Виталия Козуба Юрий Рожко Ольги Сергиенко Зинаида Дмитриева Игоря Цырульникова Николай Тверских

Authorized translation from the English language edition, entitled The Intel microprocessors : 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro processor, Pentium II, Pentium 111, and Pentium 4 : architecture, programming, and interfacing, 6th Edition, ISBN 0-13-060714-2, by Brey, Barry B., published by Pearson Education, Inc., publishing as Prentice Hall, Copyright © 2003 by Pcaison Education, Inc. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Peaison Education, Inc. RUSSIAN language edition published by BHV—St. Peteisbutg, Copyright © 2005.
Авторизованный перевод английской редакции, выпущенной Prentice Hall, Pearson Education, Inc., © 2003. Bee права защищены. Никакая часть настоящей книги не может быть воспроизведена или передана в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на то нет разрешения Peaison Education, Inc. Перевод на русский язык "БХВ-Петербург". © 2005.
Лицензия ИД No 02429 от 24.07.00. Подписано в печать 29.09.05.
Формат 70хЮ01/1в. Печать офсетная. Усл. печ. л. 107,1.
Тираж 3000 экз. Заказ No 384
"БХВ-Петербург", 194354, Санкт-Петербург, ул. Есенина, 5Б.
Санитарно-эпидемиологическое заключение на продукцию No 77.99.02.953.Д.006421.11.04 от 11.11.2004 г. выдано Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека.
Отпечатано с готовых диапозитивов в ОАО "Техническая книга" 190005, Санкт-Петербург, Измайловский пр., 29
ISBN 0-13-060714-2 (англ.)
ISBN 5-94157-422-3 (рус.)
С 2003, Pearson Education, Inc.
© Перевод на русский язык “БХВ-Петербург', 2005
ОГЛАВЛЕНИЕ
Введение..............................................................21
Содержание книги и ее особенности.....................................27
Порядок изложения.....................................................2$
Структура изложения...................................................2$
Благодарности.......................................................  ЗС
Адрес для связи.......................................................ЗС
Глава 1. Введение в микропроцессоры и компьютеры......................31
Введение..............................................................31
Темы главы............................................................31
1.1. Исторический обзор...............................................32
Эпоха механики.....................................................32
Эпоха электричества................................................33
Развитие инструментов программирования.............................34
Эпоха микропроцессоров.............................................36
Особенности микропроцессора 18080..............................37
Микропроцессор i8O85...........................................37
Современные микропроцессоры........................................38
Микропроцессор i80286..........................................38
Микропроцессор i80386..........................................39
Микропроцессор i80486..........................................40
Микропроцессор Pentium.........................................42
Pentium Pro....................................................45
Pentium II и Pentium Xeon......................................45
Pentium III....................................................46
Pentium 4......................................................46
Будущее микропроцессоров.......................................46
1.2. Персональные вычислительные системы на базе микропроцессоров.....48
Память и система ввода-вывода......................................49
ТРА............................................................50
Системная область..............................................53
Пространство адресов системы ввода-вывода......................55
Операционная система DOS...........................................56
Микропроцессор.....................................................59
Шины...........................................................61
13. Системы счисления.................................................64
Цифры..............................................................64
Позиционные системы счисления......................................65
Преобразование в десятичный формат.................................66
6
Оглавление
Преобразование из десятичного формата...............................67
Преобразование целой части десятичного числа....................67
Преобразование дробной части десятичного числа..................68
Шестнадцатеричные числа.............................................69
Дополнительный код..................................................70
1.4. Форматы данных....................................................71
ASCII-данные........................................................72
Двоично-десятичные данные...........................................74
Байты...............................................................75
Слова...............................................................76
Двойные слова.......................................................78
Действительные числа................................................79
Итоги..................................................................81
Контрольные вопросы и задания..........................................84
Глава 2. Микропроцессор и его архитектура..............................90
Введение...............................................................90
Темы главы.............................................................90
2.1.	Внутренняя архитектура микропроцессора............................90
Программная модель микропроцессора..................................90
Регистры общего назначения......................................92
Специализированные регистры.....................................93
Сегментные регистры.............................................96
2.2.	Адресация памяти в реальном режиме................................97
Сегменты и смещения.................................................97
Сочетания сегментов и смещений, действующие по умолчанию............99
Возможность перемещения программы в памяти.........................101
2.3.	Введение в защищенный режим......................................103
Селекторы и дескрипторы............................................103
Программно-недоступные регистры....................................108
2.4.	Страничная организация памяти....................................109
Регистры страничной организации памяти.............................109
Каталог страниц и таблицы страниц...................................111
Итоги.................................................................113
Контрольные вопросы...................................................114
Глава 3. Методы адресации.............................................117
Введение..............................................................117
Темы главы............................................................117
3.1.	Методы адресации данных...........................................117
Регистровая адресация..............................................121
Непосредственная адресация.........................................122
Прямая адресация данных............................................125
Прямая адресация при обмене данными с аккумулятором............125
Общий случай прямой адресации..................................126
Регистровая косвенная адресация....................................128
Базово-индексная адресация.........................................131
Регистровая косвенная адресация со смещением.......................134
Оглавление 7
Базово-индексная адресация со	смещением...........................136
Базово-индексная адресация с масштабированием.....................139
3.2.	Структуры данных.................................................140
3.3.	Методы адресации инструкций......................................143
Прямая адресация..................................................143
Относительная адресация...........................................144
Косвенная адресация...............................................144
3.4.	Адресация стека..................................................146
Итоги.................................................................148
Контрольные вопросы...................................................153
Глава 4. Инструкции передачи данных...................................156
Введение..............................................................156
Темы главы............................................................156
4.1.	Инструкция МОУ...................................................157
Машинный язык.....................................................157
Код операции...................................................158
Поле MOD.......................................................159
Коды регистров.................................................160
Коды поля R/M при адресации памяти.............................161
Кодирование прямой адресации...................................162
32-битная адресация............................................163
Непосредственный операнд.......................................164
Коды сегментных регистров......................................165
4.2.	Инструкции для работы со стеком — PUSH и POP.....................166
Инструкция PUSH...................................................166
Инструкция POP....................................................168
Инициализация стека...............................................170
4.3.	Загрузка адреса................................................. 171
Инструкция LEA......................:.............................172
Инструкции LDS, LES, LFS, LGS и LSS...............................173
4.4.	Строковые команды................................................175
Флаг направления..................................................175
Регистры DI и SI..................................................176
Инструкция LODS...................................................176
Инструкция STOS...................................................177
Команда STOS с префиксом повторения REP........................178
Инструкция МОУЕ...................................................179
Инструкция INS....................................................180
Инст	рукция OUTS.................................................181
4.5.	Дополнительные инструкции передачи данных........................182
Инструкция XCHG...................................................182
Инструкции LAHFn SAHF.............................................183
Инструкция XLAT...................................................183
Инструкции IN и OUT...............................................184
Инструкции МОУЕХ и	М0У7Х..........................................186
Инструкция BSWAP..................................................187
Группа команд СМОУ................................................187
4.6.	Префиксы переназначения сегмента................................189
4.7.	Введение в язык ассемблера......................................189
Директивы.........................................................190
Дире	ктивы определения данных................................191
Директивы ASSUME, EQU и ORG...................................193
Директивы PROC и ENDP.........................................194
Организация памяти................................................196
Модели памяти.................................................196
Полное определение сегментов..................................197
Пример программы..................................................200
Итоги................................................................202
Контрольные вопросы..................................................205
Глава 5. Арифметические и логические инструкции......................208
Введение.............................................................208
Темы главы...........................................................208
5.1.	Сложение, вычитание и сравнение.................................208
Сложение..........................................................209
Сложение при регистровой адресации............................210
Сложение при непосредственной адресации.......................210
Сложение данных в памяти и в регистре.........................211
Сложение элементов массива....................................211
Инкремент.....................................................212
Сложение с переносом..........................................214
Команда обмена и сложения в процессорах 80486—Pentium 4.......215
Вычитание.........................................................215
Вычитание при регистровой адресации...........................216
Вычитание непосредственного значения..........................216
Декремент.....................................................217
Вычитание с заемом............................................218
Сравнение.......................................................  219
Инструкция сравнения и обмена в процессорах 80486—Pentium 4...220
5.2.	Умножение и деление.............................................220
Умножение.........................................................221
Восьмибитное умножение........................................221
Умножение 16-битных слов......................................222
Инструкция 16-битного умножения с непосредственным операндом..222
Умножение 32-битных данных....................................223
Деление...........................................................223
Восьмибитное деление..........................................224
Деление с 16-битным делителем.................................225
Деление с 32-битным делителем.................................226
Использование остатка.........................................226
5.3.	Арифметика BCD- и ASCII-данных..................................227
BCD-арифметика....................................................228
Инструкция DAA................................................228
Инструкция DAS................................................229
Оглавлен^______________________________________________________________*
ASCII-арифметика..................................................229
Инструкция ААА...............................................229
Инструкция AAD...............................................230
Инструкция ААМ...............................................230
Инструкция AAS...............................................232
5 4. Логические команды..............................................232
Инструкция AND...................................................232
Инструкция OR....................................................234
Инструкция XOR...................................................236
Инструкции проверки бит..........................................238
Инструкции NOT и NEG.............................................239
5.5. Сдвиги, в том числе и циклические...............................240
Сдвиги............................................................240
Сдвиги с удвоенной точностью (80386—Pentium 4)................242
Циклические сдвиги................................................243
Инструкции сканирования бит.......................................244
5.6. Сравнение строк.................................................245
Инструкция SCAS...................................................245
Инструкция CMPS...................................................246
Итоги................................................................247
Контрольные вопросы..................................................249
Глава 6. Инструкции передачи управления..............................253
Введение.............................................................253
Темы главы...........................................................253
6.1.	Инструкции перехода.............................................253
Безусловный переход...............................................254
Короткий переход..............................................255
Ближний переход...............................................256
Дальний переход...............................................257
Переход по адресу, заданному содержимым регистра..............258
Косвенный переход при индексной адресации.....................260
Команды условного перехода и условной установки...................261
Инструкции условной установки.................................264
Инструкция LOOP...................................................264
Условные циклы................................................266
6.2.	Логические блоки в языке ассемблера.............................266
Циклы DO-WHILE....................................................269
Циклы REPEAT-UNTIL................................................272
6.3.	Процедуры.......................................................274
Инструкция CALL...................................................275
Ближний вызов.................................................275
Дальний вызов.................................................276
Вызов по значению регистра....................................277
Вызов с косвенной адресацией данных...........................277
Инструкция RET....................................................279
6.4.	Введение в прерывания...........................................281
Векторы прерываний................................................281
10
Оглавление
Инструкции вызова прерываний.....................................282
Инструкция INT...............................................282
Инструкция IRET/IRETD........................................283
Инструкция INT 3.............................................284
Инструкция INTO..............................................284
Процедуры обработки прерываний...................................284
Управление внешними прерываниями.............................284
Прерывания в IBM PC..........................................285
6.5.	Управляющие инструкции.........................................286
Команды STC, CLC и СМС...........................................287
Инструкция WAIT..................................................287
Инструкция HLT...................................................287
Инструкция NOP...................................................287
Префикс LOCK.....................................................288
Инструкция ESC...................................................288
Инструкция BOUND.................................................288
Инструкции ENTER и LEAVE.........................................289
Итоги...............................................................290
Контрольные вопросы.................................................293
Глава 7. Возможности программирования на ассемблере.................296
Введение............................................................296
Темы главы..........................................................296
7.1. Модульное программирование.....................................296
Ассе	мблер и компоновщик........................................297
Директивы PUBLIC и EXTRN.........................................298
Библиотеки.......................................................300
Создание файла библиотеки....................................300
Макрокоманды.....................................................302
Локальные переменные в макрокомандах.........................303
Размещение макроопределений в отдельном файле................304
Макрокоманды и директивы условной трансляции.....................304
Директивы условной трансляции....................................304
Директивы условной трансляции в макроопределениях................306
Директива REPEAT в макрокомандах.............................307
Директива WHILE в макрокомандах..............................308
Директива FOR в макрокомандах................................309
Директивы IF, ELSE и ENDIFb макрокомандах....................310
Модульное программирование.......................................312
7.2.	Работа с клавиатурой и дисплеем................................312
Ввод с клавиатуры функциями DOS..................................312
Ввод символа с эхо-печатью...................................316
Ввод символа без эхо-печати..................................316
Ввод строки символов с эхо-печатью...........................317
Вывод на дисплей функциями DOS...................................318
Вывод одиночного ASCII-символа...............................318
Вывод строки символов........................................319
Видеофункции BIOS................................................319
Позиционирование курсора.....................................320
пгпавление-
11
Макрокоманда для вывода символа....................................322
Работа с мышью.....................................................323
Проверка наличия драйвера мыши.....................................323
Определение типа мыши и версии драйвера............................324
Взаимодействие с драйвером мыши....................................326
7.3.	Преобразования данных............................................329
Преобразование двоичного числа в строку	ASCII-символов.............329
Преобразование строки ASCII-символов в	двоичное число.............332
Ввод-вывод шестнадцатеричных чисел.................................333
Ввод шестнадцатеричных данных.................................333
Вывод шестнадцатеричных чисел.................................335
Табличные преобразования данных....................................336
Преобразование в семисегментный код...........................336
Таблицы строк ASCII-символов..................................337
Пример табличного преобразования данных............................338
7.4.	Дисковые файлы...................................................342
Структура данных на диске..........................................342
Имена файлов.......................................................345
Имена каталогов...............................................346
Хранение длинных имен файлов..................................346
Последовательный доступ к файлам...................................347
Создание файла................................................347
Запись в файл.................................................348
Открытие, чтение и закрытие файла.............................349
Указатель файла...............................................350
Прямой доступ к файлам.............................................353
Создание файла с прямым доступом..............................354
Чтение и запись...............................................355
7.5.	Примеры программ.................................................355
Программа-калькулятор..............................................355
Сортировка числовых данных.........................................357
Шестнадцатеричный дамп файла.......................................360
7.6.	Обработка прерываний.............................................364
Перехват прерываний................................................364
Пример резидентной программы.......................................365
Пример "всплывающей" программы.....................................371
Итоги.................................................................377
Контрольные вопросы...................................................378
Глава 8. Совместное использование языка ассемблер и C/C++.............381
Введение..............................................................381
Темы главы............................................................381
8.1.	Ассемблер и C/C++ в 16-битных приложениях........................381
Ассемблерные вставки...............................................382
Ограничения при использовании ассемблерных вставок.................385
Работа со строками.................................................385
Доступ к элементам структур........................................386
Пример программы...................................................388
12
Оглавление
8.2.	Применение ассемблера и C/C++ в 32-битных приложениях...........390
Пример консольного приложения.....................................390
Прямой доступ к портам............................................391
8.3.	Объединение модулей на языках ассемблер и C/C++ при раздельной трансляции...........................................................394
Компоновка модулей на ассемблере и Visual С.......................394
Включение новых машинных команд в программы на	языке C/C++........399
Итоги................................................................400
Контрольные вопросы..................................................400
Глава 9. Спецификации аппаратных средств микропроцессоров 8086/8088....402
Введение.............................................................402
Темы главы...........................................................402
9.1.	Расположение и назначение выводов процессора....................402
Схема расположения выводов........................................403
Требования к источнику электропитания.............................404
Характеристики процессора по постоянному току.................404
Входные характеристики........................................404
Выходные характеристики.......................................404
Назначение выводов и сигналов.....................................406
Выводы процессора для минимального режима работы..............408
Выводы процессора для максимального режима работы.............410
9.2.	Генератор синхронизирующих импульсов 8284А......................411
Назначение выводов................................................411
Работа генератора 8284А...........................................414
Работа узла синхронизации.....................................414
Работа узла формирователя сигнала сброса RESET................415
9.3.	Буферизация шины и применение регистров-защелок.................416
Демультиплексирование шин.........................................416
Демультиплексирование для микропроцессора 8088................417
Демультиплексирование для микропроцессора 8086................418
Буферизированная система..........................................419
Полностью буферизированная система на базе микропроцессора 8088.420
Полностью буферизированная система на базе микропроцессора 8086.420
9.4.	Циклы шины......................................................422
Основные операции шины............................................423
Понятие о циклах шины.............................................423
Временная диаграмма чтения........................................425
Временная диаграмма записи........................................430
9.5.	Состояние готовности и ожидания.................................431
Вывод READY микропроцессора 8086/8088.............................431
RDY и 8284А.......................................................432
9.6.	Сопоставление минимального и максимального режимов работы микропроцессоров 8086/8088...........................................435
Минимальный режим работы..........................................435
Максимальный режим работы.........................................435
Шинный контроллер 8288............................................438
Назначение выводов и сигналов.................................438
Огла0Л^!2.------------------------------------------------------------—
Итоги.................................................................440
Контрольные вопросы	и задания.........................................441
Глава Ю. Интерфейс	памяти...........................................444
Введение..............................................................444
Темы главы............................................................444
10.L	Запоминающие устройства..........................................444
Выводы элементов памяти...........................................445
Выводы адреса..................................................445
Выводы данных..................................................446
Выводы выбора..................................................447
Управляющие выводы.............................................447
ПЗУ...............................................................447
Статическая память................................................451
Динамическая память...............................................457
10.2.	Дешифрирование адреса...........................................463
Зачем нужен дешифратор?...........................................463
Простой дешифратор на логическом элементе И-НЕ....................463
Линейный дешифратор "3-8" (74LS138)...............................465
Схема применения дешифратора...................................466
Сдвоенный линейный дешифратор "2-4" (74LS139).....................468
Адресный дешифратор на ППЗУ.......................................469
Программируемые дешифраторы на ПЛУ................................471
Комбинаторные программируемые логические матрицы...............471
10.3.	Интерфейс памяти 8-разрядных микропроцессоров 8088 и 80188 .....475
Базовый интерфейс памяти микропроцессоров 8088/80188..............476
Сопряжение ПЗУ с микропроцессором 8088.........................476
Сопряжение ОЗУ с микропроцессором 8088 ........................477
Интерфейс флэш-памяти.............................................479
Проверка на четность для обнаружения ошибок памяти................481
Исправление ошибок................................................483
10.4.	Интерфейс памяти 16-разрядных микропроцессоров 8086, 80186, 80286 и 80386SX.............................................................487
16-разрядная шина управления......................................487
Дешифраторы банков.............................................488
Отдельные стробы записи банков.................................490
Ю.5. Интерфейс памяти 32-разрядных микропроцессоров 80386DX и 80486...496
Банки памяти......................................................496
Интерфейс 32-разрядной памяти.....................................497
Ю.6. Интерфейс памяти 64-разрядных микропроцессоров Pentium—Pentium 4.499
Интерфейс 64-разрядной памяти.....................................501
Ю.7. Динамические запоминающие устройства.............................504
Повторное рассмотрение динамического ЗУ...........................504
Память EDO........................................................506
Синхронное динамическое ЗУ (SDRAM)................................507
Контроллеры динамического ЗУ......................................507
Итоги.................................................................510
Контрольные вопросы и задания.........................................512
14
Оглавление
Глава 11. Базовый интерфейс ввода-вывода.............................515
Введение.............................................................515
Темы главы...........................................................515
11.1. Введение в интерфейс ввода-вывода..............................516
Команды ввода-вывода.............................................516
Изолированный и отображаемый в памяти ввод-вывод.................518
Изолированный ввод-вывод......................................518
Отображаемый в памяти ввод-вывод..............................519
Карта распределения устройств ввода-вывода персонального компьютера....................................................520
Элементарные интерфейсы ввода-вывода.............................521
Элементарный интерфейс ввода данных...........................521
Элементарный интерфейс вывода данных.............................522
Квитирование.....................................................523
Немного о схемах сопряжения......................................525
Устройства ввода..............................................526
Устройства вывода.............................................528
11.2.	Дешифрирование адреса порта ввода-вывода.......................530
Дешифрирование 8-разрядных адресов устройств ввода-вывода........530
Дешифрирование 16-разрядных адресов устройств ввода-вывода.......532
8-	и 16-разрядные порты ввода-вывода............................533
32-разрядные порты ввода-вывода..................................536
11.3.	Программируемый периферийный интерфейс 8255А/8255А-5/82С55 ....538
Описание ППИ 82С55 ..............................................539
Программирование ППИ 82С55.......................................541
Функционирование в режиме 0......................................543
Подключение жидкокристаллического индикатора к ППИ 82С55......547
Подключение шагового двигателя к ППИ 82С55....................553
Подключение матричной клавиатуры..............................556
Стробированный ввод режима 1.....................................561
Описание сигналов стробированного ввода режима 1..............561
Пример стробированного ввода..................................563
Стробированный вывод режима 1.................................564
Описание сигналов стробированного вывода режима 1.............564
Пример стробированного вывода.................................566
Двунаправленные операции режима 2................................567
Описание сигналов для двунаправленной передачи режима 2.......569
Двунаправленная шина..........................................569
Краткие суммарные сведения о режимах ППИ 82С55...................571
11.4.	Программируемый интерфейс клавиатуры/дисплея 8279..............571
Краткое описание интерфейса 8279.................................572
Описание выводов интерфейса 8279..............................573
Сопряжение интерфейса 8279 с микропроцессором....................574
Интерфейс клавиатуры.............................................576
Программирование интерфейса клавиатуры........................576
Описание командных слов.......................................576
Интерфейс 6-разрядного дисплея...................................582
Оглавление
15
11.5.	Программируемый интервальный таймер 8254.......................585
Функциональное описание таймера 8254.............................585
Назначение выводов...............................................587
Программирование таймера 8254....................................588
Режимы работы.................................................589
Формирование формы сигнала с помощью таймера 8254.............592
Считывание из счетчика........................................593
Управление скоростью и направлением вращения двигателя постоянного тока.............................................................595
11.6.	Программируемый связной интерфейс 16550........................599
Последовательная асинхронная передача данных.....................599
Функциональное описание микросхемы 16550.........................600
Назначение выводов микросхемы 16550...........................601
Программирование микросхемы 16550................................604
Инициализация.................................................604
Программирование скорости передачи............................606
Пример выполнения инициализации...............................607
Передача последовательных данных..............................610
Прием последовательных данных.................................611
Ошибки универсального асинхронного приемопередатчика..........612
11.7.	Аналого-цифровой (АЦП) и цифроаналоговый (ЦАП) преобразователи..612
Цифроаналоговый преобразователь DAC0830..........................612
Внутренняя структура преобразователя DACO830..................613
Подключение преобразователя DAC0830 к микропроцессору.........614
Аналого-цифровой преобразователь ADC0804.........................615
Аналоговый входной сигнал.....................................616
Генерирование синхронизирующего сигнала.......................617
Подключение преобразователя ADC0804 к микропроцессору.........618
Совместное применение ADC0804 и DAG0830..........................619
Итоги............................................................... 621
Контрольные вопросы и задания........................................624
Глава 12. Прерывания.................................................628
Введение.............................................................628
Темы главы...........................................................628
12.1.	Основы процесса прерываний.....................................628
Назначение прерываний............................................628
Прерывания.......................................................629
Векторы прерываний............................................630
Команды прерываний: BOUND, INTO, INT, INT 3 и IRET...............633
Прерывания в реальном режиме.....................................634
Прерывания в защищенном режиме...................................635
Флаги, относящиеся к прерыванию..................................636
Процедура трассировки программы...............................638
Сохранение вектора прерывания в таблице векторов.................640
12.2.	Аппаратные прерывания..........................................641
Сигнал NMI.......................................................641
Сигналы INTR и INTA .............................................644
16
Оглавление
Использование буфера с тремя состояниями для выдачи вектора....645
Формируемый фронтом сигнал запроса на прерывание INTR..........646
Прерывание от клавиатуры, подключенной посредством микросхемы ППИ 82С55........................................................647
12.3.	Расширение системы прерываний..................................650
Использование логического элемента И-НЕ и буфера 74ALS244........651
Принцип работы схемы..........................................652
Система прерывания с последовательным опросом....................652
12.4.	Программируемый контроллер прерываний 8259А....................655
Общая характеристика контроллера 8259А...........................655
Подключение одного контроллера 8259А.............................657
Каскадное подключение контроллеров 8259А.........................658
Программирование контроллера 8259А...............................658
Командные слова инициализации.................................658
Командные слова операций......................................662
Регистры состояния............................................665
Пример программирования контроллера 8259А........................666
Инициализация.................................................666
Обработка запроса на прерывание от UART 16550.................669
Получение данных от UART 16550................................671
Передача данных на UART 16550.................................673
12.5.	Примеры прерываний.............................................677
Часы реального времени...........................................678
Обработка прерываний клавиатуры..................................679
Итоги................................................................683
Контрольные вопросы и задания........................................685
Глава 13. Прямой доступ к памяти.....................................687
Введение.............................................................687
Назначение главы.....................................................687
13.1.	Основы процесса прямого доступа к памяти.......................688
Основные операции................................................689
13.2.	Контроллер DMA 8237............................................690
Назначение выводов и сигналов....................................692
Внутренние регистры..............................................694
Команды для программирования контроллера.........................700
Программирование регистров адреса и счета слов...................701
Подключение контроллера DMA 8237А к микропроцессору 80x86........703
Передачи данных типа ’’память-память”............................707
Пример передачи типа ’’память-память”.........................707
Пример заполнения памяти с использованием контроллера 8237....709
Прямой доступ к памяти при работе с принтером....................711
13.3.	Функционирование общей шины....................................714
Типы шин.........................................................715
Арбитр шины 8289.................................................717
Организация арбитра шины 8289.................................717
Назначение выводов и сигналов.................................718
Принцип работы арбитра шины 8289..............................720
Оглавление
17
44 Ъ WK
Иллюстрация системы с арбитрами шины, работающими в одношинном режиме и режиме с локальной шиной................721
Обслуживание приоритетов для арбитров шин 8289...................724
Схема с последовательным опросом..............................724
Схема с параллельным обслуживанием приоритетов................725
Спулер печати и интерфейс принтера...............................726
Интерфейс ведущего микропроцессора в одношинном режиме работы .... 727
Работа локальной шины подчиненного микропроцессора 8088.......729
Программное обеспечение спулера печати........................732
13.4.	Системы памяти на дисках.......................................738
Память на гибких магнитных дисках................................738
Гибкий магнитный диск 5,25”...................................739
Гибкий магнитный диск 3,5”....................................742
Память на жестких магнитных дисках...............................744
Метод записи с кодированием RLL...............................746
Оптические диски.................................................749
13.5.	Видеодисплеи...................................................751
Видеосигналы.....................................................751
Цифровой RGB-монитор.............................................752
Аналоговый RGB-монитор...........................................754
Итоги................................................................760
Контрольные вопросы и задания........................................761
Глава 14. Арифметический сопроцессор и расширение ММХ................763
Введение.............................................................763
Назначение главы.....................................................764
14.1.	Форматы данных арифметического сопроцессора....................764
Знаковые целые...................................................765
Двоично-десятичные числа (BCD)........**.........................766
Данные с плавающей точкой........................................766
Преобразование к формату действительных чисел.................767
Преобразование из формата действительных чисел................768
Хранение действительных чисел в памяти........................768
14.2.	Архитектура сопроцессора 80x87.................................769
Внутренняя организация сопроцессора 80x87........................769
Регистр состояния.............................................771
Регистр управления............................................774
Регистр тегов.................................................776
14.3.	Команды сопроцессора...........................................776
Команды передачи данных..........................................777
Команды передачи действительных чисел.........................777
Команды передачи целочисленных данных.........................777
Команды передачи BCD-данных...................................777
Команды условной передачи данных для процессоров Pentium Pro— Pentium 4.....................................................778
Арифметические команды...........................................779
Разновидности команд базовой арифметики.......................780
Дополнительные команды арифметических операций................781
18
Оглавление
Команды сравнения.................................................782
Трансцендентные команды...........................................783
Команды загрузки констант.........................................784
Команды управления сопроцессором..................................784
Список команд сопроцессора........................................788
14.4. Программирование сопроцессора...................................802
Вычисление площади круга..........................................802
Вычисление резонансной частоты....................................804
Решение квадратного уравнения.....................................804
Запись результатов в массив.......................................806
Вывод на экран действительных чисел одинарной точности............807
Ввод действительных чисел с клавиатуры............................809
14.5. Введение в технологию ММХ.......................................811
Типы данных ММХ...................................................811
Система команд ММХ................................................811
Арифметические команды.........................................812
Инструкции сравнения...........................................812
Команды преобразования.........................................813
Логические команды.............................................813
Команды сдвига.................................................813
Команды передачи данных........................................813
Команда EMMS...................................................814
Список команд ММХ..............................................814
Итоги.................................................................824
Контрольные вопросы...................................................826
Глава 15. Шины ввода-вывода...........................................829
Введение..............................................................829
Назначение главы......................................................829
15.1.	Шина ISA........................................................829
Эволюция шины ISA.................................................830
Интерфейс вывода данных для 8-разрядной шины ISA..................830
Интерфейс ввода данных для 8-разрядной шины ISA...................836
16-разрядная шина ISA.............................................838
15.2.	Шины EISA и VLB................................................ 840
Шина EISA.........................................................840
Пример схемы интерфейса для шины EISA.............................840
Счетчик событий................................................842
Частотомер.....................................................843
Шина VLB..........................................................845
Схема расположения выводов шины VLB............................845
15.3.	Шина PCI........................................................847
Схема расположения выводов шины PCI...............................848
Мультиплексированные линии шины PCI...............................848
Конфигурационное пространство...................................  852
BIOS для шины PCI.................................................855
Интерфейс PCI.................................................... 859
Оглавление	19
15 4. Порт параллельного интерфейса (LPT-порт)........................859
Описание LPT-порта................................................860
Использование параллельного порта без поддержки режима ЕСР........863
15 5. Универсальная последовательная шина USB.........................863
Разъем............................................................864
Данные шины USB...................................................865
Управление шиной USB..............................................866
15.6. Ускоренный графический порт AGP.................................870
Итоги.................................................................871
Контрольные вопросы и задания.........................................872
Глава 16. Микропроцессоры 80186, 80188 и 80286 .......................874
Введение..............................................................874
Назначение главы......................................................874
16.1.	Архитектура микропроцессоров 80186/80188........................875
Версии микропроцессоров 80186/80188...............................875
Базовая блок-схема микропроцессора 80186..........................875
Основные особенности микропроцессоров 80186/80188.................876
Генератор тактовых импульсов...................................877
Программируемый контроллер прерываний..........................878
Таймеры........................................................878
Программируемый блок DMA.......................................879
Программируемый блок выбора кристалла..........................879
Режимы экономии электроэнергии и выключения питания............880
Блок управления регенерацией памяти............................880
Схема расположения выводов........................................880
Описание выводов и соответствующих сигналов....................881
Характеристики процессора по постоянному току.....................885
Временные соотношения сигналов микропроцессоров 80186/80188.......885
Время доступа к памяти.........................................886
16.2.	Программирование расширенных возможностей микропроцессоров 80186/80188...........................................................891
Блок управления периферией........................................891
Прерывания в микропроцессорах 80186/80188.........................893
Контроллер прерываний.............................................894
Регистры контроллера прерываний................................896
Каскадное включение с внешними контроллерами прерывания........897
Регистры управления прерываниями...............................898
Регистр запросов прерываний....................................899
Регистр масок и регистр маски приоритета.......................899
Регистр обслуживания прерываний................................900
Регистр опроса и регистр состояния опроса......................900
Регистр завершения прерывания..................................901
Регистр состояния прерываний...................................901
Регистр вектора прерываний.....................................902
Таймеры...........................................................902
Принцип действия регистров таймера.............................904
Выходные выводы таймера........................................908
Пример часов реального времени.................................908
20
Оглавление
Контроллер DMA....................................................911
Регистр управления каналом....................................912
Пример передачи типа "память-память"..........................913
Блок выбора кристалла.............................................914
Выбор элементов памяти........................................914
Выбор периферийных устройств..................................915
Программирование блока выбора кристалла процессоров 80186/80188 версий XL и ЕА................................................915
Программирование блока выбора кристалла процессоров 80186/80188 версий ЕВ и ЕС................................................919
16.3.	Пример использования процессора 80С188ЕВ.......................921
16.4.	Операционная система реального времени.........................925
Что представляет собой операционная система реального времени?...926
Пример системы...................................................926
Многопоточная система............................................940
16.5.	Микропроцессор 80286...........................................945
Аппаратные особенности...........................................945
Система команд...................................................948
Виртуальная память...............................................950
Итоги................................................................951
Контрольные вопросы и задания........................................952
Глава 17. Микропроцессоры 80386 и 80486..............................955
Введение.............................................................955
Назначение главы.....................................................955
17.1.	Микропроцессор 80386...........................................956
Система памяти...................................................961
Буферизованная система........................................963
Конвейерная адресация и кэш-память............................963
Системы памяти с чередованием адресов.........................965
Система ввода-вывода.............................................970
Сигналы, управляющие памятью и вводом-выводом....................971
Временные диаграммы..............................................972
Такты ожидания...................................................974
17.2.	Специальные регистры микропроцессора 80386.....................976
Управляющие регистры.............................................977
Регистры отладки и тестирования..................................978
17.3.	Управление памятью.............................................981
Дескрипторы и селекторы..........................................981
Дескрипторы сегмента кода и данных............................984
Дескриптор системных сегментов................................986
Таблицы дескрипторов.............................................987
Сегмент состояния задачи TSS.....................................990
17.4.	Переход в защищенный режим.....................................992
17.5.	Режим виртуального микропроцессора 8086...................... 1009
17.6.	Страничное управление памятью.................................1010
Каталог страниц.................................................1011
Таблица страниц................................................ 1012
Оглавление
21
17.7.	Микропроцессор 80486......................................... 1016
Схема расположения выводов микропроцессоров 80486DX и 80486SX...1017
Назначение сигналов и выводов................................1018
Базовая архитектура микропроцессора 80486...................... 1024
Система памяти микропроцессора 80486........................... 1025
Блок проверки/генератора паритета............................1026
Кэш-память...................................................1027
Временная диаграмма чтения памяти............................1028
Управление памятью микропроцессора 80486....................... 1030
Тестовые регистры кэш-памяти....................................1030
Итоги...............................................................1032
Контрольные вопросы и задания.......................................1034
Глава 18. Микропроцессоры Pentium и Pentium Pro.....................1037
Введение............................................................1037
Назначение главы....................................................  1037
18.1.	Микропроцессор Pentium........................................1038
Система памяти..................................................1046
Система ввода-вывода............................................1048
Синхронизация системы...........................................1049
Логика предсказания ветвления...................................1052
Структура кэш-памяти............................................1053
Суперскалярная архитектура......................................1053
18.2.	Специальные регистры микропроцессора Pentium..................1053
Управляющие регистры............................................1053
Регистр флагов EFLAG............................................1056
Встроенный самоконтроль.........................................1056
18.3.	Управление памятью микропроцессора Pentium....................1056
Блок страничной трансляции адресов..............................1057
Режим системного управления SMM.........•/......................1058
18.4.	Новые команды микропроцессора Pentium.........................1060
18.5.	Микропроцессор Pentium Pro....................................1065
Внутренняя структура микропроцессора Pentium Pro................1065
Назначение сигналов и выводов процессора........................1069
Система памяти................................................  1075
Система ввода-вывода............................................1077
Синхронизация системы...........................................1077
18.6.	Специальные особенности микропроцессора	Pentium Pro...........1079
Управляющий регистр CR4.........................................1079
Итоги...............................................................1080
Контрольные вопросы и задания.......................................1082
Глава 19. Микропроцессоры Pentium II, Pentium III и Pentium 4.......1084
Введение........................................................:...1084
Назначение главы....................................................1085
19.1.	Микропроцессор Pentium II.....................................1085
Система памяти..................................................1095
Система ввода-вывода............................................1098
Системная синхронизация.........................................1098
22
Оглавление
19.2.	Изменения в программном обеспечении Pentium II...............1099
Команда CPUID..................................................1099
Команды SYSENTER и SYS EXIT....................................1100
Команды FXSAVEh FXRSTOR........................................1102
19.3.	Микропроцессор Pentium III...................................1103
Чипсеты........................................................1103
Шина...........................................................1103
Схема расположения выводов.....................................1104
19.4.	Микропроцессор Pentium 4.....................................1105
Сопряжение с памятью...........................................1106
Набор регистров................................................1107
Гиперконвейерная технология....................................1109
Команда CPUID..................................................1109
Особенности применения микропроцессора Pentium 4...............1110
Итоги..............................................................1110
Контрольные вопросы и задания......................................1111
Приложение 1. Директивы ассемблера, функции DOS и BIOS, управление мышью и интерфейс DPMI..................................1113
Использование инструментальных средств.............................1113
Модели памяти в ассемблере.........................................1114
Вызов функций DOS..................................................1120
Вызов функций BIOS.................................................1148
Прерывание INT ЮН..............................................1148
Выбор видеорежима...........................................1148
Управление курсором и изображением..........................1150
Прерывание INT НН..............................................1154
Прерывание INT 12Н............................................. 1154
Прерывание INT 13Н.............................................1154
Прерывание INT 14Н.............................................1155
Прерывание INT 15Н.............................................1156
Прерывание INT 16Н.............................................1157
Прерывание INT 17Н.............................................1157
Системная область DOS/BIOS.....................................1158
Функции драйвера мыши..............................................1160
Функции DPMI.......................................................1171
Приложение 2. Система команд микропроцессоров 80x86/Pentium........1192
SIMD-команды.......................................................1260
Приложение 3. Воздействие инструкций на флаги......................1270
Приложение 4. Ответы на контрольные вопросы с четными номерами.....1273
Глава 1............................................................1273
Глава 2............................................................1275
Глава 3............................................................1276
Оглавление 23
Глава 4......................................................................1277
Глава 5......................................................................1278
Глава 6......................................................................1280
Глава 7......................................................................1282
Глава 8......................................................................1287
Глава 9......................................................................1287
Глава 10.................................................................... 1288
Глава 11.....................................................................1292
Глава 12.....................................................................1297
Глава 13.....................................................................1299
Глава 14...................................................................  1301
Глава 15.....................................................................1304
Глава 16.....................................................................1307
Глава 17.....................................................................1308
Глава 18.....................................................................1310
Глава 19....................................................................13-10
Предметный указатель.........................................................1312
Посвящается моей любимой жене Шейле
Посвящается моей любимой жене Шейле
ВВЕДЕНИЕ
Предлагаемое вашему вниманию учебно-справочное пособие адресовано, в первую очередь, тем учащимся, чья специализация требует не только общих навыков программирования, но и глубоких знаний по организации интерфейсов вычислительных систем на базе микропроцессоров фирмы Intel. Микропроцессоры Intel широко применяются в различных областях электроники, в системах связи, в системах автоматического управления, а также в персональных компьютерах. Поэтому на сегодня всем, кто связывает свою деятельность с применением компьютеров, следует иметь представление об организации вычислительных систем на базе микропроцессоров Intel и программировании этих систем на языке ассемблера.
В настоящее издание включена глава о совместном использовании языка C/C++ и языка ассемблера применительно к операционным системам DOS и Windows.
Содержание книги и ее особенности
Каждая глава открывается кратким перечнем целей и рассматриваемых предметов. Основное изложение сопровождается многочисленными примерами программ. В конце глав подводятся итоги и предлагаются контрольные вопросы.
Примеры программ написаны на языках MASM (ассемблер фирмы Microsoft) и C++ (вариант Visual C++). Предполагается, что система автоматизации программирования и операционная система включают в себя компоновщик, библиотекарь, набор макрокоманд, функции BIOS и DOS, а также среду программирования Visual C++ (возможность ассемблерных вставок в текст на языке C/C++ рассмотрена применительно к 16- и 32-разрядным версиям Visual C++).
В книге приведено подробное описание:
поколений микропроцессоров семейства i80x86;
О вариантов организации памяти;
О системы ввода-вывода (включая дисковую память);
□	устройств аналого-цифрового и цифроаналогового преобразования;
□	последовательного канала связи на базе микросхемы 16550;
О PIAs;
О таймеров;
О контроллеров дисплея и клавиатуры;
О арифметического сопроцессора;
интерфейсов и системных шин персонального компьютера на примерах стандартов AGP, ISA, PCI, VESA и USB.
28
Введение
Порядок изложения
Поскольку между поколениями семейства i80x86 разница довольно существенная, в начале книги рассматривается программирование в реальном режиме, общее для всех поколений. В дальнейшем изложении новые инструкции микропроцессоров 80386, 80486, Pentium, Pentium Pro, Pentium II, Pentium III и Pentium 4 сопоставляются с базовым набором инструкций микропроцессора 8086/8088. Поколения от 80386 до Pentium 4 различаются между собой незначительно, и для понимания их особенностей нам вполне достаточно будет знакомства с базовым вариантом — микропроцессором 8086/8088. Заметим, что микропроцессор 8086/8088 и по сей день используется в контроллерах — наряду с 80186/80188 и встроенным микроконтроллером 80386ЕХ.
В книге рассматриваются также устройство и программирование арифметического сопроцессора. Сопроцессор i80x87 позволяет ускорить операции над данными в формате с плавающей точкой, что и определяет области его применения — системы автоматического управления, машинная графика, в частности, системы автоматизированного проектирования.
В книге приведены описание и назначение контактов микросхемы для каждого из микропроцессоров семейства i80x86/Pentium. Изложение принципов организации микропроцессорных систем мы начинаем с примера системы на базе процессора 8086/8088 с включением периферийных компонентов общего назначения. В дальнейшем обсуждаются системы на базе микропроцессоров 80186/80188, 80386, 80486, а также от Pentium до Pentium 4. (Процессор 80286, представляющий собой нечто среднее между 8086/8088 и 80368, подробно не обсуждается.)
Материал, представленный в книге, позволит вам:
1.	Разрабатывать прикладное программное обеспечение для операционных систем DOS и Windows.
2.	Использовать в программах на языке ассемблера вызовы DOS для обслуживания клавиатуры, дисплея и дисковой памяти.
3.	Использовать функции BIOS для обслуживания клавиатуры, дисплея и иных компонентов вычислительной системы.
4.	Применять в программах на языке ассемблера макрокоманды, вызовы процедур, директивы условной трансляции, а также логические операторы структурного ассемблера1.
5.	Использовать перехват прерываний и разрабатывать резидентные программы, активизируемые нажатием комбинации клавиш.
6.	Программировать арифметический сопроцессор для вычисления сложных выражений в формате с плавающей точкой.
7.	Выяснить для себя и уметь объяснить особенности разных представителей семейства микропроцессоров i80x86/Pentium.
1 Директивы структурного ассемблера, встроенные в MASM 6.0 и специфические для этого ассемблера. — Пер.
Введение
29
8.	Применять реальный и защищенный режимы работы микропроцессора.
9.	Иметь представление об организации интерфейса с памятью и устройствами ввода-вывода.
10.	Представлять себе особенности построения аппаратных и программных систем на основе микропроцессоров Intel.
11.	Понимать функционирование операционных систем реального времени для встроенных микропроцессорных систем.
12.	Иметь представление об организации видео- и дисковой подсистем.
13.	Проектировать периферийные компоненты персональных компьютеров, подключаемые к системной шине (ISA, VESA или PCI), или через внешние интерфейсы (параллельный интерфейс или USB).
Структура изложения
Глава 1 — вводная: в ней содержится обзор истории компьютеров, и приведены основные сведения о принципах организации современных вычислительных систем, в частности, обсуждаются системы счисления.
В главе 2 рассмотрены: программная модель микропроцессора и системная архитектура вычислительной машины, реальный и защищенный режимы.
После изложения основ организации микропроцессорных систем следует подробное изучение машинных инструкций микропроцессоров Intel с примерами. Изучению машинных инструкций посвящены главы 3—6.
В главе 7 приведен разбор программы, включающей в себя вызовы функций BIOS и DOS. В частности, здесь обсуждаются функции обслуживания мыши, операции с файлами на дисках, ввод с клавиатуры и вывод на дисплей. Заметим, что средства, представленные в этой главе, позволяют разрабатывать полноценные программы.
В данной главе также вводятся понятия прерывание и "горячая" клавиша.
В главе 8 ъЪсуукпгтъя возможность совместного использования языков ассемблер и C/C++ — как с использованием встроенного ассемблера, так и за счет компоновки раздельно транслируемых программных модулей.
В главе 9 представлена организация интерфейса с памятью и устройствами ввода-вывода на примере системы, построенной на базе микропроцессора 8086/8088.
В главе 10 рассмотрено построение интерфейса с памятью с использованием схем дешифрации и устройств программируемой логики, с иллюстрацией на примерах контроля четности и динамической памяти. Обсуждается также организация памяти разрядностью 8, 16, 32 и 64 бита для процессоров семейства i80x86/Pentium.
Глава 11 содержит подробности организации интерфейса с такими периферийными Устройствами, как PIAs, таймер, контроллеры дисплея и клавиатуры, последовательный интерфейс 16550, устройства аналого-цифрового и цифроаналогового преобразования, шаговый двигатель и двигатель постоянного тока.
В главах 12 и 13 рассматриваются методы, обеспечивающие дополнительные возможности взаимодействия с устройствами ввода-вывода — в режиме прерываний и в
30
Введение
режиме прямого доступа к памяти. Приведены примеры для принтера, часов реального времени, дисковой памяти и видеоадаптеров.
Глава 14 содержит описание программной модели арифметического сопроцессора, от i8087 до Pentium, и возможностей его программирования, включая ММХ-рас-ширение процессора Pentium. Заметим, что на сегодня доля приложений, эффективно работающих без сопроцессора, невелика; вместе с тем он всегда в наличии, с момента появления 80486 со встроенным сопроцессором.
В главе 15 обсуждается проектирование периферийных компонентов персонального компьютера, подключаемых через параллельный интерфейс или к системной шине (ISA, VESA или PCI).
В главе 16 излагаются особенности микропроцессоров 80186/80188—80486, их отличия от 8086/8088. Здесь и в главе //обсуждаются нововведения, касающиеся устройства системной памяти, в частности, рассматриваются кэш-память в процессорах 80386 и 80486 и страничная организация памяти.
В главе 18 подробно обсуждаются особенности процессоров Pentium и Pentium Pro. В главе 19 приведены основные сведения о процессорах Pentium II, Pentium III и Pentium 4, касающиеся вариантов исполнения, дополнительных возможностей и инструкций.
В Приложении 1 представлен полный перечень функций DOS прерывания 1NT 21Н, функций BIOS прерывания INT ЮН и прерывания для обслуживания мыши, а также вызовов DPMI.
Приложение 2 содержит список инструкций процессоров от 8086 до Pentium 4, с указанием времени выполнения и с примерами на языке ассемблера (показаны также соответствующие машинные коды). Команды, воздействующие на флаги процессора, указаны в Приложении 3.
В Приложении 4 приведены ответы на контрольные вопросы к главам (выборочно).
Благодарности
Автор глубоко признателен за ценные замечания и предложения Роберту Дугласу из Мемфисского университета, Айзеку Гэнса из Калифорнийского государственного университета, Рейно Хентону из Южного университета (штат Лос-Анжелес) и Полу Уилеру из государственного университета Юты.
Адрес для связи
Авторский сайт находится по адресу http://membcrs.ec.net/brey. Там вы найдете сведения о других публикациях автора и множество ссылок на ресурсы, касающиеся микропроцессоров, персональных компьютеров, аппаратного и программного обеспечения. Раз в неделю на этом сайте проводятся уроки с обсуждением различных аспектов вычислительной техники. Некоторые сведения, не вошедшие в книгу, можно найти в разделе сайта под названием "Technical Section".
ГЛАВА 1______________________
Введение в микропроцессоры
компьютеры
Введение
В этой главе мы дадим краткий обзор микропроцессоров семейства Intel 80х86/Реп-tium, рассмотрим этапы развития вычислительной техники и обсудим основные функции микропроцессоров в современных компьютерных системах. Вы также ознакомитесь с терминами, применяемыми в этой области техники.
Мы рассмотрим назначение и функции элементов вычислительной системы на блок-схеме. Также мы обсудим организацию памяти и системы ввода-вывода, хранение данных в памяти, типы данных и их представление. Числовые данные хранятся в формате целых чисел, чисел с плавающей точкой, двоично-десятичных (BCD — Binary Coded Decimal) значений; строковые данные представлены в коде ASCII (American Standard Code for Information Interchange).
Темы главы
В этой главе мы рассмотрим:
□	компьютерные термины: байт, данные, основная память, дополнительная или иначе отображаемая (EMS — Expanded Memory System) и расширенная память (XMS — Extended Memory System), DOS, BIOS, система ввода-вывода и т. д.;
□	этапы развития вычислительной техники и области применения современных компьютеров;
поколения микропроцессоров семейства Intel 80x86/Pentium;
□	блок-схему вычислительной системы и функции блоков;
О работу микропроцессора и операции, которые он выполняет;
□	структуру памяти персонального компьютера на базе микропроцессора Intel;
выполнение преобразований между двоичными, десятичными и двоично-десятичными числами;
Форматы целых чисел, чисел с плавающей точкой, двоично-десятичных и строковых данных.
32
Глава 1
1.1. Исторический обзор
Проследим этапы развития вычислительной техники до современного уровня, представленного, в частности, микропроцессорами семейства Intel вОхвб’/Репишп1 2.
Эпоха механики
Идея вычислительной машины возникла задолго до открытия электричества и разработки элекгронных приборов. Первое механическое счетное приспособление — абака3 — было изобретено еще в V веке до н. э. в Древнем Вавилоне. Счет вели на бусах, пользовались этим приспособлением священники — для учета запасов зерна. Изменяясь незначительно, абаки — в виде знакомых вам бухгалтерских счетов — оставались в употреблении до недавнего времени.
В 1642 г. математик Блез Паскаль построил первый механический автомат для вычислений4, на основе многоступенчатого редуктора с передаточным числом Ю во всех зубчатых парах. В этом устройстве при полном обороте ведущего десятизубого колеса ведомая шестерня (тоже десятизубая) прокручивается на один зуб, приводя в движение следующее колесо. Этот принцип положен в основу всех механических вычислителей (арифмометра, например), а также используется в автомобильных одометрах5. Кстати, известный язык программирования Pascal назван в честь Блеза Паскаля — выдающегося математика и автора первого в истории автоматического вычислителя.
Механические калькуляторы вошли в обиход в начале XIX века, когда о промышленном использовании электричества еще не было и речи; пока что не изобрели еще даже лампочку накаливания. Но и в ту пору, на заре вычислительной техники люди мечтали о механизмах, выполняющих вычисления по программе, в отличие от арифмометров, способных лишь к отдельным арифметическим действиям.
Первая попытка создания подобной машины была предпринята профессором математики Кембриджского университета Чарльзом Бэббиджем (при участии графини Августы Ады Байрон). Факт этой разработки был обнаружен по сохранившимся документам только в 1937 г. Бэббидж начал создание своей так называемой аналитической машины в 1823 г. по заказу Королевского астрономического общества Великобритании. Машина предназначалась Королевскому флоту для обсчета навигационных таблиц. Предполагалось, что аналитическая машина Бэббиджа будет хранить до
1 80x86 — сокращенная запись, которая включает 8086, 8088, 80186, 80286, 80386 и 80486 процессоры.
2 Pentium — официально зарегистрированное наименование процессоров корпорации Intel начиная с процессоров пятого поколения 80586.
3 Abacus — стол, столешница; подставка для драгоценной утвари (лат). По-видимому, в Древнем Риме этим словом называли пришедшую из Греции "саламинскую доску" — счетную дощечку с бороздками для камешков. С той поры "абакой" называют все аналогичные приспособления, даже если камешки, шарики, кукурузные зерна или вишневые косточки не лежат на доске, а подвешены на веревочках, как в китайском суан-пабе или в русском "дощатом счете". — Пер.
4 Чертежи и описание подобного устройства были обнаружены еще в рукописях Леонардо да Винчи (1452-1519 гг >. - Пер.
5 Одометр — прибор для счета оборотов колеса; при помощи его измеряется длина пути. — Ред.
34
Глава 1
лосс", вероятно, за ее габариты. Хотя с помощью этой машины англичанам удалось взломать шифры Энигмы7, к решению других задач этот компьютер не был приспособлен, поскольку программа в нем была фиксированной.
Рис. 1.1. Компьютер Z3, разработанный Конрадом Цузе, с тактовой частотой 5,33 Гц (фотография предоставлена его сыном Хорстом Цузе)
Первый программируемый электронный компьютер общего назначения был создан в 1946 г. в университете штата Пенсильвания8 9. Это гигантское устройство под названием ENIAC (Electronic Numerical Integrator and Calculator) содержало более 17000 электронных ламп и 900 км проводов. При массе более 30 т эта машина выполняла около 100000 операций в секунду. Для изменения программы нужно было переключить провода на коммутаторе, напоминающем пульт оператора телефонной станции. На эту операцию обычно уходило несколько человеко-дней. Кроме того, вычислительная машина ENIAC требовала частного ремонта, ввиду короткого срока службы электронных ламп.
Ситуация изменилась в 1948 г., когда фирмой Bell Laboratories был создан первый транзистор?. А в 1958 г. Джек Килби из фирмы Texas Instruments изобретает интегральную микросхему. В последующее десятилетие на основе этого изобретения создаются микросхемы резисторно-транзисторной логики (RTL — Resistor-to-Transistor Logic). В 1971 г. фирма Intel выпускает свой первый микропроцессор i4004, с появлением которого началось бурное развитие вычислительной техники.
Развитие инструментов программирования
С появлением программируемых вычислительных машин возникли и начали развиваться средства программирования. Как мы уже говорили, программирование первой электронной вычислительной системы выполнялось за счет перекоммутации
7 Немецкая механическая шифровальная машина. — Пер.
8 Авторы — Джон Маучли и Джон Преспер Эккерт. — Пер.
9 Авторы — Джоном Бардин, Уолтер Браттейн и Уильям Шокли. — Пер.
Введение в микропроцессоры и компьютеры
33
тысячи 20-значных десятичных чисел, а работать будет по изменяемой программе, что позволило бы настраивать ее на различные вычислительные задачи. Для ввода данных предполагалось использовать перфокарты — те самые перфокарты, что в 50-х и 60-х годах XX века будут применяться в большинстве электронных вычислительных машин (ЭВМ). Полагают, что идею ввода с перфокарт Бэббидж позаимствовал у французского изобретателя Жозефа Жаккара (Joseph Jacquard), создавшего в 1801 г. ткацкий станок, в котором узор ткани определялся набором перфокарт.
После многих лет работы Бэббидж понял, что аналитическая машина технически неосуществима. Число требуемых деталей приблизилось к 50000, и для сборки надежно работающего механизма требовалась недостижимая по тем временам точность изготовления6.
Эпоха электричества
В XIX веке с появлением электрического двигателя, созданного по замыслу Майкла Фарадея, механические калькуляторы оснащаются электроприводом. Электромеханические калькуляторы, ставшие необходимой принадлежностью любой конторы, просуществовали до начала 70-х годов XX века, когда был выпущен электронный калькулятор Бомара. Калькулятор Монро, созданный примерно в то же время, невыгодно отличался от модели Бомара своими габаритами — он был размером с кассовый аппарат.
Применение перфокарт, изобретенных Жаккаром, получает дальнейшее развитие в 1889 г., когда Герман Холлерит разработал механическую машину с электрическим приводом. Эта машина могла считать и упорядочивать информацию, заданную на перфокартах. Правительство США настолько заинтересовалось этим изобретением, что Холлериту поручили применить его устройство для хранения данных переписи населения 1890 г. и для составления таблиц на основе этих данных.
В 1896 г. Холлерит создает фирму по разработке машин для обработки таблиц с использованием перфокарт. После объединения фирмы Холлерита с рядом других компаний была образована широко известная ныне корпорация IBM (International Business Machines). И перфокарты Холлерита, и принятая им 12-битная кодировка данных десятилетиями успешно применялись в вычислительной технике.
В 1941 г. происходит событие, завершившее эпоху электромеханических вычислительных устройств. Немецкий изобретатель Конрад Цузе создает первую в мире электронную вычислительную машину Z3 — результат проведенных им исследований в области электроники, начатых еще в 30-х годах. Релейный компьютер Z3, показанный на рис. 1.1, применялся в разработке летательных аппаратов (ракет и самолетов) для Германской армии во время Второй мировой войны.
Недавно, когда был открыт доступ к военным архивам Великобритании тех лет, выяснилось, что уже с 1943 г. англичане использовали электронный компьютер для расшифровки секретных кодов противника. Этот компьютер — изобретение Алана Тьюринга — был собран на электронных лампах. Автор назвал свою машину ”Ко
6 В 1812 г., задолго до разработки аналитической машины, Бэббидж создает проект механического компьютера для решения полиномиальных уравнений, действующая модель которого была продемонстрирована Британскому правительству в 1822 г. — Пер.
2 Зак 384
34
Глава 1
лосс", вероятно, за ее габариты. Хотя с помощью этой машины англичанам удалось взломать шифры Энигмы7, к решению других задач этот компьютер не был приспособлен, поскольку программа в нем была фиксированной.
Рис. 1.1. Компьютер Z3, разработанный Конрадом Цузе, с тактовой частотой 5,33 Гц (фотография предоставлена его сыном Хорстом Цузе)
Первый программируемый электронный компьютер общего назначения был создан в 1946 г. в университете штата Пенсильвания8 9. Это гигантское устройство под названием ENIAC (Electronic Numerical Integrator and Calculator) содержало более 17 000 электронных ламп и 900 км проводов. При массе более 30 т эта машина выполняла около 100000 операций в секунду. Для изменения программы нужно было переключить провода на коммутаторе, напоминающем пульт оператора телефонной станции. На эту операцию обычно уходило несколько человеко-дней. Кроме того, вычислительная машина ENIAC требовала частного ремонта, ввиду короткого срока службы электронных ламп.
Ситуация изменилась в 1948 г., когда фирмой Bell Laboratories был создан первый транзистор?. А в 1958 г. Джек Килби из фирмы Texas Instalments изобретает интегральную микросхему. В последующее десятилетие на основе этого изобретения создаются микросхемы резисторно-транзисторной логики (RTL — Resistor-to-Transistor Logic). В 1971 г. фирма Intel выпускает свой первый микропроцессор i4004, с появлением которого началось бурное развитие вычислительной техники.
Развитие инструментов программирования
С появлением программируемых вычислительных машин возникли и начали развиваться средства программирования. Как мы уже говорили, программирование первой электронной вычислительной системы выполнялось за счет перекоммутации
7 Немецкая механическая шифровальная машина. — Пер.
8 Авторы — Джон Маучли и Джон Преспер Эккерт. — Пер.
9 Авторы — Джоном Бардин, Уолтер Браттейн и Уильям Шокли. — Пер.
Введение в микропроцессоры и компьютеры 35
электрических цепей. Это было не слишком неудобно, и вскоре появляются языки, предназначенные для управления компьютерами. Первым языком программирования был машинный язык. В машинном языке программа представлена комбинацией двоичных чисел — нулей и единиц, образующих инструкции, которые хранятся в памяти машины10. Хотя использовать машинный язык было проще, нежели изменять схему коммутации, все же для задания большого количества двоичных цифр по-прежнему требовалось много времени.
С появлением в 50-х годах таких вычислительных систем, как UNIVAC, в употребление входит язык ассемблера, позволяющий сократить трудоемкость рутинной работы по кодированию машинных инструкций. Язык ассемблера позволяет программисту использовать мнемонические обозначения инструкций, например, add, взамен набора двоичных чисел вроде 01000111. В 1957 г. появляется первый язык высокого уровня — Flow-Matic, разработанный Грейс Хоппер. Вскоре выходит в свет язык Fortran (FORniula TRANslator), созданный фирмой IBM для программирования ее систем. Этот язык, позволяющий автоматизировать кодирование формул11, используется учеными и в настоящее время. Через год появляется еще один язык такого уровня — Algol (ALGOrithmic Language).
Первым по-настоящему успешным языком, получившим широкое распространение, стал язык Cobol (COmmon Business Oriented Language), ориентированный на коммерческие приложения. В последние десятилетия популярность этого языка уменьшилась, хотя в некоторых крупных коммерческих системах он по-прежнему играет важную роль. Еще одна популярная система программирования для информационных систем — это генератор программ отчетов RPG (Report Program Generator), который позволяет, в частности, описывать задачу посредством форм ввода и форм вывода.
С того времени появилось множество других языков программирования. Наиболее известные из них — Basic, C/C++, Pascal и Ada. Языки Basic и Pascal, первоначально созданные для обучения программированию, вышли за пределы учебных заведений и сейчас применяются во многих коммерческих компьютерных системах. Наиболее простым для освоения из перечисленных языков является, пожалуй, Basic. По некоторым оценкам 80% программ для компьютерных систем написано именно на этом языке. Не так давно появилась известная версия этого языка под названием Visual Basic, упростившая разработку программ для операционной системы (ОС) Windows. Не исключено, что Visual Basic со временем потеснит такие языки, как C/C++ и Pascal.
Для разработки управляющих программ в научных приложениях используются языки C/C++ и, реже, Pascal. Оба эти языка, в особенности C/C++, позволяют полностью контролировать вычислительную систему и среду программирования. Во многих случаях C/C++ обеспечивает функции низкого уровня, которые раньше можно было реализовать только на языке ассемблера. Тем не менее язык ассемблера по-прежнему сохраняет свои позиции. Так, большинство компьютерных игр почти
10 Идея вычислительной машины, хранящей инструкции в памяти наряду с данными, предложена математиком Джоном фон Нейманом. Любой компьютер, построенный по этому принципу, относится к классу машин фон Неймана. (Хотя Бэббидж пытался реализовать эту идею задолго до Неймана.) — Пер.
11 Точнее, арифметических выражений с плавающей точкой. — Пер.
полностью написано на этом языке. Ассемблер используется совместно с языками C/C++ и Pascal там, где требуется высокая эффективность в управлении вычислительной системой.
Язык Ada применяется, в основном, в системе Министерства обороны США. Этот язык назван в честь графини Августы Ады Байрон — соавтора аналитической машины Бэббиджа.
Эпоха микропроцессоров
Первый микропроцессор — Intel 4004 — представлял собой 4-разрядный однокристальный микроконтроллер с набором команд, состоящим из 45 инструкций, и с адресным пространством 4096 тетрад (тетрада образуется четырьмя двоичными разрядами, или битами). Производительность этого микропроцессора была относительно невысокой (0,05 млн оп./сек), т. к. в качестве элементной базы использовались Р-канальные полевые транзисторы. Главное преимущество в сравнении с вычислительной машиной на электронных лампах ENIAC, весившей около 30 т, состояло, конечно, в том, что микропроцессор весил в миллион раз меньше — около 28 г.
Новому устройству нашлось немало интересных применений: компьютерные видеоигры, что было внове, и небольшие системы управления. Программирование i4004 было трудным из-за его низкой разрядности и жестких ограничений по скорости и памяти. Микропроцессор i4040, выпущенный следующим и последним в ряду 4-разрядных микропроцессоров Intel, отличался лишь большей скоростью. Из аналогичных разработок других фирм наиболее известны устройства компании Texas Instruments, например 4-разрядный микропроцессор TMS-1000. Четырехразрядные микропроцессоры выпускаются до сих пор и применяются в небольших системах управления, например, в микроволновых печах. Эти процессоры широко применяются в калькуляторах — данные там представлены в формате двоично-десятичных чисел (каждая десятичная цифра хранится в 4 битах), а обработка данных некритична по времени.
В 1971 г., когда выгода от производства микропроцессоров стала очевидной, фирма Intel выпустила микропроцессор i8008 — усовершенствованный восьмиразрядный вариант микропроцессора i4004. Адресное пространство памяти в i8008 было расширено до 16 Кбайт12, а число инструкций достигло 48. Тем не менее, вскоре выяснилось, что и этих возможностей недостаточно для новых практических приложений. В 1973 г. Intel разрабатывает более совершенный 8-разрядный микропроцессор — i8080, а через шесть месяцев фирма Motorola выпускает 8-разрядный микропроцессор МС6800. В табл. 1.1 перечислены фирмы, участвовавшие в разработке и выпуске первых 8-разрядных микропроцессоров.
Компании Intel и Motorola до сих пор являются ведущими в разработке новых микропроцессоров. Фирма Zilog занимается, в основном, только производством микропроцессоров; в области разработок их больше интересуют микроконтроллеры. Фирма Rockwell больше не выпускает процессоров, a Motorola, прежде занимавшая половину рынка микропроцессоров, практически сдала свои позиции в этой области.
12 Байт — единица, соответствующая 8 битам, а приставка К — 210 = 1024.
иие в микропроцессоры и компьютеры	 		 Таблица 1.1- Первые 8-разрядные микропроцессоры и их производители			37
'"^^Гпроизводитель		Название микропроцессора	
FairChild	F-8	
Intel	8080	
MOS Technology	6502	
Motorola	MC6800	
National Semiconductor	IMP-8	
Rockwell International	PPS-8	
Zilog
Z-8
Особенности микропроцессора 18080
По сравнению с i8008 процессор i8080 позволяет адресовать больше памяти и располагает дополнительными инструкциями. Скорость выполнения инструкций возросла в десять раз. Если сложение на i8008 требует 20 мкс, что составляет 50000 оп./сек, то аналогичная операция на i8080 занимает всего 2 мкс, что соответствует 500000 оп./сек. Поскольку i8080, в отличие от 18008, является TTL-совмес-тимым13, интерфейсы вычислительных систем на базе i8080 становятся проще и дешевле. Адресное пространство, расширенное в четыре раза, составляет теперь 64 Кбайт. Можно считать, что эпоха микропроцессоров началась именно с i8080, благодаря предпринятым в нем улучшениям. Кстати, в 1974 г. фирмой MITS был выпущен первый персональный компьютер Альтаир 880014. Номер 8800 в названии отражает наличие процессора i8080, что не нарушало авторских прав корпорации Intel. Для этого компьютера были написаны транслятор с языка ассемблера и интерпретатор языка Basic. Ассемблер был разработан корпорацией Digital Research, которая в дальнейшем выпустила операционную систему DR-DOS, а автором интерпретатора Basic является Билл Гейтс, в будущем основатель корпорации Microsoft.
Микропроцессор 18085
В 1977 г. корпорация Intel объявила о выпуске обновленной версии i8080 — микропроцессора i8085. На этом разработка 8-разрядных микропроцессоров Intel была закончена. Микропроцессор i8085, отличаясь от i8080 лишь в деталях, обладал более высоким быстродействием: сложение теперь выполнялось не за 2 мкс, а за 1,3 мкс. К дополнительным преимуществам i8085 относятся: встроенный тактовый генератор (с более высокой тактовой частотой) и встроенный системный контроллер. Повышение уровня интеграции в микропроцессоре i8085 положительно отразилось на стоимости и его эксплуатационных характеристиках. Было продано около 100 млн микросхем i8085 — причем, только фирмой Intel; а если принять в расчет сторонних производителей, то более 200 млн экземпляров. Приложения, в которых использу-Тся микропроцессоры i8085, по-видимому, будут востребованы и в будущем. Мик
14 ТП" (Transistor-Transistor Logic) — транзисторно-транзисторная логика.
дик°МПЛеКТ 8800 входил процессор i8080, блок питания, лицевая панель с множеством ин-атоР°в и запоминающее устройство емкостью 256 байт. — Пер.
38
Глава 1
ропроцессор Z-80, разработанный фирмой Zilog и совместимый с i8085 на уровне машинных команд, был раскуплен в количестве 500 млн экземпляров. Таким образом, программы, написанные в системе команд i8O85/Z-8O, выполняются на 700 млн микропроцессоров!
Современные микропроцессоры
В 1978 г. Intel выпускает микропроцессор i8086, а год спустя — i8088. Оба микропроцессора — 16-разрядные, с временем выполнения инструкций около 400 нс, что составляет 2,5 MIPs (Millions of Instruction Per second) или иначе 2,5 млн оп./сек. Кроме того, эти процессоры позволяют адресовать до 1 Мбайт15 памяти, что в 16 раз больше предела, достижимого в системах на базе i8085. Благодаря лучшим возможностям новые микропроцессоры во многих приложениях вытеснили i8085. Еще одно нововведение, ускоряющее цикл отработки инструкций в i8086/88, — это буфер предвыборки, или очередь команд размером от 4 до 6 байт. Во всех последующих поколениях микропроцессоров Intel также используется очередь команд все возрастающего объема.
В результате увеличения объема памяти и введения дополнительных инструкций в 18086/88 область применения микропроцессоров существенно расширилась. В систему команд были впервые введены инструкции умножения и деления, а общее число команд возросло до 20 00016 (в i8008 их было 45, а в i8085 — 246). Микропроцессоры i8086/88 за количество и сложность системы команд получили название CISC — Complex Instruction Set Computers (процессор с полным набором команд). Новые возможности появились и в программировании — не только благодаря изобилию команд, но и в связи с увеличением количества и разрядности внутренних регистров.
В основном, 16-разрядные микропроцессоры обязаны своим появлением и развитием всевозрастающим требованиям к объему памяти. Популярность продукции фирмы Intel вновь подтвердилась в 1981 г., когда корпорация IBM приняла решение о выпуске персонального компьютера на базе микропроцессора i8088. Эффективное функционирование таких приложений, как электронные таблицы, текстовые процессоры, программы для проверки правописания и электронные справочники, требовало памяти гораздо большего размера, чем 64 Кбайт, которое было в ранних 8-разрядных микропроцессорах. Для подобных приложений системы на базе 16-разрядных процессоров i8086/88 обеспечивали доступ к 1 Мбайтам памяти. Конечно, вскоре и этого оказалось недостаточно, что ощущалось, например, при работе с большими базами данных. Поэтому в 1983 г. Intel выпускает усовершенствованный вариант i8086 — микропроцессор i80286.
Микропроцессор i80286
Микропроцессор i80286, хотя и повторяет во многом i8086/88, позволяет адресоваться уже 16 Мбайтам памяти вместо 1 Мбайт. В систему команд включен ряд инст
15 I Мбайт соответствует 1 024 Кбайтам или 1 048 576 байтам = 220 байт.
16 Вероятно, автор принимает в расчет всевозможные сочетания операндов, отражающиеся в машинных кодах команд. Число мнемоник команд в языке ассемблера значительно меньше. — Пер.
введение в микропроцессоры и компьютеры
39
рукций для управления дополнительным объемом памяти (15 Мбайт). Увеличена до 8 МГн тактовая частота, так что некоторые инструкции теперь выполняются не более чем за 250 нс. Внесены изменения в алгоритм выполнения инструкций, в результате чего время их выполнения уменьшилось, в большинстве случаев, в 8 раз.
Микропроцессор i80386
С появлением новых приложений продолжают возрастать требования к скорости вычислений, разрядности данных и объему оперативной памяти. В 1986 г. Intel выпускает 32-разрядный микропроцессор i80386, весьма существенно отличающийся от своих 16-разрядных предшественников. Этот процессор был первым из удачно разработанных микропроцессоров фирмы Intel с 32-разрядной шиной адреса и данных. (Тому предшествовала разработка 32-разрядного микропроцессора iapx-432.) При 32-разрядной шине адреса открывается доступ к 4 Гбайт17 оперативной памяти. В памяти такого объема можно разместить около миллиона страниц текста в коде ASCII. Среди модификаций микропроцессора i80386 отметим i80386SX, с 16-раз-рядной шиной данных и 24-разрядной шиной адреса, что позволяло адресоваться к 16 Мбайтам памяти, а также i80386SL/80386SLC, с 16-разрядной шиной данных и адресным пространством 32 Мбайт, доступным посредством 25-разрядной шины адреса. В процессоре i80386SLC также имелась внутренняя кэш-память, что позволяло обрабатывать данные с более высокой скоростью. В 1995 г. Intel выпускает микропроцессор i80386EX, с 16-разрядной шиной данных, 26-разрядной шиной адреса памяти и 24-разрядной шиной адреса портов ввода-вывода. Этот процессор получил название встроенного персонального компьютера (embedded PC), поскольку в его микросхему были включены необходимые компоненты IBM PC/AT (например, контроллер регенерации динамической памяти).
К приложениям, требующим высокой скорости вычислений и большого объема памяти, относятся, в частности, программные системы с графическим интерфейсом пользователя (Graphic User Interface — GUI). Современные графические дисплеи содержат порядка 256000 и более точек (пикселов). Даже самые простые дисплеи VGA (Variable Graphics Array) имеют разрешение 640 точек по горизонтали и 480 по вертикали. Для смены отображения на экране каждая из этих 307 200 точек должна быть заново нарисована, что требует от процессора высокой скорости (и часто предполагает наличие ускоренного видеоадаптера). К подобным программам относится, в частности, семейство операционных систем Microsoft Windows18. Вместо аббревиатуры GUI часто используется сокращение WYSIWYG — What You See Is What You Get (что видим, тем и располагаем).
Для процессора i80386 характерна не только более высокая скорость и разрядность. Управление памятью в i80386 реализовано на аппаратном уровне, а не на программном, как в предшествующих микропроцессорах, что значительно ускоряет работу с памятью и сокращает необходимый для этого код.
По системе команд микропроцессор i80386 совместим снизу вверх с i8088/86/286. Введены дополнительные инструкции для работы с 32-разрядными регистрами и для
17 1 Гбайт соответствует 1 024 Мбайтам или 1 073 741 824 байтам e 230 байт.
18 Windows — это официально зарегистрированное наименование операционной системы корпорации Microsoft, среди которых в настоящее время распространены: Windows 95, Windows 98, Windows 2000, Windows ME и Windows XP.
40
Глава 1
управления памятью. Кстати, инструкции для управления памятью, включенные в систему команд i80286, совместимы и с i80386.
Микропроцессор I80486
В 1989 г. корпорация Intel выпускает микропроцессор i80486, объединивший в одной микросхеме процессор i80386, арифметический сопроцессор i80387 и внутреннюю кэш-память размером 8 Кбайт. В структуру центрального процессора (Central Processor Unit — CPU) были внесены изменения, позволяющие выполнять около половины инструкций не за два такта, а за один. В результате при тактовой частоте 50 МГц время выполнения таких инструкций составляло 25 нс. По сравнению с i80386 производительность i80486, работающего на той же тактовой частоте, выше на 50%. В дальнейшем был выпущен вариант микропроцессора i80486 с удвоенной тактовой частотой — i80486DX2. В нем базовая тактовая частота (33 МГц) использовалась при доступе к оперативной памяти, а на удвоенной частоте (66 МГц) выполнялись внутренние инструкции. В микропроцессоре i80486DX4 частота была утроена: базовая частота для доступа к памяти по-прежнему составляла 33 МГц, а выполнение инструкции шло на частоте 100 МГц. (Производительность микропроцессора i80486DX4 приблизительно равна производительности микропроцессора Pentium, работающего на частоте 60 МГц.) Также, в i80486DX4 был удвоен объем кэшпамяти — размер ее достиг 16 Кбайт. Аналогичное устройство с тактовой частотой шины данных 40 МГц и внутренней тактовой частотой 120 МГц было выпущено фирмой Advanced Micro Devices (AMD).
Фирмой Intel были выпущены и другие разновидности i80486, известные как под названием Overdrive-процессоров. Процессор Overdrive — это i80486DX с удвоенной тактовой частотой, предназначенный для замены i80486SX или варианта i80486DX, работающего на частоте материнской платы. Например, при замене i80486SX, работающего на тактовой частоте 25 МГц, на Overdrive-процессор, частота шины данных остается прежней, но внутренние инструкции выполняются на частоте 50 МГц. В табл. 1.2 приведены сведения о микропроцессорах фирм Intel и Motorola, с указанием разрядности шины данных, размерности кэш-памяти и адресного пространства оперативной памяти.
Таблица 1.2. Адресное пространство и разрядность шины данных процессоров Intel и Motorola
Фирма-производитель	Микропроцессор	Разрядность шины данных (бит)	Адресное пространство и размер кэш-памяти
Intel	8048	8	2 Кбайт (встроенная память)
	8051	8	8 Кбайт (встроенная память)
	8085А	8	64 Кбайт
	8086	16	1 Мбайт
	8088	8	1 Мбайт
	8096	16	8 Кбайт (встроенная память)
	80186	16	1 Мбайт
	80188	8	1 Мбайт
введение в микропроцессоры и компьютеры
41
Таблица 1.2 (окончание)
Фирма-производитель	Микропроцессор	Разрядность шины данных (бит)	Адресное пространство и размер кэш-памяти
	80251	8	16 Кбайт (встроенная память)
	80286	16	16 Мбайт
	80386ЕХ	16	64 Мбайт
	80386DX	32	4 Гбайт
	80386SL	16	32 Мбайт
	80386SLC	16	32 Мбайт + 1 Кбайт кэш
	80386SX	16	16 Мбайт
	80486DX/DX2	32	4 Гбайт + 8 Кбайт кэш
	80486SX	32	4 Гбайт + 8 Кбайт кэш
	80486DX4	32	4 Гбайт + 16 Кбайт кэш
	Pentium	64	4 Гбайт + 16 Кбайт кэш
	Pentium Overdrive (Р24Т), на замену i80486	32	4 Гбайт + 16 Кбайт кэш
	Pentium Pro processor	64	64 Гбайт + 16 Кбайт Ll-кэш + 256 Кбайт 12-кэш
	Pentium II	64	64 Гбайт + 32 Кбайт Ll-кэш + 512 Кбайт 12-кэш
	Pentium II Xeon	64	64 Гбайт + 32 Кбайт Ll-кэш + 512 Кбайт или 1 Мбайт 12-кэш
	Pentium III. Pentium 4	64	64 Гбайт + 32 Кбайт И-кэш +
			256 Кбайт 12-кэш
Motorola	6800	8	64 Кбайт
	6805	8	2 Кбайт
	6809	8	64 Кбайт
	68000	16	16 Мбайт
	68008Q	8	1 Мбайт
	68008D	8	4 Мбайт
	68010	16	16 Мбайт
	68020	32	4 Гбайт
	68030	32	4 Гбайт + 256 байт кэш
	68040	32	4 Гбайт + 8 Кбайт кэш
	68050	32	Не был выпущен
	68060	64	4 Гбайт + 16 Кбайт кэш
	PowerPC	64	4 Гбайт + 32 Кбайт кэш
42
Глава 1
Микропроцессор Pentium
Микропроцессор Pentium, выпущенный в 1993 г., продолжает линию процессоров i80386/80486. (Названия Р5 и 80586, первоначально присвоенные этому микропроцессору, не были приняты официально ввиду сложностей патентования.) Первоначальные реализации процессора Pentium работали на тактовой частоте 60 и 66 МГц, с производительностью ПО млн оп./сек. Имелись также модификации, работающие на полуторной (100 МГц, 150 млн оп./сек) и на удвоенной частоте (120 и 133 МГц). Самый быстрый вариант Pentium, выпущенный фирмой Intel, работал на частоте 233 МГц. Общий объем кэш-памяти в Pentium составлял 16 Кбайт, в отличие от базовых версий процессора i80486, причем кэш данных (8 Кбайт) был выполнен отдельно от кэша инструкций (8 Кбайт). Адресное пространство в Pentium составляет 4 Гбайт. Частота шины данных по сравнению с i80486 возросла вдвое (60/66 МГц вместо 33 МГц), а ее размерность расширена до 64 бит. Расширение размерности шины данных дает значительное преимущество при работе с действительными числами удвоенной точности, что требуется, например, в приложениях, использующих векторную графику. Позднее система команд Pentium была расширена группой инструкций MMX (MultiMedia eXtention), ориентированных на мультимедийные приложения; правда, вопреки ожиданиям, MMX-команды не получили широкого практического применения.
Затем появился долгожданный вариант Pentium Overdrive (Р24Т), имеющий целью модернизацию старых систем на базе микропроцессора i80486. Overdrive-процессор с частотой 63 МГц позволял заменить i80486DX2, работающий на частоте 50 МГц, а Overdrive с частотой 83 МГц позволял заменить i80486DX2 в системе, работающей на частоте 66 МГц. Последний вариант по скорости занимал промежуточное положение между обычными процессорами Pentium, работающими на частотах 66 и 75 МГц.
По-видимому, наиболее существенная особенность Pentium — это наличие сдвоенного ядра процессора^, способного одновременно выполнять пару взаимнонезависимых инструкций. В результате, на Pentium возможно выполнение двух инструкций всего за один такт. Процессоры, в которых используется принцип одновременного выполнения, называются суперскалярными. Еще одно нововведение, также способствующее повышению производительности процессора Pentium при отработке циклов, — блок предсказания переходов. Кроме того, в Pentium имеется встроенный сопроцессор, который работает в пять раз быстрее аналогичного сопроцессора, входящего в микропроцессор i80486. Не исключено, что благодаря перечисленным особенностям процессоры семейства Pentium вытеснят некоторые из /?Л£С-процессоров19 20, способных выполнять одну инструкцию за один такт. Заметим, что некоторые RISC-процессоры, выполненные по суперскалярной технологии, выполняют за один такт более одной инструкции. Например, процессор PowerPC, RISC-процессор, выпущенный фирмами Motorola, Apple и IBM, имеет сдвоенное ядро центрального процессора и один сопроцессор. На базе этого RISC-процессора создан персональный компьютер Apple Macintosh с превосходной производительностью —• хотя и недостаточной для программной эмуляции современных микро
19 Ядро процессора — это основная составляющая часть процессора, осуществляющая выполнение команд. В ядро входит арифметико-логическое устройство (АЛУ) и конвейер команд.
20 RISC (Reduced Instructions Set Computer) — процессор с сокращенным набором команд. — Пер.
введение в микропроцессоры и компьютеры
43
процессоров Pentium. По результатам тестов, производительность эмулятора IBM PC на Apple Macintosh соответствует производительности микропроцессора Intel 80486SX на частоте 25 МГц. Вместе с тем, число персональных вычислительных систем на базе процессоров Intel на сегодня достигло 260 млн (по данным 1998 г. на 96% этих систем установлена ОС Windows). В то же время, число экземпляров Apple Macintosh достигло всего лишь 6 млн Отсюда можно сделать вывод, что потребность в микропроцессорах Intel в ближайшем будущем сохранится.
Для сопоставления скоростей различных процессоров фирма Intel ввела показатель iCOMP (Intel Comparative Microprocessor Performance), выводимый по результатам тестов SPEC92, ZD Bench и Power Meter. На рис. 1.2 приведены значения iCOMPl для процессоров Intel, от i80386SX 16 до Pentium 200 (число справа — тактовая частота в МГц).
Примечание_______________________________________________________
Символом "звездочка" (*) на рис. 1.2 отмечены процессоры Pentium Overdrive; в процессоры Pentium 166/200 включены команды мультимедийного расширения ММХ (MultiMedia extension).
Pentium 200
Pentium 166
Pentium 133
Pentium 120
Pentium 100
Pentium 90
Pentium 75
Pentium 83*
Pentium 66
Pentium 60
Pentium 63*
486 DX4 100 486 DX4 75
486 DX2 66
486 DX 50
486 DX2 50
486 SX2 50
486 DX 33
486 SX2 40
486 SX 33
486 DX 25 486 SX 25
486 SX 20
386 DX 33
386 SX 33
386 DX 25
386 SX 25
386 SX 20 386 SX16
0	100 200 400 600 800 1000 1200 1400 1600 1800
Примечание: *= Pentium OverDrive
1810
Рис. 1.2. Результаты тестов микропроцессоров по показателю iCOMPl
К моменту выпуска Pentium Pro и Pentium II фирма Intel использует вместо iCOMl показатель iCOMP2. Значение iCOMP2 для процессоров предыдущих поколений
44
Глава 1
составляет I/IO значения iCOMPl. Например, процессор со значением iCOMPl = 1 000 характеризуется iCOMP2 = 100. Кроме того, несколько изменилась методика тести-
Примечание: * В Pentium II Celeron кэш-память отсутствует.
Для преобразования приведенных индексов iCOMP2 в индексы ЮОМРЗ их следует умножить на коэффициент 2,568.
Рис. 1.3. Результаты тестов микропроцессоров по показателю iCOMP2
введение в микропроцессоры и компьютеры
45
Примечание_________________________________________________________
Символом "звездочка" (*) на рис. 1.3 отмечен процессор Pentium II Celeron; для получения показателя ЮОМРЗ значения ЮОМР2 следует умножить на 2,568. Celeron — это официально зарегистрированное наименование микропроцессора корпорации Intel.
Pentium Pro
Микропроцессор Pentium Pro (первоначальное название — Р6) выпущен Intel в конце 1995 г. Он содержит 21 млн транзисторов, ядро, состоящее из трех конвейеров, и арифметический сопроцессор. Первые экземпляры Pentium Pro работали на частоте 150 и 166 МГц. В дополнение к кэш-памяти первого уровня (L1) объемом 16 Кбайт (8 Кбайт кэш данных и 8 Кбайт кэш команд) в Pentium Pro введен кэш второго уровня (L2) объемом 256 Кбайт. Поскольку процессор имеет три конвейера, возможно выполнение до трех команд за один такт, причем, в отличие от Pentium, одновременное выполнение возможно даже при конфликтующих сочетаниях инструкций. Обработка 32-разрядных данных в Pentium Pro оптимизирована, поскольку этот процессор предназначался для построения серверов. Адресное пространство увеличено до 64 Гбайт; ширина шины адреса — 36 бит.
Pentium II и Pentium Хеоп
Микропроцессор Pentium II, выпущенный в 1997 г., стал совершенно новым для процессоров Intel с точки зрения конструкции. Процессор выполнен не в виде интегральной микросхемы, а в виде компактной печатной платы21, на которой дополнительно установлена кэш-память второго уровня (L2). В Pentium кэш L2 работал на частоте системной шины — 60/66 МГц. В Pentium II кэш L2 (объемом 512 Кбайт) и процессор объединены в модуле Pentium II. Кэш L2 в этой системе функционирует на частоте 133 МГц. Процессор в составе модуля Pentium II — это по сути Pentium Pro (с поддержкой ММХ), но без встроенной кэш-памяти второго уровня.
Pentium II, при внутренней тактовой частоте 26^/333 МГц, выполнял доступ к памяти на частоте всего 66 МГц. В 1998 г. тактовая частота шины данных была поднята до 100 МГц; это значение использовалось в Pentium II 350/400/450, что потребовало уменьшения времени цикла обращения к динамической памяти с 10 до 8 нс.
В середине 1998 г. корпорация Intel объявила о выпуске новой версии Pentium 11 — Pentium Хеоп. Новый процессор был специально разработан для серверов и сильно нагруженных рабочих станций. Процессор Хеоп, по сравнению с Pentium II, обладает большей кэш-памятью: L1 — 32 Кбайт, L2 — 512 Кбайт, или 1 Мбайт, или даже 2 Мбайт. Некоторые особенности процессора Pentium Хеоп — он работает с чипсетом22 440GX, и на его основе возможно построение 4-процессорной системы (в этом подобен Pentium Pro). Выпуск Pentium II Хеоп в дополнение к Pentium 11 означал изменение в стратегии корпорации Intel: выполнять каждый новый процессор в двух версиях — профессиональной и бытовой.
21 Тип корпуса — картридж с односторонним контактом (Single Edge Contact — SEC). — Пер.
22 Чипсет — это набор микросхем, устанавливаемых на материнскую плату и предназначенных для обеспечения обмена данными между процессором, оперативной памятью и различными внешними устройствами. — Ред.
введение в микропроцессоры и компьютеры
47
должен был появиться в 1999 г., но из-за ряда технических проблем этого так и,не произошло. В октябре 1999 г. корпорация Intel заявила о разработке нового 64-раз-рядного процессора под названием Itanium. Процессор появился на рынке в середине 2001 г. Архитектура процессора была построена на основе технологии EPIC (Explicitly Parallel Instruction Computing — вычисления с явным параллелизмом команд), которая по уровню параллелизма значительно превосходит традиционную архитектуру Р6. Процессор был анонсирован для серверов масштаба предприятий, компьютеров, работающих с большими базами данных, систем автоматизированного проектирования, высокопроизводительных вычислений и т. л. Начиная с середины 2002 г. корпорация Intel выпустила второго представителя семейства процессоров Itanium — микропроцессор Itanium 2 с тактовой частотой 900 МГц и 1,2 ГГц и с объемом интегрированной кэш третьего уровня (L3), равного 1,5 и 3 Мбайт.
Рис. 1.4 иллюстрирует основные особенности структур процессоров Intel — от 80486 до Pentium 4.
Ядро	Ядро	Сопроцессор
Кэш L1 16 Кбайт		
Pentium
Pentium II, Pentium III и Pentium 4
Рис. 1.4. Структурные отличия микропроцессоров 80486, Pentium Pro, Pentium II, Pentium III и Pentium 4
46
Глава 1
Pentium III
Хотя в процессоре Pentium III применено более быстродействующее ядро, это по-прежнему все тот же процессор Р6 (Pentium Pro). Конструктивные версии Pentium III — в корпусе S.E.C.C.2 (Single Edge Contact Catridge), устанавливаемый в Slot 1, и в корпусе PPGA (Plastic Pin Grid А(гау), под названием flip-chipPGX, устанавливаемый в Socket 370. Последний вариант по своей конструкции напоминает процессор Pentium и, по утверждению корпорации Intel, имеет меньшую стоимость. В обоих вариантах тактовая частота достигает 1 ГГц. Кэш-память в первом варианте составляет 512 Кбайт, а во втором — 256 Кбайт. Вместе с тем, в первом варианте кэш работает на половинной частоте, так что указанные варианты Pentium III различаются по скорости незначительно. Частота системной шины в обоих вариантах составляет 100 МГц (Intel Celeron использует частоту 66 МГц). В остальных магистралях, предназначенных для соединения с конгроллерами, такими как контроллер PCI, контроллер памяти или контроллер AGP, применяется тактовая частота 100 или 133 МГц.
Pentium 4
Последнее детище корпорации Intel, микропроцессор Pentium 4, появился в конце 2000 г. В нем сохранена прежняя архитектура Р6. Выигрыш достигнут за счет подъема тактовой частоты до 1,3/1,4/1,5 ГГц, что стало возможным благодаря прогрессу технологии микросхем. Чипсет, который обеспечивает работу Pentium 4, использует технологию памяти RAMBUS взамен прежней технологии SDRAM (Synchronous Dynamic Random Access Memory). Интересно отметить, что размер кэш-памяти первого уровня сокращен до 8 Кбайт. Как выяснилось, 8 Кбайт вполне достаточно для первой модели Pentium 4; в дальнейшем объем L1, возможно, будет увеличен до 32 Кбайт. Кэш L2 остался прежним, как в Pentium III — 256 Кбайт.
Переход в Pentium 4 к ’’медной" технологии позволил существенно повысить тактовую частоту шин. (Медь является лучшим проводником, но технология ее применения в микропроцессорах была освоена не так давно.) В результате тактовая частота системной шины уже в первых версиях Pentium 4 достигла и превысила 400 МГц.
Будущее микропроцессоров
Можно утверждать, что в ближайшие годы микропроцессорам Intel успех гарантирован. Не исключено, что технология RISC-процессоров также будет усовершенствована, но более вероятным представляется выпуск нового CISC-процессора в результате исследований, проводимых совместно фирмами Intel и Hewlett-Packard. Тогда CISC-процессоры и разработанное для них программное обеспечение сохранят свои позиции. Новые технологии будут основаны на параллельной обработке и прямом межпроцессорном взаимодействии. Если в суперскалярной архитектуре взаимодействующие процессоры используют все-таки общий набор регистров, то в новой технологии каждый из процессоров будет иметь свой набор регйстров, но эти наборы будут доступны всем процессорам. Предполагается, что параллельность работы процессоров будет обеспечиваться полностью на аппаратном уровне, без программной поддержки.
Еще в 1994 г. корпорация Hewlett-Packard объявила о начале работы над 64-разряд-ными процессорами. Первый подобный процессор под кодовым названием Merced
введение в микропроцессоры и компьютеры
47
должен был появиться в 1999 г., но из-за ряда технических проблем этого так и,не произошло. В октябре 1999 г. корпорация Intel заявила о разработке нового 64-раз-рядного процессора под названием Itanium. Процессор появился на рынке в середине 2001 г. Архитектура процессора была построена на основе технологии EPIC (Explicitly Parallel Instruction Computing — вычисления с явным параллелизмом команд), которая по уровню параллелизма значительно превосходит традиционную архитектуру Р6. Процессор был анонсирован для серверов масштаба предприятий, компьютеров, работающих с большими базами данных, систем автоматизированного проектирования, высокопроизводительных вычислений и т. л. Начиная с середины 2002 г. корпорация Intel выпустила второго представителя семейства процессоров Itanium — микропроцессор Itanium 2 с тактовой частотой 900 МГц и 1,2 ГГц и с объемом интегрированной кэш третьего уровня (L3), равного 1,5 и 3 Мбайт.
Рис. 1.4 иллюстрирует основные особенности структур процессоров Intel — от 80486 до Pentium 4.
Ядро	Ядро	Сопроцессор
Кэш L1 16 Кбайт		
Pentium
Pentium II, Pentium III и Pentium 4
Рис. 1.4. Структурные отличия микропроцессоров 80486, Pentium Pro, Pentium II, Pentium III и Pentium 4
48
Глава 1
1.2. Персональные вычислительные системы на базе микропроцессоров
Современные вычислительные системы по сравнению с первыми ламповыми ком» пьютерами изменились неузнаваемо. Машины, некогда занимавшие площадь в сотни квадратных метров, теперь, благодаря развитию микропроцессоров, при невиданной ранее производительности помещаются на письменном столе. Даже процессор 180486 обладает вычислительной мощностью, превосходящей возможности больших вычислительных машин (mainframe23) 80-х гг. стоимостью около миллиона долларов. Многие фирмы, такие как, например, DEC (Digital Equipment Corporation), давно закончили выпуск mainframe в пользу микропроцессорных систем.
В этом разделе мы рассмотрим структуру персональных вычислительных систем на базе микропроцессоров, в частности, состав памяти и характеристики операционной системы.
На рис. 1.5 показана блок-схема персонального компьютера. Представленная блок-схема отражает структуру произвольной вычислительной системы, от больших вычислительных машин до современных микрокомпьютеров.
Системная память
Внешние устройства
Динамическая память RAM (DRAM)	8086
Статическая память RAM (SRAM)	8088
Кэш	80186
Постоянная память (ROM)	80188
Флэш-память	80286
EEPROM	80386
SDRAM	80486
RAMBUS	Pentium
Pentium Pro Pentium II Pentium III Pentium 4
Принтер СОМ-порты Накопители на гибких дисках Винчестеры Мышь
Привод CD-ROM
Плоттер
Клавиатура
Дисплей
Стример Сканер Привод DVD
Рис. 1.5. Блок-схема микропроцессорной вычислительной системы
Компьютер состоит из трех основных блоков, соединенных между собой шинами. Шина — это набор проводников для передачи однотипной информации; например, шина адреса, которая содержит 20 и более проводников, передает в блок памяти адрес ячейки памяти. Рассмотрим назначение блоков, показанных на рис. 1.5.
23 Mainframe — (мэйнфрейм) главный компьютер вычислительного центра. Обычно это многопользовательская большая супермини- или мини-ЭВМ. — Ред.
Введение в микропроцессоры и компьютеры	49
Память и система ввода-вывода
Структура памяти, показанная на рис. 1.6, одинакова для всех компьютерных систем, построенных на базе процессоров Intel, от i8088 до Pentium 4.
Рис. 1.6. Структура памяти персонального компьютера
Память разделяется на три части: память для транзитных программ — ТРА (Transient Program Area) или иначе стандартная память (Conventional memory), системная область и расширенная память — XMS (Extended Memory System). Наличие XMS определяется типом микропроцессора. В системах PC24 и XT25, построенных на микропроцессорах i8086/88, расширенная память отсутствует. В компьютерах класса IBM PC/XT область ТРА составляет 640 Кбайт, системная область или иначе верхняя па-мять UМА (Upper Memory Area) занимает 384 Кбайт — итого I Мбайт. Область памяти размером I Мбайт, расположенная в начале адресного пространства, иногда называется реальной (real), поскольку она доступна в реальном режиме любому микропроцессору семейства Intel 80x86.
Расширенная память доступна для процессоров от 80286 до Pentium 4. Персональные компьютеры на базе этих процессоров называются машинами класса АТ26. Системы PS/1 и PS/2, выпущенные фирмой IBM, также имеют доступ к расширенной памяти. Их иногда называют ISA- или EISA-машинами (ISA — Industry Standard Architecture, EISA - Extended ISA) по названию используемой системной шины. Для вычислительных систем PS/2 соответственно принято название МСА-систем (Micro Channel27 Architecture).
PC (Personal Computer) товарная марка корпорации IBM для обозначения персональных компьютеров.
25 Х*Г _ /р;
(extended Technology) товарная марка корпорации IBM для обозначения персональных омпьютеров, изготовленных по расширенной технологии.
АТ
Ко (Advanced Technology) товарная марка корпорации IBM для обозначения персональных 27 Пьютеров, изготовленных по современной передовой технологии.
Cro“ChanneI — торговый знак корпорации IBM. — Пер.
50
Глава 1
В системах на базе Pentium—Pentium 4 вместо шины ISA используется, в основном, шина PC/ (Peripheral Component Interconnect). С появлением микропроцессора i80286 расширенная память становится доступна, ее размер пока ограничивается 15 Мбайтами. В персональных компьютерах на базе 80386DX, 80486 и Pentium мак-симальный размер XMS составляет 4095 Мбайт — в дополнение к I Мбайтам реальной памяти. Начиная с Pentium Pro, предельный объем XMS-памяти достигает 4 или 64 Гбайт. В ISA-машинах имеется 8-разрядная периферийная шина для обмена с 8-разрядными внешними устройствами системы PC/XT. В машинах класса АТ, которые также называются ISA-машинами, используются 16-разрядная периферийная шина и процессор от i80286 и выше. Шина EISA шириной 32 бита не нашла широкого применения; сейчас ее можно обнаружить в некоторых старых машинах на базе i80386DX или i80486. Заметим, что все новые версии шины ISA были совместимы с предшествующими. Так, 8-битная плата расширения могла работать со всеми шинами ISA: 8- и 16-битной ISA и 32-битной EISA. Аналогично, внешнее устройство с 16-разрядным интерфейсом могло функционировать с 16-разрядной шиной ISA или с 32-разрядной шиной EISA.
Во многих персональных компьютерах на базе i80486 использовалась локальная шина VESA (Video Electronic Standard Association), или точнее VL-bus. Локальная шина позволяет подключать дисковые накопители и видеосистему к микропроцессору отдельно от других устройств. За счет локальности шины реализуется 32-битный интерфейс на частоте процессора. Последняя версия шины VESA поддерживала 64-битный обмен данными с Pentium, что, несмотря на возможность конкуренции локальной шины (VL-bus) с шиной РС1, не вызвало особого интереса у разработчиков персональных вычислительных систем. Шины ISA и EISA работают на частоте всего лишь 8 МГц, что ограничивает производительность системы при работе с дисками и видеоадаптерами. Тактовая частота шины PCI — 33 МГц, разрядность составляет 32 или 64 бита. Эта шина была специально разработана для систем на базе Pentium.
В последние модели компьютеров включены две новые шины. Первая — это USB (Universal Serial Bus, что означает универсальная последовательная шина). Интерфейс USB предназначен для подключения к микропроцессору периферийных устройств (клавиатуры, мыши, модема, звуковой карты и т. д.) через последовательный канал связи типа витой пары. С уменьшением числа проводов система становится дешевле и надежней. Кроме того, звуковая система может теперь использовать собственный источник питания, отдельный от PC, что позволяет снизить уровень шума. На сегодняшний день интейфейс USB обеспечивает скорость передачи 10 Мбит/с; в стандарте USB-2 предполагается повышение скорости до 100 Мбит/с.
Еще одна из новых шин — AGP (Advanced Graphics Port) — предназначена для обмена данными с видеоадаптером. Частота шины AGP составляет 66 МГц, разрядность — 64 бита, что обеспечивает рекордную скорость обмена — 533 Мбайт/с. Разработка этой шины была обусловлена появлением накопителей DVD (Digital Versatile Disk или Digital Video Disk — универсальный цифровой диск или цифровой видеодиск).
ТРА
В области транзитных программ ТРА, или иначе в стандартной памяти, размешаются операционная система DOS (Disk Operating System) и другие программы для управления компьютерной системой. В ТРА также хранятся все приложения DOS —
51
111Лв в микропроцессоры и компьютеры -------------
ie и неактивные в текущий момент. Размер ТРА составляет 640 Кбайт. После a**’ MS-DOS 1.x для приложений остается около 628 Кбайт свободной памяти. заГтим, что Ранние версии DOS требовали больше оперативной памяти, оставляя ^аМС0^ениЯМ не более 530 Кбайт. Вместо MS-DOS (Microsoft Disk Operating System) nPHJlT использоваться совместимая с ней операционная система, например, РС-MOS (Personal Computer Disk Operating System) (разработка фирмы IBM). ОС P. dows и OS/2 также обеспечивают выполнение приложений DOS. Операционная WLreMa DOS (Disk Operation System) организует и контролирует данные дисковых С копителей, а также предоставляет прикладным программам средства для управле-Н я устройствами ввода-вывода. ОС Windows обеспечивает аналогичные функции Windows-приложений. Структура ТРА (стандартной памяти) в компьютере с установленной операционной системой MS-DOS показана на рис. 1.7.
9FFFF
9FFF0
Транзитный модуль COMMAND.COM
Свободная память
08Е30
08490
02530
01160
00700
00500
00400
00000
Резидентный модуль COMMAND.COM
Драйверы
MSDOS.SYS
IO.SYS
Область данных DOS
Область данных BIOS
Таблица векторов прерываний
Рис. 1.7. Структура ТРА при наличии операционной системы MS-DOS
На карте памяти, представленной на рис. 1.7, показаны многочисленные области занятые системными программами, данными и драйверами, а также обширная 0 ласть памяти для прикладных программ. Слева проставлены адреса, представление в шестнадцатеричной системе — на границам областей памяти. Шестнадцате-чное число — это обозначение числа в системе счисления с основанием 16, с по-оц1ью знаков 0—9 и A—F. Чтобы отличать шестнадцатеричные числа от десятич-иЫх’ в конце шестнадцатеричных обычно записывается буква Н (hexadecimal), апРимер, 1234Н. Возможно и такое обозначение — 0x1234.
и Ласть векторов прерываний обеспечивает приложениям доступ к функциям DOS Bbq05060^ системы ввода-вывода (BIOS — Basic Input Output System). Базовая система ^-вывода представляет собой набор программ, записанных в энергонезависимой
52
Глава 1
памяти — либо в постоянном запоминающем устройстве (ПЗУ), иначе по-английски ROM (Read-Only Memory), либо во флэш-памяти. Программы BIOS обеспечивают управление основными устройствами ввода-вывода. Заметим, что флэш-память относится к типу EEPROM (Electrically Erasable Programmable Read-Only Memory), т. e. является электрически стираемой, причем перезапись содержимого возможна средствами самого же компьютера. Напротив, запись EPROM выполняется на отдельном устройстве, которое называется программатором EPROM (Erasable Programmable Read-Only Memory), или в заводских условиях. Программы BIOS находятся в системной области памяти, структура которой рассмотрена далее.
В областях данных BIOS и DOS хранятся данные, обеспечивающие прикладным программам доступ к устройствам ввода-вывода и настройкам системы. Подробнее состав областей данных BIOS и DOS см. в Приложении 1. Эти данные находятся в памяти, доступной для чтения и записи, называемой ОЗУ (Оперативное Запоминающее Устройство), или иначе по-английски RAM (Random Access Memory), и поэтому могут быть изменены прикладными программами.
Модуль расширения BIOS, хранящийся в файле IO.SYS (MS-DOS) или IBMBIO.COM (PC-DOS), загружается в память с диска при запуске соответствующей операционной системы. В нем содержатся подпрограммы, обеспечивающие в DOS работу с клавиатурой, дисплеем, принтером и с другими часто используемыми устройствами ввода-вывода. Подпрограммы IO.SYS связывают DOS с процедурами ROM BIOS.
После загрузки DOS занимает две области памяти. Первая, длиной 16 байт, находится на вершине ТРА. Эту область занимает транзитный модуль командного процессора COMMAND.COM. Вторая, значительно большего размера, находится в начале ТРА. Размер и расположение областей DOS зависят от версии и конфигурации DOS. Например, если DOS загружается в область высокой памяти (НМА — High Memory Area), находящуюся выше 1 Мбайт и доступную при установке драйвера Hl MEM.SYS в реальном режиме работы процессора, то большая часть ТРА остается свободной для прикладных программ. Следует отметить, что высокая память (НМА) доступна только в системах с микропроцессором i80286 и выше.
Размер области драйверов и количество таких областей зависят от настройки системы. Драйвер — это программа для управления периферийным устройством: мышью, электронным диском, ручным сканером, накопителями CD-ROM (Compact Disk Read-Only Memory) или DVD (Digital Versatile Disk или Digital Video Disk — универсальный цифровой диск или цифровой видеодиск). Инсталлируемые драйверы обеспечивают управление устройствами, дополняющими вычислительную систему. Чаще всего драйверам дают расширение SYS, например MOUSE.SYS; в DOS 3.2 и выше используется также расширение ЕХЕ, например EMM386.EXE. Поскольку персональные системы настроены все по-разному, количество драйверов и суммарный размер занимаемой ими памяти — величины непостоянные. Хотя эти файлы не нужны для операционной системы Windows, они все же используются в сеансах DOS, даже в среде Windows. Загрузка драйверов в Windows определяется файлом SYSTEM.INI. В новых версиях Windows для хранения информации о системе и загружаемых драйверах используется системный реестр, содержимое которого доступно посредством утилиты REGEDIT.EXE.
Программа COMMAND.COM, или иначе командный процессор, выполняет команды, вводимые с клавиатуры в режиме командной строки. Например, при вводе команды DIR программа COMMAND.COM отображает на экране названия дисковых фай
Введение в микропроцессоры и компьютеры
53
лов текущего каталога. Ни в коем случае не следует удалять программы COMMAND.COM и IO.SYS, пытаясь освободить память для прикладных программ — компьютер не будет работать. Эти программы могут быть установлены заново при помощи утилиты SYS.COM из каталога DOS (или из каталога WIN DOWS/COM MAN D).
В оставшиеся области ТРА загружаются прикладные программы (текстовые процессоры, электронные таблицы, системы автоматизации проектирования и т. п.) на время их выполнения. В ТРА также помещаются резидентные программы (TSR — Terminate and Stay Resident), которые после их завершения остаются в памяти и активизируются либо нажатием "горячей" клавиши, либо наступлением какого-либо иного события, связанного с аппаратными или программными прерываниями. Пример TSR-программы — калькулятор, активизируемый нажатием комбинации клавиш, например, <Alt>+<C>. TSR-программы такого типа часто называют всплывающими (pop-up), поскольку при активизации они оказываются "наверху", вытесняя прерванную программу. Если установлена система Windows, то она использует часть ТРА для хранения управляющей информации, применяемой для доступа к расширенной памяти.
Системная область
Системная область, или иначе верхняя память (UMA — Upper Memory Area), хотя и меньше по размеру, чем ТРА, но также является очень важной. Она, как правило, содержит программы, хранящиеся ПЗУ (ROM) или в энергонезависимой флэш-памяти, и данные в памяти, предназначенной как для чтения, так и для записи (RAM). Содержимое системной области показано на рис. 1.8.
FFFFF
F0000
ЕОООО
ROM BIOS
ПЗУ Basic (в ранних моделях PC)
Свободная область
ПЗУ винчестеров и сетевых карт
С8000
СОООО
воооо
АОООО
Рис. 1.8. Содержимое системной области
ПЗУ видео-BIOS
Видеопамять (текстовый режим)
Видеопамять (графический режим)
В начале системной области (по адресам АООООН—C7FFFH) находятся видеопамять и программы для обслуживания видеосистемы — видео-BIOS, хранящейся в ПЗУ (ROM) или во флэш-памяти. Размер используемой памяти зависит от типа видео
54 Глава/j
адаптера — CGA (Color Graphics Adapter), EGA (Enhanced Graphics Adapter) или’ VGA (Variable Graphics Array). В общем случае, видеопамять в диапазоне адресов. A0000H—AFFFFH предназначена для графических данных; текстовые данные хранятся по адресам B0000H—BFFFFH. Некоторые из недавно выпущенных видеоадаптеров могут адресовать области и большего размера в области верхней памяти; эта возможность поддерживается Windows. Некоторые видеоадаптеры обращаются к области видеопамяти Windows в диапазоне адресов Е1800000Н—E2FFFFFF. Управление видеоадаптерами в DOS обеспечивается видеофункциями BIOS, расположенными в ПЗУ (ROM) или во флэш-памяти по адресам C0000H—C7FFFH.
Адаптеры MFM- и RLL-винчестеров28 29 содержат постоянную память с программой низкоуровневого форматирования, расположенной по адресу С8005Н. Размер ПЗУ и его положение в адресном пространстве зависят от типа винчестера. Большинство IDE-винчестеров не содержат встроенного программного обеспечения в ПЗУ, но во многих SCSI-винчестерах оно имеется.
Память в диапазоне адресов С8000Н—DFFFFH чаще всего свободна. Ее используют для отображения страниц дополнительной1* или иначе отображаемой памяти (Expanded Memory System — EMS) в PC/XT или для работы с верхней памятью (UMA) в АТ-системах. Доступ к отображаемой памяти обеспечивается посредством верхней памяти за счет страничного отображения. Кадр страницы (page frame), или иначе окно размером 64 Кбайт, расположенный в свободной области верхней памяти (LIMA), например, по адресам D0000H—DFFFFH, отображает такой же объем дополнительной памяти блоками по 16 Кбайт. Отображение страниц при использовании EMS показано на рис. 19.
Отображаемая память (EMS)
64 Кбайт Страница 255
64 Кбайт Страница 2
64 Кбайт Страница 1
64 Кбайт Страница О
Рис. 1.9. Отображение страниц при использовании EMS
28 Винчестеры MFM и RLL в PC уже не используются. MFM-винчестеры были стандартом в IBM PC/XT и АТ 286; наиболее известные из них — Seagate ST255 (21,4 Мбайт) и ST251 (42,8 Мбайт). - Пер.
29 Память называется дополнительной, поскольку ранее для расширения объема памяти доступного для DOS свыше 1 Мбайт, применялся отдельный дополнительный адаптер памяти со схемами коммутации банков по 64 Кбайт, вставляемый в слот расширения на материнской плате. — Ред.
55
ние в микропроцессоры и компьютеры
ьзование EMS стандартизировано спецификацией LIM 4.0, разработанной ИсП°Л и Lotus, Intel и Microsoft. Недостатком EMS является ее низкая скорость, Ф^Р^вленная тем, что переключение блоков требует вмешательства EMS-драйвера, о^^вдением процессора i80386 необходимость в EMS отпала30 (разве что для за-С п° старых игр, написанных под DOS), и в большинстве вновь разрабатываемых ПУска ний отображаемой (Expanded) памятью лучше не пользоваться.
прил°
E0000H—EFFFFH в первых моделях IBM PC были заняты ПЗУ с интерпре-языка Basic. В новых системах эта область свободна и используется в качестве RAM.
п ледние 64 Кбайт системной области памяти заняты ROM BIOS — по адресам FO000H—FFFFFH. Здесь находятся тестовая программа POST (Power On Self Test), которая при включении компьютера проверяет все его важнейшие компоненты, ооцедуры для обслуживания основных устройств ввода-вывода компьютерной системы, кроме дисплея (видеофункции находятся в отдельном ROM BIOS, начиная с адреса C0000H), программа CMOS Setup, предназначенная для установки параметров BIOS и конфигурации компьютера, а также программа начальной загрузки системы Bootstrap. В первой части BIOS по адресам F0000H—F7FFFH обычно находятся программы, выполняемые при включении компьютера для его начального тестирования и настройки; вторая часть содержит процедуры базовой системы ввода-вывода. После загрузки системы адреса F0000H—F7FFFH можно использовать в качестве блоков верхней памяти UMA, при установленном драйвере EMM386.EXE. С этой же целью может быть занят блок памяти в диапазоне адресов B0C00H— B7FFFH (видеопамять монохромного дисплея).
Пространство адресов системы ввода-вывода
Пространство адресов системы ввода-вывода PC составляет 64 Кбайт. Адрес порта ввода-вывода, или иначе номер порта, подобен адресу памяти, но используется для обращения к периферийному устройству. Периферийные устройства обеспечивают взаимодействие процессора с внешним миром. Пространство адресов системы ввода-вывода в 64 Кбайт позволяет обращаться к 65 536 различным восьмибитным внешним устройствам, и на сегодня этого более чем достаточно. На рис. 1.10 показано распределение адресов ввода-вывода для типичной компьютерной системы.
В области адресов системы ввода-вывода можно выделить два больших фрагмента.
Рагмент ниже адреса 0400Н зарезервирован для системных устройств, многие из 04плРЫХ показаны на Рис- 1-Ю- Пространство ввода-вывода в диапазоне адресов
Н—FFFFH оставлено для дополнительных устройств, хотя некоторые из совре-нных материнских плат используют и эту область. В общем случае, адреса из диакона 0000H-00FFH имеют отношение к компонентам материнской платы; а диа-Ров %°Т 01 МН до 03FFH предназначен для адресации регистров съемных адапте-Пе0 (Разделение области ввода-вывода на границе 0400Н связано с применением в Дилг?1Х моделях PC шины ISA, которая не позволяет адресовать порты за пределами вазона 0000Н—03FFH.)
30 Про
ПоэтССС°РЬ1’ начиная с i80386, имеют встроенные средства имитации коммутации банков памяти.
(ЕХ( в компьютерах, использующих такие процессоры, можно использовать расширенную nded) память для имитации отображаемой (Expanded) памяти. — Ред.
56
FFFF
Область адресов расширения системы ввода-вывода
03F8
03F0 03D0 0378 0320
02F8
0060 0040 0020 0000
_________СОМ1___________ Контроллер накопителя на гибких дисках Адаптер CGA
LPT1
Контроллер жестких дисков
COM2 ~
Программируемый периферийный интерфейс (микросхема 8255)
Таймер (микросхема 8254)
Контроллер прерываний
Контроллер DMA
Рис. 1.10. Внешние устройства PC в адресном пространстве системы ввода-вывода
Операционная система DOS
Операционной системой (ОС) называется комплекс программ, управляющих работой компьютера. В дальнейшем изложении под операционной системой в основном будет подразумеваться DOS (Disk Operation System) — самая распространенная система, которая применяется, согласно недавней публикации в журнале PC Magazine, в 85% персональных компьютеров — с учетом того, что DOS входит в состав Windows. Операционная система хранится на гибком диске или на одном из разделов жесткого диска (локального или сетевого). В ряде персональных вычислительных систем DOS хранится в постоянной памяти (пример — персональный компькь тер фирмы Tandy Corporation). При включении компьютера операционная система загружается, т. е. копируется в оперативную память с локального или сетевого диска. Будучи загруженной в память, DOS организует функционирование компьютерной системы, в том числе устройств ввода-вывода и прикладных программ. В конце загрузки считывается файл CONFIG.SYS, в котором задана конфигурация системы и указаны драйверы, которые следует дополнительно установить. Заметим, что этот файл не влияет на настройку операционной системы Windows, которая определена отдельно в системном реестре Windows. В примере l.l показан один из вариантов содержимого CONFIG.SYS для DOS. Файл CONFIG.SYS при работе с Windows обычно содержит меньше операторов.
Пример 1.1. Вариант содержимого файла CONFIG.SYS для DOS
REM DOS CONFIG.SYS FILE
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE NOEMS i=c800-efff
57
С:\LASERLIB\SONY_CDU.SYS
C:\DOS\SETVER.EXE
:\MOUSE1\MOUSE.SYS
я микропроцессоры и компьютеры BgegSUH------------
DOS8^ fILES2°io
B°f^C-\DOS\COMMAND,COM C:\DOS\ /Е:2048 /Р S^igh u nrVlCEHlGH
^XlCEHlGH C:\DOS\SETVEK.EXE °EVICEHIGH c: \MOUSE1 \MOUSE. SYS lastdrive=f
и пвый оператор в примере 1.1 начинается с комментария, заданного командой rem mark). В результате, первый оператор при обработке файла CONFIG.SYS игнори-veTCH. Второй оператор задает загрузку драйвера расширенной и высокой (НМА) памяти HIMEM.SYS. Драйвер — это программа, которая управляет периферийным устройством или вмешивается в работу других программ; драйверы загружаются при обработке файла CONFIG.SYS — до запуска прикладных программ. Высокая память (НМА) — это память по адресам 100000Н— 10FEFFH, примыкающая к памяти, ограниченной I Мбайтом, и доступная в системах с процессором 80286 и выше. Размер высокой памяти составляет 64 Кбайт — 16 байт.
В следующих операторах CONFIG.SYS указано число файлов, буферов и стеков, а также количество блоков управления файлами, необходимых для работы прикладных программ. Требуемые значения могут быть указаны в документации на прикладную программу либо они автоматически записываются в CONFIG.SYS при инсталляции программного обеспечения. Если в качестве основной операционной системы используется Windows, установки CONFIG.SYS учитываются ею при запуске DOS-приложений.
Доступ к блокам высокой памяти (НМА) в системах на базе процессора 80386 и выше предполагает загрузку менеджера отображаемой памяти (EMS) — драйвера EMM386.EXE. Загрузка драйвера EMM386.EXE позволяет запускать программы, разработанные для компьютеров на базе 80286 и использующие EMS-память. В примере 1.1 вызов EMM386.EXE задан с несколькими параметрами. Аргумент i*c8oo-efff определяет диапазон адресов области в стандартном адресном пространнее, предназначенной для блоков верхней памяти (Upper Memory Block — UMB). ^еРед заданием значений для параметра i следует убедиться, что эта область памяти пересекается с системными программами или с данными в ROM/RAM. Параметр То°18 отключает эмуляцию дополнительной памяти. Если требуется доступ к EMS, вместо параметра noems следует задать параметр ram со значением числа байт
ДУет ИРеНН°Й памяти’ напРимеР> пам 1024 задает резервирование 1 Кбайт EMS. Сле-Пам Напомнить’ что на сегодняшний день дополнительная или иначе отображаемая браж Ь В Рольшинстве систем не используется. Расположение кадра страницы ото-МестаСМ0Й памяти (окна) задает параметр frame; например, frame=dooo определяет страницы в Wecax D0000H—DFFFFH. Начиная с DOS 6.0 доступ к EMS (Vi *ен Даже ПРИ указании параметра NOEMS, посредством драйвера VCPI ВацИ1^ Control Program Interface). Драйвер VCP1 распределяет блоки EMS по требо-°своб0Текущей программы (т. е. динамически), а после завершения программы сам (Dqc блоки. В Windows аналогичную функцию выполняет интерфейс DPMI rotected Mode Interface).
58
Глава 1
Продолжим рассмотрение примера 1.1. Оператор dos=umb указывает системе предусмотреть блок верхней памяти (LIMB) для использования DOS. Операторы files=30 и buffers=io определяют, соответственно, максимальное количество одновременно открытых файлов и число буферов для чтения-записи данных файлов.
Команда shell обеспечивает настройку и указывает местонахождение файла командного процессора для DOS. В примере 1.1 в качестве командного процессора указан COMMAND.COM (он используется по умолчанию) с опциями Е:2048 и /р. Опция Е:2048 задает размер области памяти для переменных окружения в байтах. В переменных окружения хранится информация, доступная для всех приложений. Например, оператор set темр=с:\темр означает, что временные данные рекомендуется записывать в каталог, указанный в переменной temp (в данном случае, это каталог C:\TEMP). Команда set, предназначенная для установки переменной окружения, может быть включена в файл AUTOEXEC.BAT или вызвана из командной строки DOS. Переключатель /р указывает, что командный процессор должен быть загружен в память раз и навсегда, т. е. используется резидентный режим работы командного процессора. Без опции /р он будет загружаться каждый раз при возвращении к командной строке; хотя это позволяет высвободить часть памяти, частая загрузка командного процессора приводит к ускоренному износу диска и отнимает время. Следующий оператор — dos=high — задает загрузку DOS в высокую память (НМЛ), которая становится доступной после загрузки драйвера HIMEM.SYS.
Команда devicehigh задает загрузку указанного драйвера или программы в блок верхней памяти, распределенный драйвером EMM386.EXE. В соответствии с примером 1.1 три драйвера (SONY_.CDU.SYS, SETVER.EXE и MOUSE.SYS) будут помещены в верхнюю память с адреса С8000Н.
Последний оператор в примере — команда lastdrive — задает максимальное число дисков в системе, точнее, букву, обозначающую последний логический диск. Каждый диск требует наличие буфера в оперативной памяти, поэтому не следует задавать лишнего в этой команде. Также в CONFIG.SYS может быть указана загрузка драйверов PRINT.SYS, ANSI.SYS и других программ, функционирующих в качестве драйверов. Обычно файлы драйверов обозначаются расширением SYS. В ранних версиях DOS корректировка CONFIG.SYS требовала осторожности — ошибка могла привести к блокировке системы. В DOS 6.0 и выше отработка файла CONFIG.SYS может быть отключена нажатием комбинации клавиш <Ctrl>+<C> при загрузке, что позволяет впоследствии исправить ошибку.
После завершения обработки файла CONFIG.SYS компьютер выполняет команды, заданные в пакетном файле AUTOEXEC.BAT (AUTOmatic EXECution BATch). Если AUTOEXEC.BAT отсутствует, то компьютер при загрузке запрашивает время и дату. Пример 1.2 иллюстрирует один из вариантов файла AUTOEXEC.BAT. Команды, заданные в нем, можно было бы ввести и в режиме командной строки, но файл AUTOEXEC.BAT избавляет пользователя от необходимости задавать команды вручную после каждой загрузки системы. Этот файл используется также при вызове сеанса DOS из Windows.
................................................................y..........T.v_7.......
Г Пример 1.2;. Вариант файла AUTOEXEC.BAT	: j
PATH С:\DOS;С:\;С:\MASM\BIN;С:\MASM\BINB\;С:\UTILITY
SET BLASTER=A220 17 DI ТЗ
Введение в микропроцессоры и компьютеры
59
SET INCLUDE=C:\MASM\INCLUDE\
SET HELPFILES=C:\MASM\HELP\*.HLP
SET INIT=C:\MASM\INIT\
SET ASMEX=C:\MASM\SAMPLES\
SET TMP=C:\MASM\TMP
SET SOUND=C:\SB
LOADHIGH C:\LASERLIB\MSCDEX.EXE /D:SONY_001 /L:F /M:10
LOADHIGH C:\LASERLIB\LLTSR.EXE ALT-Q
LOADHIGH C:\DOS\FASTOPEN C:=256
LOADHIGH C:\DOS\DOSKEY /BUFSIZE=1024
LOADHIGH C:\LASERLIB\PRINTF.COM
DOSKEY GO=C:\WINDOWS\WIN.EXE
GO
Оператор path в примере 1.2 задает путь поиска исполняемого файла при вводе имени программы в командной строке. Порядок просмотра каталогов при поиске определяется последовательностью их перечисления в операторе path. Предположим, в командной строке введено имя PROG. Поиск начнется в каталоге C:\DOS, продолжится в корневом каталоге С:\, затем в C:\MASM\B1N и т. д., пока программа PROG не будет найдена. Если поиск окажется безуспешным, командный процессор COMMAND.COM выведет соответствующее сообщение.
Команда set, как мы уже говорили, вводит переменную окружения и устанавливает ее значение. Обычно переменным присваиваются пути, имена программ и/или опции. Переменные окружения доступны всем исполняемым программам, в частности, на них можно ссылаться из командных или иначе пакетных^ (batch) файлов. Первая команда set в примере устанавливает переменную окружения для звуковой карты, вторая присваивает переменной INCLUDE значение пути C:\MASM \INCLUDE\. Заметим, что переменные записываются в память, зарезервированную командой shell в файле CONFIG.SYS (см. опцию е:2048 в примере 1.1).
Команда loadhigh, или сокращенно lh загружает программу в блоки UMB (Upper Memory Block) верхней памяти, сформированные драйвером EMM386.EXE. Предпоследняя команда в примере — doskey — определяет макрокоманду go; после чего ввод слова GO в командной строке будет восприниматься как команда запуска Windows - C:\WINDOWS\WIN.EXE.
Микропроцессор
Основу компьютера составляет микросхема микропроцессора. Микропроцессор (МП), иначе называемый центральный процессор (ЦП) (Central Processing Unit — CPU), — это элемент, управляющий вычислительной системой. Управление памятью и системой ввода-вывода осуществляется посредством электрических сигналов, передаваемых по линиям соединений, которые называются шинами. Подавая сигналы на шину, микропроцессор выбирает порт ввода-вывода или ячейку памяти для обмена данными. Микропроцессор выполняет эти действия в соответствии с инструкциями, которые хранятся в памяти.
31 Командные или иначе пакетные файлы должны иметь расширение ВАТ (от BATch). — Ред.
60
Глава 1
На микропроцессор возложены следующие задачи:
□	обмен данными с памятью и портами ввода-вывода;
□	выполнение основных арифметических и логических операций;
□	принятие решений — переключение между последовательностями инструкций по определенным признакам.
В совокупности, выполнение этих простых задач позволяет выполнять вычисления любой сложности.
Достоинство микропроцессора заключается в его способности выполнять за секунду сотни миллионов инструкций. Инструкции хранятся в оперативной памяти, что позволяет достаточно быстро изменять исполняемую программу. Напомним, что концепция хранимой программы была принята при разработке аналитической машины Бэббиджа.
В табл. 1.3 приведены арифметические и логические операции микропроцессоров Intel. Эти элементарные операции позволяют решать весьма сложные задачи. Данные для операций, или операнды, находятся во внутренних регистрах процессора и/или в памяти. Размерность операндов — байт (8 бит), слово (16 бит) или двойное слово (32 бита). Заметим, что элементарные операции над двойными словами возможны только в 32-разрядных процессорах. Начиная с 180486, микросхема микропроцессора включает в себя сопроцессор, обеспечивающий выполнение сложных арифметических операций над числами с плавающей точкой. В компьютерах на базе i8086—i80386 арифметический сопроцессор не входил в микросхему процессора, а устанавливался как дополнительный компонент.
Таблица 1.3. Элементарные арифметические и логические операции
Операция	Команда I	I Операция	Команда
Сложение (Addition)	ADD	Логическое сложение	OR
Вычитание (Subtraction)	SUB	Логическая инверсия	NOT
Умножение (Multiplication)	MUL	Арифметическая инверсия	NEG
Деление (Division)	DIV	Сдвиг (Shift)	SAR
Логическое умножение	AND	Циклический сдвиг (Rotate)	ROR
Еще одна важная особенность микропроцессора заключается в его способности принимать решения по результатам операций. Например, микропроцессор может проверить число на равенство нулю, определить знак числа и т. п. Эти элементарные решения позволяют микропроцессору в ходе выполнения программы выбирать разные последовательности инструкций. В табл. 1.4 перечислены элементарные проверки, доступные микропроцессорам Intel.
Таблица 1.4. Проверки, доступные микропроцессорам Intel
Проверка	Пояснение
Нуля (Zero)	Проверяется, равно ли число нулю
Знака (Sign)	Проверяется знак числа
пиление в микропроцессоры и компьютеры	61	
	Таблица 1.4 (окончание)
Проверка	Пояснение
Переноса (Carry)	Проверяется, имеется ли перенос при сложении или заем при вычитании
Четности (паритета) (Parity)	Проверяется четное или нечетное количество битов, установленных в 1
Переполнения (Overflow)	Проверяется переполнение, которое указывает на недопустимый результат после выполнения операции сложения или вычитания
Шины
Шиной называется группа проводников, объединяющих различные компоненты вычислительной системы. Шины служат для передачи адресов, данных и сигналов управления между микропроцессором и такими компонентами системы, как память и порты ввода-вывода. В микропроцессорных системах имеется три основные шины — шина адреса, данных и управления. Объединение компонентов системы (микропроцессора, ОЗУ (RAM), ПЗУ (ROM) и периферийных устройств) посредством шин показано на рис. 1.11.
Рис. 1.11. Шины адреса, данных и управления в структуре вычислительной системы
По шине адреса передается номер ячейки памяти или порта ввода-вывода. При обращении к порту адрес 16-разрядный (в диапазоне 0000Н—FFFFH), что позволяет адресовать 64К портов. Адрес при обращении к памяти зависит от версии микропроцессора. В системах на базе 8086/8088 адрес памяти 20-разрядный; адресное пространство составляет 1 Мбайт, в диапазоне 00000Н—FFFFFH. Для микропроцессоров 80286 и 80386SX адресуемая память составляет максимум 16 Мбайт, в диапазоне 0ОООООН—FFFFFFH. Для микропроцессоров 80386SL, 80386SLC и 80386ЕХ адресное пространство — 32 Мбайт, доступные адреса находятся в диапазоне 0000000Н— IFFFFFFH, разрядность шины адреса — 25 бит. В системах на базе 80386DX,
62
Глава 1
80486SX и 80486DX доступно максимум 4 Гбайта памяти (диапазон адресов — 00000000Н—FFFFFFFFH) посредством 32-разрядной шины адреса. Микропроцессор Pentium также располагает адресным пространством 4 Гбайт, но шина данных у него 64-разрядная, что позволяет обращаться одновременно к восьми смежным байтам. Процессоры от Pentium Pro до Pentium 4 используют 64-разрядную шину данных, а адресная шина у них, в зависимости от конфигурации, может быть 32-разрядной или 36-разрядной. В последнем случае адресное пространство памяти достигает 64 Гбайт в диапазоне адресов 000000000Н—FFFFFFFFFH. В табл. 1.5 приведены сведения о разрядности шин и размере адресного пространства памяти микропроцессоров Intel разных поколений.
Таблица 1.5. Разрядность шин и размер адресного пространства памяти микропроцессоров Intel
Микропроцессор	Разрядность шины данных	Разрядность шины адреса	Размер адресного пространства памяти
8086	16	20	1 Мбайт
8088	8	20	1 Мбайт
80186	16	20	1 Мбайт
80188	8	20	1 Мбайт
80286	16	24	16 Мбайт
80386SX	16	24	16 Мбайт
80386DX	32	32	4 Гбайт
80386ЕХ	16	26	64 Мбайт
80486	32	32	4 Гбайт
Pentium	64	32	4 Гбайт
Pentium Overdrive	32	32	4 Гбайт
Pentium Pro	64	32	4 Гбайт
Pentium Pro	64	36	64 Гбайт
Pentium II	64	32	4 Гбайт
Pentium II, Pentium III, Pentium 4	64	36	64 Гбайт
По шине данных выполняется передача данных между микропроцессором и памятью или портами ввода-вывода. Разрядность шины данных различна для разных поколений микропроцессоров — от 8 до 64 бит. Например, микропроцессор 8088 имеет 8-разрядную шину данных, что позволяет передавать только один байт за цикл. В 8086, 80286, 80386SL, 80386SX и 80386ЕХ может быть передано сразу 16 бит данных; в 80386DX, 80486SX и 80486DX — 32 бита; а в Pentium-Pentium 4 — 64 бита. Преимущества более широкой шины данных проявляются при работе с данными соответствующей разрядности. Например, доступ к 32-разрядному числу в памяти микропроцессор 8088 выполняет за 4 цикла шины, поскольку разрядность шины данных — всего лишь 8 бит. Процессор 80486, располагая 32-разрядной ши
Введение в микропроцессоры и компьютеры
63
ной данных, может выполнить ту же операцию за один цикл. На рис. 1.12 показана физическая организация памяти в системах на базе микропроцессоров 8086—80486 и Pentium—Pentium 4. Обратите внимание, что в процессорах Pentium—Pentium 4 используется 64-разрядная шина данных.
Шина управления служит для передачи сигналов, определяющих выбор памяти или выбор порта, чтение или запись. Следующие управляющие сигналы используются в большинстве компьютерных систем: сигнал чтения памяти — MRDC (Memory Read Control), сигнал записи в память — MWTC (Memory Write Control), сигнал чтения из порта — IORC (I/O Read Control), и сигнал записи в порт — IOWC (I/O Write Control). "Подчеркивание" сверху означает, что сигнал инверсный, т. е. активен, или, иначе говоря, вызывает срабатывание при напряжении, соответствующем уровню логического нуля. Например, если IOWC = 0, то микропроцессор записывает данные, передавая их по шине данных, в порт, адрес которого установлен на шине адреса.
Старший (нечетный) байт			Младший (четный) байт	
FFFFFF			FFFFFE	
FFFFFD			FFFFFC	
FFFFFB			FFFFFA	
	◄	8 бит	►			◄	8 бит	>
	8 Мбайт			8 Мбайт
000005			000004	
000003			000002	
000001			000000	
	D15-D8			D7-D0
Микропроцессоры:
** 8086 (1 Мбайт), 80286, 80386SX, 80386SL (32 Мбайт) и 80386SLC (32 Мбайт)
	БайтЗ		Байт 2
FFFFFFFF		FFFFFFFE	
FFFFFFFB		FFFFFFFA	
FFFFFFF7		FFFFFFF6	
	4	8 бит	► 1 Гбайт		4 —8 бит	► 1 Гбайт
0000000В		ОООООООА	
00000007		00000006	
00000003		00000002	
	D31 - D24		D23-D16
	Байт 1		БайтО
FFFFFFFD		FFFFFFFC	
FFFFFFF9		FFFFFFF8	
FFFFFFF5		FFFFFFF4	
	◄	8 бит	► 1 Гбайт		4	8 бит	► 1 Гбайт
00000009		00000008	
00000005		00000004	
00000001		00000000	
	D15-D8		D7-D0
Микропроцессоры.
80386DX, 80386SX и 80486DX
Рис. 1.12. Физическая организация памяти для различных поколений микропроцессоров Intel (см. продолжение)
64	Глава d
  11 ""
	Байт 7	Байт 6	Байт 5	Байт 4
FFFFFFFF		FFFFFFFE	FFFFFFFD 		FFFFFFFC	
FFFFFFF7		FFFFFFF6	FFFFFFF5 		FFFFFFF4	7 I
FFFFFFEF		FFFFFFEE	. . ..	FFFFFFED 		FFFFFFEC	(
	4	8 бит	►	<4	8 бит	►	4	8 бит	►	4	вбит—
	512 Мбайт	512 Мбайт	512 Мбайт	512 Мбайт >
00000017		00000016	00000015 		00000014	
0000000F		0000000Е	0000000D 		ОООООООС	/
00000007		00000006	00000005 		000000041	J
	D63 - D56	D55 - D48	D47 - D40	D39 - D32
	Байт 3	Байт 2	Байт 1	БайтО '
FFFFFFFB		FFFFFFFA 		FFFFFFF9 		FFFFFFF8		
FFFFFFF3		FFFFFFF2		FFFFFFF1 		FFFFFFFO		
FFFFFFEB		FFFFFFEA	FFFFFFE9	FFFFFFE8 	
	4	вбит	►	4  8 бит  >	4	вбит	►	4	вбит	>
	512 Мбайт	512 Мбайт	512 Мбайт	512 Мбайт j !
00000013		00000012 		00000011 		00000010 	
0000000В		ОООООООА		00000009 		00000008 	
00000003		000000021		00000001 		00000000 	 !
	D31 - D24	D23-D16	D15-D8	D7-D0 I
		Микропроцессоры от Pentium до Pentium 4		
Рис. 1.12. Окончание
Чтобы прочитать содержимое ячейки памяти, микропроцессор выставляет ее адрес на шину адреса и затем посылает сигнал MRDC (чтение памяти), после чего данные из памяти передаются по шине данных в процессор. Чтение порта выполняется аналогичным образом. При записи в память или в порт действия выполняются в иной последовательности, но принцип остается тем же.
1.3. Системы счисления
Программирование микропроцессорных систем предполагает наличие навыков работы с двоичными и шестнадцатеричными числами. В этом разделе приведены сведения о системах счисления, применяемых в компьютерах, а также рассмотрены преобразования между десятичными, двоичными и шестнадцатеричными числами.
Цифры
Чтобы выполнять преобразования между представлениями чисел в разных системах счисления, следует, прежде всего, представлять себе, какие цифры в них используются. Всем нам известно, что в десятичной системе счисления применяются цифры от 0 до 9. Первая цифра в любой системе счисления — это 0. Например, в двоичной

в микропроцессоры и компьютеры
65
исГеме используются цифры 0 и 1, а в восьмеричной системе диапазон цифр от О с у Если основание системы счисления превышает 10, то для обозначения цифр ис-пОпьзуются также латинские буквы, начиная с А. Например, если основание рав-н0 12. то цифры обозначаются знаками 0—9, А (соответствует 10) и В (соответствует 1D- Заметим, что в системе с основанием 10 нет цифры для обозначения 10, так же как в восьмеричной системе не используется цифра 8. В компьютерах, как правило, применяются системы счисления по основанию 10 (десятичная), 2 (двоичная) и 16 (шестнадцатеричная). Ранее весьма популярной была восьмеричная система.
Позиционные системы счисления
Произвольные числа составляются из ограниченного набора цифр в соответствии с позиционной системой счисления. Еще в начальной школе нам объясняли, что для десятичной системы счисления крайняя цифра справа обозначает число единиц, цифра левее — число десятков, следующая цифра — число сотен, и т. д. Например, в десятичном числе 132 содержатся 2 единицы, 3 десятка и 1 сотня. Порядковый номер позиции определяет ее вес (заметим, что позиции нумеруются справа налево, начиная с 0). Позиция единиц (позиция номер 0) имеет вес 10°. т. е. 1; позиция десятков обладает весом 101, т. е. 10; а позиция сотен "весит” 102, т. с. 100. Позиция слева от точки — это всегда позиция единиц. (Точка между целой и дробной частями числа имеет смысл при любом основании системы; более узкое понятие десятичная точка применимо лишь к десятичной системе счисления.) Например, позиция слева от двоичной точки имеет вес 2°, т. е. 1; позиция слева от восьмеричной точки — 8°, т. с. вновь 1. Понятно, что в любой системе счисления слева от точки находится позиция единиц.
Слева от позиции единиц находится позиция, вес которой равен основанию системы счисления; в десятичной системе это 101, т. е. 10. В двоичной системе это 21, или 2; в восьмеричной — 8’, или 8. Понятно, что значение 11 в десятичной записи не то же самое, что двоичное 11. Десятичное число 11 состоит из одного десятка и одной единицы и равняется 11 единицам Двоичное число 11 состоит из одной Двойки и одной единицы и равно трем единицам. В восьмеричной системе счисления запись 11 обозначает 9 единиц.
Вес позиций справа от точки равен основанию системы счисления в отрицательной степени — это относится к любой системе счисления. Так, например, первая цифра справа от десятичной точки имеет вес 10”1, или 0.1, а в двоичной системе вес перкой цифры справа от точки (двоичной) равен 2-1, т. е. 0.5.
Пример 1.3 иллюстрирует преобразование двоичного числа 110.101 (часто записывается также в виде 110.1012) в десятичное число.
[ Пример 1.3. Преобразование двоичного числа 110.101 в десятичное
Степень	22	21	2°	2’1	о-2	2~J
Вес	4	2	1	0.5	0.25	0.125
Число	1	1	0	1	0	1
Десятичное	4	+	2	+	0	+	0.5	+	0	4-	0.125	= 6.625
Представление
3 Зак. 384
66 Глава]
Значение 110.1012 в двоичной системе вычисляется как сумма 4 + 2 + 0.5 + 0.125 что составляет 6.625. Слагаемое с весом 1 (2°) в целую часть суммы не входит, по* скольку цифра в соответствующей (нулевой) позиции равна 0. По той же причине в дробную часть не входит слагаемое с весом 0.25 (2~2).
В примере 1.4 показано преобразование шестеричного числа 25.26. Результат преоб* разования — десятичное число 17.333.
i Пример 1.4. Преобразование шестеричного чйсла 25.2 в десятичное
Степень	61	6°	б'1
Вес	6	1	0.167
Число	2	5	2
Десятичное представление	12	+	5	+	0.333	= 17.333
Преобразование в десятичный формат
Примеры 1.3 и 1.4 показывают, что для преобразования в десятичное представление числа, записанного в произвольной системе счисления, следует сложить произведения всех цифр числа на их вес. Еще один пример 1.5 показан для преобразования восьмеричного числа. Сначала записываем цифры исходного числа и для каждой цифры ее вес; затем вычисляем слагаемые, умножая каждую из цифр числа на соответствующий вес. В результате преобразования, числу 125.78 соответствует десятичное значение 85.875.

Пример 1.5. Преобразование восьмеричногочисла 125,7^ вдесятичное
Степень	82	81	8°	8”1
Вес	64	8	1	0.125
Число	1	2	5	7
Десятичное	64	+	16	+	5	+	0.875	= 85.875
представление
Вес позиции, находящейся слева от позиции единиц в восьмеричном числе, равен 81 =1 х 8, или 8. Вес следующей позиции слева — 82 = 8 х 8, т. е. 64. Вес следующей цифры равен 83 = 64 х 8, или 512. Таким образом, вес позиции слева от текущей равен весу текущей позиции, умноженному на основание системы счисления, т. с. на 8, в данном случае. Вес позиции справа от текущей равен весу текущей позиции, поделенному на основание системы счисления. Например, в восьмеричном числе вес позиции справа от точки равен 1/8, или 0.125. Следующая позиция справа имеет вес 0.125/8, или 0.015625, или 1/64.
В примере 1.6 показано преобразование двоичного числа 11011.0111. Результат преобразования — 27.4375.
Вес позиции справа от двоичной точки равен 2"1, или 1/2; вес следующей позиции справа — 2“2, или 1/4, и т. д. Вес последней позиции в дробной части равен 2 » или 1/16, или 0.0625. Дробная часть составляет в сумме 7/16, или 0.4375. Число 7 в числителе дроби 7/16 соответствует коду 0111 в дробной части, а 16 в знаменателе
_^^кропроцессоры
и компьютеры 67
соответствует весу крайней правой позиции (1/16). Аналогично, дробная часть дроби может быть записана как 5/8, а число 0.001101 — в виде 13/64. числа он Vi
г	^мер 1-6- Преобразование двоичного числа 11011.0111 в десятичное	|								
2"	23 степень	2	21	2°	2’1	2~2	2“3	2“4	
16	8 вес	4	2	1	0.5	0.25	0.125	0.0625	
1 1 ЧИСЛО	0	1	1	0	1	1	1	
десятичное	±6 +	8 представле-	0 +	2 +	1 +	0 +	0.25 +	0.125 +	0.0625	= 27.4375
ние
Пример 1.7 иллюстрирует преобразование шестнадцатеричных чисел, весьма распространенных в вычислительной технике, на примере числа 6А.СН (Н справа означает, что число шестнадцатеричное).
i Пример 1.7. Преобразование шестнадцатеричного числа 6А.С в десятичное
Степень	161	16°	16’1
Вес	16	1	0.0625
Число	6	А	С
Десятичное представление	96	+	10	+	0.75
= 106.75
Целая часть равна 6 х 16 + 10, дробная часть — 12/16, или 3/4. Результат преобразования — 106.75.
Преобразование из десятичного формата
Для преобразования целой части десятичного числа следует делить целую часть на основание требуемой системы счисления, а для преобразования дробной части — умножать.
Преобразование целой части десятичного числа
Для преобразования целой части делим число на основание системы счисления, вписывая в качестве цифр результата остатки от деления. Последовательность дей-^вий следующая:
Разделить число на основание системы счисления.
2- Сохранить остаток (первый остаток — последняя значащая цифра, и наоборот).
Повторять шаги 1 и 2, пока целая часть результата деления не станет равной нулю.
Зу ПримеР’ преобразования числа 10 в двоичный формат, разделим его на 2. Ре-ци Ьтат первого деления равен 5, а остаток — 0. Первый остаток дает цифру в пози-единиц результата (0, в данном случае). Теперь разделим 5 на 2. Целая часть зииУЛЬтата Деления — 2, а остаток — 1. Остаток дает цифру в позиции слева от по-и единиц. Продолжаем деление до обнуления целой части результата деления. пы преобразования показаны в примере 1.8. Результат преобразования — 10102.
68
Глава 1
Пример 1.8. Преобразование десятичного числа 10 в двоичное
10/2	=	5	остаток	=	0
5/2	=	2	остаток	=	1
2/2=1	остаток	=	0
1/2	=	0	остаток	=	1
результат = 1010
Преобразование того же числа 10 в восьмеричный формат потребует всего лишь двух делений. Преобразование показано в примере 1.9, а результат его 128.
Пример 1.9. Преобразование десятичного числа 10 в восьмеричное
10/8 = 1
1/8 = 0
остаток = 2
остаток = 1
результат = 12
Преобразование в шестнадцатеричный формат предполагает деление на 16, с получением остатка в диапазоне от 0 до 15. Остаткам в диапазоне 10—15 соответствуют шестнадцатеричные "цифры" A—F. Преобразуем число 109 (пример 1.10). После первого деления остаток равен 13, что записывается как D. Целая часть равна 6. После второго деления остаток равен 6, а целая часть — нулю. Преобразование закончено, результат — 6DH.
:........................................................................................-£
= Пример 1.10. Преобразование десятичного числа 109 в шестнадцатеричное
;........................................................................................л
109/16 = 6 остаток = 13 (D)
6/16 = 0 остаток = 6
результат = 6D
Преобразование дробной части десятичного числа
Преобразование дробной части выполняется за счет умножения на основание системы счисления, например, на два при преобразовании в двоичный формат. Целая часть результата умножения представляет собой значащую цифру результата преобразования, а дробная часть снова умножается на основание системы счисления, пока не станет равной нулю. Заметим, что некоторые числа не могут быть преобразованы к конечной форме; их дробная часть никогда не станет равной нулю. Последовательность операций для преобразования дробной части десятичного числа следующая:
1.	Умножить десятичную дробную часть на основание системы счисления.
2.	Сохранить целую часть результата умножения, даже если она равна нулю, как значащую цифру. Заметим, что цифра, полученная первой, записывается справа от точки.
3.	Повторять шаги 1 и 2, используя дробную часть, полученную в результате выполнения шага 2, в качестве исходных данных для шага 1, пока она не станет равной нулю.
В примере 1.11 показано преобразование в двоичный формат десятичного числа 0.125. Обратите внимание, преобразование заканчивается, когда дробная часть ре
Введение в микропроцессоры и компьютеры
69
зультата умножения становится равной нулю. Результат преобразования в данном примере — 0.0012.
i Пример 1.11. Преобразование десятичного числа 0.125 в двоичное
0.125 х 2 = 0.25
целая часть = 0
0.25 х 2 = 0.5
целая часть = 0
0.5x2= 1.0
целая часть = 1
результат = 0.0012
Преобразование дробной части десятичного числа в произвольную систему счисления выполняется аналогично. Например, преобразование в восьмеричную систему счисления производится соответственно умножением на 8. К примеру, десятичное число 0.125 преобразуется за один цикл (пример 1.12) — после умножения 0.125 на 8 получаем результат 1.0 с нулем в дробной части. Таким образом, десятичное число 0.125 в восьмеричном формате записывается как 0.1.
I Пример 1.12. Преобразование десятичного числа 0.125 в восьмеричное
0.125 х 8 = 1.0	целая часть = 1	результат = 0.1g
Пример 1.13 иллюстрирует преобразование десятичного числа в шестнадцатеричный формат. Десятичное число 0.046875 преобразуется в шестнадцатеричное 0.0CH путем умножения на 16.
| Пример 1.13. Преобразование десятичного числа 0.046875 в шестнадцатеричное
0.046875 х 16 = 0.75	целая часть = 0	•*
0.75 х 16 = 12.0	целая часть = 12 (С) результат = 0.0CH
Шестнадцатеричные числа
Шестнадцатеричные числа обычно используются в вычислительной технике для компактного представления двоичных чисел. Двоичные коды, соответствующие шестнадцатеричным цифрам, приведены в табл. 1.6.
С использованием табл. 1.6 любое шестнадцатеричное значение может быть записано в виде тетрад двоичных цифр. Например, двоичный эквивалент шестнадцатеричного числа 2АС показан в примере 1.14.
| Пример 1.14. Преобразование шестнадцатеричного числа 2АС в двоичное
2АС = 0010 1010 1100
Пример обратного преобразования показан в примере 1.15.
70
Глава i
Пример 1.15. Преобразование двоичного числа в шестнадцатеричное	'
1000 ООН 1101 . 1110 = 83D.E
Таблица 1.6. Двоичные коды шестнадцатеричных цифр
Шестнадцатеричная цифра	Двоичный код	Шестнадцатеричная цифра	Двоичный крд
0	0000	8	1000	**
1	0001	9	1001
2	0010	А	1010
3	0011	В	1011
4	0100	С	1100
5	0101	D	1101
6	0110	Е	1110
7	0111	F	1111
Дополнительный код
Инверсный и дополнительный коды используются в вычислительной технике для хранения отрицательных чисел (в настоящее время гораздо более распространен дополнительный код). Для получения инверсного кода исходное значение вычитается из числа, в котором все цифры максимальны, т. е. равны основанию системы счисления минус 1. Для двоичного числа инверсный код соответствует числу с поразрядной инверсией, т. е. полученного путем замены всех единиц нулями и наоборот.
Далее приведен пример 1.16 получения инверсного кода для байта со значением 0100 1100. Исходное число вычитается из кода, целиком состоящего из единиц (основание системы счисления равное 2 минус 1) — 1111 1111. Результат — 1011 0011-
Пример 1.16. Получение>1нверсногокодадвоигчного;чис^а.01001100
1111	1111
-	0100	1100
1011	0011
Аналогичным образом выполняется преобразование в инверсный код для значен ’ записанных в других системах счисления. Например, инверсный код для щестнаД теричного числа 5CD вычисляется путем вычитания его из числа, в котором цифры равны 15 (F) (основание системы счисления равное 16 минус 1).
71
едение 8 микРопР°ЦессоРы и компьютеры
р иМеР ^0ЛУчение инверсного кода шестнадцатеричного числа 5CD
15	15	15
. 5	С—2_
инверсный код сам по себе практически не используется, из него может быть олучен дополнительный код, который и применяется в настоящее время для представления отрицательных чисел. Использовать с этой целью инверсный код, что было принято в ранних вычислительных системах, неудобно, поскольку число ноль может быть представлено двояко — последовательностью 0 (’’положительный" ноль) или последовательностью 1 ("отрицательный" ноль). В дополнительном коде, напротив число 0 представлено только последовательностью битов со значением 0.
Чтобы получить дополнительный код, следует прибавить единицу к инверсному коду Далее показан пример 1.18 получения дополнительного кода числа 0100 1000.
f пример 1.18. Получение дополнительного кода двоичного числа 0100 1000
1111 1111
-	0	1	0 0	1	0	0	0
10	11	0	111
+	0000	0001
10	11	10	0	0
(инверсный код)
(дополнительный код)
Для проверки результата просуммируем полученный дополнительный код 1011 0111 с исходным кодом 0100 1000. Получаем ноль (перенос из старшей позиции игнорируется), что и следовало ожидать (0100 1000 = +72, а 1011 0111 = -72). Аналогичный подход используется для получения дополнительного кода в произвольной системе счисления. Далее показан пример 1.19 подобного преобразования для шестнадцатеричного числа 345. Для проверки полученного результата можно сложить код 345 с его дополнительным кодом СВВ и, отбросив перенос в четвертую позицию, получить 000.
1$РИм®Р 1.19. Получение дополнительного кода шестнадцатеричного числа 345	|
...........................................................„..........
15	15
'	4	5
с	В	д	(инверсный	код)
+	Л_о	1
С	В	в	(дополнительный код)
1*4. Форматы данных
Ь^ГраммиР°вание на машинном языке предполагает знание форматов данных.
разделе рассмотрены наиболее общие форматы данных (ASCII, BCD, дейст-ьные числа, знаковые и беззнаковые целые) и их использование в системах на
2
базе микропроцессоров Intel. Форматы данных специального назначения пока обсуждаем.
ASCII-данные
Стандартный код для обмена информацией — ASCII (American Standard Code fOf Information Interchange) — используется для представления буквенно-цифровых зна^ ков в памяти вычислительной системы. Стандартный код ASCII, представленный g табл. 1.7, занимает семь бит.
Свободный старший бит байта с кодом ASCII иногда используют в качестве бита четности. При выводе на дисплей или принтер букв, цифр и знаков препинания этот бит равен 0, а при выводе символов псевдографики — установлен в 1. В общем случае, установка старшего бита включает расширенный набор ASCII-символов. Пример расширенного набора ASCII-символов кодов в диапазоне кодов 80Н—FFH приведен в табл. 1.8.
В расширенном наборе ASCII-символов обычно представлены буквы греческого или местного алфавита, специальные математические знаки, символы псевдографики и т. п. Заметим, что содержание расширенного набора может быть различным для разных принтеров. В частности, набор, представленный в табл. 1.8, имеет отношение к конкретному принтеру — IBM ProPrinter.
Управляющие ASCII-символы, приведенные в начале табл. 1.7, предназначены для выдачи команд периферийным устройствам, например, для очистки экрана, стирания символа, перевода строки и т. п. Для ввода управляющего символа с клавиатуры используется комбинация клавиш <Ог1>+<буква>. Например, код 01Н (SOH — Start Of Heading, начало заголовка) вводится нажатием комбинации клавиш <Ctrl>+<A>; код 02Н (STX — Start Of Text, начало текста) — комбинацией клавиш <Ctrl>+<B> и т. д. (Если ввести эти коды в режиме командной строки DOS, они будут отображены на экране в виде ЛА, ЛВ и т. д.) Ввод ASCII-кода CR (Carriage Return — возврат каретки) выполняется нажатием клавиши <Enter>. (Управляющий символ CR задает возврат курсора в начала строки.) Еще один часто встречающийся код LF (Line Feed — перевод строки) задает перемещение курсора на следующую строку.
Использование табл. 1.7 и 1.8 поясним на следующем примере: найдем ASCII-кодЫ для символов "А" и "а". Символ "А" находится на пересечении строки 4х и столбца х! табл. 1.7. Объединяя названия строки и столбца, получаем, что код этой литеры — шестнадцатеричное число 41 или, иначе, 41Н. Символ "а" находится на пересечении строки 6х и столбца xl, т. е. его код равен 61Н. Заметим, что во многих приложениях Windows используется другая система кодировки алфавитно-цифровЫ* символов — Unicode. В этой кодировке символы представлены в виде 16-битны* значений. Коды в диапазоне 0000Н—00FFH совпадают со стандартным набор0 ASCII-кодов. Остальные коды (в диапазоне 0100Н—FFFFH) используются для Хр® нения специальных символов, с учетом всех национальных алфавитов, что позво ет тиражировать программное обеспечение по всему миру.
Для определения данных ASCII в программе на языке ассемблера предназначен, директива db (Define Byte(s) — определить байт(ы)) или полностью совпадают ней директива byte. Примеры определения ASCII-данных при помощи директивы приведены в примере 1.20.
	xO	x1	x2	x3	Таблица 1.7. Коды ASCII (первая половина кодовой таблицы)												VS	
					х4	х5	хб	х7	х8	х9	хА	хВ	xC	xD	xE	xF		
Ox	NUL	SOH	STX	ETX	EOT	ENQ	АСК	BEL	BS	нт	LF	VT	FF	CR	SO	SI		съ tn
1x	DLE	DC1	DC2	DC3	DC4	NAK	SYN	ЕТВ	CAN	EMS	SUB	ESC	FS	GS	RS	US		i
2x	SP	i		#	$	%	&		(	)	*	+		-		/		O о
3x	0	1	2	3	4	5	6	7	8	9			<	=	>	?		"O о
4x	@	A	В	C	D	Е	F	G	Н	I	J	К	L	M	N	0		Ф о о
5x	P	Q	R	S	Т	и	V	W	X	Y	Z	[	\	]	A				•§
6x		a	b	c	d	е	f	g	h	i	j	k	I	m	П	0		X
7x	P	q	r	s	t	и	V	W	X	У	z	{	I	}				о 1
																		б
					Таблица 1.8. Расширенные ASCII-коды для IBM ProPrinter													5:
	xO	х1	х2	хЗ	х4	х5	хб	х7	х8	х9	хА	хВ	хС	xD	хЕ	xF	
Ox		О	•	V	♦	Ф	Л	•	□	О		*			J3	а	
1х	►	◄	I	!!	И	§		1			—*	«—	L		▲	▼	
8х	С	и	ё	а	а	а	ё	9	ё	ё	ё	т	1	i	А	А	
9х	Ё	ае	ZE	о	6	о	й	й	У	0	и	0	£	¥	Pt	f	
Ах	а	i	6	й	п	N	а	о	с	Г"		72	Уд	i	«	»	
Вх			1	|	d	=1	dl	и	=1	=51	II	Т1	JI	Л	J		
Сх	L	±	т	F	-	+	h	IF	IL	1г	JL	тг	IF	=	JL 1Г	X	
Dx	JL	т	т	IL	L	f=	IF	dF	+	J	Г	1		1	1		
Ex	а	₽	г	тт	Z	о	М	Y	ф	О	О	б	«о		е	А	
Fx	=	±	>	<	[	J		-	□	•			п	2			со
74 Глава j
Пример 1.20. Определение ASCII-данных при помощи директивы db
0000	42 20 72	61 72 72 79			NAMES	DB	'Barry B. Brey'
		42 2Е 20		42			
		65	79				
000D	57	68	65 72	65	MESS	DB	'Where can it be?
	20	63	61 6Е	20			
	69	74	20 62	65			
	3F						
001D	57	68	61 74	20	WHAT	DB	'What is on first
	69	73	20 6F	6Е			
	20	66	69 72	73			
	74	2Е					
Обратите внимание, что цепочки символов заключены в одинарные кавычки; двойные кавычки использовать не следует. С левой стороны от директив db в примере I.20 приведены шестнадцатеричные значения для каждого из ASCII-кодов. В крайнем столбце слева показаны шестнадцатеричные адреса, с которых начинается распределение памяти для строк ASCII-символов. Например, строка what размещена в памяти с адреса 001D; по этому адресу хранится буква W (с кодом 57), за ней — буква h (с кодом 68), и т. д.
Двоично-десятичные данные
Двоично-десятичные числа, или BCD-числа (Binary Coded Decimals), хранятся в упакованной или в неупакованной форме. Упакованные BCD-данные содержат по паре десятичных цифр в каждом байте, в то время как один байт неупакованных BCD-данных содержит всего одну цифру. Значения BCD-данных ограничены диапазоном представления десятичных цифр 0—9, или 00002—10012. Неупакованные BCD-числа появляются в компьютере в результате нажатия на клавиатуре клавиш с цифрами. Для выполнения сложения и вычитания BCD-чиоел в центральном процессоре предусмотрены специальные команды.32
В табл. 1.9 показаны примеры представления десятичных чисел в BCD-формате. Поскольку простой и эффективный способ выполнения сложных вычислений с BCD-данными не найден, применение данных этого типа ограничено устройствами, производящими минимум арифметических действий.
Таблица 1.9. Упакованные и неупакованные BCD-числа
Десятичное число Упакованное BCD-число Неупакованное BCD-число
12	0001 0010	0000 0001	0000 0010
623	0000 0110 0010 0011	0000 0110	0000 0010 0000 0011
910	0000 1001 0001 0000	0000 1001	0000 0001 0000 0000 	
больнК’**
32 Арифметический сопроцессор позволяет ускорить работу с упакованными BCD-числами размерности. — Пер.
75
в микропроцессоры и компьютеры
------------------------------
иМере 121 показано, как использовать язык ассемблера для задания упакован-0 неупакованных BCD-чисел. При задании числа по частям следует помнить, нЬ,Хяанные, определенные в начале, являются младшими разрядами числа, и наобо-ч1"0 таким образом, для хранения чисел используется способ хранения, начиная с Р^-щего байта. Часто для такого способа применяется термин обратная запись слое, показывает, что байты слова хранятся в обратном порядке по сравнению с К°иДаеМЬ,м’ Например, чтобы задать неупакованное BCD-число 83, сначала следует °* еделить байт со значением а затем байт со значением 8. Упакованные BCD-° иные задают шестнадцатеричными числами; при этом рекомендуется дописывать справа в конце этих чисел букву Н, чтобы ассемблер не воспринял число как деся-тичное-
Таймер 1.21* Задание упакованных и неупакованных BCD-чисел
; Неупакованные BCD-числа
оооо	03 04 05	NUMB1	DB	3,4,5	; число 543
0003	07 08	NUMB2 DB / ; Упакованные		7,8 BCD-числа	. ; число 87
0005	37 34	NUMB3	DB	37Н,34Н	; число 3437
0007	03 45	NUMB 4	DB	3,45Н	; число 4503
Байты
Двоичное число, хранящееся в байте (8 битах), может рассматриваться как беззнаковое или знаковое целое число, что иллюстрирует рис. I.13. Разница — в различном весе старшего бита. Для беззнакового целого числа вес старшего бита равен 128, а для знакового — —128. Когда речь идет о знаковых данных, именно старший бит определяет знак числа. Например, байт с кодом 80Н, если трактовать его как беззнаковое число, означает 128 в десятичном представлении; если же рассматривать его как число со знаком, это —128. Диапазон беззнаковых целых чисел, заданных байтом, составляет ООН—FFH (0—255). Предельные значения знаковых целых соот-ветственно -128 и +127.
Веса разрядов
Знаковый байт
Рис. 1.13. Веса разрядов знаковых и беззнаковых 8-разрядных целых чисел
76
Отрицательные значения хранятся в дополнительном коде. Например, чтобы зада-w код числа —8, следует найти дополнительный код для +8. Дополнительный код жет быть получен из инверсного кода, как показано в примере 1.22.
Пример 1.22. Представление отрицательного числа -8 в дополнительном коде
8
00001000
11110	111
1
(инверсный код)
-8	=	11111000
(дополнительный код)
Более простой способ заключается в следующем. Ищите справа налево позицию со значением 1. Биты, оставшиеся слева от этой позиции, следует проинвертировать (остальные — оставить без изменений). Пример 1.23 иллюстрирует эту технологию с таким же числом, как и в предыдущем примере.
Пример 1.23. Представление отрицательного числа -8 в дополнительном коде
+8	=	00001000
10	0	0
1111
-8	=	1111	1000
(правая часть числа до бита со значением 1 включительно)
(результат инверсии левой части числа)
В программах на языке ассемблера для сохранения байтов данных в памяти предусмотрена директива db. Пример 1.24 показывает, каким образом с помощью ассемблера можно сохранять в памяти различные виды восьмибитных чисел. Следует отметить, что шестнадцатеричные числа в программе завершаются буквой Н, а десятичные числа записывают как есть, т. е. без какого-либо специального обозначения.
Пример 1.24. Применение директивы db
0000	ГЕ	; Беззнаковые байты			
		DATA1	DB	254	; десятичное 254
0001	87	DATA2	DB	87Н	; шестнадцатеричное 87
0002	47	DATA3	DB	71	; десятичное 71
; Знаковые байты
0003	9С	DATA4	DB	-100	; десятичное	-100
0004	64	DATA5	DB	+ 100	; десятичное	+ 100
0005	ЕЕ	DATA 6	DB	-1	; десятичное	-1
0006	38	DATA7	DB	56	; десятичное	56
Слова
Слова, или иначе шестнадцатиразрядные данные, хранятся в паре смежных байт-Младший байт слова всегда сохраняется в ячейке памяти с младшим адресом,
77
uiAe в микропроцессоры и компьютеры
ий байт соответственно в следующей — старшей ячейке. Этот метод, приня-системах на базе микропроцессоров Intel, называется прямым порядком байтов fl»1# endian). Противоположный вариант хранения многобайтных чисел — обратный (ДО > к байтов (big endian) — в микропроцессорах Intel не используется. В этом ва-
старшая (наиболее значимая) часть числа хранится в младшем байте. Формат ^браТН°Г0 порядка байтов применяется в системах на базе микропроцессоров Motor°la-
На Рис
формат представления
1.14, а показаны веса позиций 16-битного слова. Рис. 1.14, б иллюстрирует 1234Н в смежных байтах по адресам 3000Н и 3001Н.
числа
а) Беззнаковое слово
Старший байт
Младший байт
б) Содержимое байтов по адресам ЗОООН и 3001Н при хранении слова 1234Н
Рис. 1.14. Формат хранения 16-битного числа в регистре (а) и в двух смежных байтах памяти (б)
азница между знаковыми и беззнаковыми 16-битными величинами, как и в случае 'битных чисел, заключается в использовании старшего бита. Если число беззнако-в°е, то старший бит — значащий, с наибольшим весом. Если число знаковое, то ^РШий бит задает знак числа, а его вес равен -32 768. Для представления отрица-Тельных чисел используется дополнительный код.
задания знаковых и беззнаковых слов в программе на языке ассемблера предна-аЧена директива dw (или идентичная ей директива word). Пример задания 16-бит-Ь1х Данных приведен в примере 1.25.
78
Листинг 1.25. Задание 16-битных данных
; Беззнаковые
слова
0000 0002 0004	09F0 8 7 АС 02С6	DATA1 DATA2 DATA3	DW DW DW	2544 87АСН 710	; десятичное 2544 ; шестнадцатеричное 87АС ; десятичное 710
		; Знаковые слова			
0006	СВА8	DATA4	DW	-13400	; десятичное -13400
0008	00С6	DATA5	DW	+198	; десятичное +198
000А	FFFF	DATA6	DW	-1	; десятичное -1

Двойные слова
Числа размерностью 32 бита хранятся в двойном слове — в четырех смежных байтах. В 16-разрядных микропроцессорах данные такой размерности получаются в результате умножения 16-разрядных слов; также в двойное слово записывается делимое перед выполнением операции деления (если делитель 16-разрядный). В процессорах от i80386 до Pentium 4 разрядность внутренних регистров и размерность операндов команд расширена до 32. Рис. 1.15, а иллюстрирует хранение 32-разрядного числа в памяти; на рис 1.15, б показаны веса двоичных позиций 32-разрядного числа.
Веса разрядов
а)	Беззнаковое двойное слово
001ОЗН
00102Н
00101Н
001ООН
000FFH
Старший байт
Младший байт
б)	Содержимое байтов по адресам 001 ООН и 001 ОЗН при хранении двойного слова 12345678Н
Рис. 1.15. Формат хранения 32-разрядного числа в регистре (а) и в четырех смежных байтах памяти (6)
79
е^ие в микропроцессоры и компьютеры
32-разрядное число хранится в памяти, его наименее значимая часть находит-К^байте по наименьшему адресу, а наиболее значимая часть — в старшем байте, сЯ 0 тВетствии с форматом прямого порядка байтов (little endian). Например, если ц с°° 12345678Н хранится в памяти по адресам 001 ООН—00103Н, то в байте по адре-ч1<^)100Н записано 78Н, в байте по адресу 00101Н — 56Н, по адресу 00102Н — 34Н, V аДРесу 00103Н - 12Н*
3 задания двойных слов используется директива ассемблера dd. Вместо нее можно ^ользовать также директиву dword. Задание знаковых и беззнаковых 32-разрядных ИСцНЫх посредством директивы dd приведено в примере 1.26.
..............................................................
йКимер -26- Использование директивы ю для задания 32-разрядных данных
; Беззнаковые двойные слова
0000	0003Е1С0	DATA1	DD	254400	; десятичное 254400
0004	87АС1234	DATA2	DD	87АС1234Н	; шестнадцатеричное 87АС1234
0008	00000046	DATA3	DD	70	; десятичное 70
; Знаковые двойные слова
ооос	FFEB8058	DATA4	DD	-1343400	; десятичное -1343400
0010	000000С6	DATA5	DD	+198	; десятичное +198
0014	FFFFFFFF	DATA6	DWORD	-1	; десятичное -1
В принципе, мы можем задать целое значение сколь угодно большой размерности. Рассмотренное нами определение данных в виде 8-, 16- и 32-разрядных знаковых и беззнаковых чисел является стандартным, но это не значит, что в памяти нельзя задать, например, 128-байтное целое значение. Для определения данных нестандартной размерности обычно используют директиву db. Например, 24-разрядное число 123456Н может быть задано директивой db 5бн,34н,12н — в соответствии с форматом прямого порядка байтов (little endian).
Действительные числа
Действительное число, или число с плавающей точкой, состоит из мантиссы и поряд-На рис. 1.16 приведены форматы действительных чисел одинарной и двойной точности, занимающих в памяти 4 или 8 байт соответственно.
Варианты, приведенные на рис. 1.16, соответствуют версии 10.0 стандарта IEEE-4 3, в котором зафиксированы форматы действительных чисел и минимальный абор операций, выполняемых арифметическими сопроцессорами персональных °Мпьютеров. Действительное число однократной точности на рис. 1.16, а содержит еДующие поля: знаковый бит, 8-битный порядок и 24-битную дробную часть ц антиссу). На рис. 1.16, б показан формат действительных чисел двойной точности.
Роцессоры Pentium—Pentium 4, располагающие 64-разрядной шиной данных, спо-803* выполнять ДОСТУП к таким данным в два раза быстрее, чем процессоры
— Institute of Electrical and Electronic Egineers.
80	Гпава ч
31	30	23 22	0
Знак	Смещенный порядок	Мантисса
а)
63	62	52 51	О
Знак	Смещенный порядок	Мантисса
б)
Рис. 1.16. Действительные числа одинарной (а) и двойной точности (6)
Сложив число битов для представления действительного числа одинарной точности, получим 33. На самом деле мантисса хранится в 23 битах, поскольку содержит подразумеваемый или, иначе, скрытый разряд. В сумме получаем 32 бита, что соответствует 4 байтам. Скрытый бит — это первый бит нормализованного действительного числа. При нормализации числа его порядок подбирается таким, чтобы мантисса была больше или равна I и меньше 2. Например, десятичное число 12 в двоичном формате равно И002, а после нормализации l.l х 23. Единица справа от точки не хранится, поэтому мы и считаем, что мантисса 24-битная (хотя в памяти она занимает 23 бита). Примеры машинного представления действительных чисел одинарной точности приведены в табл. !.Ю.
Таблица 1.10. Машинное представление действительных чисел одинарной точности
Число	Код	Нормализованное представление	Знак	Смещенный порядок	Мантисса
+ 12	1100	1.1 х23	0	10000010	1000000 00000000 00000000	:
-12	1100	-1.1 х23	1	10000010	1000000 00000000 00000000
+100	1100100	1.1001 х2в	0	10000101	1001000 00000000 00000000
-1.75	1.11	-1.11 х 2°	1	01111111	1100000 00000000 00000000
+0.25	.01	1.0 х2'2	0	01111101	0000000 00000000 00000000
+0.0	0	0	0	00000000	0000000 00000000 00000000
Порядок двоичного числа с плавающей точкой хранится в смешенном виде и назЫ* вается смещенным порядком. Это означает, что к порядку прибавлена постоянная составляющая — смещение. Значение смещения равно 127 (7FH) для действительны* чисел одинарной точности и 1023 (3FFH) для действительных чисел двойной точно* сти. В предыдущем примере двоичный порядок, равный 3, в числе с одинарно точностью хранится как сумма 127 + 3 = 130 (82Н), а в числе с двойной точностЫО записывается как 1026 (402Н).
81
0 микропроцессоры и компьютеры
орЫе значения, не допускающие нормализации, кодируются особым образом. НеК°наГ1ример, число 0.0, код которого состоит из одних нулей. Еще один при-^т°’ бесконечность (infinity), которая обозначается единицами в поле смещенного мер и нулями в поле мантиссы (с помощью знакового бита различают положи-vio и отрицательную бесконечности).
YgjibHy
ассемблера позволяет определить действительные числа одинарной и двойной ости. Число одинарной точности занимает 32 бита, и для его задания использу-Т°Ч директива dd или dq. Число двойной точности имеет размерность 64 бита и ^Дпеляется директивой dq, которая резервирует 8-байтные последовательности, есто dd и dq можно использовать идентичные директивы real4 и reals. Действи-пьное число расширенной точности определяется директивой realio. Пример 1.27 люстрирует задание действительных чисел.
Г пример 1.27. Задание данных с плавающей точкой
		; Действительные	числа	одинарной точности
0000	3F9DF3B6	NUMB1 DD	1.234	; 1.234
0004	С1ВВЗЗЗЗ	NUMB 2 DD	-23.4	; -23.4
0008	43D20000	NUMB3 REAL 4	4.2Е2	; 420
ооос	3F9DF3B6	NUMB4 REAL 4	1.234	
		f ; Действительные	числа	двойной точности
0010	405ED9999999999A	NUMB 5 DQ	123.4	;123.4
0018	С1ВВЗЗЗЗЗЗЗЗЗЗЗЗ	NUMB 6 REAL8	-23.4	;-23.4
0028	405ED9999999999A	NUMB 7 REAL 8	123.4	
		; Действительное	число	расширенной точности
0030	4005 F6CCCCCCCCCCCCCD	NUMB 8 REAL10	123.4	
Итоги
О Эпоха механических вычислительных устройств началась с изобретения счетов в 500 г. до н. э. В 1642 г. Блез Паскаль изобрел механический калькулятор. Первый механический компьютер под названием "аналитическая машина" спроектирован в 1823 г. Чарльзом Бэббиджем, но изготовлен не был — по причине слишком высоких требований к точности деталей.
Первая электронная вычислительная машина создана Конрадом Цузе во время т°рой мировой войны. Этот компьютер, под названием Z3, применялся в пробировании летательных аппаратов для нужд вермахта.
□ п
1еРвый компьютер на электронных лампах был создан в Англии в 1943 г. и Применялся для раскрытия секретных кодов германской шифровальной машины нигма. Первая электронная вычислительная система под названием "Колосс" °здана Тьюрингом; главный ее недостаток — фиксированная программа.
Первая программируемая электронная вычислительная система ENIAC (Electrodes Numerical Integrator and Calculator) разработана в 1946 г. в университете шта-m Пенсильвания.
82
Глава 1
О Первый язык программирования высокого уровня Flow-Matic был разработан для компьютера UN 1 VAC I в начале 50-х. Автор — Грейс Хоппер. В дальнейшем по образу и подобию Flow-Matic были созданы такие известные языки, как Fortran и CoboL
О Первый в мире микропроцессор Intel 4004 представлял собой 4-разрядный программируемый однокристальный микроконтроллер с 45 инструкциями и 4096 ячейками памяти.
□	Первые 16-разрядные микропроцессоры, созданные фирмой Intel, — 8086/8088. В дальнейшем были выпущены микропроцессоры 80286, 80386, 80486, Pentium, Pentium Pro, Pentium II, Pentium III и Pentium 4. В 80386 разрядность процессора была расширена до 32, а в процессоре Itanium она доведена до 64 бит. В каждом новом поколении процессоров Intel их архитектура усовершенствуется для достижения более высокой производительности.
□	Персональные компьютеры на базе микропроцессоров включают в себя подсистему памяти, содержащую область транзитных программ (ТРА), называемую иначе стандартной памятью, системную область или, иначе, верхнюю память и расширенную память. В область ТРА загружаются на выполнение прикладные программы, там же хранятся программы операционной системы и драйверы. Системная область занята блоками памяти для дисковых операций, видеопамятью и ROM BIOS. Расширенная память доступна в персональных компьютерах класса АТ, на процессорах начиная с Intel 80286.
□	Процессоры 8086/8088 могут адресовать максимум 1 Мбайт памяти в диапазоне адресов 00000Н—FFFFFH. Процессоры 80286 и 80386SX способны адресовать уже 16 Мбайт в диапазоне 000000Н—FFFFFFH. Процессор 80386SL адресует 32 Мбайт памяти по адресам 0000000Н—1 FFFFFFH. Адресное пространство процессоров 80386DX и выше расширено до 4 Гбайт (максимальный адрес — FFFFFFFFH). Кроме того, процессоры от Pentium Pro до Pentium 4 могут использовать 36-разрядные адреса, что позволяет расширить адресное пространство до 64 Гбайт (в диапазоне адресов 000000000Н—FFFFFFFFFH).
□	Во всех версиях микропроцессоров Intel от 8086—80486 до Pentium—Pentium 4 адресное пространство портов ввода-вывода составляет 64 Кбайт, в диапазоне адресов 0000Н—FFFFH. Порты по адресам 0000Н—03FFH зарезервированы для системных устройств персонального компьютера.
□	Большинство персональных компьютеров оснащено операционной системой MS-DOS (Microsoft) или PC-DOS (IBM). Операционная система обеспечивает работу компьютерной системы, включая периферийные устройства общего назначения.
□	Микропроцессор в вычислительной системе играет роль центрального элемента управления. Микропроцессор организует передачу данных, обеспечивает выполнение элементарных арифметических и логических операций, а также принимает простейшие решения. Микропроцессор выполняет сложные операции, заданные программами, которые хранятся в памяти вычислительной системы.
□	Во всех вычислительных системах имеются три шины для организации обмена данными между процессором, памятью и портами ввода-вывода. Адрес порта или ячейки памяти передается по шине адреса. Данные между микропроцессо
Введение в микропроцессоры и компьютеры 83
ром и памятью или периферийными устройствами передаются по шине данных. Шина управления используется для инициирования записи и чтения портов ввода-вывода и памяти посредством сигналов IORC (I/O Read Control — чтение порта), IOWC (I/O Write Control — запись в порт), MRDC (Memory ReaD Control — чтение ячейки памяти) и MWTC (Memory WriTe Control — запись в ячейку памяти).
□	Число, заданное в произвольной системе счисления, преобразуется в десятичное число за счет оценки весов каждой позиции числа. Вес позиции слева от точки в любой системе счисления равен единице. Следующая позиция слева имеет вес, равный основанию системы счисления. Вес последующих позиций определяется как результат умножения веса предыдущей позиции на значение основания системы счисления. Вес позиции справа от точки определяется посредством деления на значение основания системы счисления.
□	Преобразование десятичного числа в любую другую систему счисления выполняется за счет деления на значение основания системы счисления. Преобразование дробной части десятичного числа выполняется посредством умножения на значение основания системы счисления.
□	Шестнадцатеричные данные применяются в вычислительной технике, в основном, для сокращения записи двоичных чисел.
□	Код ASCII используется для хранения печатных литер — букв, цифр, знаков препинания. Восьмой бит кода используется для расширения стандартного 7-битного набора ASCII до 256 символов. Код возврата каретки, вырабатываемый клавиатурой при нажатии клавиши <Enter>, дает команду на перемещение курсора к левому краю строки. Код LF (Line Feed) задает перемещение курсора на следующую строку.
□	Двоично-десятичные числа (BCD) используются в компьютерных системах для хранения десятичных чисел. Двоично-десятичньТе числа могут быть представлены в двух формах — упакованной (по две цифры в байте) и неупакованной (по одной цифре в байте).
□	Двоичные данные хранятся в виде байта (8 бит), слова (16 бит) или двойного слова (32 бита). Могут быть знаковыми или беззнаковыми. Знаковые отрицательные данные хранятся в дополнительном коде. Данные размерностью более 8 бит хранятся в формате прямого порядка байтов (little endian), при котором наименее значимая часть числа размещается в байте с наименьшим адресом.
□	Числа с плавающей точкой используются в компьютерных системах для хранения чисел с дробной частью. Число с плавающей точкой состоит из знака, мантиссы и порядка или, точнее, приведенного порядка.
□	В ассемблере имеются директивы для задания байтов — db или byte, для задания слов — dw или word, для задания двойных слов — DD или DWORD; и для задания 8-байтных значений — dq или qword.
□	В примере 1.28 показаны варианты возможного использования директив ассемблера для задания чисел размерностью байт, слово и двойное слово, а также директив для задания ASCII-строк и действительных чисел.
84
Глава 1

; ASCII-данные 0000 54 68 69 73 20 69 MES1 DB 'This is a character string in ASCII' 73 20 61 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6E 67 20 69 6E 20 41 53 43 49 49
0023 002D 002Е 002F	53 6F 20 69 73 20		MES2 ; Байты DATA1 DATA2 DATA3	DB DB DB DB	'So is 23 -34 34Н	this'	
	74 68 17 DE 34	69 73					
						; десятичное 23 ; десятичное -34 ; шестнадцатеричное	34
			; Слова				
0030	1000		DATA4	DW	1000Н	; шестнадцатеричное	1000
0032	FF9C		DATA5	DW	-100	; десятичное -100	
0034	ооос		DATA6	DW	+12	; десятичное +12	
; Двойные слова
0036	00001000	DATA7	DD	1000Н	; шестнадцатеричное	1000
003А	FFFFFED4	DATA8	DD	-300	; десятичное -300	
003Е	00012345	DATA9	DD	12345Н	; шестнадцатеричное	12345
; Действительные числа
0042	4015C28F	DATA10	REAL4	2.34	; 2.34
0046	C00CCCCD	DATA11	REAL4	-2.2	; -2.2
004А	4059133333333333	DATA12	REAL8	100.3	; 100.3
Контрольные вопросы и задания
1.	Кто автор аналитической машины?
2.	В 1890 г. при переписи населения США был применен новый носитель информации — перфокарта. Кто ее изобрел?
3.	Кто является основателем корпорации IBM?
4.	Кто создал первую электронную вычислительную машину?
5.	С какой целью был разработан первый электронный компьютер?
6.	Как назывался первый программируемый компьютер общего назначения?
7.	Кто является создателем первого в мире микропроцессора?
8.	Кто, кроме Бэббиджа, участвовал в разработке аналитической машины?
9.	Кто автор первого языка программирования высокого уровня Flow-Matic?
10.	В чем заключается принципиальная особенность машины фон Неймана?
11.	С какого 8-разрядного микропроцессора началась эпоха микропроцессоров?
12.	Каков объем продаж микропроцессора 8085, представленного фирмой Intel в 1977 г.?
Введение в микропроцессоры и компьютеры 85
13.	В каком из микропроцессоров фирмы Intel адресное пространство было расширено до 1 Мбайт?
14.	Сколько байт памяти доступно микропроцессору 80386SL?
15.	Сколько памяти доступно микропроцессору 80486?
16.	В каком году фирма Intel представила микропроцессор Pentium?
17.	В каком году был выпущен процессор Pentium Pro?
18.	Когда появился микропроцессор Pentium 4?
19.	Какой из микропроцессоров Intel может адресовать 64 Гбайт памяти?
20.	Что означает аббревиатура MIPs?
21.	Что означает аббревиатура CISC?
22.	Какие две цифры можно закодировать одним битом?
23.	Чему равно приставка К (кило) в вычислительной технике?
24.	Сколько Кбайт в одном Мбайте?
25.	Сколько Мбайт в одном Гбайте?
26.	Сколько страниц текста можно сохранить в памяти объемом 4 Гбайт?
27.	Какие две области находятся в памяти, доступной процессору в реальном режиме его работы?
28.	Сколько памяти отводится под ТРА?
29.	Сколько занимает системная область памяти или, иначе, верхняя память?
30.	Сколько байт памяти адресует микропроцессор 8086?
31.	Сколько байт памяти адресует микропроцессор Pentium 4?
32.	Какой микропроцессор способен адресовать 4 Гбайт памяти?
33.	Как называется область памяти за пределами памяти, доступной в реальном режиме работы процессора?
34.	Для чего предназначена базовая система ввода-вывода (BIOS)?
35.	Для чего предназначена операционная система DOS?
36.	В чем разница между компьютерными системами класса XT и АТ?
37.	Что такое локальная шина VESA?
38.	Какова разрядность интерфейсных карт, поддерживаемых шиной ISA?
39.	Что означает аббревиатура USB?
40.	Что означает аббревиатура AGP?
41.	Что означает аббревиатура XMS?
42.	Что означает аббревиатура EMS?
43.	Что означает аббревиатура TSR?
44.	В каких областях памяти могут находиться драйверы?
45.	В каких ситуациях используются TSR-программы?
46.	Для чего предназначен файл CONFIG.SYS?
47.	Каково назначение файла AUTOEXEC.BAT?
48.	Какую информацию обрабатывает программа COMMAND.COM?
49.	Каков объем адресного пространства системы ввода-вывода?
50.	Где находится область высокой памяти (НМА)?
51.	В каком файле могут встретиться операторы DEVICE и DEVICEHIGH?
52.	Где находятся блоки верхней памяти (UMB), используемые MS-DOS?
86
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.

Где располагается видео-BIOS?
Нарисуйте типичную блок-схему компьютерной системы.
Для чего предназначен микропроцессор в компьютерной системе?
Какие шины используются в типичной компьютерной системе? По какой шине передается адрес порта и ячейки памяти? Какой управляющий сигнал инициирует чтение памяти?
Для чего предназначен сигнал IORC ?
Какую операцию выполняет микропроцессор, когда сигнал MRDC имеет значение 0? Для чего предназначены следующие директивы:
a) DB б) DQ В) DW Г) DD Преобразуйте следующие двоичные числа в десятичный формат: а) 1101.01 б) 111001.0011 в) 01011.0101 г) 11.0001
Преобразуйте в десятичный формат следующие восьмеричные числа: а) 234.5 б) 12.3 в) 7767.07 г) 123.45 д) 72.72
Преобразуйте в десятичный формат следующие шестнадцатеричные числа: а) АЗ.З б) 129.С в) AC.DC г) FAB.3 д) BB8.0D
Преобразуйте следующие целые десятичные числа в двоичный, восьмеричный и в шесТ' надцатеричный форматы: а) 23 б) 107 в) 1238 г) 92 Д) 173
Преобразуйте следующие десятичные числа в двоичный, восьмеричный и в шестнаДИ31*’ ричный форматы: а) 0.625 б) .00390625 в) .62890625
87
8 микРопР°ЦессоРы и компьютеры
г) 0.75
л)*375
ЗаПи1ПИтс следующие шестнадцатеричные числа в двоичном формате:
*’ ,рз
б) AD4
в) 34 AD
Г) BD32
д) 234-3
Запишите следующие двоичные числа в шестнадцатеричном формате: ' а) Ц00 0010
6) 0001 0000 1111 1101
В) 1011 1100
г) 0001 0000
д) юоо 1011 1010
(9 Вычислите инверсный код для следующих двоичных чисел: а) 1000 1000 6)0101 1010
в) 0111 0111
г) 1000 0000
70. Получите дополнительный код для следующих двоичных чисел:
а) 1000 0001
б) 1010 1100
в) 1010 1111
г) 1000 0000
71. Запишите на ассемблере пример задания байта, слона и двойного слова с произвольными их значениями.
22.	Запишите следующие последовательности символов в коде ASCII:
a)	FROG
б)	Аге
в) Water
г) Well
73- Какой ASCII -код у клавиши <Enter> и что она обозначает?
' Запишите директиву задания данных для хранения строки 'What time is it?'. Преобразуйте следующие десятичные числа в двоичные знаковые байты: а) +32
6)	-12
») +100
’6.
г) -92
Преобразуйте следующие десятичные числа в двоичные слова со знаком: а) +1000 6) -120
®) +800
г> -3212
88
77. 78.	Запишите директиву задания одного элемента данных со значением -34. Задайте следующие слова в памяти, используя вместо директивы DW директиву db (ка*д слово следует задавать парой байт): а)	1234Н б)	А122Н в)	В100Н
79.	В чем разница между форматами обратного порядка байтов (big endian) фирмы Motorola и прямого порядка байтов (little endian) Intel при хранении данных размерностью больщ. байта?
80. 81.	Запишите директиву задания элемента данных с шестнадцатеричным значением 123А. Преобразуйте следующие десятичные числа в форматы упакованных и неупакованных BCD-чисел:
a) 102
6)44
в)	301
г)	1000
82.	Преобразуйте следующие двоичные числа в знаковые десятичные:
а)	10000000
б)	00110011
в)	10010010
г)	10001001
83.	Преобразуйте следующие упакованные BCD-числа в десятичные:
а)	10001001
б)	00001001
в)	00110010
г)	00000001
84.	Преобразуйте следующие десятичные числа в действительные числа одинарной точности: а) +1.5
б)	-10.625
в)	+100.25
г)	-1200
85.	Преобразуйте следующие действительные числа одинарной точности в десятичные числа: а) 0 10000000 11000000000000000000000 б) 1 01111111 00000000000000000000000 в) 0 10000010 10010000000000000000000
86.	Найдя дополнительную информацию в Internet, составьте краткое сообщение о следу10' щих изобретателях:
•	Чарльз Бэббидж (Charles Babbage)
•	Конрад Цузе (Konrad Zuse)
•	Жозеж Жаккар (Joseph Jacquard)
•	Герман Холлерит (Herman Hollerith)
89
..е в микропроцессоры и компьютеры ------------- -----------------------
чдЯ дополнительную информацию в Internet, составьте краткое сообщение о следую-
87.	А*1* языках программирования:
щи*'
Кобол (Cobol)
Алгол (Algol)
фортран (Fortran)
Паскаль (Pascal)
Найдя дополнительную информацию в Internet, составьте краткое сообщение об особен-
88	ностях микропроцессора Itanium.
ГЛАВА 2
Микропроцессор и его архитектура
у
Введение
В этой главе мы рассмотрим программную модель микропроцессоров Intel и принд. тые в них механизмы адресации памяти.
Методы адресации представлены для реального и защищенного режимов. В реальном режиме доступна память по адресам 00000Н—FFFFFH (1 Мбайт в начале адресного пространства); возможности реального режима одинаковы для всех версий микропроцессоров Intel. В защищенном режиме, начиная с микропроцессора 80286 адресное пространство расширено до 16 Мбайт для 80286, до 4 Гбайт для 80386— Pentium и 4/64 Гбайт для Pentium Pro—Pentium 4.
Темы главы
В этой главе мы рассмотрим:
□	функции и назначение программно-доступных регистров микропроцессоров 8086—80486 и Pentium—Pentium 4;
□	регистр флагов микропроцессора и назначение флагов;
□	доступ к памяти в реальном режиме;
□	доступ к памяти в защищенном режиме;
□	программно-недоступные регистры микропроцессоров 80286—Pentium 4;
□	страничную организацию памяти.
2.1. Внутренняя архитектура микропроцессора
Знакомство с архитектурой микропроцессора — необходимый предварительный этап в освоении системы команд и разработке первых программ. Предметы рассмотрение в этом разделе — программно-доступная часть внутренней архитектуры микропр0
цессоров 8086—Pentium 4 и назначение их регистров.
Программная модель микропроцессора
Программная модель микропроцессора представляет собой программно-^ часть его внутренней архитектуры. В нее входят, в частности, программно-^
91
ifpenecc°P и его архитектура регистры, которые могут быть указаны в качестве операндов Прочие регистры, доступные лишь косвенно, относятся к категории про-^доступных. Рассмотрение этих регистров представлено далее в этой главе. гр^Н°^ с микропроцессора 80286, программно-недоступные регистры применяют-ИачйН управления памятью в защищенном режиме.
Сегментные регистры
Код
Данные
Дополнительные данные
Стек
Рис. 2.1. Программная модель микропроцессоров Intel
р^фаммная модель микропроцессоров 8086—Pentium 4 показана на рис. 2.1. Для иих версий микропроцессоров Intel (8086, 8088 и 80286) характерна 16-битная
92
Г*
архитектура с набором регистров, показанных на рис. 2.1. В процессорах 8038* Pentium 4 архитектура 32-битная. Эти архитектуры (16- и 32-битная) совместив снизу вверх. Затененные области на рис. 2.1 обозначают те элементы архитектур которые свойственны микропроцессорам 80386—Pentium 4, но отсутствуют в 16-613} ных микропроцессорах 8086—80286.
В программную модель входят 8-, 16- и 32-битные регистры. К 8-битным относят*. АН, AL, ВН, BL, CH, CL, DH и DL — так они обозначаются в языке ассемблер при указании их в качестве операндов инструкций. Пример — команда add al д? которая прибавляет 8-битное число в регистре АН к 8-битному числу в регистре ai (при этом изменяется только содержимое AL). К 16-битным регистрам относят*. АХ, ВХ, СХ, DX, SP, BP, DI, SI, IP, FLAGS, CS, DS, ES, SS, FS и GS. Приме! команды с использованием этих регистров: add dx,cx. Эта команда складывает 16-битные данные, хранящиеся в регистрах СХ и DX, помещая‘результат в DX (со. держимое СХ при этом не изменяется). Расширенные 32-битные регистры — ЕДУ ЕВХ, ЕСХ, EDX, ESP, EBP, EDI, ESI, EIP и EFLAGS. Расширенные регистры, а также 16-битные регистры FS и GS доступны для процессоров начиная с 80386. Пример команды с расширенными регистрами: add есх,евх.
Регистры разделяются на специализированные регистры и регистры общего назначения. К регистрам общего назначения относятся ЕАХ, ЕВХ, ЕСХ, EDX, EBP, EDI и ESI. Они используются для хранения данных различной размерности (байт, слов или двойных слов), их назначение определяется исключительно логикой программы.
Регистры общего назначения
Рассмотрим регистры общего назначения и особенности их применения.
□	ЕАХ (accumulator — аккумулятор)
ЕАХ адресуется как 32-битный (ЕАХ), 16-битный (АХ) или как 8-битный регистр (АН и AL)1. При записи в 8- или 16-битный регистр остальная часть регистра ЕАХ остается без изменений. Регистр-аккумулятор EAX/AX/AL используется в качестве обязательного операнда таких инструкций, как умножение, деление, двоично-десятичная коррекция и т. д. Хотя в этих командах аккумулятор используется специальным образом, в остальных случаях он является типичным регистром общего назначения. В процессорах 80386—Pentium 4 допускается косвенная адресация памяти через регистр ЕАХ.
□	ЕВХ (base index — указатель базы)
ЕВХ адресуется как ЕВХ, ВХ, BL или ВН. Регистр ВХ во всех поколениях микропроцессоров Intel допускает применение в качестве указателя. В процессора* от 80386 и выше регистр ЕВХ также может быть использован для косвенной аД* ресации памяти.
□	ЕСХ (count — счетчик)
ЕСХ-регистр общего назначения, но в некоторых инструкциях играет роль счет чика. В микропроцессорах 80386—Pentium 4 может применяться для косвенн адресации. В качестве счетчика используется строковыми инструкциями с пр6
1 АН и AL обозначают, соответственно, старший и младший байты регистра АХ. — Пер.
93
d
о
о
о
^nniieccop и его архитектура ~~
ксами повторения rep/repe/repne, инструкциями сдвига и циклического сдви-напримеР» loop/loopd. При сдвигах и циклических сдвигах в регистре CL на-га’ тсЯ число сдвигов; счетчик повторов строковых инструкций с префиксами х°вТорения хранится в СХ, а команды циклов ведут счет либо в СХ, либо в ЕСХ. ЕрХ (data - данные2)
ерХ-регистр общего назначения, но дополнительно используется для сохране-ния части результата умножения и, при делении, для хранения части делимого. В микропроцессоре 80386 и выше допускает применение в качестве указателя при адресации к памяти.
gpp (base pointer — указатель базы3)
регистр ЕВР адресуется как ВР и ЕВР; в любом из этих вариантов может быть использован в качестве указателя базы.
EDI (destination index — указатель приемника)
регистр EDI адресуется как EDI и DI; в строковых командах используется в качестве указателя операнда-приемника.
ESI (source index — указатель источника)
Регистр адресуется как ESI или SI; в строковых командах адресует операнд-источник.
Специализированные регистры
К специализированным регистрам относятся регистры EIP, ESP, EFLAGS, а также сегментные регистры — CS, DS, ES, SS, FS и GS.
О EIP (instruction pointer — указатель инструкции)
Регистр адресует следующую инструкцию в области памяти, определенной в качестве сегмента кода. В реальном режиме указатель инструкции занимает младшее слово EIP — регистр IP; целиком регистр EIP используется в защищенном режиме процессоров 80386—Pentium 4. Указатель инструкции может быть изменен командой перехода или вызова подпрограммы.
& ESP (stack pointer — указатель стека)
Регистр ESP адресует область памяти, определенную в качестве стека. Стек хранит данные от адреса, заданного в ESP (подробности обсудим позднее, при изучении инструкций для работы со стеком). Регистр ESP целиком используется в защищенном режиме процессоров 80386—Pentium 4, а младшая его часть (регистр SP) — в реальном режиме.
eflags (регистр флагов)
Регистр характеризует состояние микропроцессора и управляет его настройками. На рис. 2.2 показано содержимое регистра флага для всех версий микропроцес
< р
негИстр EDX/DX также называют “расширителем аккумулятора” — в командах деления и умноже-j он используется в паре с ЕАХ/АХ. — Пер.
Меется в виду "база" стека — точка отсчета, которую устанавливают перед операциями над дан-’Ми в стеке. — Пер.
94
Гпава 2
соров Intel. Обратите внимание, что в процессорах от 8086/8088 до Pentium 4 флаги совместимы снизу вверх. В 8086—80286 флаги хранятся в 16-битном регистре FLAGS; начиная с микропроцессора 80386 применяется расширенный (extended) 32-битный регистр флагов — EFLAGS.
Рис. 2.2. Регистры EFLAGS и FLAGS для микропроцессоров i80x86—Pentium 4
Состояние пяти флагов справа на рис. 2.2 и флага переполнения изменяется при выполнении большинства арифметических и логических инструкций. Флаги никогда не изменяют свое значение при передаче данных и при выполнении команд передачи управления. Некоторые флаги используются для настройки операций микропроцессора. Ниже приведен перечень флагов с их краткой характеристикой (подробности — по мере изучения системы команд).
□	С (carry — перенос)
Флаг С содержит значение переноса после операции сложения или заема после вычитания. Часто используется как признак ошибки при выполнении функций операционной системы (см. Приложение 1) или пользовательских процедур.
□	Р (parity — паритет)
Флаг сброшен в 0, если результат операции содержит нечетное число бит, установленных в 1; иначе (если число единичных бит результата операции четное), флаг Р установлен в 1. Например, если число содержит три единицы, то паритет нечетный, и флаг Р = 0. Если число равно 0 (все биты сброшены в 0), то паритет четный, и Р = 1. Флаг Р был введен в первых микропроцессорах для поддержки коммуникационных приложений — для формирования бита паритета при передаче и контроля ошибок паритета при приеме. Формирование и контроль паритета в современных устройствах приемопередачи встроенный, поэтому флаг Р используется сейчас довольно редко.
□	A (auxiliary carry — промежуточный перенос)
Флаг содержит значение переноса из третьего бита в четвертый (так называемый полуперенос) при сложении, или значение заема из четвертого бита при вычитании. Значение флага А проверяется при выполнении инструкций daa и das для коррекции значения в AL после сложения или вычитания двоично-десятичных чисел. Значение этого флага на выполнение других инструкций не влияет.
Микропроцессор и его архитектура 95
О Z (zero — ноль)
Флаг Z устанавливается в 1, если результат равен 0; сбрасывается в 0, если результат отличен от нуля.
О S (sign — знак)
Флаг содержит копию знакового бита результата арифметической или логической операции. Если S = I, знак отрицательный (число меньше нуля); если S = 0, то знак положительный (число меньше или равно нулю).
□	TF (trap flag — флаг ловушки4)
Флаг обеспечивает аппаратную поддержку пошаговой отладки (например, в отладчике CodeView). Когда режим трассировки установлен (TF = 1), микропроцессор прерывает выполнение программы после каждой инструкции.
О IF (internipt flag — флаг прерывания)
Флаг разрешает проверку внешнего запроса на прерывание по входу INTR (interrupt request). При IF = 1 проверка входа INTR разрешена; если же IF = 0, то состояние INTR не контролируется микропроцессором. Установка флага IF в 1 выполняется инструкцией sti (set I flag), сброс — командой сы (clear I flag).
□	D (direction — направление)
Флаг определяет режим автоматического изменения (увеличение или уменьшение) регистров DI и/или SI при выполнении строковых инструкций. Если D = 1, значения этих регистров автоматически уменьшается, при D = 0 — увеличивается. Установка флага D выполняется командой std (set direction); команда cld (clear direction) обнуляет флаг D.
□	О (overflow — переполнение)
Флаг отражает переполнение при сложении и вычитании знаковых чисел. Переполнение означает, что результат превысил возможности машины. Например, результат сложения 8-битных значений 7FH (+127) и 01Н равен 80Н (-128). Флаг О устанавливается в 1, поскольку' эта величина, полученная в результате 8-битного сложения, не может быть представлена в формате 8-битного числа со знаком.
□	IOPL (I/O privilege level — уровень привилегий ввода-вывода)
Флаг используется в защищенном режиме, где определяет уровень привилегий ввода-вывода текущей задачи. Если текущий уровень привилегий выше уровня, указанного в поле IOPL, то ввод-вывод выполняется беспрепятственно. Если IOPL ниже текущего уровня привилегий, генерируется прерывание, приостанав-. ливающее выполнение программы. Заметим, что IOPL = 00 соответствует высшему уровню привилегий, a IOPL =11 — низшему.
□	NT (nested task — вложенная задача)
Флаг NT установлен в 1, если текущая задача является вложенной по отношению к другой задаче.
4 Также называется флагом трассировки. — Пер.
м----------------------------------------------------------------------0*2^
□	RF (resume — возобновление)
Флаг используется при отладке для возобновления программы после выполнена следующей инструкции.	7
□	VM (virtual mode — режим виртуальной машины)
Флаг определяет режим виртуальной DOS-машины в рамках защищенного жима. Каждой виртуальной машине выделяется блок памяти размером 1 Мбайь из пространства памяти защищенною режима, что позволяет операционной теме выполнять несколько DOS-программ.
□	AC (alignment check — контроль выравнивания)
Флаг АС разрешает прерывания при доступе к словам или двойным словам, цр выровненным по границам слова или двойного слова соответственно. В микро., процессоре 80486SX этот флаг использовался для синхронизации встроенного сопроцессора 80487SX.
П VIF (virtual interrupt flag — виртуальный флаг прерывания)
Флаг VIF копия флага IF в микропроцессорах Pentium—Pentium 4.
□	VIP (virtual internipt pending — виртуальный флаг задержки прерывания)
Флаг предоставляет информацию о прерывании для процессоров Pentium-Pentium 4; используется в многозадачных операционных системах совместно с флагом VIF.
□	ID (identification — идентификация)
Если значение этого флага может быть изменено программным путем, то процессор поддерживает инструкцию cpuid (Pentium—Pentium 4). Инструкция cpuid дает такие сведения о микропроцессоре, как номер версии и код производителя.
Сегментные регистры
Сегментные регистры, в сочетании с другими регистрами микропроцессора, используются при генерировании адреса памяти. В различных версиях микропроцессоров число сегментных регистров составляет 4 или 6. Содержимое сегментных регистров в реальном и защищенном режимах используется различным образом (подробнее этот вопрос мы обсудим чуть позже в данной главе). Ниже приведен список сегментных регистров с указанием их назначения и особенностей.
□	CS (code — код)
Сегмент кода представляет собой область памяти, в которой содержатся иН^ рукции программы. Сегментный регистр CS определяет стартовый адрес этой области памяти. В реальном режиме CS указывает непосредственно на сегмент кода — область размером 64 Кбайт. В защищенном режиме CS указывает на ДесК* риптор, в котором хранится описание сегмента кода, включая начальный адрсс размер сегмента. Размер сегмента кода в процессорах 8088—80286 ограните 64 Кбайт, но в защищенном режиме 32-битных процессоров может достига 4 Гбайт.
□	DS (data — данные)
Сегмент данных представляет собой область памяти для хранения данных ПР^ граммы. Адрес данных определяется сочетанием сегментного адреса в регистр*
97
d
^nnueccop и его архитектура --------
и смешения, значение которого находится либо в самой инструкции, либо в трС-указателе. Размер сегмента данных в процессорах 8088—80286 не пре-1Ш^еТ Кбайт, для 32-битных процессоров ограничен 4 Гбайт.
gS (extra дополнительные данные)
р гистр оказывает местоположение операнда-приемника при выполнении строевых инструкций.
0 SS (Stack - стек)
регистр определяет область памяти для системного стека. Адрес вершины стека образуется сочетанием значений SS и ESP/SP. Регистр ЕВР/ВР, в паре с SS, применяется для доступа к данным, расположенным в любой точке сегмента стека.
□	FS и GS
Дополнительные сегментные регистры, предназначенные для поддержки добавочных сегментов данных; доступны в процессорах 80386—Pentium 4.
2.2. Адресация памяти в реальном режиме
Микропроцессорам 80286—Pentium 4 доступны два режима функционирования — реальный и защищенный. Процессоры 8086/8088, напротив, работают только в реальном режиме. В этом разделе мы подробно рассмотрим реальный режим адресации памяти. Реальный режим позволяет микропроцессору, даже если это Pentium 4, адресовать только 1 Мбайт памяти. Операционная система DOS рассчитана на реальный режим; соответственно программы, написанные для 8086/8088, могут работать на процессорах 80286—Pentium 4 в реальном режиме без изменения программного кода. (Заметим, что совместимость программного обеспечения снизу вверх определяет, наряду с другими факторами, успех микропроцессоров Intel.) Все версии микропроцессоров Intel включаются в работу именно в реальном режиме, как при включении питания, так и при повторном запуске.
Сегменты и смещения
В реальном режиме адрес памяти представляет собой комбинацию сегментного ад-реса и смещения. Сегментный адрес, заданный одним из сегментных регистров, определяет начало сегмента памяти объемом 64 Кбайт. Смещение задает положение Ячейки памяти внутри сегмента. Рис. 2.3 иллюстрирует вычисление адреса памяти в Реальном режиме — по значениям сегментного адреса и смешения. Сегмент на РИс- 2.3 занимает адреса 10000Н— 1FFFFH (всего 64 Кбайт). Поскольку сегмент начинается с адреса 10000Н, а смещение составляет F000H, то адрес ячейки памяти Равен 1F000H. Напомним, что значение смещения определяет расстояние в байтах т Начала сегмента.
в ^Ратите внимание, что начало сегмента на рис. 2.3 расположено по адресу 10000Н, То время как сегментный регистр содержит 1000Н. В реальном режиме при вычис-нии адреса сегмента к значению сегментного регистра микропроцессор добавляет Рава ОН. Так формируется 20-битный адрес памяти, определяющий начало сег-еНта. Расширение адреса до 20 бит позволяет адресовать 1 Мбайт памяти. Напри-еР, если сегментный регистр содержит 1200Н, то посредством этого регистра дос-
4
Зак 3N4
98
Гпава 2
тупна память размером 64 Кбайт с адреса 12000Н. Если значение сегментного регистра равно 1201Н, он адресует сегмент памяти с адреса 12010Н. Поскольку значение сегментного регистра дополняется ОН, в реальном режиме сегменты выровнены по 16-байтным границам. Промежуток в 16 байт между соседними сегментами называется параграфом.
Рис. 2.3. Механизм адресации памяти в реальном режиме
Поскольку в реальном режиме сегмент имеет фиксированную длину 64 Кбайт, то конечный адрес сегмента равен сумме начального адреса и FFFFH. Например, если сегментный регистр содержит 3000Н, то первый адрес в сегменте равен 30000Н, а последний — 30000Н + FFFFH, т. е. 3FFFFH. В табл. 2.1 показаны несколько значений сегментного регистра и соответствующие им адреса границ сегмента в памяти.
Таблица 2.1. Примеры значений сегмента и его границ
Значение сегментного регистра	Начальный адрес	Конечный адрес
2000Н	20000Н	2FFFFH
2001Н	20010Н	3000FH
21 ООН	21000Н	30FFFH
AB00H	AB000H	BAFFFH
1234Н	12340Н	2233FH
Микропроцессор и его архитектура
99
При формировании адреса памяти значение смещения, как часть адреса, прибавляется к стартовому адресу сегмента. Например, если сегментный регистр содержит 1000Н, а смещение составляет 2000Н, то микропроцессор обратится к памяти по адресу 12000Н. Составляющие адреса — сегмент и смещение — часто записывают парами через двоеточие. Например, 1000:2000 означает сегмент 1000Н и смещение 2000Н.
В микропроцессорах 80386—Pentium 4, а также в некоторых версиях процессора 80286 наличие сегмента FFFFH позволяет адресовать в реальном режиме помимо 1 Мбайта еще одну область памяти объемом 64 Кбайт минус 16 байт. Это так называемая высокая память, которая находится в диапазоне адресов 0FFFF0H—10FFEFH п доступна программам реального режима при установке драйвера HIM ЕМ.SYS. Если сегментный адрес равен FFFFH, то при добавлении смещения микропроцессор устанавливает активный уровень на адресной линии А20. Например, при сочетании сегмента и смещения FFFF:4000, результирующий адрес составляет FFFF0H + 4000Н = 103FF0H. Обратите внимание, что в адресе 103FF0H бит 20 установлен в 1. Если управление линией А20 не поддерживается, то бит 20 адреса не передается, и микропроцессор обращается к ячейке по адресу 03FF0H.
В некоторых методах адресации смещение задается суммой значений регистров и/или постоянной величины, которая может превысить предельную длину сегмента — FFFFH. Например, если сегментный адрес равен 4000Н, а смещение определяется суммой составляющих F000H и 3000Н, то процессор обратится к ячейке по адресу 42000Н, а не по адресу 52000Н. Дело в том, что результат сложения F000H и 3000Н составляет не 12000Н, а всего 2000Н, поскольку ограничен 16 битами. Перенос при сложении отбрасывается — на определение адреса памяти он не влияет. В итоге генерируется адрес, соответствующий сегменту и смещению 4000:2000, т. е. 42000Н.
Сочетания сегментов и смещений, действующие по умолчанию
Каждый из сегментных регистров связан по умолчанию с определенными источниками смещений. Правила, устанавливающие соответствие между сегментными регистрами и источниками смещений, действуют как в реальном, так и в защищенном режиме. Например, сегментный регистр кода всегда используется в паре с регистром указателя инструкции — для доступа к следующей исполняемой инструкции. Выбор между парами регистров CS:IP и CS:EIP определяется режимом микропроцессора. Сегментный регистр CS определяет начало сегмента кода, а указатель инструкции E1P/IP задает смещение внутри кодового сегмента. Например, если в реальном режиме CS = 1400Н, a IP = 1200Н, то микропроцессор считывает инструкцию из памяти по адресу 14000Н + 1200Н = 15200Н.
Для доступа к стеку применяются пары регистров SS:SP (SS:ESP) и SS:BP (SS.EBP). Например, если SS = 2000Н, a BP = 3000Н, то при использовании ВР в качестве указателя микропроцессор обратится к памяти по адресу 23000Н. Заметим, что в реальном режиме в качестве смещения используются только младшие 16 бит расширенного регистра. Поэтому в процессорах 80386—Pentium 4 при работе в реальном
100 j
режиме не следует задавать значения смещений в регистрах-указателях больщ FFFFH. В противном случае система остановится5.
Возможные сочетания сегментов и 16-битных смещений, действующие по умодц^ нию, приведены в табл. 2.2. В табл. 2.3 приведены аналогичные данные дд* 32-битных смещений6. Обратите внимание, что процессоры 80386—Pentium 4 располагают большим числом сочетаний сегментов и источников смещений по сравнению с 8086—80286.
Таблица 2.2. Сочетания сегментов и 16-битных смещений, действующие по умолчанию
Сегмент	Смещение	Назначение адреса
CS	IP	Адрес инструкции
SS	SP или ВР	Адрес стека
DS	ВХ, DI, SI, 8- или 16-битное число	Адрес данных
ES	DI (для строковой инструкции)	Адрес приемника строковой команды
Таблица 2.3. Сочетания сегментов и 32-битных смещений, по умолчанию
Сегмент	Смещение	Назначение адреса
CS	EIP	Адрес инструкции
SS	ESP или ЕВР	Адрес стека
DS	ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, 8- или 32-битное число	Адрес данных
ES	EDI (для строковой инструкции)	Адрес приемника строковой команды
Микропроцессоры 8086—80286 располагают четырьмя сегментными регистрами, а процессоры от 80386 и выше — шестью. Количество сегментных регистров ограничивает число текущих сегментов программы. На рис. 2.4 показан пример расположения в памяти четырех сегментов. Заметим, что текущие сегменты могут пересекаться друг с другом; обычно это происходит, если программе требуется часть сегмента размером меньше 64 Кбайт. Сегменты можно представить себе окнами, которые обеспечивают доступ к данным или инструкциям и могут перемещаться в памяти. Заметим также, что число сегментов в программе может превышать число сегментов, поддерживаемых микропроцессором; но в каждый момент времени Д°с' тупны только четыре или шесть сегментов, в зависимости от версии микропроцессора.
5 В реальном режиме при значении смещения больше 0FFFFH генерируется исключение °б защиты. Поскольку в DOS 6.22 это исключение не обрабатывается надлежащим образом, систе "повисает" без каких-либо сообщений. — Пер.
мИХ
6 Сегментные регистры FS и GS здесь не указаны, т. к. источник смещения по умолчанию ДЛЯ и не определен. — Пер.
npoUeccoP и его архитектура
101
Память
-| 4 9 О О I ES
-| 3 4 О О | SS
j~ 2 О О О | CS
1 О О О | DS
Рис. 2.4. Пример расположения сегментов в памяти
Предположим, что прикладная программа требует 1000Н байт памяти для инструкций, 190Н байт для данных, 200Н байт для стека, а дополнительный сегмент данных не нужен. Программа загружается в подходящую по размеру область в ТРА над Драйверами и другими программами, уже находящимися в ТРА. Загрузка выполняйся специальной программой в составе DOS. Расположение прикладной программы в памяти после загрузки показано на рис. 2.5. Видно, что сегменты пересекаются МеХцу собой, поскольку длина каждого из них меньше 64 Кбайт.
Возможность перемещения программы в памяти
^еханизм адресации памяти посредством сегментов и смещений, хотя и кажется ^Ишне сложным, упрощает распределение памяти при загрузке программ. Кроме Го, благодаря этой схеме адресации, программы, написанные для работы в реаль-°м режиме, могут работать так же и в защищенном режиме. Код и данные могут ,Ть помещены в произвольные области памяти без изменений в программе, что °3&оляе7 использовать одно и то же программное обеспечение на машинах с раз-и конфигурацией памяти.
^Оскольку данные в пределах сегмента адресуются смещением, сегмент может быть Умещен в любую область адресного пространства без коррекции смещений. Пе-К1еЩение выполняется следующим образом: программа копируется, как единый
102
Пересечение сегментов
Память
Рис. 2.5. Пример расположения сегментов кода, данных и стека прикладной программы
блок памяти, целиком в новую область, после чего корректируются значения сегментных регистров. Если смещение некоторой инструкции от начала сегмента составляет 4 байта, то после перемещения программы расстояние этой инструкции от начала сегмента остается таким же — 4 байта. Все, что требуется после копирования программы в новую область, — подправить значения сегментных регистров. В отсутствие сегментов переместить программу, не исправляя ее код, было бы невозможно. В результате для разных конфигураций памяти пришлось бы поддерживать несколько разных версий программы7.
7 Разработка перемещаемых программ возможна даже в этой ситуации, хотя требует более развиты^ методов адресации, не поддерживаемых процессорами Intel. Например, при разработке драйверов операционной системе RT-11 для компьютеров PDP-11 (фирмы DEC) применялись специальна приемы для замены абсолютных смещений относительными, когда адрес операнда задается К** расстояние от операнда до инструкции. В результате драйверы для RT-1I допускали размешен в любой области памяти в пределах 64 Кбайт. — Пер.
103
саиии в -объекта^ адреса. -тифииирует л
teccop и его архитектура --------------
2 з ВвеДение в защищенный режим
нныи режим адресации памяти (в процессорах от 80286 и выше) открывает 3^и к данным и коду за пределами памяти, ограниченной 1 Мбайтом. При адре-достУп^ заШИ1ценном режиме смещение по-прежнему задает положение адресуемого .j сегменте. Основное отличие от реального режима — отказ от сегментного Теперь в сегментном регистре хранится значение селектора, который иден-- — дескриптор, заданный в таблице дескрипторов. Дескриптор описывает ^^дожение сегмента в памяти, его размер, а также права доступа к сегменту. По-^льку сегментный регистр и смещение по-прежнему используются для доступа к памяти, инструкции процессора в защищенном режиме не отличаются от инструкций реального режима. Поэтому многие программы, написанные в расчете на реальный режим, работают без изменений и в защищенном режиме. Разница между режимами заключается в разной интерпретации значения сегментного регистра. Еще одна особенность защищенного режима состоит в том, что в процессорах 80386— Pentium 4 смещение может быть задано 32-битным числом, что позволяет адресовать данные в сегменте размером до 4 Гбайт8.
Селекторы и дескрипторы
Селектор, заданный в сегментном регистре, определяет выбор одного из 8192 дескрипторов, хранящихся в глобальной или в локальной таблице дескрипторов. Дескриптор содержит информацию о расположении и длине сегмента, а также о правах доступа к сегменту. В итоге, сегментный регистр по-прежнему определяет выбор сегмента памяти, но косвенно, в отличие от реального режима, где выбор прямой. Например, значение CS = 0008Н в реальном режиме определяет сегмент кода по адресу 00080Н. В защищенном режиме при таком значении регистра CS соответствующий сегмент кода может находиться в любой области адресного пространства.
Для задания дескрипторов предусмотрены две таблицы дескрипторов', в одной содержатся глобальные дескрипторы, в другой — локальные. В таблице глобальных Дескрипторов хранятся определения сегментов, доступные всем программам; напротив, локальные дескрипторы используются только одним приложением. Глобальные дескрипторы называют также системными, а локальные дескрипторы — дескрипторами приложения. Таблицы дескрипторов содержат максимум по 8192 дескрипторов; таким образом общее число дескрипторов, одновременно доступных приложению, не пРевышает 16384. Это число определяет максимальное количество сегментов в про-ирамме (поскольку каждый дескриптор содержит описание одного сегмента памяти).
ра рис. 2.6 показан формат дескриптора для процессоров от 80286 азмерность дескриптора — 8 байт; таким образом, объем таблицы Лобальной или локальной) может достигать максимум 64 Кбайт. скриптора в процессоре 80286 имеет некоторые особенности, они вместимости с процессорами 80386—Pentium 4.
до Pentium 4. дескрипторов Хотя формат не нарушают
8
°зможность применять в качестве указателей расширенные регистры есть и в Ме - Пер.
реальном режи-
104	Глава?
Базовый адрес, входящий в состав дескриптора, определяет положение сегмента 3 памяти. Для микропроцессора 80286 базовый адрес 24-битный, что ограничивает адресное пространство 16 Мбайт. Заметим, что выравнивать сегменты по граница^ параграфов в защищенном режиме не требуется. В процессорах 80386 и выше используется 32-битный базовый адрес, что позволяет располагать сегмент с любой точки адресного пространства 4 Гбайт. Обратите внимание, что старшие 16 бит базового адреса в дескрипторе процессора 80286 содержат 0. Тем самым обеспечивается совместимость снизу вверх базовых адресов дескрипторов процессора 80286 и процессоров 80386—Pentium 4. (Адресное пространство объемом 64 Гбайт в процессорах Pentium Pro—Pentium 4 рассматривается в главах 18 и 19.)
Дескриптор для 80286	Дескриптор для 80386 - Pentium 4
7	00000000	00000000	6	7	База (В31-В24)	G	D	0	А V	Предел (L1O4.16)	6
5	Права доступа	База (В23-В16)	4	5	Права доступа	База (В23-В16)					4
3	База (В15-ВО)		2	3	База (В15-В0)						2
1	Предел (L15-L0)		0	1	Предел (L15-L0)						0
Рис. 2.6. Форматы дескрипторов для микропроцессоров 80286 и 80386—Pentium 4
Предел сегмента (segment limit) в дескрипторе задает размер сегмента и, в совокупности с базовым адресом, определяет верхнюю границу сегмента в памяти. Например, если сегмент начинается с адреса F00000H и заканчивается по адресу F000FFH, то базовый адрес сегмента равен F00000H, а предел (limit) — FFH. Предел для 80286 задается 16-битной величиной, а для 80386—Pentium 4 — 20-битной. Длина сегмента в процессоре 80286 ограничена значениями 1 байт и 64 Кбайт. В процессорах 80386 и выше размер сегмента находится в пределах от 1 байта до 1 Мбайта или от 4 Кбайт до 4 Гбайт.
В процессорах 80386—Pentium 4 дескриптор содержит дополнительный бит гранулярности (granularity bit) или иначе бит дробности (бит G). Если G = 0, то поле предела задает длину сегмента в байтах — от 00000Н до FFFFFH. Если G = 1, то единице в поле предела соответствует 4 Кбайт адресного пространства (т. е. к значению предела добавляется справа хххН, где хххН — любое значение от 000Н до FFFH). Таким образом, при G = 1 размер сегмента находится в диапазоне от ОООООхххН до FFFFFxxxH байт, т. е. от 4 Кбайт до 4 Гбайт (шаг изменения предела — 4 Кбайт). То, что длина сегмента в процессоре 80286 ограничена 64 Кбайтами, объясняется 16-битной архитектурой этого процессора — поэтому и смещение ограничено 16 битами. В процессорах от 80386 и выше используется 32-битная архитектура, И смещение может быть задано 32 битами. Смещение, заданное 32 битами, позволяет адресовать данные в сегменте длиной 4 Гбайта, в то время как 16-битное смешение ограничивает длину сегмента 64 Кбайтами.
Приведем два примера вычисления границ сегмента (стартового адреса Start и конечного адреса End) по базовому адресу (Base) и пределу (Limit). Полагаем, 4110 Base = ЮООООООН, a Limit = 001 FFH. Сначала рассчитаем значения Start и End случая G = 0.
^рпцесс°Р и его архитектура
105
..... .. Вычисление границ сегмента для случая, когда G = О ................................-....................
U start = ЮООООООН
Base
G * 0 оа<=р + Limit = ЮООООООН + 001FFH = 100001FFH
End * Base
ob приведем расчет для G = 1, подставляя на место хххН максимальное значе-
Пример 2.2. Вычисление границ сегмента для случая, когда G 3 1
Base = Start = ЮООООООН
G = г
EHd = Base + Limit = ЮООООООН + OOlFFxxxH = 101FFFFFH
Бит AV в дескрипторах процессоров 80386 и выше используется некоторыми операционными системами как признак доступности сегмента (AV = I означает, что сегмент доступен). Бит D в процессорах 80386—Pentium 4 определяет разрядность доступа к регистрам и к памяти (и в защищенном, и в реальном режиме). Если D = 0, то инструкции — 16-битные, совместимые с микропроцессорами 8086—80286. Это означает, что в инструкциях при доступе к памяти используется по умолчанию 16-битное смещение, а при обращении к регистрам выполняется доступ к их младшим 16-битным составляющим. Этот режим называется режимом 16-битных инструкций. Если D = 1, то инструкции — 32-битные. По умолчанию в режиме 32-бит-ных инструкций смещения и регистры считаются величинами 32-битными. Заметим, что размерность регистра и смещения, действующие по умолчанию, могут быть временно изменены как в режиме 16-битных инструкций, так и в режиме 32-битных инструкций. Операционные системы MS-DOS, PC-DOS и Windows 3.1 рассчитаны на режим 16-битных инструкций. Режим 32-битных инструкций доступен лишь в защищенном режиме и применяется в таких операционных системах, как Windows NT, Windows 95, Windows 98 и OS/2. Подробнее о режимах 16- и 32-битных инструкций см. в главах 3 и 4.
Байт прав доступа, приведенный на рис. 2.7, контролирует доступ к сегменту в защищенном режиме. Этот байт описывает способ функционирования сегмента в системе. Если сегмент содержит данные, то для него определено допустимое направле-Ние изменения размера. Если размер сегмента выходит за заданные пределы, генерируется исключение общей защиты. Для сегмента данных может быть также Установлена защита от записи. Контроль сегментов кода выполняется аналогичным Разом. При установленном флаге защиты кодовый сегмент не допускает даже чте-Ия’ что позволяет скрыть программный код от взлома.
*ыбоР дескриптора из таблицы дескрипторов определяется содержимым сегментно-Регистра. На рис. 2.8 показано содержимое сегментного регистра в защищенном ^име. Сегментный регистр содержит 13-битное поле Индекс (Index), бит выбора ^Лицы дескрипторов (TI) и поле уровня запрашиваемых привилегий (RPL— 81g?ested Privilege Level). Поле Индекс (Index) в составе селектора выбирает один из cjt ДескРипторов из таблицы. Выбор таблицы определяет бит выбора таблицы дебиторов (TI): если TI = 0, то дескриптор извлекается из таблицы глобальных Крипторов, а если TI = 1, то используется локальная дескрипторная таблица. За-
106
Гпава 2
прошиваемый уровень привилегий (RPL — Requested Privilege Level) определяет привилегии сегмента. Высший уровень привилегий соответствует RPL = 00, а низший — Н. Если запрашиваемый уровень привилегий не ниже (по приоритету) уровня, установленного байтом прав доступа, то доступ разрешен. Например, если запрашиваемый уровень привилегий равен 10, а в байте прав доступа уровень привилегий сегмента равен II, то доступ разрешен, поскольку уровень 10 имеет более высокие привилегии по сравнению с уровнем II. Уровни привилегий в многопользовательских системах позволяют контролировать действия пользовательских программ.
7	6	5	4	3	2	1	0
Р = 1 Сегмент содержит правильные базу и предел
Рис. 2.7. Байт прав доступа в микропроцессорах 80286—Pentium 4
Селектор
I----------------------------------------------------
15	3 2 1 0
Индекс	Tl RPL
I у
L___> Запрашиваемый уровень привилегий
00 - наивысший, а 11 - низший
________TI = 0 - выбор глобальной таблицы дескрипторов
TI = 1 - выбор локальной таблицы дескрипторов
-----------------------» Индекс (Index) - поле выбора дескриптора из соответствующей таблицы дескрипторов
Рис. 2.8. Содержимое сегментного регистра в защищенном режиме
Микропроцессор и его архитектура 107
На рис. 2.9 показано, как посредством сегментного регистра, содержащего селектор, выбирается дескриптор в глобальной таблице дескрипторов. Напомним, что каждый элемент таблицы глобальных дескрипторов определяет один сегмент в памяти. Регистр DS на рис. 2.9 содержит число 0008Н, что задает выбор дескриптора номер 1 из глобальной таблицы дескрипторов, при запрашиваемом уровне привилегий 00. В дескрипторе номер 1 задан базовый адрес ООЮООООН, а предел равен 000FFH. Таким образом, в примере на рис. 2.9 значение DS = 0008Н определяет сегмент памяти в диапазоне адресов 00100000Н—001000FFH. Заметим, что дескриптор номер 0 (нуль-дескриптор) зарезервирован и не используется для доступа к памяти.
Глобальная таблица
Рис. 2.9. Использование регистра DS при выборе дескриптора из глобальной таблицы дескрипторов
108 Главам
Программно-недоступные регистры
Как мы уже говорили, глобальные и локальные дескрипторные таблицы располагаются в памяти микропроцессорной системы. Адресация этих таблиц в микропроцессорах 80286, 80386, 80486, Pentium, Pentium Pro и Pentium 4 выполняется посредством программно-недоступных регистров. На рис. 2.10 показаны программнонедоступные регистры процессоров 80286—Pentium 4, используемые в защищенном режиме.
Сегментные регистры				Кэш дескрипторов		
CS			Базовый адрес	Предел	Доступ	
DS						
ES						
SS						
FS						
GS		1	i				
						
TR			Базовый адрес	Предал	Доступ	
LDTR						
GDTR	Адреса таблиц дескрипторов		Программно-недоступно
	Базовый адрес	Предел	
IDTR			
Рис. 2.10. Программно-недоступные регистры микропроцессоров 80286—Pentium 4
В каждом из сегментных регистров имеется программно-недоступная часть, исполь-* зуемая микропроцессором в защищенном режиме. При каждом изменении видимойJ части сегментного регистра в невидимую часть загружается базовый адрес, предел и! права доступа. При записи в сегментный регистр нового значения микропроцессор; считывает дескриптор из таблицы дескрипторов в программно-недоступную часть сегментного регистра. Сохраненный таким образом дескриптор управляет доступом j к сегменту памяти — до тех пор, пока значение в регистре сегмента вновь не изме-; нится. Кэширование дескриптора позволяет выполнять доступ к памяти без постоянного обращения к таблице дескрипторов.
Базовый адрес и предел глобальной дескрипторной таблицы хранятся в регистре GDTR (global descriptor table register). В регистре IDTR (internipt descriptor table' register) хранятся базовый адрес и предел таблицы дескрипторов прерываний. Пре-! дел задается 16-битной величиной, что ограничивает размер таблиц в 64 Кбайт. За-; полнение глобальной таблицы дескрипторов (GDT — global descriptor table) и загрузка ее адреса и предела в регистре GDTR — необходимые операции перед входом в защищенный режим; подобным же образом должны быть инициализированы таблица дескрипторов прерываний и регистр IDTR.
Информация о расположении локальной таблицы дескрипторов (LTD — local descriptor table) содержится в глобальной таблице дескрипторов: один из дескрипторов глобальной таблицы адресует локальную таблицу. Доступ к локальной таблице дескрипторов открывается при записи в регистр LDTR (local descriptor table register) селекто
Микропроцессор и его архитектура 109
ра глобальной таблицы. В невидимую часть регистра LDTR записывается информация из глобальной таблицы дескрипторов — базовый адрес, предел и права доступа локальной таблицы дескрипторов.
В регистре задачи TR (task register) хранится селектор, адресующий дескриптор с определением задачи. Задача чаще всего представляет собой процедуру или прикладную программу. Ее дескриптор хранится в глобальной таблице дескрипторов, что позволяет контролировать уровни привилегий. Регистр задач используется для переключения контекста в многозадачных системах — с незначительной задержкой, поскольку переключение выполняется аппаратно.
2.4. Страничная организация памяти
Механизм страничной организации памяти в микропроцессорах 80386—Pentium 4 позволяет обращаться к любой ячейке физической памяти посредством произвольного линейного адреса. Линейным адресом называется адрес, который генерируется исполняемой программой. При включении механизма страничной организации памяти линейный адрес аппаратно преобразуется в физический адрес, что позволяет перераспределять в памяти программу, рассчитанную на функционирование в определенных линейных адресах. Также страничный механизм позволяет отображать линейные адреса на те области физического адресного пространства, где память вообще отсутствует. Пример такого отображения — блоки верхней памяти при установке драйвера EMM386.EXE.
Программа EMM386.EXE отображает расширенную (Extended) память на верхнюю память (UMA) в области между видео-BIOS и системным BIOS. Отображение выполняется блоками по 4 Кбайта. Заметим, что в отсутствие страничного механизма отображения памяти доступ к верхней памяти в реальном режиме был бы невозможен.
Регистры страничной организации памяти
В работе механизма страничного преобразования адресов участвуют управляющие регистры микропроцессора. На рис. 2.11 показано содержимое управляющих регистров CRO—CR3. Эти регистры доступны только в микропроцессорах 80386—Pentium 4. Еще один управляющий регистр CR4 был введен в Pentium в связи с расширениями базовой архитектуры в этом микропроцессоре. В частности, в Pentium появилась возможность увеличить размер страницы до 4 Мбайт — при установке в 1 бита 4 регистра CR4 (подробности см. в главах 18 и 19).
Из управляющих регистров в страничном преобразовании наиболее существенную роль играют CR0 и CR3. Крайний левый бит регистра CR0 (бит PG) включает механизм преобразования страниц. Если бит PG сброшен в 0, то линейный адрес, сгенерированный программой, используется — без преобразования — в качестве физического адреса. Если PG установлен в 1, то линейный адрес преобразуется в физический адрес посредством страничного механизма. Заметим, что страничный механизм функционирует как в защищенном, так и в реальном режиме работы процессора.
Регистр CR3 содержит базовый адрес каталога страниц и, дополнительно, биты PCD и PWT. Биты PCD и PWT управляют одноименными выводами микропроцессора.
110
Гпава 2
Если PCD = I, то вывод PCD устанавливается в I на один цикл шины в тот момент, когда страничное преобразование не выполняется. Это позволяет внешним устройствам работать с кэш-памятью второго уровня. (Напомним, что кэш L2 представляет собой внешнюю высокопроизводительную память, которая выполняет функцию буфера между микропроцессором и внешней DRAM-памятью.) Бит PWT и одноименный вывод PVVT используются подобным же образом, также для управления кэш-памятью. Базовый адрес каталога страниц определяет его расположение в памяти. Заметим, что микропроцессор добавляет к базовому адресу справа 000Н, поэтому каталог страниц размещается по границе 4 Кбайт. Каталог страниц содержит 1024 записей по 4 байта. Каждая запись адресует таблицу страниц из 1024 элементов.
Только для Pentium, Pentium Pro, Pentium II, Pentium III и Pentium 4
Рис. 2.11. Структура управляющих регистров микропроцессора
Линейный адрес, сгенерированный программой, разделяется на три части; две из них определяют доступ к элементу каталога страниц и к элементу таблицы страниц, а третья задает смещение в странице. Формат линейного адреса показан на рис. 2.12. Десять бит слева адресуют элемент каталога страниц. Например, при значении линейного адреса в диапазоне 00000000Н—003FFFFFH выбирается первый элемент каталога страниц. Каждый элемент каталога страниц задает отображение 4 Мбайт памяти. Элемент каталога указывает на таблицу страниц; индекс элемента таблицы страниц задан в следующих 10 битах линейного адреса (биты 12—21). Например, адрес 00000000Н—00000FFFH определяет выбор нулевого элемента в каталоге страниц и нулевой записи в таблице страниц. Обратите внимание, что изменение на 1 индекса элемента в таблице страниц соответствует изменению линейного адреса на 4 Кбайт. Смещение, заданное младшей частью линейного адреса (биты 0—11), адресует байт в пределах страницы размером 4 Кбайт. Например, если элемент таблицы
Микропроцессор и его архитектура
111
страниц на рис. 2.12, б является нулевым элементом и содержит 00100000Н, то линейный адрес из диапазона 00000000H—00000FFFH преобразуется в физический адрес от 00100000Н до 00100FFFH. В результате, когда программа обращается к памяти по адресу 00000000Н—0000FFFH, микропроцессор выполняет доступ к ячейкам из диапазона адресов 00100000Н—00100FFFH.
Каталог	Таблица страниц	Смещение
Рис. 2.12. Формат линейного адреса (а), формат элементов каталога страниц и таблиц страниц (б)
Поскольку отображение памяти предполагает доступ к каталогу страниц и к таблице страниц, которые сами расположены в памяти, был введен буфер ассоциативной трансляции — TLB (Translation Look-Aside Buffer). В микропроцессоре 80486 буфер TLB сохраняет информацию о последних 32 отображениях страниц. Если программа повторно обращается к области памяти, информация о которой сохранена в TLB, то считывать элементы каталога страниц и таблицы страниц из памяти не требуется. Это ускоряет выполнение программы. Процессоры Pentium, Pentium Pro, Pentium П, Pentium III и Pentium 4 содержат раздельные буферы TLB — для кэша инструкции и для кэша данных.
Каталог страниц и таблицы страниц
На рис. 2.13 показаны фрагмент каталога страниц, несколько таблиц страниц и страниц памяти. Каталог страниц существует в единственном экземпляре и содержит 1024 двойных слов для адресации до 1024 таблиц страниц. Каталог страниц и каждая таблица страниц занимают по 4 Кбайта. Например, для страничного преобразования 4 Гбайт памяти требуются 4 Кбайта памяти для каталога страниц и 4 Мбайта для таблиц страниц (т. е. 1024 таблицы по 4 Кбайт).
Операционная система DOS при установке драйвера EMM386.EXE использует таблицы страниц для отображения памяти в промежутке между адресами С8000Н и EFFFFH блоков верхней памяти. Это позволяет обращаться к расширенной (Extended) памяти через области верхней памяти, доступные приложениям DOS.
00003FFC 00003FF8 00003FF4 00003FF0
00003328 00003324 00003320
00003008
00003004
00003000
0000200С
00002008
00002004
---- 00002000
Нулевая таблица страниц
00110FFF 00110FFE
00110002 00110001 00110000
00000FFF
00000FFE
00000002
00000001
00000000
Каталог
страниц
Страница 00000Н
Рис. 2.14. Каталог страниц, нулевая таблица страниц и две страницы памяти
113
рессор и его архитектура -------
---- жим, что ПРИ наличии драйвера EMM386.EXE требуется отобразить ли-С8000Н—EFFFFH на физические адреса 110000—138000Н, не затра-неЙНЫе гальную память. Схема отображения для этого случая приведена на гИ0аЯ Л Заметим, что страница, расположенная по адресам 000С8000—000С9000, рис- ^ажаеТСЯ на Ml 10000—00110FFF.
° еденном примере каталог страниц содержит четыре элемента. Напомним, что В пРиВ эЛементу каталога соответствует 4 Мбайт физической памяти. В данном каЖД0 отображения потребуется четыре таблицы страниц по 1024 элементов. cJI^4afoM накладные расходы составят 16 Кбайт для четырех таблиц страниц и ® байт для каталога страниц.
бпажение страниц применяется также в операционной системе Windows. На-р Windows 3.11 поддерживает страничный механизм, но только для 16 Мбайт и^мяти. В микропроцессорах Pentium—Pentium 4 имеется возможность выбрать дли-п ^границы равной либо 4 Кбайта, либо 4 Мбайта. Программная поддержка страниц размерностью 4 Мбайта пока не реализована, но в будущем, с появлением более мошных микропроцессоров, несомненно, будет введена.
Итоги
□ В программную модель микропроцессоров 8086—80286 входят 8- и 16-битные регистры. Программная модель микропроцессоров 80386—Pentium 4 дополнена 32-битными расширенными регистрами и парой 16-битных сегментных регистров FS и GS.	----
□ В группу 8-битных регистров входят АН, AL, ВН, BL, CH, CL, DH и DL; 16-битные регистры — АХ, ВХ, СХ, DX, SP, BP, DI и SI; сегментные {^гист-ры — CS, DS, ES, SS, FS и GS. Расширенные 32-битные регистры — ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, EDI и ESI. К регистрам также относятся указатель инструкции IP/EIP и регистр флагов FLAGS/EFLAGS.
О В реальном режиме адрес памяти образуется сочетанием адреса сегмента и смещения. Начальный адрес сегмента определяется 16-битным значением в сегментном регистре, умноженным на 16. Смещение представляет собой 16-битное число, которое прибавляется к 20-битному адресу начала сегмента.
Доступ к инструкциям в сегменте кода определяется сочетанием значений регистров CS (содержит адрес сегмента кода) и 1P/EIP (содержит смещение).
Адрес данных определяется сочетанием регистра сегмента данных DS и смещения, заданного либо непосредственно в команде, либо в регистре-указателе. В качестве указателей данных в микропроцессорах 8086—Pentium 4 могут быть Использованы 16-битные регистры ВХ, D1 и SL В микропроцессорах 80386— Pentium 4 в этом качестве могут применяться также 32-битные регистры ЕАХ, ЕВХ, ЕСХ, EDX, EDI и ESI.
Защищенный режим микропроцессоров 80286—Pentium 4 открывает доступ к адресному пространству за пределами стандартной памяти 1 Мбайт. Адрес расширенной памяти в защищенном режиме определяется сочетанием сегмента и сМещения, как в реальном режиме. Но в защищенном режиме сегментный адрес хРанится не в сегментном регистре, а в дескрипторе, на который указывает сег-Ментный регистр.
□ Дескриптор содержит информацию о базовом адресе, пределе и правах доступ^ Базовый адрес определяет начало сегмента; предел задает размер сегмента. Байто правами доступа определяет допустимые способы доступа к сегменту из граммы. Размерность базового адреса в микропроцессоре 80286 составляем 24 бита, что позволяет адресовать сегменты в пределах 16 Мбайт. В процессору от 80386 и выше адресное пространство расширено до 4 Гбайт за счет использования 32-битного базового адреса. В процессоре 80286 предел задается 16-бим-ным, а в процессорах 80386—Pentium 4 20-битным числом. В результате, размер сегмента в 80286 ограничен 64 Кбайтами, но в последующих поколениях процессоров может достигать 1 Мбайт (при G = 0) или 4 Гбайт (при G = 1).
□ Сегментный регистр содержит три поля. Крайнее поле слева размерностью 13 бит определяет выбор одного из 8192 элементов таблицы дескрипторов. Установка бита выбора таблицы дескрипторов (TI) определяет выбор таблицы дескрипторов: при TI = 0 используется глобальная таблица, при TI = 1 — локальная. Два бита справа задают запрашиваемый уровень привилегий при доступе к сегменту.
□ Программно-недоступные регистры в микропроцессорах 80286—Pentium 4 используются для доступа к таблицам дескрипторов. Каждый сегментный регистр содержит невидимую часть, в которую записываются из дескриптора базовый адрес, предел и права доступа. Кэширование дескриптора в невидимой части сегментного регистра позволяет обращаться к памяти без повторного чтения таблицы дескрипторов, пока содержимое сегментного регистра не изменится.
□ Размер страницы памяти составляет 4 Кбайт. Линейный адрес, генерируемый программой, может быть отображен на любой физический адрес посредством страничного механизма, реализованного в микропроцессорах 80386—Pentium 4.
□ Страничное преобразование контролируется регистрами управления CR0-CR3. Бит PG регистра CR0 включает страничное преобразование, а регистр CR3 адресует каталог страниц. Каталог страниц содержит до 1024 указателей на таблицы страниц. Таблица страниц, в свою очередь, содержит 1024 записей о физических адресах страниц памяти.
□ Введение буфера опережающей трансляции адресов (TLB), с информацией о последних 32 отображениях страниц, повышает производительность страничного преобразования.
Контрольные вопросы
1.	Какие регистры процессора называются программно-доступными?
2.	Какова размерность регистров, доступных в микропроцессоре 80286 наряду с 8-битныМИ регистрами?
3.	В каких микропроцессорах имеются расширенные регистры?
4.	Как обозначается расширенный вариант регистра ВХ?
5.	Какой регистр используется, по умолчанию, в качестве счетчика при выполнении некого рых инструкций?
6.	Для чего предназначен регистр IP/EIP?
7.	Какие арифметические операции воздействуют на флаг переноса?
115
8.
9.
10-
|2-|3.
|4.
о0цессоР^го аРХИТ?-К™?-_________________________________________
- pt ли переполнение при сложении знаковых байтов FFH и 01Н?
ЛпОИЗОИД	„
1 И паритет У числа с тРемя единичными битами — четный или нечетный? Флаг разРсшаст контр°ль вх°ла intr?
К“к мцкропроиессоры располагают сегментным регистром FS?
К^^его предназначен сегментный регистр в реальном режиме работы микропроцессора? реального режима вычислите границы сегментов, сегментные адреса которых равны:
а)	Ю00Н
б)	1234Н
в)	2300Н
Г) E000H
д) AB00H
Вычислите адрес очередной инструкции в реальном режиме для следующих значений регистровой пары CS.IP.
а) CS = Ю00Н, б) CS = 2000Н, в) CS = 23ООН, г) CS = 1А00Н, д) CS = 3456Н,
Чему равен максимально доступный объем памяти в реальном режиме? Какие регистры задают смешение операнда-приемника строковых инструкций?
Какие 32-битные регистры микропроцессора Pentium 4 могут применяться в качестве указателей данных в сегменте данных?
1Р= 2000 Н IP = 1000Н IP = 1А00Н IP = ВОООН 1Р = ABCDH
15.
16.
17.
18.	Какие регистры используются для задания сегмента и смешения при доступе к стеку?
19.	Какой сегментный регистр используются для доступа к данным при задании регистра ВР в качестве указателя?
20.	Вычислите адреса для реального режима процессора 80286 при следующих значениях сегмента и смещения:
21.
22.
23.
24.
a)	DS = 1000Н, DI = 2000Н
б)	DS = 2000Н, SI = 1002Н
в)	SS = 2300Н, BP = 3200Н
г)	DS = A000H, ВХ = 1000Н
4) SS = 2900Н, SP = 3A00H
Вычислите для процессора Pentium 4 адрес памяти при следующем сочетании регистров:
а)	DS = 2000Н, EAX = ООООЗОООН
б)	DS = 1А00Н, ЕСХ = 00002000Н
в)	DS = C000H, ESI = 0000A000H
г)	SS = 8000Н, ESP = 00009000Н
4) DS = I239H, EDX = 0000А900Н
8028б^КИМ адресам РазРсшен доступ к памяти в защищенном режиме микропроцессора
PentKaKHM ^Р603^1 разрешен доступ к памяти в защищенном режиме микропроцессора cr*iium 4 9
Ка
кУ*о информацию содержит сегментный регистр в защищенном режиме?
116 GjaaJ
25.	Какова емкость глобальной таблицы дескрипторов?	|
26.	Предположим, что в дескрипторе для процессора 80286 задан базовый адрес А00000Ц, I предел (limit) 1000Н. Вычислите границы сегмента, адресуемого этим дескриптором.
Т1. Предположим, что в дескрипторе для процессора 80486 базовый адрес равен 0IOOOOOqu предел — 0FFFFH, а бит G = 0. Чему равны начальный и конечный адреса сегмента, // ресуемого этим дескриптором?	’ ।
28.	Предположим, что в дескрипторе для Pentium 4 базовый адрес равен 00280000Н, предел 00010Н, а бит G = 1. Вычислите границы сегмента, адресуемого этим дескриптором?
29.	Если в защищенном режиме значение регистра DS = 0020Н, какой дескриптор он выб^ рает из глобальной таблицы дескрипторов?
30.	Чему равен запрашиваемый уровень привилегий, если в защищенном режиме значецш регистра DS = 01 ОЗН?
31.	Если в защищенном режиме значение регистра DS = 0105Н, то какой дескриптор и щ какой таблицы он выбирает? Чему равен запрашиваемый уровень привилегий?
32.	Назовите максимальный размер таблицы глобальных дескрипторов для микропроцессора Pentium 4?
33.	Составьте дескриптор, который задает расположение сегмента в диапазоне адресов 210000Н—21001FH. Сегмент следует определить как сегмент кода, который может быть прочитан, а дескриптор соответствует микропроцессору 80286.
34.	Составьте дескриптор, определяющий сегмент памяти, расположенный по адресам 03000000H--05FFFFFFH. Этот сегмент памяти является сегментом данных, который увеличивается вверх в адресном пространстве системы памяти и может быть записан, а деск* риптор соответствует микропроцессору 80386.
35.	Какой регистр определяет местоположение глобальной таблицы дескрипторов?
36.	Как определяется положение локальной таблицы дескрипторов?
37.	Что произойдет при загрузке нового значения в сегментный регистр, если микропроцес-сор работает в защищенном режиме?
38.	Какие программно-недоступные регистры вам известны?
39.	Для чего предназначен регистр GDTR?
40.	Каков размер страницы памяти?
41.	Какой регистр используется для включения страничного преобразования адресов в микропроцессорах 80386, 80486, Pentium, Pentium Pro и Pentium 4?
42.	Сколько 32-битных адресов хранится в каталоге страниц?
43.	Чему равен размер памяти, отображаемой одним элементом каталога страниц?
44.	К каким элементам каталога страниц и таблицы страниц произойдет обращение при нерировании линейного адреса 00200000Н?
45.	Какое значение следует поместить в таблицу страниц для трансляции линейного аДР®^ в диапазоне 20000000Н—30000000Н?
46.	Что хранится в буфере TLB?
47.	Найдите в сети Internet (например, на сайте корпорации Intel) дополнительную информ цию о буфере TLB.
г л а£а 3_______
Методы адресации
Введение
'ЭЛдективное программирование невозможно без знания методов адресации, приме-мых к той ,,ли ин°й инструкции. В этой главе мы рассмотрим методы адресации анных на примере инструкции передачи данных — mov. Эта инструкция пересылает данные между двумя регистрами или между регистром и памятью. В процессорах 8086—80286 инструкция mov позволяет копировать байты и слова; в процессорах 80386—Pentium 4 она обеспечивает также передачу двойных слов. На примере команд call и jump мы рассмотрим адресацию инструкций и продемонстрируем, каким образом можно изменить последовательность выполнения программы.
Методы адресации данных, реализованные в процессорах 8086—80286, следующие: регистровая, непосредственная, прямая, регистровая косвенная, базово-индексная, регистровая со смещением и базово-индексная со смещением. Процессоры 80386— Pentium 4 поддерживают также индексную адресацию данных с масштабированием. Для адресации инструкций в процессорах 8086—Pentium 4 имеется три метода адресации инструкций: относительная, прямая и косвенная. Адресация данных в стеке обсуждается на примере команд push и ?ор.
Темы главы
этой главе обсуждаются следующие вопросы:
О О О □ □ □ О
О
Функционирование каждого из методов адресации данных;
применение методов адресации данных в операторах языка ассемблера;
Действие методов адресации инструкций;
использование методов адресации инструкций в операторах ассемблера;
Выбор наиболее подходящего метода адресации;
Различия между адресацией данных в реальном и в защищенном режиме;
Последовательность действий при записи данных в стек и при чтении данных из стека;
РазмеШение структур данных в памяти и их использование в программах.
^4. Методы адресации данных
В
^СТВе основы для объяснения методов адресации данных мы примем инструк-как наиболее распространенную и к тому же допускающую всевозможные
методы адресации. На рис. 3.1 показан пример инструкции mov с указанием операн дов и направления передачи данных. В начале команды записана мнемоника затем перечислены операнды. Операнд-источник задан справа, операнд-при^ц $ ник — слева1. Запись источника и приемника в таком порядке может поначалу пока?. заться неудобным — направление слева направо привычнее2. Приемник и источц35 обязательно разделяются запятой. Заметим, что только инструкция movs копировать данные из памяти в память за одну команду.
позволяв
MOV АХ.ВХ
1
и.
я
Приемник Источник
Рис. 3.1. Инструкция MOV. ее операнды и направление передачи данных
Команда mov ах,вх на рис. 3.1 передает 16-битное содержимое источника — регистра’ ВХ — в приемник — регистр АХ. Источник при этом не изменяется, а приемни^4 напротив, изменяется всегда3. Заметим, что команды передачи данных не воздействуют на флаги.
На рис. 3.2 показаны всевозможные сочетания методов адресации данных при использовании команды mov. Заметим, что приведенные здесь методы адресации дан-1 ных действительны для всех версий микропроцессоров Intel, кроме индексной адресации с масштабированием, впервые появившейся в 80386.
Методы адресации данных, рассмотренные на примеры инструкции mov, следующие.
□	Регистровая адресация
Передает копию байта или слова из регистра-источника или из памяти в регистр-приемник или в память. Например, инструкция mov cx,dx копирует 16-битнде содержимое регистра DX в регистр СХ. В процессорах 80386—Pentium 4 возможна передача также двойных слов. Например: инструкция mov ecx,edx копирует 32-битное содержимое регистра EDX в регистр ЕСХ.
□	Непосредственная адресация
Передает непосредственное значение в формате байта или слова в регистр-приемник или в память. Например, инструкция mov al,22h копирует байтовое значение 22Н в регистр AL. В процессорах 80386—Pentium 4 возможна также пе-редача непосредственных данных в формате двойного слова. Например, рукция mov евх, 12345678Н копирует 32-битную константу 12345678Н в 32-битнЫ” регистр ЕВХ.
1 В дальнейшем операнд-источник и операнд-приемник называются просто источником и прием11 ком. — Пер.
2 В ассемблере для VAX-11 (фирмы DEC) сначала указывается источник, а потом приемник ких преимуществ в этом нет — любой вариант вскоре становится привычным и кажется венно возможным. — Лер.
3 Исключения — команды TEST и СМР, которые никогда не изменяют значение приемника.
119
адресации	

Пример

MOV АХ.ВХ
р^р°вая
«иная MOV СН.ЗАН
НепосР^и
Прямая	MOV [1234Н],АХ
Косвенная	MOV (BXJ.CL
бвЭОв0-индексная	MOV [BX+SI],BP
Косвенная	MOV СЦВХ+4]
со смещением
Базово-индексная	MOV ARRAY[BX+SI],DX
со смещением
Базово-индексная	MOV [ЕВХ+2 х ESI],АХ
с масштабированием
Рис. 3.2. Методы адресации данных в процессорах 8086—Pentium 4
□	Прямая адресация
Пересылает байт или слово между памятью и регистром. Передача данных между двумя операндами в памяти не поддерживается, за исключением инструкции movs. Например, инструкция mov cx,list копирует 16-битное содержимое операнда в памяти, обозначенного именем list, в регистр СХ. В процессорах 80386—Pentium 4 допускается передача двойного слова. Например, инструкция tov esi,list копирует 32-битное число, размещенное в четырех смежных байтах памяти по адресу, обозначенному именем list, в регистр ESI.
Регистровая косвенная адресация
Передает байт или слово между регистром и ячейкой памяти, адрес которой за-^ан содержимым индексного или базового регистра. Индексные и базовые реги-в процессорах 8086—80286 — это BP, ВХ, DI и SL Например, инструкция v ах, [вх] копирует в регистр АХ 16-битное число из сегмента данных; смеще-р е в сегменте данных задано базовым регистром ВХ. В процессорах 80386— entiuni 4 возможна передача 8-, 16- и 32-битных значений, а смещение может 1ть задано любым из регистров EAX, ЕВХ, ЕСХ, EDX, EBP, EDI и ESI. На-м иМер, инструкция mov al, [есх] загружает в регистр AL значение байта из сег-(J НТа Данных, смещение которого задано содержимым регистра ЕСХ.
^ово-индексная адресация
^РеДает байт иди слово между регистром и ячейкой памяти, смещение которой ч,1сдяется как сумма значений базового регистра (ВР или ВХ) и индексного
120
Гпава 3
регистра (DI или SI). Например, инструкция mov [bx+di],cl копирует из регистра CL байт в сегмент данных по смещению, заданному суммой значений ВХ и DL В процессорах 80386—Pentium 4 допустимы любые сочетания регистров ЕАХ, ЕВХ, ЕСХ, EDX, EBP, EDI и ESI. Например, инструкция mov [eax+ebx],cl передает байт из регистра CL в сегмент данных по смещению, вычисляемому сложе* нием содержимого регистров ЕАХ и ЕВХ.
□	Регистровая косвенная адресация со смещением
Передает байт или слово между регистром и ячейкой памяти, смещение которой равно сумме некоторого смещения, указанного в команде, и индексного или базового регистра4. Например, инструкция mov ах, [вх+4] загружает в регистр АХ значение из сегмента данных со смещением ВХ + 4; а инструкция mov ах, array[вх] записывает в АХ число из сегмента данных, смещение которого равно сумме константы array и содержимого регистра ВХ. В процессорах 80386 и выше разрешается также применять для этой цели расширенный регистр. Например, инструкция mov ах, [ЕСХ+4] загружает в регистр АХ значение из сегмента; данных, используя в качестве смещения сумму содержимого регистра ЕСХ и1 константы 4. Инструкция mov ах,array[евх] записывает в регистр АХ число, смещение которого в сегменте данных равно сумме содержимого регистра ЕВХ ц константы ARRAY.
□	Базово-индексная адресация со смещением
Передает байт или слово между регистром и ячейкой памяти, смещение которой, определяется суммой базового регистра, индексного регистра и константного смещения. Пример — инструкции mov ах,array[bx+di] и mov ах,[bx+di+4], кото-' рые загружают в регистр ах значение из сегмента данных. В первой инструкции смещение задано суммой константы array, значений регистров ВХ и DI, а во второй — суммой ВХ, DI и 4. Пример для процессоров 80386—Pentium 4 — инструкция mov eax, array [евх+есх], которая загружает в регистр ЕАХ двойное слово, расположенное в сегменте данных по смещению, равному сумме константы array, значений регистров ЕВХ и ЕСХ.
□	Индексная адресация с масштабированием
Доступна только для процессоров 80386—Pentium 4. Значение второго регистра из пары регистров, задающих смещение, умножается на масштабный коэффициент 2, 4 или 8. Например, инструкция mov edx, [еах+4*евх] загружает в регистр EDX значение из сегмента данных, смещение которого определяется результатом вычисления выражения евх * 4 + еах. Масштабирование упрощает доступ к массивам слов, двойных и 8-байтовых слов — при использовании коэффициентов 2, 4 и 8 соответственно. По умолчанию коэффициент равен 1; указывать это значение в явном виде не запрещено, но смысла не имеет. Например, в инструкции mov al, [евх+есх] масштабный коэффициент равен 1 (по умолчанию); эта инструкция может быть также представлена в виде mov al, [ebx+i*ecx] . Еще один пример использования индексной адресации с масштабированием — это инст-
4 В англоязычной литературе по вычислительной технике смещение в сегменте обозначается словом offset, а постоянная составляющая смещения при косвенной адресации — как displacement. Эти понятия по сложившейся традиции переводятся одинаково — как "смещение". — Пер.
Методы адресации
121
рукция mov al, [2*евх], в которой адрес памяти задан одним регистром с масштабным коэффициентом 2.
регистровая адресация
регистровая адресация, обозначаемая именем регистра, применяется в программах наиболее часто. Микропроцессор содержит следующие программно доступные регистры: 8-битные регистры АН, AL, ВН, BL, CH, CL, DH и DL, 16-битные регистры АХ, ВХ, СХ, DX, SP, BP, SI и DI, и, начиная с процессора 80386, расширенные 32-битные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, EDI и ESI. Команды mov, push и pop допускают также использование 16-битных сегментных регистров CS, ES, DS, SS, FS и GS. Подчеркнем, что размерность регистров источника и приемника должна быть одинаковой. Нельзя, например, в качестве источника указывать 8-битный регистр, а в качестве приемника — 16- или 32-битный регистр. Примеры недопустимого сочетания размерностей — инструкции mov ах, al и mov eax,al. Заметим, что в некоторых инструкциях операнды разной размерности допустимы, как, например, в shl dx,cl. Эти исключения мы рассмотрим при обсуждении системы команд.
В табл. 3.1 приведены примеры сочетаний регистровых операндов для инструкции копирования. Все возможные комбинации мы демонстрировать не будем — их очень много. Например, только 8-битные регистры в инструкции mov образуют 64 сочетания. Обратите внимание, что передача данных между сегментными регистрами не поддерживается. Также запрещена прямая (по команде mov) запись в регистр сегмента кода — регистр cs в паре с ip/eip определяет адрес следующей инструкции, и запись в него приведен к непредсказуемому результату.
Таблица 3.1. Примеры инструкций с регистровой адресацией
Инструкция	Размерность	Действие
		
MOV AL,BL	Байт	Копирует BL в AL
MOV CH,CL	Байт	Копирует CL в СН
MOV AX,CX	Слово	Копирует СХ в АХ
MOV SP,BP	Слово	Копирует ВР в SP
MOV DS,AX	Слово	Копирует АХ в DS
MOV SI,DI	Слово	Копирует DI в SI
MOV BX,ES	Слово	Копирует ES в ВХ
MOV ECX,EBX	Двойное слово	Копирует ЕВХ в ЕСХ
MOV ESP,EDX	Двойное слово	Копирует EDX в ESP
MOV ES,DS	—	Недопустимая инструкция — копирование сегментного регистра в сегментный регистр запрещено
MOV BL,DX	—	Инструкция недопустима — операнды имеют разную размерность
MOV CS,AX	—	Недопустимая инструкция — сегментный регистр кода не может быть приемником
122
Гпава 3
На рис. 3.3 показано выполнение инструкции mov вх,сх. Обратите внимание, что содержимое регистра-источника не изменяется, в то время как регистр-приемник получает новое значение. Инструкция копирует число 1234Н из регистра СХ в регистр ВХ. В результате прежнее содержимое (76AFH) регистра ВХ стирается, но содержимое регистра СХ остается прежним. Заметим, что приемник, будь то регистр или данные в памяти, изменяется при выполнении всех инструкций, кроме смр и test. Также отметим, что инструкция mov вх,сх не воздействует на старшие 16 бит регистра ЕВХ.
Рис. 3.3. Выполнение инструкции mov вх,сх на момент перед изменением регистра вх
В примере 3.1 приведена последовательность инструкций, выполняющих копирование регистров различной размерности. При выполнении последней инструкции (mov cs,ax), если она не вызовет ошибку при трансляции, контроль над программой будет потерян, поскольку при изменении cs следующая инструкция будет прочитана из другого сегмента кода.
 . ' ц
Пример 3.1. Копирование содержимого регистров разной размерности
0000 8В СЗ	MOV АХ,	BX	; копирует содержимое ВХ в AX
0002 8А СЕ	MOV CL,	DH	; копирует содержимое DH в CL
0004 8А CD	MOV CL,	CH	; копирует содержимое СН в CL
0006 66I8B	C3	MOV ЕАХ	:,ebx	; копирует содержимое ЕВХ в ЕАХ
0009 66I8B	D8	MOV ЕВХ	:,EAX	; копирует ЕАХ в ЕВХ, ЕСХ и EDX
000С 66|8В	С8	MOV ЕСХ	:,EAX	
000F 66|8В	DO	MOV EDX	:,EAX	
0012 8С С8	MOV AX,	cs	; копирует CS в DS
0014 8Е D8	MOV DS,	AX	
0016 8Е С8	MOV CS,	AX	; ошибка
Непосредственная адресация
Непосредственная адресация означает, что данные заданы непосредственно в коде инструкции (следуют за кодом операции). При непосредственной адресации значения данных неизменны, в отличие от переменных значений регистров при регистровой адресации. Непосредственные данные имеют размерность байта, слова и,
Методы адресации
123
в процессорах 80386—Pentium 4, двойного слова. Инструкция mov с непосредственным операндом передает копию непосредственных данных в регистр или ячейку памяти. На рис. 3.4 показано действие инструкции mov eax,13456Н, которая записывает константу 13456Н из кода инструкции в регистр ЕАХ.
13456Н*-
Рис. 3.4. Действие инструкции MOV ЕАХ, 3456Н
Программный код
MOV ЕАХ.13456Н
В некоторых ассемблерах для обозначения непосредственных данных используется литера #5. Пример: mov ах,#3456н. В ассемблерах Intel ASM, Microsoft MASM и Borland TASM непосредственные данные обозначаются без литеры #, например MOV АХ,3456Н.
Ассемблер допускает задание непосредственного операнда в различных системах счисления. Константы в шестнадцатеричном формате заканчиваются буквой Н, а если такая константа начинается с буквы A—F, то перед ней ставится цифра 0. Например, шестнадцатеричное число F2 на языке ассемблера записывается как 0F2H. В некоторых ассемблерах шестнадцатеричные константы начинаются с 'h; пример— mov ах,#'Ы234. Десятичные константы записывают в общепринятом стиле (пример — инструкция mov al, юо). Символ ASCII задается числовым кодом или буквой в кавычках. Пример — инструкция mov вн,'А', которая копирует ASCII-символ А (41Н) в регистр ВН. Двоичные константы записываются в виде двоичного числа с буквой В в конце (или У в некоторых ассёмблерах). В табл. 3.2 приведены примеры инструкции mov с непосредственной адресацией.
Таблица 3.2. Примеры инструкции mov с непосредственной адресацией
Инструкция	Размерность	Действие
MOV BL,44	Байт	Копирует десятичное число 44 (2СН) в BL
MOV АХ,44Н	Слово	Копирует 0044Н в АХ
MOV SI,0	Слово	Копирует 0000Н в SI
MOV CH,100	Байт	Копирует десятичное число 100 (64Н) в СН
MOV AL,'A'	Байт	Копирует ASCII-символ А в AL
MOV AX,'AB'	Слово	Копирует пару ASCII-символов ВАвв АХ
5 Например, в ассемблерах фирмы Hewlett-Packard.
6 Это нс ошибка — пара ASCII-кодов, заданная в качестве непосредственного операнда, хранится в обратном порядке (ВА).
124
Гпава 3 [
Таблица 3.2 (окончание)
Инструкция	Размерность	Действие
MOV CL,11001110В	Байт	Копирует двоичное значение 11001110 в CL
MOV ЕВХ,12340000Н	Двойное слово	Копирует 12340000Н в ЕВХ
MOV ESI,12	Двойное слово	Копирует десятичное число 12 в ESI
MOV EAX,100Y	Двойное слово	Копирует двоичное число 100 в ЕАХ
В примере 3.2 приведена небольшая программа с вариантами непосредственной адресации. Первые инструкции записывают 0000Н в 16-битные регистры АХ, ВХ и СХ. Последующие инструкции используют регистровую адресацию для копирования содержимого АХ в регистры SI, DI и ВР. Текст в примере 3.2 представляет собой 1 законченную программу, с указанием модели памяти. Директива .model tiny предписывает ассемблеру помещать программу в один сегмент кода. Директива .code обозначает начало сегмента кода; директива .startup указывает точку входа в i программу; оператор .exit задает завершение программы и выход в DOS. Директива end отмечает конец файла программы. Программа транслируется ассемблером MASM, либо совместимой с ним версией TASM; ход ее выполнения можно проконтролировать отладчиком CodeView (CV). Ввод и редактирование текста программы выполняются, например, с помощью редактора EDIT (в составе DOS) или Programmer’s WorkBench (PWB). Заметим, что TINY-программы транслируются в исполняемые программы формата СОМ.
Пример 3.2. Программа с применением непосредственной адресации	1
	.MODEL TINY	; задает односегментную модель памяти
0000	.CODE .STARTUP	; начало сегмента кода ; отмечает начало программы
0100 В8 0000	MOV AX,0	; помещает 0000Н в АХ
0103 ВВ 0000	MOV BX,0000H	; помещает 0000Н в ВХ
0106 В9 0000	MOV CX, 0	; помещает 0000Н в СХ
0109 8В F0	MOV SI,AX	; копирует АХ в SI
010В 8В F8	MOV DI,AX	; копирует АХ в DI
010D 8В Е8	MOV BP,AX .EXIT END	; копирует АХ в ВР ; выход в DOS ; конец файла
Операторы языка ассемблера состоят из четырех частей или полей, показанных в примере 3.3. Оператор начинается с метки, которая обозначает текущий адрес программы в символическом виде. Метка начинается буквой или одним из символов @, $, или ? и содержит не более 35 символов. Метка вводится для символического обозначения адреса памяти, например, при определении данных. Следующее поле в операторе ассемблера предназначено для мнемоники инструкции; за мнемоникой находится поле операндов. Например, в операторе mov al, bl слово mov — мнемоника, a al и bl — операнды. Заметим, что число операндов зависит от инструкции и может изменяться от нуля до трех. Крайнее поле справа предназначено для записи комментария — от точки с запятой до конца'строки.
Методы адресации
125
Пример 3.3. Формат операторов ассемблера
Матка	Мнемоника	Операнды	Комментарии
DATA1	DB	23Н	; определить DATA1 как байт co
			; значением 23H
DATA2	DW	1000Н	; определить DATA2 как слово со
			; значением 10ООН
START:	MOV	AL, BL	; копирует BL в AL
	MOV	BH,AL	; копирует AL в ВН
	MOV	CX,200	; копирует десятичное число 200 в СХ
Листинг, формируемый при трансляции программы в файле с расширением .LST, выглядит так, как показано в примере 3.2. В крайней колонке слева приведены шестнадцатеричные значения смещений инструкций или данных, вычисленные ассемблером. Число или ряд чисел справа от смещения соответствуют машинному коду инструкции или данных. Например, смещение инструкции mov ах, о в примере 3.2 равно 0100Н, а машинный код — В8 оооо. Байт в8 соответствует коду операции, а 16-битное значение 0000 — непосредственному операнду 0.
Прямая адресация данных
Прямая адресация данных поддерживается в большинстве инструкций. Адрес данных в памяти при прямой адресации задается константным смешением в символическом или в числовом виде. Для инструкций с двумя операндами прямая адресация кодируется двояко. Первая форма кода применяется при передаче данных между памятью и регистром-аккумулятором (al/ax/eax); вторая форма — при прочих сочетаниях операндов. В любом случае адрес данных в памяти образуется совокупностью значений сегментного регистра и смещения, заданного в инструкции.
Прямая адресация при обмене данными с аккумулятором
Этот вариант предполагает, применительно к инструкции mov, передачу данных между памятью и регистром AL, АХ или ЕАХ. Инструкция mov в этом случае кодируется тремя байтами. В процессорах 80386—Pentium 4 коду инструкции может предшествовать префикс размерности регистра.
Рассмотрим пример. Инструкция mov al, data загружает в регистр AL данные, расположенные в сегменте данных по смещению data. Имя data обозначает величину смещения в символическом виде. Предположим, значение data равно 1234Н. Тогда инструкция mov al, data может быть записана как mov al, [1234Н]. Операнд [1234Н] обозначает ячейку памяти по смещению 1234Н. В некоторых ассемблерах при задании смещения в числовой форме требуется уточнить сегмент — mov al,ds: [1234Н]. Действие этой инструкции (запись байта, расположенного в сегменте данных по смещению 11234Н, в регистр AL) показано на рис. 3.5. В реальном режиме исполнительный адрес образуется сочетанием смещения 1234Н и сегментного адреса 1000Н.
Примеры прямой адресации при обмене данными с аккумулятором приведены в табл. 3.3. Инструкции с операндом-аккумулятором применяются довольно часто,
126
Гпава 3
поэтому для них предусмотрен 3-байтный вариант кода7. Инструкции для обмена данными между памятью и остальными регистрами кодируются четырьмя байтами.
Рис. 3.5. Выполнение инструкции MOV AL, [1234Н] при DS = 1000Н
Таблица 3.3. Примеры прямой адресации для обмена данными с регистром EAX/AX/AL
Инструкция	Размерность	Действие
MOV AL,NUMBER	Байт	Копирует в AL байт из сегмента данных по смещению NUMBER
MOV AX,COW	Слово	Копирует в АХ слово из сегмента данных по смещению cow
MOV EAX,WATER*	Двойное слово	Копирует в ЕАХ двойное слово из сегмента данных по смещению water
MOV NEWS,AL	Байт	Копирует AL в сегмент данных по смещению news
MOV THERE,AX	Слово	Копирует АХ в сегмент данных по смещению there
MOV HOME,EAX*	Двойное слово	Копирует ЕАХ в сегмент данных по смещению номе
MOV ES: [2000 H] , AL	Байт	Копирует AL в дополнительный сегмент данных по смещению 2000Н
Общий случай прямой адресации
В общем случае инструкция для обмена данными между памятью (при прямой адресации) и регистром кодируется четырьмя байтами (в процессорах 80386—Pentium 4 размер кода может достигать семи байт — при 32-битном смещении и 32-битном регистре). Вместе с тем, этот вариант кодировки наиболее гибкий, поскольку предусматривает все сочетания операндов.
7 В микропроцессорах 80386—Pentium 4 передача данных между регистром ЕАХ и памятью (при прямой адресации) может кодироваться большим числом байт.
Методы адресации
127
Сравним инструкцию MOV CL,DS: [1234Н] С инструкцией MOV AL,DS:[1234Н], рассмотренной в предыдущем разделе. Обе выполняют практически одну и ту же операцию, только регистры-приемники у них разные (CL и AL). Кодируются они тоже по-разному: команда mov al,ds: [1234Н] занимает три байта, а инструкция mov cl,ds: [1234Н] — четыре, что подтверждает пример 3.4.
Пример 3.4. Варианты размера кода инструкции mov при прямой адресации
0000 АО 1234 R	MOV AL,DS:[1234Н]
0003 8А 0Е 1234 R MOV CL,DS:[1234H]
Примеры инструкций с длиной кода более трех байт (при прямой адресации) приведены в табл. 3.4.
Таблица 3.4. Примеры прямой адресации в общей форме
Инструкция	Размерность	Действие
MOV CH,DOG	Байт	Копирует в СН байт из сегмента данных, расположенный по смещению dog
MOV CH,[1000H]8	Байт	Копирует в СН байт из сегмента данных, расположенный по смещению 1000Н
MOV ES,DATA6	Слово	Копирует в ES слово из сегмента данных, расположенное по смещению DATA6
MOV DATA7,BP	Слово	Копирует ВР в сегмент данных по смещению DATA7
MOV NUMBER,SP	Слово	Копирует SP в сегмент данных по смещению number
MOV DATA1,EAX	Двойное слово	Копирует ЕАХ в сегмент данных по смещению datai
MOV EDI,SUMI	Двойное слово	Копирует в EDI двойное слово, расположенное в сегменте данных по смещению sumi
Вариант программы с прямой адресацией данных показан в примере 3.5. Начало сегмента данных обозначено директивой .data. Модель памяти small позволяет определить один сегмент данных и один сегмент кода. Программа в модели small транслируется в исполняемый модуль формата EXE. Обратите внимание, что директивы задания данных db и dw записаны в сегменте данных (между операторами .data и .code). Оператор .startup теперь не только определяет точку входа в программу, но также загружает адрес сегмента данных в регистр DS.
Пример 3.5. Программа с прямой адресацией данных
.MODEL SMALL ; выбор SMALL-модели памяти
.DATA	; начало сегмента данных
0000 10 DATA1 DB ЮН	; определить байт ЮН с адресом DATA1
8 Смещения в числовом виде используются довольно редко.
128
Гпава 3
0001 оо 0002 0000 0004 АААА	DATA2 DATA3 DATA4	DB DW DW	0 0 0AAAAH	; поместить 9 в байт DATA2 ; поместить 0 в слово DATA3 ; поместить АЛДАН в DATA4
0000		.CODE		; начало сегмента кода
		.STARTUP		; начало программы
0017 АО 0000	R	MOV	AL,DATA1	; скопировать DATA1 е AL
001А 8А 26 0001 R		MOV	AH,DATA2	; скопировать DATA2 ь АН
001Е АЗ 0002	R	MOV	DATA3,AX	; сохранить АХ в DATA3
0021 8В 1Е 0004 R		MOV	BX, DATA 4	; загрузить в ВХ значение из DATA4
.EXIT
END
; выход в DOS ; конец файла
Регистровая косвенная адресация
Регистровая косвенная адресация позволяет обращаться к элементу данных, расположенному по произвольному смещению, заданному содержимым одного из регистров ВР, ВХ, DI и S1. Например, если регистр ВХ содержит число ЮООН, то команда mov ах, [вх] запишет в регистр АХ 16-битное значение, хранящееся в сегменте данных по смещению ЮООН. В предположении, что микропроцессор работает в реальном режиме и значение регистра DS = 01 ООН, эта инструкция обратится к паре байтов по адресам 2000Н и 2001Н, как показано на рис. 3.6. Заметим, что байт, расположенный по адресу 2000Н, копируется в регистр AL, а в регистр АН записывается байт, находящийся по адресу 2001Н. Скобки [ ] на языке ассемблера обозначают косвенную адресацию. Обратите внимание, что базовый адрес сегмента данных при значении регистра DS = 0100Н равен 01000Н.
00002002
00002001
00002000
00001002
00001001
00001000
Рис. 3.6. Действие команды mov ах, [вх] при вх = ЮООН и DS = 01 ООН
Методы адресации 129
В процессорах 80386—Pentium 4 в дополнение к регистрам ВР, ВХ, DI и SI для косвенной адресации могут использоваться все расширенные регистры, кроме ESP. Примеры инструкций с косвенной адресацией приведены в табл. 3.5.
Таблица 3.5. Примеры инструкций с косвенной адресацией
Инструкция	Размерность	Действие
MOV СХ,[ВХ]	Слово	Копирует в СХ слово, расположенное в сегменте данных по смещению, заданному в ВХ
MOV [BP],DL* В 9	Байт	Копирует DL в сегмент стека по смещению, заданному вВР
MOV [DI],BH	Байт	Копирует ВН сегмент данных по смещению, заданному в DI
MOV [DI],[BX]		Ошибка— передача данных между ячейками памяти поддерживается только для строковых инструкций
MOV AL,[EDX]	Байт	Копирует в AL байт из сегмента данных, смещение которого задано регистром EDX
MOV ЕСХ,[EBX]	Двойное слово	Копирует в ЕСХ двойное слово из сегмента данных, смещение которого задано в ЕВХ
Сегмент данных используется по умолчанию, если смещение задано регистром вх, di или si. Если указатель памяти задан регистром вр, то по умолчанию адресуется сегмент стека. В процессорах 80386 и выше регистр ЕВР по умолчанию адресует данные в сегменте стека, а при использовании в качестве указателей регистры ЕЛХ, ЕВХ, ЕСХ, EDX, EDI и ESI по умолчанию адресуется сегмент данных. Например, инструкция mov еах, [евх] загружает в регистр ЕАХ двойное слово из сегмента данных; смещение в сегменте данных задано содержимым ЕВХ. При адресации памяти через 32-битный регистр его значение в реально^ режиме не должно превышать 0000FFFFH. В защищенном режиме допускается любое смещение в пределах границ сегмента.
В определенных ситуациях при косвенной адресации необходимо уточнять размерность данных посредством специальной ассемблерной директивы byte ptr, word ptr пли dword ptr. Пример, когда уточнение не нужно, — байтовая инструкция mov al, [Di]10. Напротив, в инструкции mov [Di],юн нет сведений о том, на что указывает DI (на байт, на слово или на двойное слово11)? Запись инструкции в виде mov byte ptr [di],юн явно указывает размерность операнда, адресуемого регистром DI, — байт. Инструкция, записанная в виде mov dword ptr [di],ioh, работает с двойными словами, что определено директивой dword ptr. Заметим, что директивы
4 При косвенной адресации через регистр ВР/ЕВР используется, но умолчанию, сегмент стека.
В остальных случаях подразумевается сегмент данных.
10 Уточнять размерность [DI] не требуется, т. к. она должна соответствовать размерности второго
операнда — AL. — Пер.
11 Число ЮН помещается и в байт, и в слово, и в двойное слово — отсюда неопределенность. Если бы число было больше 0FFFFH, оно помещалось бы только в двойном слове, и размерноеib команды нс оставляла бы сомнений. — Пер.
5 Зак 384
130
Гпава 3
byte ptr, word ptr и dword ptr необходимы, в основном, только при сочетании косвенной адресации с непосредственными данными.
Косвенная адресация дает возможность поэлементной обработки табличных данных в памяти. Предположим, требуется сформировать таблицу с 50 значениями, прочитанными из памяти по адресу 0000:046С, где находится счетчик системного времени. На рис. 3.7 показана таблица и регистр-указатель ВХ для доступа к ее элементам. Для решения задачи требуется сначала загрузить начальный адрес таблицы в регистр ВХ — командой mov с непосредственной адресацией. Затем, используя регистр ВХ, один за другим сформировать элементы таблицы.
Рис. 3.7. Массив из 50 байт, косвенно адресуемый регистром ВХ
Программа, приведенная в примере 3.6, начинается с загрузки в регистр ВХ начального смещения таблицы и установки счетчика СХ = 50. В инструкции mov вх, offset table директива offset означает, что операнд представляет собой не содержимое table, а смещение table. Если бы инструкция была записана в виде mov вх, table, то в регистр ВХ было бы скопировано первое слово массива table. Напротив, команда mov вх, offset table запишет в регистр ВХ смещение массива table. Встретив в команде директиву offset, ассемблер вычисляет смещение и подставляет его в виде непосредственного операнда.
Пример 3.6. Программа с косвенной адресацией через регистр
0000 0000 0032 |	[ 0000	.MODEL SMALL .DATA		; выбор модели памяти SMALL ; начало сегмента данных ; задание массива из 50 байт
		TABLE DW 50 dup )	(?)	
0000		.CODE		; начало сегмента кода
		.STARTUP		; начало программы
Методы адресации
131
0017 В8 0000 001А 8Е СО	MOV MOV	AX, 0	
		ES,AX	запись 0 в ES
001С ВВ 0000 R	MOV	BX,OFFSET TABLE;	смещение таблицы
001F В9 0032	MOV	CX, 50	счетчик := 50
0022	AGAIN: 3022 26:А1 046С	MOV	AX,ES:[046CH]	;	прочитать показания часов
0026 89 07	MOV	[BX],AX	сохранить их в таблице
0028 43	ADD	BX,2	увеличить указатель ВХ
0029 Е2 F7	LOOP	AGAIN	повторять 50 раз
.EXIT	; выход в DOS
END	; конец файла
После инициализации счетчика и указателя программа входит в цикл до обнуления регистра СХ. В цикле выполняется чтение слова из дополнительного сегмента данных по смещению 46СН (инструкцией mov ax,es: [04бсн]) и запись прочитанного значения в главный сегмент данных по смешению, заданному содержимым регистра ВХ. Затем ВХ увеличивается на 2 (в результате, он адресует следующее двухбайтное слово таблицы), и выполняется инструкция loop. Эта инструкция вычитает I из регистра СХ, и если после этого СХ не равен нулю, то выполняет переход на метку again. Если же значение регистра СХ после уменьшения становится равным нулю, то переход не выполняется, и программа продолжается со следующего оператора (.exit). Значения, записанные этой программой в массив table, скорее всего, будут одинаковы, поскольку системное время изменяется с относительно невысокой частотой — 18,2 Гц. Для проверки работы программы воспользуйтесь отладчиком, например, CodeView. Вызов CodeView выполняется командой cv file.exe. Вызов CodeView с опцией /50 включает 50-строчный текстовый режим дисплея, а ключ /s позволяет отлаживать приложения, использующие видеорежимы с высоким разрешением. Например, для отладки программы TEST.COM в 50-строчном режиме, в командной строке DOS введите cv /50 test.com. Для отладки программы в Programmer’s WorkBench воспользуйтесь пунктом DEBUG меню RUN.
Базово-индексная адресация
Положение данных в памяти при базово-индексной адресации определяется содержимым регистров, что напоминает косвенную регистровую адресацию. В процессорах 8086—80286 при базово-индексной адресации используется один базовый (ВР или ВХ) и один индексный регистр (DI или S1). В базовом регистре обычно находится смещение начала массива, а в индексном — позиция элемента в массиве. Напомним, что при использовании регистра ВР для косвенной адресации памяти исполнительный адрес образуется сочетанием значений ВР и SS.
В процессорах 80386—Pentium 4 допустима любая комбинация 32-битных регистров без участия ESP. Например, в инструкции mov dl, [еах+евх] регистр ЕАХ выступает в роли базового регистра, а ЕВХ — в роли индексного. При использовании ЕВР выполняется доступ к сегменту стека.
Рис. 3.8 иллюстрирует адресацию данных при выполнении инструкции mov dx, [bx+di] в реальном режиме. Поскольку в этом примере ВХ = 1000Н, D1 = 00ЮН,
132
Гпава 3
a DS = 01 ООН, в регистр-приемник (DX) записывается слово, расположенное по адресу 020ЮН.
Рис. 3.8. Действие базово-индексной адресации при выполнении инструкции mov dx, [bx+di ]
Таблица 3.6. Примеры инструкций с базово-индексной адресацией
Инструкция	Размерность	Действие
MOV СХ, [BX+DI]	Слово	Копирует в СХ слово из сегмента данных по смещению, равному сумме ВХ и DI
MOV CH, [BP+SI]	Байт	Копирует в СН байт, находящийся в сегменте стека по смещению, равному сумме ВР и SI
MOV [BX+SI],SP	Слово	Копирует SP в сегмент данных по смещению, равному сумме ВХ и SI
MOV [BP+DI],AH	Байт	Копирует АН в сегмент стека по смещению, равному сумме содержимого регистров ВР и DI
MOV CL,[EDX+EDI]	Байт	Копирует в CL байт, расположенный в сегменте данных по смещению, равному сумме EDX и EDI
MOV [EAX+EBX],ECX	Двойное слово	Копирует ЕСХ в сегмент данных по смещению, равному сумме ЕАХ и ЕВХ
В табл. 3.6 приведены примеры инструкций с базово-индексной адресацией. Заметим, что в ассемблере фирмы Intel принято обозначать этот метод адресации в виде (BXHDT) (вместо (bx+di]). Инструкция mov dx, (bx+dij в этом ассемблере выглядит
Методы адресации
133
как mov dxz [вх] [Di]. Команда mov di,[bx+di] при трансляции ассемблером Intel не вызовет ошибки, но будет работать неправильно. В большинстве ассемблеров, включая Microsoft MASM, допускаются обе формы.
Базово-индексная адресация применяется, главным образом, для доступа к элементам массива в памяти. Предположим, требуется выполнить поэлементный доступ к массиву array в сегменте данных. Формируем в базовом регистре ВХ адрес начала массива, а в индексном регистре DI — смещение текущего элемента от начала массива. Адресация элемента массива регистрами ВХ и DI показана на рис. 3.9.
ARRAY + 5
ARRAY + 4
ARRAY + 3
ARRAY + 2
ARRAY + 1 ARRAY
Рис. 3.9. Пример базово-индексной адресации
Программа в примере 3.7 копирует содержимое элемента массива с номером ЮН в элемент номер 20Н. Номер элемента загружается в регистр DI. Копируемый элемент массива проинициализирован числом 29Н, для -проверки результата выполнения программы.
Пример 3.7. Программа с базово-индексной адресацией
0000			.MODEL SMALL .DATA		; выбор модели памяти SMALL ; начало сегмента данных
0000	0010		[ ARRAY 00 1	DB 16 DUP (?)	; начало определения массива ARRAY
0010 ООП	29 001Е		J I 00 1	DB 29H DB 30 DUP (?)	; элемент ARRAY с номером ЮН
0000			J	.CODE .STARTUP	; начало сегмента кода ; начало программы
0017 001А	ВВ BF	0000 R 0010		MOV BX,OFFSET MOV DI,10H	ARRAY; смещение ARRAY ; смещение элемента с номером ЮН
134 з
001D 8А 01	MOV	AL,[BX+DI]	; прочитать этот элемент в AL
001F BF 0020	MOV	DI,20H	; вычислить адрес элемента номер 2ОН
0022 88 01	MOV	[BX+DI],AL	; скопировать AL в этот элемент
.EXIT	; выход в DOS
END	; конец файла
Регистровая косвенная адресация со смещением
Этот метод адресации похож на базово-индексный, т. к. смещение данных в памяти формируется суммой двух значений. При регистровой косвенной адресации адрес составляется из константного смещения и содержимого одного регистра — базового или индексного (ВР, ВХ, DI или SI). На рис. ЗЛО показано действие инструкции mov ах, [вх+юоон] при ВХ = 01 ООН и DS = 0200Н. В регистр АХ копируется слово из сегмента данных, находящееся по смещению 0100Н + 1000Н = 1100Н. При значении регистра DS = 0200Н линейный адрес равен 02000Н + 01100Н = 03100Н.
Рис. 3.10. Действие инструкции MOV АХ, [ВХ+ЮООН] при ВХ = 01 ООН и DS = 0200Н
Если смещение задано регистром ВХ, DI или SI, то доступ выполняется к сегменту данных, а если регистром ВР, то к сегменту стека. В процессорах 80386—Pentium смещение может быть 32-битным числом, а регистр — любым расширенным регистром, кроме ESP. Напомним, что в реальном режиме размер сегмента ограничен 64 Кбайтами. В табл. 3.7 приведены примеры использования регистровой косвенно адресации со смещением в командах.
Константа, прибавляемая к содержимому регистра при формировании смещении» может быть положительной, как в инструкции mov al, [di+2], или как, например, в команде mov al, [si-1]. Константа смещения ука:--------
скобок ( ] или перед ними, как в инструкции mov al, data [Di]. КомаН MOV AL,DATA[Di+3] также допустима (здесь заданы две константы — одна внутри сК
отрицательно ыняется внутр11
135
а перед скобками). В микропроцессорах 8086—80286 суммарное значение боК и 0 и ограничено диапазоном 16-битных знаковых чисел — от —32768 (8000Н) cMeLlid?767 (7FFFH); в процессорах 80386—Pentium 4 значение смещения лежит в ДО +32v ОТ -2 147483648 (80000000Н) до +2 147483647 (7FFFFFFFH).
дре^аХ
Таблица 3.7. Примеры регистровой косвенной адресации со смещением
'^РУ*иия	Размерность	Действие
	Слово	Копирует в АХ слово из сегмента данных, расположенное по смещению DI + 100Н
Ц0У ARHAYISIbBL	Байт	Копирует BL в сегмент данных по смещению ARRAY + SI
MOV LIST [SH 2], CL	Байт	Копирует CL в сегмент данных по смещению, равному сумме list, SI и 2
MOV DI,SFT_TT[BX)	Слово	Копирует в DI слово из сегмента данных, расположенное по смещению set_it + ВХ
MOV DI, [EAX+10H]	Слово	Копирует в DI слово из сегмента данных, расположенное по смещению ЕАХ + ЮН
MOV ARRAY[EBX] , EAX	Двойное слово	Пересылает значение ЕАХ в сегмент данных по
смещению, равному сумме имени array и содержимого ЕВХ
Применение регистровой косвенной адресации со смещением для доступа к элементам массива иллюстрирует рис. 3.11 на примере, рассмотренном для базовоиндексной адресации. Ссылка на элемент массива формируется как сумма константы array и индексного регистра DI.
ARRAY + 6
ARRAY + 5
ARRAY + 4
ARRAY + 3
ARRAY + 2
ARRAY + 1
ARRAY
Рис. 3.11. Доступ к элементам массива array с использованием регистровой косвенной адресации со смещением
136
Гпава 3
Программа в примере 3.8 демонстрирует применение этого метода адресации для передачи данных между элементами массива с номерами ЮН и 20Н. Обратите внимание на сходство программ в примерах 3.7 и 3.8. Различны лишь способы задания начального адреса массива. В программе из примера 3.7 для этого используется регистр ВХ, а в примере 3.8 — константа array.
Пример 3.8. Программа, использующая косвенную адресацию со смещением
.MODEL SMALL
; выбор модели памяти SMALL
0000
.DATA	; начало сегмента данных
0000 0010 [ ARRAY DB 16 DUP (?) 00
J
0010 29	DB 29H
ООП 001E [	DB 30 DUP (?)
00 ]
0000	.CODE
.STARTUP
; начало определения массива ARRAY
; элемент ARRAY с номером ЮН
; начало сегмента кода
; начало программы
0017	BF 0010	MOV	DI ДОН	‘ смещение элемента с номером	ЮН
001А	ЬА 85 0000 R	MOV	AL,ARRAY[DI] ;	; прочитать этот элемент в AL	
001Е	BF 0020	MOV	DI,20H	;	: смещение элемента с номером	20Н
0021	88 85 0000 R	MOV	ARRAY (DI], AL ;	? скопировать AL в этот элемев	IT
.EXIT
END
; выход в DOS ; конец файла
Базово-индексная адресация со смещением
Этот метод адресации используется для обработки двумерных массивов и представляет собой, по существу, базово-индексную адресацию с добавлением константы смещения.
Базово-индексная адресация со смещением — самый сложный метод адресации в процессорах 8086—80286. Действие этого метода, применительно к инструкции mov ах, [bx+si+iooh], показано на рис. 3.12. Смещение в сегменте данных равно сумме константы 100Н и содержимого регистров ВХ и SL При значении регистров ВХ = 0020Н, SI = 0010Н и DS = ЮООН линейный адрес равен Ю130Н.
Примеры команд с использованием метода базово-индексной адресации со смещением приведены в табл. 3.8. Следует отметить, что этот сложный метод адресации используется в программах относительно редко.
Таблица 3.8. Примеры использования базово-индексной адресации со смещением
Инструкция	Размерность	Действие
MOV DH,[BX+DI+2ОН]	Байт	Копирует в DH из сегмента данных байт, смещение которого равно сумме ВХ, DI и 20Н
Методы адресации
137
Таблица 3.8 (окончание)
Инструкция	Размерность	Действие
MOV АХ,FILE[BX+DI]	Слово	Копирует в АХ слово из сегмента данных по смещению file + ВХ + DI
MOV LIST[BP+DI],CL	Байт	Копирует CL в стек по смещению, равному сумме list, ВР и DI
MOV LIST[BP+S1+4],DH	Байт	Копирует DH в сегмент стека по смещению, равному сумме list, ВР, SI и 4
MOV EAX,FILE[ЕВХ+ЕСХ+2J	Двойное слово	Копирует в ЕАХ двойное слово из сегмента данных, по смещению file + ЕВХ + ЕСХ + 2
ЕАХ
ЕВХ
ЕСХ
EDX
ESP
ЕВР
ESI
01 ООН	DSX10H
Рис. 3.12. Пример базово-индексной адресации со смещением для команды MOV АХ, [BX+SI+100H] при DS = 1000Н
Предположим, что в памяти задан массив записей, каждая из которых содержит набор элементов. Имя массива — file. Для доступа к элементам используем три смещения (как показано на рис. 3.13):
□ смещение массива относительно начала сегмента данных — задано константой file;
О смещение записи от начала массива — формируем в базовом регистре;
О смещение элемента — формируем в индексном регистре.
Программа в примере 3.9 передает содержимое элемента 0 записи А в элемент 2 записи С, используя базово-индексную адресацию со смещением. В этом примере массив file содержит четыре записи по 10 элементов в каждой. Обратите внимание
138
на оператор this КИ — FILE И RECA.
byte; с его помощью мы определили по одному адресу две
Память
REC (Запись С)
REC (Запись В)
REC (Запись А)
Рис. 3.13. Применение базово-индексной адресации со смещением для доступа к элементам записей rec массива FILE

Пример 3.9. Программа, использующая базово-индексную адресацию со смещением^
	.MODEL SMALL	; выбор модели памяти SMALL
0000	.DATA	; начало сегмента данных
0000 = 0000 FILE EQU THIS BYTE		; назвать этот байт именем FILE
0000 000А [	RECA DB 10 DUP (?) 00 1	; зарезервировать 10 байт под RECA
000А 000А [	J RECB DB 10 DUP (?) 00 1	; зарезервировать 10 байт под RECB
0014 000А [	J RECC DB 10 DUP (?) 00	; зарезервировать 10 байт под RECC
001Е 000А [	] RECD DB 10 DUP (?) 00	; зарезервировать 10 байт под RECD
0000
.CODE
.STARTUP
; начало сегмента кода
; начало программы
адресации
139
ool7 qO1a QO1P
00?4 0027
BB BF 8A
BB BF
88
OOOC R oooo 31 0000 R 0014 R 0002 81 0000 R
MOV	BX,OFFSET RECA;	смещение RECA
MOV	DI, 0	смещение элемента с номером 0
MOV	AL,FILE[BX+DI];	прочитать данные
MOV	BX,OFFSET RECC;	смещение RECC
MOV	DI, 2	смещение элемента с номером 2
MOV	FILE[BX+DI],AL;	сохранить данные
.EXIT
END
; выход в DOS ; конец файла
разово-индексная адресация с масштабированием
разово-индексная адресация с масштабированием доступна только в процессорах 80386—Pentium 4. В этом методе адресации смещение задается парой 32-битных регистров (базового и индексного). Содержимое второго регистра (индексного) умножается на масштабный коэффициент I, 2, 4 или 8. Масштабный коэффициент со значением I используется по умолчанию, и указывать его в инструкции на языке ассемблера не обязательно, например — mov al, [евх+есх] . Масштабный коэффициент 2 применяется для адресации элементов массива слов, коэффициент 4 — для обработки массива двойных слов, а коэффициент 8 — для доступа к элементам массива 8-байтовых данных.
Рассмотрим, например, инструкцию mov ах,[edi+2*ecxj. В ней масштабный коэффициент равен 2; перед сложением с EDI содержимое ЕСХ умножается на 2, полученный результат определяет смещение при доступе к памяти. Значение ЕСХ = 00000000Н адресует элемент массива слов с индексом 0, при ЕСХ = 00000001Н доступ выполняется к элементу с индексом I, и т. д. Примеры использования индексной адресации с масштабированием в инструкциях приведены в табл. 3.9. Эти примеры дают представление о том, сколь велико число сочетаний регистров в данном методе адресации. Следует отметить, что базовый регистр можно опустить, как, например, в команде mov eax, [4*edij.
Таблица 3.9. Примеры использования индексной адресации с масштабированием
Инструкция	Размерность	Действие
1407 ЕАХ, [ЕВХ+4*ЕСХ] fEAX+2*EDI+100H] ,СХ	Двойное слово Слово	Копирует в ЕАХ двойное слово из сегмента данных, расположенное по смещению 4 * ЕСХ + ЕВХ Копирует СХ в сегмент данных по смещению, равному сумме регистра ЕАХ, смещения 100Н и двукратного значения регистра EDI
[EBP+2*EDI-2] МОу ь •array[4*ЕСХ]	Байт Двойное слово	Копирует из сегмента стека в AL байт, смещение которого равно сумме ЕВР, -2 и удвоенного значения EDI Копирует в ЕАХ двойное слово из сегмента данных, расположенное по смещению ARRAY + 4 * ЕСХ
140
В примере З.Ю приведен листинг программы обработки массива слов list. Смев пне list загружается в регистр ЕВХ инструкцией mov евх,offset list. Для Доступ^ элементам массива используется масштабный коэффициент 2; индекс элемеиЛ формируется в регистре ЕСХ. Программа записывает число 2 в элементы с инде сом 2, 4 и 7. Директива .386 в начале программы разрешает транслятору использо^ вать возможности микропроцессора 80386. Вместо директивы .386 может быть зада на директива .486 или .586 — для включения расширений, свойственных процессов 80486 или Pentium—Pentium 4, соответственно. При трансляции программ для DQj директива .386, .486 или .586 записывается после директивы .model. Если зад^ подобную директиву перед .model, транслятор сгенерирует инструкции для 32-битного режима, несовместимого с DOS.
Пример 3.10. Программа, использующая индексную адресацию с масштабированием .......................................................................J3I
.MODEL SMALL ; выбор модели памяти SMALL
.386	; использовать возможности 80386
0000	.DATA	; начало сегмента данных
0000 0000 0001 0002 LIST DW 0,1,2,3,4 ; определить массив LIST
0003 0004
000А 0005 0006 0007	DW 5,6,7,8,9
0008 0009
0000	.CODE	; начало сегмента кода
.STARTUP	; начало программы
0010 66|	ВВ 00000000 R	MOV ЕВХ,OFFSET LIST;	 смещение массива LIST
0016 661	В9 00000002	MOV ЕСХ,2	прочитать элемент номер 2
001С 67&	8В 04 4В	MOV АХ,[ЕВХ+2*ЕСХ]	
0020 661	В9 00000004	MOV ЕСХ, 4	записать в элемент номер 4
0026 67&	89 04 4В	MOV [ЕВХ+2*ЕСХ],АХ	
002А 66|	В9 00000007	MOV ЕСХ,7	сохранить в элементе
			номер 7
0030 67&	89 04 4В	MOV [ЕВХ+2*ЕСХ],АХ	
.EXIT	; выход в DOS
END	; конец файла
3.2. Структуры данных
Структуры данных определяют способ хранения разнородных данных. СтрУ*1?!^ данных в языке ассемблера — это шаблон для определения данных. Определи # этого шаблона начинается директивой struc с именем структуры и заканчив оператором ends. В примере 3.11 приведен листинг определения структуры и мирования данных на ее основе.
Пример 3.11. Определение структуры info и данных на ее основе
; Определение структуры данных
INFO STRUC
0057
^ппесации								/4/
		NAMES	DB	32 DUP (?)	; 32	байта для имени		
”"20	I 00 1							
	J f	STREET DB		32 DUP (?)	; 32	байта для названия	i улицы	
	00							
0040 0010	J [ 00	CITY	DB	16 DUP (?)	; 16	байт для названия	города	
0050 0°02	] [ 00	STATE	DB	2 DUP (?)	; 2 ।	байта для названия	штата	
0052 0005	] [ 00	ZIP	DB	5 DUP (?)	; 5 ।	байт для zip-кода		
INFO ENDS
NAME1 INFO <'Bob Smith'z' 123 Main Street'Wanda'OH'44444'> 42 6F 62 20 53 6D 69 74 68 ООП (
00 )
31	32	33	20	4D
61	69	6E	20	53	74
72	65	65	74
0011 [
00 ]
57 61 6E 64 61
000B [
00 ]
48 34 34 34
34 34
NAME2 INFO <'Steve Doe'z'222 Mouse Lane'z'Miller'z'PA'z'18100'>
53 74 65 76 65 20
44 6F 65
0017 [
00
]
32 32 20 4D
J 75 73 65 20 4C
61 6E 65
0012 (
00
69 6C 6C 65
142
ОООА [
00
J
50 41 31 38 31
30 30
ООАЕ NAME3 INFO <'Jim Dover'303 Main Street','Orender','CA','90000'> 42 65 6E 20 44 6F 76 65 72 0017 [ 00 ] 33 30	33	20	4D
61 69	6E	20	53	74
72 65	65	74
0011 [ 00 ] 4F 72 65 6E 64 65 72 0009 [ 00 ] 43 41 39 30 30 30 30
Струклура info, определенная в примере 3.11, предназначена для хранения сведений об адресе и состоит из пяти полей. Первое поле (32 байта) отведено для имени и фамилии; zip-код хранится в пятом поле (5 байт). Во втором поле (32 байта) хранится название улицы, в третьем (16 байт) — название города, в четвертом (2 байта) — аббревиатура штата. Данным, определяемым на основе шаблона структуры, могут быть присвоены начальные значения. Начальные значения записываются внутри скобок < >, как показано в примере 3.11. Доступ к полям структуры требует указания имени структуры вместе с названием поля, как показано в примере 3.12. Например, поле STREET В структуре NAME2 доступно как NAME2. street. В начале этого имени указано название структуры, а затем — имя поля. Еще один пример — имя NAME3.CITY. Оно обозначает адрес данных с названием города в составе структуры NAME3.
Пример 3.12. Доступ к элементам структуры
0000 В9 0020 0003 ВО 00 0005 BE 0000		; Очистка MOV MOV R	MOV REP	поля имени и фамилии в структуре NAME1	
			СХ, 32 AL, 0 SI, OFFSET STOSB	NAME1.NAMES
0008	F3/AA			
		; Очистка	названия улицы в структуре NAME2	
000А	В9 0020	MOV	СХ, 32	
000D	ВО 00	MOV	AL, 0	
143
001°
0013
BE 0°77 R F3/aa
MOV
REP
; Очистка
SI,OFFSET NAME2.STREET
STOSB
zip-кода в NAME3
od5 0018 001A OOlD
B9 0005
BO 00 bE 0100 R рЗ/АА
MOV CXZ5
MOV AL,0
MOV SI,OFFSET NAME3.ZIP
REP STOSB
Программ3’ показанная в примере
Hr ______ хтлтлг! ПП1Р ЯППАГЯ n стих
лпограмма, показанная в примере 3.12, очищает три элемента данных: поле имени в уктуре namei, поле адреса в структуре name2 и zip-код в структуре иамез. Действие ^роковой инструкции rep stosb выяснится в дальнейшем при изучении системы
хоманд-
3.3. Методы адресации инструкций
В инструкциях передачи управления jmp и call применяются три метода адресации памяти программ: прямой, относительный и косвенный. В этом разделе мы рассмотрим эти методы адресации на примере инструкции jmp.
Прямая адресация
Прямая адресация памяти программ применялась в большинстве первых микропроцессоров для передачи управления при выполнении переходов и вызовов подпрограмм. Этот метод адресации также используется в языках высокого уровня типа Basic при передаче управления операторами goto и gosub. В микропроцессорах Intel этот вид адресации тоже применяется, хотя и не столь часто, как относительная или косвенная.
Адрес перехода при прямой адресации программной памяти хранится в коде инструкции. Например, в команде перехода по адресу 10000Н значение адреса (10000Н) хранится в конце кода команды, как показано на рис. 3.14. Инструкция jmp, приведенная на рис. 3.14, загружает в регистр CS число 1000Н, а в IP — 0000Н; таким образом, она передает управление инструкции по адресу 10000Н. Переход в произ-в°льный сегмент, или межсегментный переход, обеспечивает передачу управления в нределах всего адресного пространства. По этой причине прямой переход также на-Зь,вают дальним (far jump). В реальном режиме дальний переход ограничен стандартной памятью объемом 1 Мбайт. В защищенном режиме микропроцессоров 80386— ntiuin 4 дальний переход возможен в пределах всего адресного пространства я Гайт.
Код операции
Смещение (младший байт)
Смещение (старший байт)
Сегмент (младший байт)
Сегмент (старший байт)
Е А
О О
О О
О О
1 О
Рис. 3.14. Машинный код инструкции JMP [ 10000Н ]
используется также в инструкции call — как при внугрисегмент-
^чМая адресация
’ так и при дальнем вызове подпрограммы. Обычно адрес перехода задают не в
144
числовой форме, а в символическом виде — меткой. В последнем случае ассембл^ сам выбирает, при трансляции, наиболее подходящий метод адресации.	"д
Относительная адресация
В ранних микропроцессорах этот метод адресации не поддерживался, но в микъх процессорах Intel 8086—Pentium 4 он присутствует. Термин "относительная адр^Т ция" означает, что смещение следующей инструкции отсчитывается от текуще|ъ значения указателя инструкции IP. Например, если инструкция jmp передает у прям ление вперед через два байта (задает обход следующих двух байт программы)7<|£ относительный адрес перехода равен двум. Пример относительной адресации в иц» струкцип jmp приведен на рис. 3.15. Заметим, что код инструкции jmp в примере состоит всего из двух байт: в первом байте записан код операции, а во втором — смещение относительно IP. Смешение кодируется одним байтом при короткой (short) форме перехода. Двухбайтное смешение используется при ближних (пеа^ передачах управления. В последнем случае возможен переход в любую точку текущего сегмента кода (внутрисегментный переход). В процессорах 80386—Pentium 4 смещение может быть закодировано 32-битной величиной, что позволяет передавал управление в пределах текущего сегмента кода размером до 4 Гбайт.
юоо 1001
1002 юоз 1004
Рис. 3.15. Машинный код инструкции JMP [2], передающей управление через два байта кода вперед
Относительные инструкции jmp и call содержат 8- или 16-битное знаковое смешение, что позволяет адресовать как последующие, так и предшествующие инструкции. В процессорах 80386—Pentium 4 в дополнение к 8-битному смещению может использоваться 32-битное. При трансляции ассемблер вычисляет смешение и выбирает наиболее подходящую форму его представления — 1-, 2- или 4-байтную. Если относительное смещение не может быть представлено двухбайтной величиной, семблер отказывается от относительной адресации и использует прямую. Диапа^ short-переходов — при задании смещения 8-битной величиной — составляет от " до +127 байт. При 16-битном смещении (пеаг-переход) "дальность" перехода ±32 Кбайт. В процессорах 80386—Pentium 4 при использовании 32-битного сме^ ния (что возможно только в защищенном режиме) диапазон переходов соста ±2 Гбайт.
Косвенная адресация
Микропроцессоры Intel 8086—Pentium 4 поддерживают несколько форм косВ деН*1 адресации памяти программ для инструкций jmp и call. В табл. 3.10 прив примеры косвенной адресации в инструкциях перехода. Адрес перехода задан любым 16-битным регистром (АХ, ВХ, СХ, DX, SP, BP, DI или SI), а
145
Мх*****^
спи е м необязательной констан ты смещения.
с < 1 4	.............. ..........—...........................
На|*।•'*, ’*'-'Н'
одержимым регистра ЕАХ.
етсЯ с
^положенным в сегменте данных по смещению [bpj, [bxi, [di] или [si], В процессорах 80386—
4 команды jmp и call допускают задание адреса перехода в расширенном Например, jmp еах передает управление команде, адрес которой определи-
Таблица 3.10. Примеры косвенной адресации памяти программ
Действие
Инс		
JMP	AX	Переход в текущем сегменте кода по смещению, заданному содержимым АХ
JMP	ex	Переход в текущем сегменте кода по смещению, заданному содержимым СХ
JMP	near ptr [DX]	Переход в текущем сегменте кода по смещению, заданному содержимым слова, расположенного в сегменте данных по смещению ВХ
JMP	NEAR PTR[DI+2]	Переход в текущем сегменте кода по смещению, заданному в слове из сегмента данных по смещению DI + 2
JMP	TABLE [ b:< J	Переход в текущем сегменте кода по смещению, заданному 16-битным содержимым сегмента данных по смещению table + ВХ
JMP	ECX	Переход в текущем сегменте кода по смещению, заданному содержимым ЕСХ
Если адрес перехода инструкции jmp задан 16-бптным регистром, то переход ближний. Например, если регистр ВХ содержит 1000Н, то инструкция jmp вх передает управление команде, смещение которой в текущем сегменте кода равно 1000Н.
Переход считается косвенным и тогда, когда операнд инструкции перехода задан
Регистром-указателем в квадратных скобках. Так, например, команда jmp [bxj обра-™Тся за адресом перехода к слову, которое находится в сегменте данных по смешению, заданному регистром ВХ. Прочитанное из сегмента данных 16-битное число ^пользуется в качестве смешения; переход выполняется в текущем сегменте кода. В °т ваРпант перехода называют косвенно-косвенным, или дважды косвенным.
дИцРИМере 3 13 приведен фрагмент программы с таблицей адресов переходов. Таб-Bhi расположена в памяти данных с адреса table. Выбор элемента таблицы при Мере вСНИ11 инстРУкции jmp table[вх] определяется значением регистра ВХ. В при-= 4, поэтому адрес перехода равен содержимому второго слова массива ет элементов массива — от 0).
:	3 1 ЯЛ
мУльтиветвление с использованием косвенной адресации
\ ииць1 переходов
Че
• Таблица адресов переходов
DW LOCO
DW LOCI
DW LOC2
DW LOC3
• "ОВД ф Таблица 3.11 (окончание)	
Инструкция	Действие
PCPAD	Удаляет данные из стека, помещая их в регистры ESI, EDI, EBP, ESP ЕВХ, EDX, ЕСХ и ЕАХ
pop е;ах	Удаляет двойное слово из стека, помещая его в ЕАХ
PUSH EDI	Копирует EDI в стек
Парные инструкции pusha и рора, доступные в микропроцессорах 80286—Pentium 4 предназначены для сохранения и восстановления всех регистров, за исключением сегментных. Порядок записи и считывания регистров при выполнении команд fusha/popa приведен в табл. 3.11. Начиная с процессора 80286, в инструкции push допускается непосредственный операнд. В процессорах 80386—Pentium 4 операндом инструкции push и pop может быть также расширенный регистр.
В примере 3.14 приведен листинг программы, которая, сохранив в стеке содержимое регистров АХ, ВХ и СХ, восстанавливает их в обратном порядке. Первая команда pop извлекает из стека копию содержимого регистра СХ, но записывает се в АХ. Вторая команда pop помешает исходное значение регистра ВХ в СХ. Последняя команда pop записывает в ВХ исходное значение АХ.
Пример 3.14. Программа для иллюстрации работы стека
	.MODEL TINY
0000	.CODE
	.STARTUP
0100 В8 1000	MOV AX,1000H
0103 ВВ 2000	MOV BX,200CH
0106 В9 3000	MOV CX,3000H
0109 50	PUSH AX
010А 53	PUSH BX
010В 51	PUSH ex
01ОС 58	POP AX
010D 59	POP ex
010Е 5В	POP BX
	.EXIT
	END
; выбор модели TINY
; начало сегмента кода
; начало программы
; загрузить тестовые данные
;	записать	1000Н	в	стек
;	записать	2000Н	в	стек
;	записать	3000Н	в	стек
;	прочесть	ЗОООН	в	АХ
;	прочесть	2000Н	в	СХ
;	прочесть	1000Н	в	ВХ
; выход в DOS
; конец текста программы
Итоги
О Существуют следующие методы адресации данных: регистровая, непосредственная, прямая, регистровая косвенная, базово-индексная, регистровая косвенная со смещением и базово-индексная со смещением. Дополнительный метод, принятый в микропроцессорах 80386—Pentium 4, — это индексная адресация с мас-ш габированием.
149
тОдам адресации инструкций относят: прямую, относительную и косвенную,
и К ме
U оды адресации данных, доступные в реальном режиме микропроцессоров 0 ^6-80286, приведены в табл. 3.12.
Таблица 3.12. Примеры методов адресации данных в реальном режиме
Инструкция	Местонахождение операнда
MOV AL, BI. MOV AX,BX MOV EAX,ECa	8-битный регистр (регистровая адресация) 16-битный регистр 32-битный регистр
MOV DS/CX	Сегментный регистр
MOV AL,LIST	(DS * ЮН) + list
MOV CH,DATA1	(DS * ЮН) 4- DATA1
MOV ES,DATA2	(DS * ЮН) 4- DATA2
MOV AL,12	Непосредственные данные (число 12Н)
MOV AL, [BP]	(SS * ЮН) + ВР
MOV AL,[BX]	(DS * ЮН) + ВХ
MOV AL,[DI]	(DS * ЮН) + DI
MOV AL,[SI]	(DS * ЮН) + SI
MOV AL,[BP+2]	(SS * ЮН) + ВР + 2
MOV AL,[BX-4]	(DS*10H) + BX-4
MOV AL, [DI + 1000H]	(DS * ЮН) + DI-ь ЮООН
MOV AL, [SI + 300H]	(DS * ЮН) + SI + 300Н
MOV AL,LIST[BP]	(SS * ЮН) ч-LIST +ВР
MOV AL,LIST[BX]	(DS * ЮН) + LIST +ВХ
MOV AL,LIST[DI] MOV AL,LIST[SI] MOV AL,LIST[BP+2] MOV AL,LIST[BX-6] MOV AL, LIST[DI+100H] Mov AL,LIST[SI+200H] MOV al, [BP+DI] MOV al, [BP+SI] Mov AL, [BX+DI] MOV AL, [BX+SI] bp+di+4 J	(DS * ЮН) + LIST + DI (DS * ЮН) + list +SI (SS * ЮН) + LIST +BP + 2 (DS* 10H) 4-LIST +BX-6 (DS*1OH) + LIST + DI + 1OOH (DS * ЮН) + list 4-SI + 200H (SS * 10H) + BP + DI (SS * ЮН) + BP + SI (DS * ЮН) 4-BX 4-DI (DS * 10H) 4-BX 4-SI (SS * 10H) 4-BP 4-DI 4-4
150

Таблица 3.12 (от
Инструкция
Местонахождение операнда
MOV ALZ [BP+SI-S]	(SS * 10H) + BP + SI - 8
MOV ALZ [BX+DI+10H]	(DS * 10H) + BX + DI + 10H
MOV ALZ [BX+ SI-10H]	(DS ’ 10H) + BX + SI - 10H
MOV ALZLIST[BP+DI]	(SS * 10H) + LIST + BP + DI
MOV ALZLIST[BP+SI ]	(SS * 10H) + LIST + BP + SI
MOV AL,LIST[BX+DI]	(DS * 10H) + LIST + BX + DI
MOV ALZLIST[BX+SI]	(DS * 10H) + LIST + BX + SI
MOV ALZLIST[BP+DI+2]	(SS * 10H) + LIST + BP + DI+ 2
MOV ALZLIST[BP+SI-7]	(SS * 10H) + LIST + BP + SI-7
MOV ALZLIST[BX+DI+3]	(DS * 10H) + LIST + BX + DI + 3
MOV ALzLIST[BX+SI-2 ]	(DS * 10H) + LIST + BX + SI-2
□	В микропроцессорах 80386—Pentium 4 предусмотрены дополнительные методы адресации с использованием регистров ЕАХ, ЕВХ, ЕСХ, EDX, EBP, EDI и ESI дня задания смещения (см. табл. 3.12). Пример — команда mov al, table[евх+2*есх+юн].
□	Инструкция mov копирует содержимое операнда-источника в операнд-приемник; при этом источник не изменяется.
□	Регистровая адресация применяется для доступа к 8-битному (АН, AL, ВН, BL, СН, CL, DH или DL) или 16-битному регистру (АХ, ВХ, СХ, DX, SP, ВР, SI или D1). Сегментный регистр (CS, DS, ES или SS) может быть указан в командах копирования при обмене данными с 16-битным регистром, а также в командах № и pop. Микропроцессоры 80386—Pentium 4 располагают дополнительными сегментными регистрами FS и GS, а также расширенными регистрами ЕАХ, Е»** ЕСХ, EDX, ESP, EBP, EDI и ESI.
□	Непосредственная команда mov копирует в регистр или в память данные, Рас^ ложенные в коде инструкции (после кода операции). Размерность непосрсД венного операнда — байт, слово или, в процессорах 80386—Pentium 4, дв°
П
слово.
Директива .model в программе на языке ассемблера указывается в начале и 3 ного текста и определяет модель памяти. В модели tiny программа одного сегмента кода и транслируется в исполняемую программу формата В модели small программа содержит один сегмент кода и один сегмент Д транслируется в формат EXE. Характеристики других моделей памяти см. в
ложен ни 1.
И
Прямая адресация, предназначенная для обмена данными между памятью ги стром, кодируется в двух формах. Первая форма, 3-байтная, предназнач^ г обмена данными с регистром-аккумулятором EAX/AX/AL. Вторая форма
151
0
0
тся при обмене данными с другими регистрами и кодируется четырьмя бай-Н ш. Заметим, что некоторые инструкции с прямой адресацией в микропроцес-пах 80386—Pentium 4 имеют более длинный код — при добавлении префиксов р33мерности регистра и операнда.
И и регистровой косвенной адресации смещение данных в памяти задано значе-iieM базового (ВР или ВХ) или индексного регистра (DI или SI). В процессорах «0386— Pentium 4 для адресации данных в памяти используются также расширенные регистры ЕАХ, ЕВХ, ЕСХ, EDX, EBP, EDI и ESL
При базово-индексной адресации смещение данных в памяти определяется суммой значений базового и индексного регистров, указанных в команде. Этот метод адресации часто используется для доступа к элементам массивов. В процессорах 80386—Pentium 4 в качестве базового и индексного регистра может быть задан любой из 32-битных регистров, кроме EIP и ESP.
□	При регистровой косвенной адресации со смешением адрес данных в сегменте данных определяется суммой константы и содержимого базового или индексного регистра.
□	Базово-индексная адресация со смещением используется для доступа к двумерным массивам. Смещение данных определяется суммой константы и содержимого базового и индексного регистров.
□	Индексная адресация с масштабированием доступна только в процессорах 80386—Pentium 4. Примеры: инструкции mov ах,[евх+2*есх] и mov (4*ecxj,edx. Второй регистр (индексный) умножается на заданный масштабный коэффициент 2, 4 или 8, что используется при обработке массивов с 16-, 32- или 64-битными элементами.
О Структуры в языке ассемблера играют роль шаблонов для определения наборов данных. Элементы данных в наборе адресуются именем поля. Например, поле ten набора данных number обозначается number.ten.
□ □
0
tj
Прямая адресация памяти программ в инструкциях jmp и call позволяет передавать управление в любую точку адресного пространства, поскольку в коде команды задана информация о смещении и сегменте.
Относительная адресация памяти программ обеспечивает переход по произвольному смещению в текущем сегменте кода. В защищенном режиме процессоров 0386— Pentium 4 за счет использования 32-битного смещения дальность перехода в текущем сегменте кода достигает ±2 Гбайт.
При косвенной адресации памяти программ адрес перехода для команд jmp и Call задан содержимым регистра или косвенно адресуемого слова из сегмента Данных.
Нструкции push и pop предназначены для передачи 16-битных данных между еком и регистром или памятью. Инструкция push допускает также непосредст-Нные операнды. Команды pusha и рора предназначены для обмена данными ^Жду стеком и набором регисгров АХ, СХ, DX, ВХ, ВР, SP, SI и D1. В процессах 80386—Pentium 4 предусмотрены команды записи/чтения стека для расши-Ных регистров. Команда pushed предназначена для записи в стек копии ретива eflags, а команда pushf — для сохранения регистра flags.
152
Гпава 3
□	Программа в примере 3.15 демонстрирует многие из рассмотренных методов адресации. Программа заполняет массив arrayi значениями, прочитанными из ячеек в диапазоне адресов 0000:0000—0000:0009. Затем в массив array2 записываются значения, возрастающие от 0 до 9 с шагом 1. В завершение программа обменивает местами значения второго элемента arrayi и третьего элемента ARRAY2.
Пример 3.15. Примеры использования различных методов адресации данных
.MODEL SMALL	; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 000А [	ARRAYI DB 10 DUP (?)		; массив ARRAYI из 10 байт
	00	
J 000A 000A [	ARRAY2 DB 10 DUP (?)		; массив ARRAY2 из 10 байт
	00	
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 B8	0000	MOV AX,0	; ES = 0000Н
001A 8E	CO	MOV ES,AX	
001C BE	0000	MOV DI,0	; смещение элемента номер 0
COIF B9	000A	MOV CX,10	; счетчик = 10
0022	LABI:	
0022 26:	:8A 05	MOV AL,ES:[DI]	; копировать данные
0025 88	85 0000 R	MOV ARRAYI[DI],AL	; в ARRAYI
0029 47	INC DI	
002A E2	F6	LOOP LABI	
002C BF	0000	MOV DI,0	; смещение элемента номер 0
002F B9	000A	MOV CX,10	; счетчик = 10
0032 B0	00	MOV AL, 0	установить начальное значение
0034	LAB2:	
0034 88	85 000A R	MOV ARRAY2[DI),AL	; заполнить массив ARRAY2
0038 FE	CO	INC AL	
003A 47	INC DI	
003В E2	F7	LOOP LAB 2	
003D BF	0003	MOV DI,3	; обмен значений массивов
0040 8A	85 0000 R	MOV AL,ARRAYI[DI]	
0044 8A	A5 000B R	MOV AH,ARRAY2[DI + 1]	
0948 88	A5 0000 R	MOV ARRAYI[DI], AH	
004C 88	85 000B R	MOV ARRAY2[DI+1],AL	
.EXIT
END
выход в DOS
конец текста программы
Методы адресации У53
Контрольные вопросы
I.	Какие действия выполняют следующие инструкции:
a)	mov ах,вх
б)	MOV ВХ, АХ
в)	MOV BL,CH
Г) MOV ESP, EBP
Д) MOV AX,CS
2.	Перечислите 8-битные регистры, используемые при регистровой адресации.
3.	Перечислите 16-битные регистры, пригодные для регистровой адресации.
4.	Перечислите 32-битные регистры, используемые при регистровой адресации в процессорах 80386—Pentium 4.
5.	Перечислите 16-битные сегментные регистры, применяемые в командах mov, push и pop при регистровой адресации.
6.	Почему инструкция MOV BL,CX ошибочна?
7.	Почему инструкция MOV DS,SS недопустима?
8.	Запишите инструкции для выполнения следующих действий:
а)	скопировать ЕВХ в EDX
б)	скопировать BL в CL
в)	скопировать SI в ВХ
г)	скопировать DS в АХ
д)	скопировать AL в АН
9.	Запишите инструкции для выполнения следующих действий:
а)	записать 12Н в AL
б)	записать 123АН в АХ
в)	записать 0CDH в CL
г)	записать 1000Н в SI
д)	записать 1200А2Н в ЕВХ
10.	Каким символом обозначаются непосредственные данные в некоторых ассемблерах?
11.	Для чего предназначена директива .MODEL tiny?
12.	Какой директивой обозначается в языке ассемблера начало сегмента кода?
13.	Что такое метка?
14.	В каком поле оператора ассемблера записывается обозначение MOV?
15.	Какие символы допустимы в начале имени метки?
16.	Для чего предназначена директива .exit?
17.	В каком формате создается исполняемая программа при задании директивы .MODEL tiny?
18.	Какие действия задаст директива .startup, если применяется модель памяти small?
19.	Что означает термин "смещение"? Как определяется адрес данных в команде MOV [200СН], AL?
20.	Что означают квадратные скобки в программе на языке ассемблера?
21.	Предположим, что DS = 0200Н, ВХ = 0300Н, a DI = 400Н. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV AL, [1234Н]
б)	MOV ЕАХ,[ВХ]
В) MOV [DI],AL
154
Гпава 3
22.	Почему инструкция mov [ВХ], [di] ошибочна?
23.	Приведите пример инструкции, требующей применения директивы BYTE ptr.
24.	Приведите пример инструкции, требующей директивы word ptr.
25.	Приведите пример инструкции, требующей директивы DWORD PTR.
26.	В чем разница между командами MOV BX,DATA и MOV вх, OFFSET DATA?
27.	Предположим, что DS = ЮООН, SS = 2000H, BP = Ю00Н, a DI = 0I00H. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV AL,[BP+DI]
б)	MOV СХ, [DI]
В) MOV EDX, [BP]
28.	Ошибочна ли инструкция mov al, [BX] [si]?
29.	Предположим, что DS = 1200H, BX = 0100H, a SI = O25OH. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV [100H],DL
б)	MOV [SI + 100H],ЕАХ
В) MOV DL, [ВХ+100Н]
30.	Предположим, что DS = 1100Н, BX = 0200H, list - O25OH, a SI = 0500H. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV LIST[SI],EDX
6)	MOV CL,LIST[BX+SI]
B) MOV CH, [BX+SI]
31.	Предположим, что DS = 1300H, SS = 1400H, BP = I500H, a SI = 0I00H. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV ЕАХ, [ВР+200Н]
б)	MOV AL, [BP+SI-200H]
В) MOV AL, [SI-0100H]
32.	Какой базовый регистр адресует данные в сегменте стека?
33.	Предположим, что ЕАХ = 0000ЮООН, ЕВХ = 00002000Н, a DS = 00ЮН. По каким адресам обращаются к памяти следующие инструкции в реальном режиме?
a)	MOV ЕСХ, [ЕАХ+ЕВХ]
б)	MOV [ЕАХ+2*ЕВХ],CL
В) MOV DH, [ЕВХ+4*ЕАХ+1000Н]
34.	Запрограммируйте структуру данных FIELDS с полями Fl, F2, F3, F4 И F5.
35.	Как обозначить в программе адрес поля F3 структуры FIELDS?
36.	Какие методы адресации инструкций реализованы в процессорах 8086—Pentium 4?
37.	Сколько байт занимает машинный код дальней инструкции перехода? Какая информация хранится в каждом из них?
38.	Чем различаются внутрисегментный и межсегментный переходы?
39.	Какова дальность перехода при задании смешения 16-битным знаковым числом?
40.	Какова разрядность смешения, позволяющего перейти в любую точку текущего сегмента кода размером до 4 Гбайт (в процессорах 80386—Pentium 4)?
41.	Что означает дальний переход?
42.	Какая разновидность инструкции jmp не позволяет передать управление по адресу 200Н в текущем сегменте кода, если сама инструкция находится по адресу 100Н?
Методы адресации 155
43.	Какой вариант инструкции перехода (short, near или far) выберет ассемблер, если инструкция jmp THERE находится по адресу Ю000Н, а адрес THERE равен:
а)	Ю020Н
б)	П000Н
в)	0FFFEH
г)	30000Н
44.	Запишите инструкцию перехода для передачи управления по адресу, заданному содержимым регистра ВХ.
45.	Запишите инструкцию ближнего (near) перехода для передачи управления по адресу из таблицы адресов.
46.	Сколько байт записывает в стек инструкция push?
47.	Объясните действие инструкции push [DI).
48.	Какие регистры помешает в стек инструкция pusha и в каком порядке?
49.	Какие действия выполняет инструкция PUSHAD?
50.	Какая инструкция микропроцессора Pentium 4 записывает в стек значение регистра ЕFLAGS?
ГЛАВА 4
Инструкции передачи данных
Введение
В этой главе мы рассмотрим инструкции передачи данных. В эту группу инструкций входят команды MOV, movsx, movzx, push, pop, bswap, xchg, xlat, in, out, lea, lds, les, I.FS, LGS, LSS, LAHF И SAHF, 3 ТЗКЖе СТроКОВЫС ИНСТРУКЦИИ MOVS, LODS, STOS, INS 11 OUTS. В Pentium Pro—Pentium 4 также имеется инструкция условной передачи cmov. Мы начинаем изучение системы команд с инструкций передачи данных, поскольку они самые простые и чаще других используются при написании программ.
Программирование машинных команд выполняется, как правило, нс вручную, а на языке ассемблера — машинный язык слишком сложен. В этой главе мы начнем изучение синтаксиса ассемблера и ознакомимся с некоторыми директивами этого языка. Поскольку в книге рассматривается ассемблер MASM фирмы Microsoft, мы рекомендуем вам пользоваться при выполнении примеров именно этой реализацией ассемблера1. Конечно, вы можете воспользоваться и другими, похожими реализациями — например, ассемблерами ASM фирмы Intel или TASM фирмы Borland. Кстати, последняя версия TASM полностью совместима с MASM. Подробные сведения об ассемблере MASM, о компоновщике и среде Programmer's WorkBench приведены в Приложении /.
Темы главы
В этой главе мы рассмотрим:
□	действие инструкций передачи данных;
□	назначение директив языка ассемблера align, assume, db, dd, dw, end, ends, endp, EQU, .MODEL, OFFSET, ORG, PROC, PTR, SEGMENT, USE16, USE32 И USES;
П выбор инструкции передачи данных в различных ситуациях;
□	поля машинного кода;
□	оформление сегментов данных, стека и кода на языке ассемблера;
□	оформление процедур с использованием директив proc и endp;
□	разницу между моделью памяти и полными определениями сегментов в ассемблере MASM.
1 В этой книге используется MASM 6..v с директивами структурного ассемблера.
Инструкции передачи данных
157
4.1.	Инструкция MOV
Инструкция mov вам знакома — на ее примере в главе 3 рассмотрены методы адресации данных в процессорах 8086—Pentium 4. В этой главе мы обсудим построение машинного кода инструкций при разных методах адресации на примере команд mov. Знакомство с машинным кодом пригодится на тот случай, если вам придется исследовать результат работы транслятора. Вы сможете исправить исполняемый код при отладке с использованием DOS-утилиты DEBUG. Машинный код и правила его построения см. в Приложении 2.
Машинный язык
В машинном языке инструкции хранятся в двоичном коде, понятном процессору. Длина машинных инструкций для процессоров 8086—Pentium 4 варьируется в пределах I —!3 байт. Хотя машинный язык кажется весьма сложным и обширным2, в нем есть некая система.
Формат машинных инструкций для !6-битных процессоров 8086—80286 показан на рис. 4.1, а3. Этот формат совместим с процессорами 80386—Pentium 4 в 16-битном режиме, хотя для этих процессоров 16-битный код может быть расширен префиксами, изображенными на рис. 4.1, о пунктиром. В процессорах 80386 и выше 16-битный формат используется в реальном режиме. В защищенном режиме выбор между 16- и 32-битным режимом определяется значением бита D в старшем байте дескриптора. В 32-битном режиме функционируют такие операционные системы, как Windows ХР, Windows 95, Windows 98 и OS/2. 32-битный формат показан на рис. 4.1, б. Инструкции 32-битного формата могут применяться и в 16-битном режиме за счет специальных префиксов, которые мы рассмотрим далее в этой главе.
Формат 16-битных инструкций
Код операции (1 или 2 байта)	MOD-REG-R/M 0-1 байт	Смещение 0-1 байт	Непосредственное значение . 0-2 байт
а)
Формат 32-битных инструкций
Размерность адреса 0-1 байт
Размерность операнда 0-1 байт
Код операции MOD-REG-R/M (1 или 2 байта) 0-1 байт
Масштаб-индекс-база 0-1 байт
Смещение 0-4 байт	Непосредственное значение 0-4 байт
б)
Рис. 4.1. Форматы машинных инструкций 8086—Pentium 4: а) 16-битный; б) 32-битный
Первые два байта в 32-битном формате — это префиксы модификации размерности; их наличие в команде не обязательно. Первый префикс модифицирует размерность адреса операнда, второй — размерность регистра. Если процессор 80386—Pentium II работает в 16-битном режиме (что возможно в реальном и в защищенном режиме), и в команде используется 32-битный регистр, то в начале команды ставится префикс
2 Количество вариантов кода превышает 100 000.
3 В дальнейшем этот формат называется 16-битным. Число 16 в данном случае нс относился к длине машинного кода, а связано только с разрядностью операций. — Пер.
158
Гпава 4
модификации размерности регистра — байт со значением 66Н. Если режим инструкций 32-битный (что возможно только в защищенном режиме работы процессора), и используется 32-битный регистр, то префикс модификации размерности регистра не ставится. В 32-битном режиме инструкций префикс должен быть указан, если нужен доступ к 16-битному регистру. Префикс модификации размерности адреса операнда (байт со значением 67Н) используется аналогичным образом Префиксы модификации размерности переключают разрядность адреса или регистра для одной инструкции между 16 и 32 битами. По умолчанию в 16-битном режиме используются 8- и 16-битные регистры и смещения, а в 32-битном режиме — 8- и 32-битные регистры и смещения. Рассмотренные префиксы временно изменяют разрядность по умолчанию, что позволяет обращаться к 32-битному регистру в 16-битном режиме, а к 16-битному регистру — в 32-битном режиме. Выбор между 16- и 32-битными режимами определяется разрядностью данных, с которыми работает программа. Обычно выбор разрядности возлагается на операционную систему. (Операционная система DOS функционирует только в 16-битном режиме.)
Код операции
Код операции (opcode) определяет выполняемой тип операции (сложение, вычитание, копирование и т. д.). Код операции занимает один или два байта в начале машинной инструкции. Формат первого байта кода операции для большинства инструкций показан на рис. 4.2. Первые шесть бит — двоичный код операции. Бит D задает направление (не путайте с флагом D, который определяет увеличение или уменьшение указателей при выполнении строковых команд), бит W — размерность операции (байт или слово). Установка бита W = 1 в процессорах 80386—Pentium 4 может означать или слово, или двойное слово; выбор между ними зависит от текущего режима инструкций (16- или 32-битный) и наличия префикса модификации размерности операнда (66Н).
MOD
REG
Код операции
Рис. 4.2. Первый байт кода операции
Рис. 4.3. Второй байт кода операции
Местоположение источника и приемника данных закодировано в полях REG и R/M — во втором байте машинного кода. Если бит направления D установлен в 1, то местоположение источника определяется полем R/М. а местоположение приемника — полем REG. Если бит D = 0, то направление передачи противоположное: в этом случае поле REG задает источник, а поле R/M — приемник. При W = 0 размерность данных — байт, а при W = I — слово или двойное слово. Бит W присутствует в большинстве инструкции, а бит D — в основном, в командах mov. Формат второго байта кода операции для большинства инструкций показан на рис. 4.3. Этот байт — reg-mod-r/m — содержит поля MOD (режим), REG (регистр) и R/М (ре* гистр/память).
Инструкции передачи данных 159
Поле MOD
Поле MOD определяет метод адресации и, в частности, наличие константного смещения при адресации памяти. Коды поля MOD для 16-битного режима приведены в табл. 4.1. Код 11 означает регистровую адресацию; код регистра записан в поле R/М. При MOD =00, 01 и 10 поле R/М задает метод адресации памяти. Значение MOD = 00 говорит о том, что при адресации памяти постоянное смещение не используется. При MOD = 01 и 10 смещение имеется и задано знаковым байтом (MOD = 01) или словом (MOD = 10). Например, адрес данных в памяти для команды mov al, [di] задан без смещения, в инструкции mov al, [di+2] используется S-битное смещение (+2), в команде mov al, [di+ioooh] — 16-битное (+1000Н).
Таблица 4.1. Коды поля MOD в 16-битном режиме
Код поля MOD	Значение
00	Смещение отсутствует
01	Смещение задано знаковым байтом
10	Смещение 16-битное
11	Поле R/М содержит код регистра
Смещение, заданное в команде 8-битным значением, при выполнении инструкции расширяется до 16-битной величины, с учетом знака. Положительное 8-битное смещен е (ООН—7FH) преобразуется в 16-битное положительное значение в пределах 0000Н—007FH. Отрицательное 8-битное смещение (80Н—FFH) преобразуется в 16-битное отрицательное число в диапазоне FF80H—FFFFH. При знаковом расширении старший бит исходного байта копируется в старший байт результата, т. е. старший байт получает значение ООН или FFH.
Значения поля MOD в 32-битном режиме микропроцессоров 80386—Pentium 4 приведены в табл. 4.2. Смысл значений поля MOD для 16- и 32-битного режимов различен только для одного значения — MOD = 10. Код 10 для 16-битного режима определяет 16-битное смещение, а для 32-битного режима — 32-битное. Напомним, что процессоры 80386—Pentium 4 используют в 32-битном режиме 8- или 32-битное смещение, если не задан префикс модификации адреса операнда. Если смещение задано 8-битным значением, то при формировании адреса оно расширяется до 32 бит, с учетом знака.
Таблица 4.2. Коды поля MOD в 32-битном режиме (только для процессоров 80386—Pentium 4)
Код поля MOD	Значение
00	Смещение отсутствует
• 01	Смещение задано знаковым байтом
10	Смещение 32-битное
11	Поле R/М содержит код регистра
160	Гпава 4
Коды регистров
В табл. 4.3 приведены значения кодов полей REG и R/М при MOD = Н, в зависимости от размерности операнда.
Таблица 4.3. Коды REG и R/М (при MOD = 11)
Код	w= 0 (байт)	w= 1 (слово)	w= 1 (двойное слово)
000	AL	АХ	ЕАХ
001	CL	СХ	ЕСХ
010	DL	DX	EDX
011	BL	ВХ	ЕВХ
100	АН	SP	ESP
101	СН	ВР	ЕВР
110	DH	SI	ESI
111	ВН	DI	EDI
Разберем, например, машинный код 8ВЕСН. Первый байт не равен ни 67Н (пре-, фикс модификации размерности адреса), ни 66Н (префикс модификации размерив сти регистра) — значит, в первом байте находится код операции. Значения полА 16-битной инструкции с кодом 8ВЕСН показаны на рис. 4.4. Код операции равен 100010. Из Приложения 2 выясняем, что это код инструкции mov. Поскольку биты О и W установлены в 1, то задана операция над словами, приемником является регистр, а код регистра задан полем REG. Значение REG =101 соответствует регистру ВР. Поскольку MOD = 11, в поле R/М задан код второго регистра — источника. Код R/M = 100 обозначает регистр SP. Таким образом, машинный код 8ВЕСН соответствует инструкции MOV BP,SP.
Код операции	D W	MOD	REG	R/M
1 ! 0 [ °	° j 1	0	1	1
1	1	1	0 I 1	1 । 0	0
Код операции = MOV
D = Передача в регистр REG W = Слово
MOD = R/M задает регистр REG = ВР R/M = SP
Рис. 4.4. Машинный код 8ВЕСН (инструкция MOV ВР, SP)
Рассмотрим код 668ВЕ8Н применительно к процессорам 80386 и выше. Пред подо* жим, что процессор работает в 16-битном режиме. Первый байт машинного КОД* имеет значение 66Н — это префикс модификации размерности регистра. Таким оо* разом, в этой команде используются 32-битные операнды. Далее выясняется, код операции соответствует команде mov, источником является регистр ЕАХ, а пр11
Инструкции передачи данных 161
смником — ЕВР. То есть, код 668ВЕ8Н в 16-битном режиме задает инструкцию
v евр,еах. В 32-битном режиме тот же код, с учетом префикса 66Н, соответствует команде mov вр,ах. Подстановка префиксов, модифицирующих размерность адреса и регистра, выполняется ассемблером автоматически — под управлением директив, определяющих текущий режим инструкций (16- пли 32-битный). Напомним, что директива .386, поставленная перед оператором .model, определяет 32-битный режим; если же она указана после оператора .model, то режим — 16-битный.
Коды поля R/M при адресации памяти
Кодировка поля R/M при MOD = 00, 01 и 10 приведена в табл. 4.4. Коды MOD = 00, 01 и 10 задают адресацию памяти. Каким образом, это выяснится в следующем разделе, код R/M = ПО неоднозначен.
Таблица 4.4. Коды R/M при адресации памяти в 16-битном режиме
Код поля R/M	Метод адресации	Код поля R/M	Метод адресации
000	DS:[BX+SI]	100	DS:[SI]
001	DS:[BX+DI]	101	DS:[DI]
010	SS:[BP+SI]	110	SS:[ВР]
011	SS:[BP+DI]	111	DS:[ВХ]
В гибл. 4.4 приведены все варианты 16-битной косвенной адресации, рассмотренные в г.шве 3. Наличие и разрядность константного смещения определяется полем MOD. Если MOD = 00 и R/M = 101, то операнд — [di]. Если MOD = 01 или 10, то операнд адресуется суммой DI и константы смещения, например, [dh-ззн] или LIST [DI+22H] И Т. П.
Код операции	D W	MOD*	REG	R/M
i	I	I 1	0	I	0	I	0 		I	I		1 I		0	1	0
0	0	i i 0 I 1 i о ! I	1	0 I 1 i
Код операции = MOV
D = Передача в регистр REG
W = Байт
MOD = Нет смещения
REG = DL
R/M = DS:[DI]
Рис. 4.5. Инструкция MOV DL, [Di] в машинном представлении
На рис. 4.5 показаны значения полей 16-битной инструкции mov dl, [di]. Машинный код составляет два байта, значение — 8А15Н. Код операции равен 100010, бит D = I (приемник задан полем REG, а источник — полем R/M), бит W - 0 (операция байтовая), поле MOD = 00 (смещение отсутствует), REG = 010 (регистр — DL) и R/M =101 (адресация — [di]). Если изменить инструкцию на mov dl, [dt+ij, то в Первой паре байт машинного кода изменится только поле MOD — оно примет зна-Пение 01 (смещение — 8-битное). Код станет трехбайтным (8А5501Н); последний
Зак 384
162
Гпава 4
байт содержит 8-битное смещение. Команда mov dl, [di+ioooh] кодируется уже четырьмя байтами (8A7500I0H); последние два содержат 16-битное смещение ЮООН.
Кодирование прямой адресации
Прямая адресация памяти (адрес задан константой смещения) кодируется особым образом. Этот метод адресации в табл. 4.2—4.4 не указан. Примеры инструкций с прямой адресацией: mov [Ioooh],dl и mov humb,dl. Первая инструкция передает содержимое регистра DL в сегмент данных по смещению ЮООН, а вторая копирует регистр DL в сегмент данных по смещению numb.
MOD
REG
R/M
Байт 2
Код операции	О W
о о о о	0	0
Байт 1
Смещение (младший байт)
,	i	I	!
0l0*0	0|0|0l0	0
' i I I	I	i	I
Байт 3
Смещение (старший байт)
—'------|--------Г~~!-----------j—
О I О I О 1 ! О ' О ! О ’ О
I ।	 I I i,
Байт 4
Код операции = MOV
D = Передача из регистра REG W = Байт
MOD = Прямая адресация
REG = DL
R/M = DS:[BP]
Смещение = ЮООН
Рис. 4.6. Инструкция MOV [ЮООН], DLс прямой адресацией
Код операции
Байт 1
8-битное смещение
MOD	REG	R/M
т	0	’!0	1	1 ! о ।
Байт 2
Байт 3
Код операции = MOV
D = Передача из регистра REG
W = Байт
MOD = Адресация [ВР+смещение]
REG = DL
R/M = DS:[BP] Смещение = ООН
Рис. 4.7. Машинный код инструкции MOV [BP], DL
Инструкции передачи данных 163
Прямая адресация определяется сочетанием MOD = 00 и R/M = ПО. Эта комбинация полей MOD и R/М, согласно табл. 4.2 и 4.4, была предназначена для кодирования косвенной адресации через регистр ВР без смещения — [вр] . Но сочетанию MOD = 00 и R/M = ПО придан совершенно другой смысл — оно обозначает прямую адресацию; при этом косвенная адресация без смещения через регистр ВР исключена вообще. При трансляции ассемблер заменяет [вр] на [вр+0] с 8-битным смещением (MOD = 01).
На рис. 4.6 показаны поля машинного кода команды mov [1000H],dl, а на рис. 4.7 — инструкция mov [bp],dl. Обратите внимание, что инструкция mov [bp],dl кодируется тремя байтами; последний байт содержит смещение ООН.
32-битная адресация
Процессоры 80386 и выше применяют 32-битную адресацию либо в режиме 32-битных инструкций, либо при выполнении 16-битной инструкции с префиксом модификации размерности адреса (67Н). Коды поля R/М для 32-битной адресации приведены в табл. 4.5. Заметим, что R/M =101 обозначает также прямую адресацию. Обратите внимание, что при R/M = 100 в коде инструкции появляется дополнительный байт масштаб-индекс-база4. Этот байт используется, когда в формировании смещения участвуют два регистра. Максимальное число комбинаций кодов при добавлении байта масштаб-индекс-база к байту кода операции составляет 215, или 32 К. Команда mov в 80386—Pentium 4 кодируется более чем 32000 сочетаниями кодов.
Таблица 4.5. Коды поля R/М при 32-6итной адресации
Код поля R/M	Метод адресации
000	DS:(ЕАХ)
001	DS:[ЕСХ[
010	DS:[EDX]	•*
011	DS:[EBX] •
100	Базово-индексная адресация с масштабированием
101	SS:[ЕВР]
110	DS:[ESI]
111	DS:[EDI]
Формат байта масштаб-индекс-база показан на рис. 4.8. Следует напомнить, что этот байт добавляется к байту кода операции, если адресация 32-битная и R/M = 100. Два бита слева определяют масштабный коэффициент — 1, 2, 4 или 8. При базово-индексной адресации через 32-битные регистры по умолчанию используется масштабный коэффициент 1. В поле Index указывается код 32-битного индексного регистра; в поле Base — код 32-битного базового регистра. Коды регистров приведены в крайнем правом столбце табл. 4.3.
4 Обозначается аббревиатурой SIB (Scale-Indcx-Base). — Пер.
164
Глава^
База
Масштаб Индекс
Г 00 = х 1
м с 01=х2
Масштаб-! 10 = х4
. 11 =х8
Рис. 4.8. Формат байта масштаб-индекс-база
Ф
Ф
Инструкция mov eax, [евх+4*есх] кодируется как 67668В048ВН. В этом коде задан] префиксы модификации размерности адреса (67Н) и регистра (66Н) — предполагя ется, что микропроцессор работает в 16-битном режиме. В 32-битном режиме инея рукция mov еах, [евх+4*есх] кодируется без префиксов, как 8В048ВН. Напомню, Ч1 адресация с масштабированием может применяться и для одного регистра, как, q пример, в команде mov al, [2*есх], которая задает копирование в регистр AL байА расположенного в сегменте данных по смещению удвоенного значения региста ЕСХ.	]
Непосредственный операнд	>
Пример непосредственного операнда — команда mov word ptr [вх+юоон] , 1234Н. Э* инструкция копирует непосредственное значение 1234Н в сегмент данных по см! тению ЮООН 4- ВХ. В 16-битном режиме эта команда кодируется шестью байтай! как показано па рис. 4.9. Первые два байта содержат код операции, бит W и пен
Смещение (младший байт)
MOD	R/M х
| !
1 I 0	0 : 0 ] 0	1
i __________!_______________
Байт 2
о о
Смещение (старший байт)
1	! 0 | 0 j 0	1 	!	;	i		I	i	I 0	I	0	|	0	I	0 	i	!	i
Байт 4
О I о ! о о !
Байт 3
Код операции = MOV (непосредственная адресация)	! 1
W = Слово	j
MOD = 16-битное смещение REG = ООО R/M = DS:[BX] Смещение = ЮООН Данные = 1234Н
Рис. 4.9. Код инструкции MOV WORD PTR [ВХ+ЮООН] , 1234Н
Инструкции передачи данных 165
>101) и R/M. В следующих двух байтах задана константа смещения (IOOOH), а в победней паре байт — непосредственный операнд 1234Н.
11ри записи этой команды на языке ассемблера применена директива word ptr. Она уведомляет транслятор о том, что в инструкции задан указатель на слово. Чтобы записать непосредственное значение в байт памяти, следует вместо word ptr задать директиву byte ptr. При использовании 32-битного непосредственного операнда указывается директива dword ptr. Заметим, что директивы byte ptr, word ptr и , ?rd ptr нужны не во всех случаях, когда требуется обращение к данным в памяти. Они необходимы лишь тогда, когда размерность операнда неопределима. Например, команда mov (bx],al является байтовой, что следует из размерности AL. Напротив, размерность данных инструкции mov (вх],1 неизвестна — здесь операнды могут быть байтами, словами или двойными словами. Такая команда считается ошибочной, ассемблер ее не пропустит. В данной ситуации следует уточнить размерность операндов, записав команду в виде mov byte ptr [вх], 1, или mov word ptr [bx],i, n/lll MOV DWORD PTR [BX],1.
Коды сегментных регистров
Коды сегментных регистров в поле REG, используемые при копировании сегментною регистра в командах mov, push и pop, приведены в табл. 4.6. Замечание по поводу регистра CS: команды mov cs,r/m(16) и pop cs не поддерживаются микропроцессором.
Таблица 4.6. Кодировка сегментных регистров
Код	Сегментный регистр	Код	Сегментный регистр
ООО	ES	011	DS
001	CS	100	FS
010	SS	101	GS
Код операции
1	0	0	0	1	1	0	0
Код операции = MOV
MOD = R/M обозначает регистр
REG = CS
R/M = [ВХ]
MOD	REG	R/M
Рис. 4.10. Машинный код инструкции MOV ВХ, CS
Na рис. 4.IO показан машинный код инструкции mov bx,cs. Код операции для этого T,iiia инструкции mov отличается от кодов в предыдущих примерах. Допускается об-Х|сц данными между сегментным регистром и любым 16-битным регистром или памятью. Например, команда mov [di],ds записывает содержимое регистра DS в сегмент данных по смещению, заданному регистром D1. Непосредственный операнд йрн обмене данными с сегментным регистром не допускается. Для загрузки в сег
166	Глава
ментный регистр непосредственного значения следует скопировать число в 16-бит, ный регистр общего назначения, а из него — в сегментный регистр.
Хотя мы рассмотрели правила построения машинных кодов не полностью, вы поду,; чили общее представление о машинном языке, которого вполне достаточно для про^ граммирования на ассемблере. Напомним, что при использовании символическое языка ассемблера необходимость в составлении кодов машинного языка возникает крайне редко, поскольку транслятор с языка ассемблера выполняет эту задачу за вас.
4.2.	Инструкции для работы со стеком —
PUSHw POP
Инструкции push и pop предназначены для доступа к стеку. В микропроцессору 8086—Pentium 4 предусмотрено шесть форм инструкций push и pop для следующие операндов: регистр, данные в памяти, непосредственное значение, сегментный регистр, регистр флагов, а также набор регистров общего назначения как целое. Команды push и pop с непосредственным операндом, а также инструкции pusha и рора, предназначенные для сохранения и восстановления всех регистров общего назначения, доступны только в процессорах 80286—Pentium 4.
При регистровой адресации в командах push и pop может быть указан любой 16-битный регистр. В процессорах 80386—Pentium 4 также допустимы команды push и pop для 32-битных регистров, включая eflags5. В качестве операнда команд push и pop может быть задано также 16- или 32-битное слово в памяти (32-битное слово — в процессорах 80386—Pentium 4). Непосредственное значение может быть указано при записи в стек командой push, но в команде pop недопустимо. Ограничение при использовании сегментных регистров следующее: имеется возможность записать в стек копию CS, но обратная операция — запись в CS из стека — запрещена. Ио пользование регистров общего назначения и регистра флагов в командах push и pop не ограничено ничем — любой из них может быть указан в качестве источника команд push и приемника команды pop.
Инструкция PUSH
Инструкция push в процессорах 8086—80286 всегда передаст в стек два байта данных* В процессорах 80386 и выше она пересылает или два, или четыре байта, в зависимости от размерности операнда. Операндом команды push может быть любой внутренний 16- или 32-битный регистр, непосредственные данные, любой сегментный ре* гистр или двухбайтовое слово в памяти. Имеется специальная инструкция pusHA (push all), которая копирует в стек полный набор внутренних регистров, кроме сегментных регистров. Порядок копирования следующий: АХ, СХ, DX, ВХ, SP, ВР, Si и DI. Причем значение SP записывается в стек таким, каким оно было до выполнения команды pusha. Команда pushf (push flags) копирует в стек содержимое регистр*
5 Для сохранения и восстановления флагов предусмотрены команды PUSHF/POPF (для 16-битного регистра FLAGS) и PUSHFD/POPFD (для 32-битного регистра EFLAGS). — Пер.
инструкции передачи данных 167
фюгов. Команды pushad и popad сохраняют и восстанавливают значения набора 32-5И।пых регистров, имеющихся в процессорах 80386— Pentium 4.
ррп записи в стек первый байт (наиболее значимый) сохраняется по адресу SP — I. jpopoii (наименее значимый) байт записывается по адресу SP - 2. Затем содержите регистра SP уменьшается на 2. Аналогичным образом выполняется запись в сТек двойного слова, только значение SP уменьшается не на 2, а на 4. На рис. 4.Н показано действие инструкции push ах. Запись регистра АХ в стек выполняется следующим образом: SS:|SP - I] = АН, SS:[SP - 2| = AL, после чего SP = SP - 2.
Рис. 4.11. Воздействие инструкции PUSH АК.на регистр ESP и на данные в стеке по адресам 37FFH и 37FEH
Команда pusha сохраняет в стеке все внутренние 16-битные регистры, как показано на рис. 4.12. Для сохранения восьми регистров ей требуется 16 байт стека. После копирования регистров содержимое SP уменьшается на 16. Команда pusha процессора 80286 очень удобна в тех случаях, когда необходимо полностью сохранить кон-*екст текущей задачи. Команда процессора 80386 pushad выполняет аналогичные действия в отношении 32-битных регистров, сохраняя их в 32 байтах стека.
Инструкция push с непосредственным операндом записывает в стек 16-битное значение. Команда pushd с непосредственным операндом помещает в стек 32-битное значение. Если непосредственный операнд находится в диапазоне ООН—FFH, то код °нерации push равен 6АН; если же число попадает в диапазон 0100Н—FFFFH, то к°д операции — 68Н. Например, команда push 8 в машинном коде представлена как 6Д08Н, a push 1000Н — как 680010Н. Еще один пример команды push с непосредственным операндом — инструкция push 'а', которая записывает в стек ASCII-код Отпиской буквы А — число 0041Н.
табл. 4.7 приведены варианты инструкции push, включая pusha и pushf.
168
Гпава 4
Таблица 4.7. Инструкции push
Вариант инструкции	Пример	Операнды
PUSH reg16	PUSH BX	16-битный регистр
PUSH reg32	PUSH EDX	32-битный регистр
PUSH meml6	PUSH WORD PTR [BX]	16-битный указатель
PUSH mem32	PUSH DWORD PTR [EBX]	32-битный указатель
PUSH seg	PUSH DS	Сегментный регистр
PUSH imm8	PUSH ', '	8-битное непосредственное значение
PUSHW iirunl6	PUSHW 1000H	16-битное непосредственное значение
PUSHD iinin32	PUSHD 20	32-битное непосредственное значение
PUSHA	PUSHA	Все 16-битные регистры
PUSHAD	PUSHAD	Все 32-битн’ые регистры
PUSHF	PUSHF	Флаги
PUSHED	PUSHFD	Регистр EFLAGS
Инструкция POP
Инструкция pop противоположна push — эта команда извлекает данные из стека и помешает их либо в 16-битный регистр, в том числе сегментный, или в 16-битное слово в памяти. В процессорах 80386—Pentium 4 команда pop может оперировать также с 32-битными данными; также допускается 32-битная адресация данных в памяти. Непосредственный операнд в инструкции pop недопустим. Команда popf (Pop Flags) помешает 16-битное значение из стека в регистр флагов; команда popfd выполняет аналогичное действие с 32-битным регистром eflags. Инструкция рора (Pop АП) извлекает из стека 16 байт, копируя их в регистры общего назначения DI, SI, BP, SP, ВХ, DX, СХ и АХ (в таком порядке). Последовательность чтения, как видите, обратна порядку записи регистров в стек при выполнении команды pusha. Для сохранения/восстановления набора 32-битных регистров в процессорах 80386— Pentium 4 имеются команды pushad/popad.
Инструкции передачи данных
169
Рис. 4.13 иллюстрирует выполнение инструкции pop вх. Эта команда извлекает из стека 16-битное значение и записывает его в регистр вх. Происходит это следующим образом. Первый байт, расположенный в сегменте стека по адресу SP, передается в регистр BL. Затем второй байт, по адресу SP + 1, копируется в регистр ВН. После этого значение регистра SP увеличивается на 2.
Варианты инструкции pop приведены в табл. 4.8. Следует отметить, что команда : op cs микропроцессорами Intel не поддерживается — запись в регистр CS без одновременного изменения IP лишена смысла.
Таблица 4.8. Разновидности инструкции pop
Вариант инструкции	Пример	Операнды
POP reg16	POP ex	16-битный регистр
POP reg32	POP EBP	32-битный регистр
POP meml6	POP WORD PTR[BX+1]	16-битное косвенно адресуемое слово в памяти
POP mem32	POP DATA3	32-битное слово в памяти
POP seg	POP FS	Сегментный регистр
POPA	POPA	Все 16-битные регистры
POPAD	POPAD	Все 32-битные регистры
POPF	POPF	Флаги
POPFD	POPFD	Регистр EFLAGS
170
Гпава 4
Инициализация стека
Для инициализации стека требуется установить значения регистров стекового сегмента (SS) н указателя стека (SP). В SS загружается сегментный адрес начала (дна) стека.
Например, если для стека зарезервирована память размером 64 Кбайт по адресам Ю000Н —1FFFFH, то в SS следует загрузить число ЮООН. Напомню, что в реальном режиме абсолютный адрес получается из адреса сегмента добавлением ОН справа. Чтобы установить указатель стека на вершину этой области, в регистр SP следует записать число 0000Н. Если бы верхняя граница стека проходила по адресу 10FFFH, то в SP следовало бы загрузить ЮООН. Выполнение первой после инициализации стека команды push показано на рис. 4.14. Как видите, сегменты цикличны — вершина сегмента примыкает к началу сегмента.
Рис. 4.14. Иллюстрация цикличности стека (стек до выполнения команды push сх)
На языке ассемблера установка сегмента стека программируется так, как это показано в примере 4.1. Первый оператор определяет начало сегмента стека, а последний — его конец. В результате трансляции и компоновки определяются два значения: сегментный адрес стека6 — для записи в регистр SS — и длина стека — для записи в SP. Заметим, что программировать инструкции для установки значений SS и SP не требуется.
h В результате компоновки вычисляется относительный сегментный адрес стека, отсчитываемый от начала загрузочного модуля. Абсолютное значение для записи в SS определяется лишь при загрузке программы, когда становится известен абсолютный адрес выделенного нро1раммс блока памяти. — Пер.
Инструкции передачи данных
171
I Пример 4.1. Задание стека в программе на языке ассемблера
0000	STACK-SEG SEGMENT STACK
0000 0100 [	DW 100Н DUP (?)
???? ) 0200	STACK SEG ENDS
При использовании ассемблера MASM стек может быть определен иначе. В примере 4.2 приведен листинг программы задания стека в стиле MASM — посредством директивы .stack, в которой указана емкость стека в байтах (полный список директив MASM см. в Приложении /). Приведенный пример аналогичен заданию стека в предыдущем случае.
i Пример 4.2. Задание стека посредством директивы .stack
.MODEL SMALL
.STACK 200H	/установить размер стека
Если стек не определен никаким из указанных способов, то при компоновке будет выдано предупреждение. Его можно проигнорировать, если требуемый размер стека не больше 128 байт. Стек такого объема распределяется системой автоматически (при работе в DOS) — в области префикса программного сегмента (Program Segment Prefix — PSP), находящегося в начале блока памяти, выделяемого программе при загрузке. Если вы используете стек большего размера, то при выполнении программы будет стерта часть PSP с информацией, существенной для выполнения программы. Заметим, что при использовании модели TINY указатель стека автоматически устанавливается на последний байт сегмента программы, что обеспечивает более протяженный стек7 В.
4.3.	Загрузка адреса
В системе команд микропроцессора имеются специальные инструкции для загрузки адреса. Команда lea загружает в 16-битный регистр (первый операнд — приемник) эффективный адрес (смещение) второго операнда (источника), определяемый в соответствии с использованным методом адресации. Команды lds/les копируют в указанный 16-битный регистр и в регистр ds/es значение двойного слова из памяти. В процессорах 80386—Pentium 4 имеются аналогичные команды lfs, lgs и lss; кроме того, первым операндом может быть указан не только 16-битный, но и 32-битный регистр. Разновидности инструкций загрузки адреса показаны в табл. 4.9.
7 При за груз кс СОМ-файла программе всегда выделяется ровно 64 Кбайт памяти. Содержимое СОМ-файла переписывается в этот блок памяти со смещением 100Н. Сегментный адрес начала блока автоматически записывается в CS, SS, DS и ES; регистр SP получает значение 0FFFFH.
В итоге, код и данные находятся "внизу" (начиная со смещения 100Н), а стек "растет" им навстречу — "вниз" с самого "верха" (со смещения 0FFFFH). — Пер.
V72
Гпава 4
	Таблица 4.9. Инструкции загрузки адреса
Инструкция	Действие
LEA АХ,NUMB	Загрузка в АХ адреса numb
LEA ЕАХ,NUMB	Загрузка в ЕАХ адреса numb
LDS DI,LIST	Загрузка в DS и DI 32-битного содержимого сегмента данных по смещению LIST
LDS EDI,LIST	Загрузка в DS и EDI 48-битного содержимого сегмента данных по смещению LIST
LES BX,CAT	Загрузка в ES и ВХ 32-битного содержимого сегмента данных по смещению CAT
LFS DI,DATAI	Загрузка в FS и DI 32-битного содержимого сегмента данных по смещению DATA1
LGS SI,DATA5	Загрузка в GS и SI 32-битного содержимого сегмента данных по смещению DATA5
LSS SP,MEM	Загрузка в SS и SP 32-битного слова из сегмента данных по смещению мем
Инструкция LEA
Инструкция lea загружает в 16- или 32-битпый регистр смещение данных в памяти. Например, команда в первой строке табл. 4.9 записывает в регистр АХ адрес numb, а не содержимое numb — в этом и заключается отличие команды lea от команды mov. Например, команда lea вх, [di] загружает в регистр вх смещение данных, адресуемых регистром di (т. е. в вх копируется значение регистра di); напротив, команда mov вх., [di] записывает в вх слово, расположенное в сегменте данных по смещению [DIJ.
В предыдущих примерах мы воспользовались директивой offset. Действие этой директивы аналогично действию команды lea. Например, команда mov вх, offset list равносильна команде lea bx,list. Обе инструкции записывают в вх смещение list. Заметим, что длина этих инструкций тоже одинакова — 3 байта. В примере 4.3 показан вариант использования команды lea. При помощи этой команды в регистр S1 записывается адрес datai, а в DI — адрес data2; затем выполняется обмен данными.
Листинг 4.3. Пример использования инструкции LEA
	.MODEL SMALL	; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 2000 DATA1	DW 2000H	; определение слова DATA1
0002 3000 DATA2	DW 3000H	; определение слова DATA2
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 BE 0000 R	LEA SI,DATAI	; адрес DATA1 - в SI
001А BF 0002 R	MOV DI,OFFSET DATA2	; адрес DATA2 - в DI
001D 8В 1С	MOV ВХ,[SI]	; обмен значений DATA1 и DATA2
Инструкции передачи данных
173
001Г 8В 0D
0021 89 ОС
Э023 89 1D
MOV
MOV
MOV
СХ,[DI] (SI],CX [DI],BX
.EXIT
END
; выход в DOS
; конец исходного текста
Зачем понадобилась инструкция lea, если директива offset выполняет ту же функцию? Во-первых, директива offset применима только к простым операндам вроде list. Ее нельзя использовать при косвенной адресации, например, для операндов ;di], list [si] и т. п. Во-вторых, директива offset, когда ее можно применить, оказывается более эффективной. То есть инструкция lea bx,list выполняется дольше, чем команда mov вх,offset list. Например, микропроцессор 80486 затрачивает на выполнение lea bx,list два такта, в то время как инструкция mov вх,offset list требует всего лишь одного. Причина в том, что смещение для инструкции mov вх, offset list вычисляется заранее, при трансляции (смещение подставляется в виде непосредственного операнда). Напротив, для команды lea смешение операнда вычисляется при выполнении самой команды.
Предположим, что микропроцессор выполняет инструкцию lea вх, [di]. Поскольку смещение задано регистром di, микропроцессор передает в вх копию dt. Команда mov вх, di выполняет ту же задачу за более короткое время и поэтому более предпочтительна.
Еще один пример — команда lea si, [bx+di] . Эта инструкция складывает содержимое регистров ВХ и DI по модулю 64К и сохраняет сумму в регистре S1. Например, если ВХ = 1000Н, a DI = 2000Н, то в SI записывается число 3000Н. Если при том же значении ВХ регистр DI = FF00H, то в SI запишется 0F00H, а не 10F00H — поскольку сложение выполняется по модулю 64 К, и перенос за пределы 16-битной разрядной сетки игнорируется.
Инструкции LDS, LES, LFS, LGS и LSS
Команды lds, les, lfs, lgs и lss загружают в произвольный 16- или 32-битный регистр смещение, а в соответствующий сегментный регистр DS, ES, FS, GS или SS — сегментный адрес. В этих командах применимы любые методы адресации, обеспечивающие доступ к 32- или 48-битной области памяти, где хранятся значения составляющих адреса — сегмента и смещения. 32-битная область используется при 16-битном смещении, а 48-битная — при 32-битном смещении (значение сегмента — всегда 16-битное). Регистровый метод адресации (MOD = 11) здесь нс применяется. Использование 32-битных регистров и команд lfs, lgs и lss возможно только в процессорах 80386 и выше.
Команды lds, les, lfs, lgs и lss позволяют загрузить новое значение дальнего указателя на данные, находящиеся в памяти. На рис. 4.15 показан пример выполнения команды lds вх, [Di]. Эта инструкция передает 32-битное число, находящееся в сегменте данных по смещению D1, в пару регистров ВХ и DS. Смещение хранится в младшем слове, а адрес сегмента — в старшем слове двойного слова [di]. То есть в регистр ВХ записываются данные из ячеек 11000Н и 11001Н (число 127АН), а в регистр DS — данные из ячеек 11002Н и 11003Н (число 3000Н).
174
Гпава 4
Для формирования в памяти данных со значением дальнего указателя используется директива dd. Например, оператор addr dd far ptr frog резервирует двойное слово со значениями смещения и адреса сегмента объекта frog; это двойное слово обозначается именем addr.
Инструкция lds евх, [Di] в процессорах 80386—Pentium 4 загружает в регистр евх смещение из двойного слова, расположенного в сегменте данных по адресу, указанному в регистре DI. За этим двойным словом находится 16-битное слово, значение которого записывается в регистр DS. Таким образом, при указании 32-битного регистра загрузка происходит из 48-битной области памяти. Первые 4 байта содержат смещение для записи в 32-битный регистр, а последние два байта — сегментный адрес.
Среди инструкций загрузки дальнего указателя следует отметить весьма удобную команду lss. В примере 4.4 приведен листинг программы, которая создает новый стек, предварительно сохранив настройки исходного стека. После выполнения нескольких команд прежний стек восстанавливается — за счет одновременной загрузки регистров SS и SP командой lss. Заметим, что при переключении стека без использования команды lss необходимо запретить прерывания командой сы; затем прерывания вновь разрешаются командой sti. Поскольку команда lss поддерживается процессорами 80386 и выше, перед оператором .model в примере 4.4 поставлена директива .386. Директива .386 позволяет транслировать программы для процессоров 80386, 80486 и всех поколений процессоров Pentium. Чтобы воспользоваться такими командами, как cmpxchg, xadd или bswap, следует указать директиву .486; а команда cmpxchg8 из системы команд Pentium предполагает задание директивы .586. Обратите внимание на использование директивы word ptr при записи 16-битной составляющей двойного слова, определенного директивой dd.
Инструкции передачи данных
175
Пример 4.4. Использование команды lss
0000 0000 00000000 0004 1000 [		SADDR SAREA	.MODEL SMALL .386 . DATA	выбор модели SMALL выбор процессора 80386 начало сегмента данных прежний адрес стека новая область стека
			DD ?	
			DW 1000H DUP (?)	;	
	0000			
2004 0000 0010 ООН 0013 0016 0018	] = 2004 ГА 8В С4 АЗ 0000 R 8С D0 АЗ 0002 R	STOP	EQU THIS WORD	; вершина нового стека .CODE	;	начало сегмента кода .STARTUP	;	точка входа в программу CLI	;	запрет прерываний MOV АХ,SP	;	сохранить SP MOV WORD PTR SADDR,АХ MOV AX,SS	;	сохранить SS MOV WORD PTR SADDR+2,AX	
001В 001D	8С D8 8Е D0		MOV AX,DS MOV SS,AX	загрузить новое значение SS
001F 0022 0024 0025 0027	В8 2004 R 8В Е0 ГВ 8В СО 8В СО		MOV AX,OFFSET STOP ; MOV SP,AX STI MOV AX,AX MOV AX,AX	загрузить новое значение SP разрешить прерывания две пустые операции
9029	OF В2 26 0000 R		LSS SP,SADDR .EXIT END	восстановить прежние значения SS и SP выход в DOS конец исходного текста
4.4.	Строковые команды
К строковым командам относятся lods, stos, movs, ins и outs. Эти инструкции позволяют передавать байты, слова или двойные слова, а при использовании префиксов повторения целые блоки данных, передавая их байтами, словами или двойными словами. Предварительно рассмотрим роль флага D и регистров D1 и S1 в выполнении строковых инструкций.
Флаг направления
Флаг направления D выбирает режим автоувеличения (при D = 0) или автоуменьшения (при D = I) значений регистров DI и SI, используемых строковой операцией. Флаг направления влияет на выполнение только строковых инструкций. Инструкция cld обнуляет флаг D, а команда std — устанавливает D = 1. Таким образом, режим автоувеличения устанавливается командой cld, а режим автоуменьшения — командой std.
При передаче байта строковой инструкцией содержимое регистра D1 и/или S1 увеличивается или уменьшается на 1, при передаче слова — на 2, а при передаче двойного слова — на 4. Причем изменяются только тс регистры из SI и D1, которые дсй-
176
Гпава 4
ствителыю используются данной строковой инструкцией. Например, команда stosb использует только регистр DI — для адресации данных в памяти. При выполнении команды stosb изменяется только регистр DI, a S1 остается прежним. Напротив, при выполнении команды lodsb, адресующей память только посредством регистра SI, его содержимое изменится, a DI сохранит прежнее значение.
Регистры DI и SI
При выполнении строковой инструкции доступ к памяти определяется содержимым регистров DI и SI — одного из них или обоих сразу. Регистр DI содержит смещение данных в дополнительном сегменте, a SI адресует данные в главном сегменте данных (по умолчанию). Сегмент данных, связанный с регистром SI, может быть изменен префиксом переназначения сегмента. Сегмент, связанный с регистром DI, не может быть изменен — для строковой команды это всегда дополнительный сегмент. То обстоятельство, что операнды строковых команд находятся в разных сегментах, позволяет передавать (инструкцией movs) до 64 Кбайт данных между произвольными областями памяти.
Инструкция LODS
Инструкция logs загружает в аккумулятор: регистр AL, АХ или ЕАХ данные, расположенные в сегменте данных по смещению SI. Следует заметить, что загрузка в ЕАХ возможна только в процессорах от 80386 и выше. После записи байта в AL, или слова в АХ, или двойного слова в ЕАХ содержимое регистра SI увеличивается при D = 0 или уменьшается при D = I. При передаче байта значение SI изменяется на I, при передаче слова — на 2, а при передаче двойного слова — на 4.
Допустимые обозначения инструкции lods приведены в табл. 4.Ю. Мнемоника lodsb (Loads a Byte) обозначает инструкцию lods для записи байта в al, мнемоника lodsw (Loads a Word) — это вариант lods для записи слова в ах, a lodsd (Loads а Doubleword) обозначает команду lods для загрузки двойного слова в еах. Также (хотя это используется реже) вместо lodsb, lodsw и lodsd применяется lods с операндом, по типу которого ассемблер определяет размерность данных.
Таблица 4.10. Варианты инструкции lods
Обозначение	Действие
LODSB	AL = DS:[SI]; SI = SI ± 1
LODSW	AX = DS:[SI]; SI = SI ± 2
LODSD	EAX = DS;[SI], SI = SI ± 4
LODS IdST	AL = DS:[SI]; SI = SI ± 1 (если имя list определено как байт)
LODS DATAI	АХ = DS:[SI], SI = SI ± 2 (если имя datai определено как слово)
LODS FROG	ЕАХ = DS:[SI]; SI = SI ± 4 (если имя FROG обозначает двойное слово)	_
Иллюстрация действия команды lodsw при D = 0, SI = 1000Н и DS = 1000Н представлена на рис. 4.16. В результате выполнения lodsw в АХ копируется 16-битное
Инструкции передачи данных
177
число из ячеек памяти по адресам H000H и Н001Н. Поскольку передается слово, а D = 0, то содержимое регистра SI после загрузки АХ увеличивается на 2.
Сегмент
Рис. 4.16. Выполнение команды LODSW при D = OrSI = ЮООН, DS = ЮООН, [11000Н] = 32 и [11001Н] = ОАОН. (Показано в момент после загрузки АХ, но до изменения SI)
Инструкция STOS
Команда stos сохраняет значение al, ах или еах в дополнительном сегменте данных по смещению, заданному регистром di. Формы инструкции stos приведены в табл. 4.П. Размерность команды stos уточняется суффиксами в, w или d (обозначает пересылку байтами, словами или двойными словами). Так, команда stosb копирует al, stosw — ах, a stosd — еах. Затем содержимое регистра D1 автоматически Изменяется — увеличивается или уменьшается.
	Таблица 4.11. Варианты команды stos
Обозначение	Действие
STOSB	ES:[DI] = AL; DI = DI ± 1
STOSW 		ES:[DI] = AX; DI = DI ± 2
178
Гпава 4
Таблица 4.11 (окончание)
Обозначение	Действие
S'L’OSD	ES:[DI] = EAX; DI = DI ± 4
STOS LIST	ES:[DI] = AL; DI = DI ± 1 (если имя list определено как байт)
sros DATA3	ES:[DI] = АХ; DI = DI ± 2 (если имя DATA3 определено как слово)
STOS DATA4	ES:[DI] = ЕАХ; DI = DI ± 4 (если DATA4 обозначает двойное слово)
Команда STOS с префиксом повторения REP
Префикс повторения rep может быть добавлен к любой строковой инструкции, кроме lods — повторное выполнение операции lods не имеет смысла. При включении префикса повторения выполнение строковой инструкции приводит к уменьшению значения регистра СХ. Если СХ после уменьшения не равно нулю, то инструкция повторяется. Если СХ, в результате действия префикса повторения, становится равным нулю, то повторы прекращаются и программа продолжается со следующей команды. Например, если в СХ загружено число 100, то команда rep stosb выполнится ЮО раз. Поскольку регистр DI автоматически увеличивается или уменьшается после каждого цикла stosb, инструкция rep stosb запишет содержимое регистра AL во все байты ЮО-байтного блока данных.
В примере 4.5 приведен пример использования команды stosw для очистки видеобуфера в текстовом режиме. Видеопамять начинается по адресу В800:0000. Экран в текстовом режиме состоит из 25 строк по 80 символов в каждой. Одно знакоместо кодируется двумя байтами: в первом байте хранится ASCI 1-код символа, во втором — атрибуты символа (цвет символа, цвет фона и признак мигания). Для очистки экрана в видеобуфер записываются символы пробела (AL = 20Н), белые на черном фоне (АН = 07Н).
Пример 4.5. Очистка экрана в текстовом режиме
	.MODEL TINY
оооо	.CODE
	.STARTUP
0100 ЕС	OLD
0101 В8 Б800	MOV AX,0B800H
0104 8Е СО	MOV ES,AX
0106 BF 0000	MOV DI, 0
0109 В9 07D0	MOV CX,25*80
010С В8 0720	MOV AX,0720H
010F F3/AB	REP STOSW
.EXIT
END
; выбор модели TINY
; начало сегмента кода
; точка входа в программу
; выбор режима автоувеличения
; в ES - адрес сегмента В800
; в DI - смещение 0000
; установить счетчик
; загрузить данные
; очистить экран
; выход в DOS
; конец исходного текста
Счетчик повторов для команды rep stosw задан константным выражением 25*80, значение которого вычисляется ассемблером при трансляции. Некоторые операторы, используемые в константных выражениях, приведены в табл. 4.12.
Инструкции передачи данных
179
Таблица 4.12. Арифметические операторы в константных выражениях
Оператор	Пример использования в команде	Действие команды
	MOV AL,6+3	Копирует 9 в AL
-	MOV AL,8-2	Копирует 6 в AL
	MOV AL,4*3	Копирует 12 в AL
/	MOV AX,12/5	Копирует 2 в АХ (остаток от деления не используется)
MOD	MOV AX, 12 MOD 7	Копирует 5 в АХ (целая часть результата деления не используется)
AND	MOV AX,12 AND 4	Копирует 4 в АХ (1100 AND 0100 = 0100)
OR	MOV AX,12 OR 1	Копирует 13 в АХ (1100 OR 0001 = 1101)
NOT’	MOV AL,NOT 1	Копирует 254 в AL (поразрядная инверсия двоичного числа 0000 0001 равна 1111 1110 или 254)
Префиксу rep в машинном коде соответствует байт со значением F3H. В результате, команда rep stosw кодируется двумя байтами со значениями F3H (rep) и АВН (stosw).
Если выполнить rep stosw при АХ = 0731Н, то экран будет заполнен белыми единицами на черном фоне. При АХ = 0132Н экран заполняется цифрами 2, с тем же цветом. Подбирая значения регистра АХ в программе из примера 4.5, можно добиться при заполнении экрана любого сочетания символа и цвета. В дальнейшем мы рассмотрим доступ к видеобуферу в текстовом режиме более подробно.
Инструкция MOVS
Инструкция movs позволяет копировать массивы данных. Это единственная команда копирования в системе команд процессоров 8086—Pentium 4, выполняющая передачу данных из памяти в память. Команда movs копирует байт, слово или двойное слово, расположенное в сегменте данных по смещению SI, в дополнительный сегмент данных по смещению DI. При выполнении movs указатели SI и DI увеличиваются или уменьшаются, в зависимости от значения флага направления. Варианты записи инструкции movs на языке ассемблера приведены в табл. 4.13. Обратите внимание, что переназначение сегмента возможно только для операнда-источника, адресуемого парой регистров DS:Sl. Операнд-приемник всегда находится в дополнительном сегменте данных — по адресу ES:DI.
Таблица 4.13. Варианты инструкции movs
Обозначение	Действие
MOVS в	ES:[DI] = DS:[SI]; DI = DI ± 1, SI = SI ± 1 (передача байта)
MOVSW	ES:[DI] = DS:[SIJ; DI = DI ± 2; SI = SI ± 2 (передача слова)
MOVSD	ES:[DI] = DS:[SI]; DI = DI ± 4; SI = SI ± 4 (передача двойного слова)
180
Гпава 4
	Таблица 4.13 (окончание)
Обозначение	Действие
MOVS BYTE1,BYTE2	ES:[DI] = DS:[SIJ; Dl = Dl ± 1; SI = SI ± 1 (если bytei и byte2 определены как байты)
MOVS WORD1,WORD2	ES:[DI] = DS:[SI]; Dl = Dl ± 2, SI = SI ± 2 (если wordi и WORD2 определены как слова)
MOVS DWORD1,DWORD2	ES:[DI] = DS:[SI]; Dl = Dl ± 4; SI = SI ± 4 (если имена dwordi и dword2 обозначают двойные слова)
Рассмотрим еще один пример использования команды movs с префиксом повторения — сдвиг содержимого экрана на одну строку вверх. Программа, приведенная в примере 4.6, копирует содержимое видеобуфера с адреса В800:0000, заданного в регистрах DS:S1. Начальный адрес приемника В800:00А0 задан в регистрах ES:DI8. Инструкция rep movsw выполняется 24*80 раз — за счет этого происходит сдвиг изображения. Затем команда rep stosw очищает нижнюю строку экрана.
Пример 4.6. Сдвиг содержймого экрана на одну строку вверх
	.MODEL TINY	; выбрать модель TINY
0000	.CODE	; начало сегмента кода
	.STARTUP	; начало программы
0100 FC	CLD	; режим автоувеличения
Old B8 B800	MOV AX,0B800H	; в ES и DS - В800
0104 8E CO	MOV ES,AX	
0106 8E D8	MOV DS,AX	
0106 BE 00A0	MOV SI,160	; адрес строки 1
010b BE’ 0000	MOV DI,0	; адрес строки 0
010F. B9 0780	MOV CX,24*80	; загрузить счетчик
0111 F3/A5	REP MOVSW	; прокрутка экрана
0113 BF 0F00	MOV DI,24*80*2	; очистить нижнюю строку
0116 В9 0050	MOV CX, 80	
0119 B8 0720	MOV AX,0720H	
011C F3/AB	REP STOSW	
	.EXIT	; выход в DOS
	END	; конец исходного текста
Инструкция INS
Инструкция ins (input string), доступная в микропроцессорах 80286—Pentium 4, передает байт, слово или двойное слово из устройства ввода-вывода в дополнительный сегмент по смещению, заданному регистром D1. Адрес в пространстве адресов сис
s Области копирования образуют перекрытие: расстояние между ними соответствует одной строке экрана, а размер каждой из них — 24 строкам (массив-источник начинается с первой строки видеобуфера, а массив-приемник — со второй). — Пер.
Инструкции передачи данных
181
темы ввода-вывода задан регистром DX9. Эта инструкция применяется при вводе блока данных из внешнего устройства в память, например, при чтении данных с диска.
Подобно остальным строковым инструкциям, команда ins допускает две основные формы записи10. Инструкция insb вводит данные из одного байтового порта и сохраняет их в памяти по адресу ES:DI. Команда insw вводит 16-битное значение из пары смежных портов, a insd — 32-битное значение из четырех смежных портов. С этими инструкциями допустимо применение префикса rep, что позволяет записывать данные в массив целым блоком. Варианты инструкции ins приведены в табл. 4.14.
	Таблица 4.14. Варианты инструкции ins
Обозначение	Действие
INS В	ES:[DI] = [DX]; DI = DI ± 1 (передача байта)
INSW	ES:[DI] = [DX]; DI = DI ± 2 (передача слова из пары соседних портов)
INSD	ES:[DI] = [DX]; DI = DI ± 4 (передача двойного слова из четырех смежных портов)
INS LIST	ES:[DI] = [DX]; DI = DI ± 1 (если имя list определено как байт)
INS DATA4	ES:[DI] = [DX]; DI = DI ± 2 (если DATA4 определено как слово)
INS DATA5	ES:[DI] = [DX]; DI = DI ± 4 (если DATA5 определено как двойное слово)
Фрагмент программы, приведенный в примере 4.7, выполняет 50-кратное чтение порта ОЗАСН, сохраняя результаты чтения в массиве, расположенном в дополнительном сегменте данных по смещению lists. Предполагается, что очередные данные периферийного устройства постоянно готовы для чтения. Иначе пришлось бы отказаться от префикса rep и проверять готовность данных перед каждым обращением к порту.	*
: Пример 4.7. Чтение из порта в массив командой rep insb
0000 BF 0000 R	MOV	DI,OFFSET LISTS	; адрес массива
0003 BA 03АС 00'06 FC	MOV OLD	DX,3ACH	; адрес порта ввода-вывода ; режим автоувеличения
0007 В9 0032	MOV	CX, 50	; счетчик повторов
ОООА F3/6C	REP	INSB	; чтение данных из порта
Инструкция OUTS
Инструкция outs (output string), доступная в процессорах 80286—Pentium 4, передает байт, слово или двойное слово из сегмента данных (смещение задано регистром SI)
} При чтении слова (или двойного слова) DX содержит адрес первого порта из пары (или четверки) смежных портов. — Пер.
10 Вероятно, основными формами следует считать INSB/W/D (с явным указанием размерности) и INS <имя> (размерность определяется типом имени). — Пер.
182
Гпава 4
в пространство портов ввода-вывода по адресу, заданному регистром DX. Формы инструкции outs приведены в табл. 4.15.
	Таблица 4.15. Формы инструкции outs
Обозначение	Действие
GUT SB	[DX] = DS:[SI]; SI = SI ± 1 (передача байта)
OUTSW	[DX] = DS:[SI]; SI = SI ± 2 (передача слова в пару соседних портов)
?UTSD	[DX] = DS:[SI]; SI = SI ± 4 (передача двойного слова в четыре смежных порта)
OUTS DATA7	[DX] = DS:[SI]; SI = SI ± 1 (если имя DATA7 определено как байт)
GUTS DATA8	[DX] = DS:[SI]; SI = SI ± 2 (если DATA8 определено как слово)
GUTS DATA9	[DX] = DS:[SI]; SI = SI ± 4 (если DATA9 определено как двойное слово)
В примере 4.8 приведен фрагмент, выполняющий передачу байтов из массива array в порт по адресу ЗАСН. Предполагается, что после очередной записи в порт устройство сразу же готово к следующей записи.
; Пример 4.8. Вывод из массива в порт инструкцией rep outs	I
;......................................................................................;.J
0000 BE 0064 R	MOV	SI,OFFSET ARRAY	; адрес массива
0003 BA ОЗАС	MOV	DX,3ACH	; номер порта
0006 ГС	CLD		; режим автоувеличения
0007 В9 0064	MOV	CX,100	; загрузка счетчика
000А ГЗ/еЕ	REP	OUTSB	
4.5.	Дополнительные инструкции передачи данных
В этом разделе мы рассмотрим следующие инструкции: xchg, lahf, sahf, xlat, in, out, bswap, movsz, movzx и cmov. Эти инструкции также выполняют передачу данных, хотя применяются реже, чем mov.
Инструкция XCHG
Команда xchg (exchange) выполняет обмен содержимого регистра и ячейки памяти пли регистра. Обмен между сегментными регистрами или между двумя ячейками памяти не поддерживается. Размерность операндов — байт, слово или двойное слово (в процессорах 80386 и выше); допустимы все методы адресации, рассмотренные в главе 3, кроме непосредственной. Примеры инструкции xchg приведены в табл. 4.16-Вариант инструкции xchg с использованием двух 16-битных регистров, из которых один — АХ, является наиболее коротким — машинный код занимает всего один байт. Другие варианты xchg требуют два и более байтов в зависимости от метоДа адресации.
Инструкции передачи данных
183
Таблица 4.16. Примеры инструкции xchg
Обозначение	Действие
XCHG AL,CL	Обмен содержимого AL и CL
XCHG CX,BP	Обмен содержимого СХ и ВР
XCHG EDX,ESI	Обмен содержимого EDX и ESI
XCHG AL,DATA2	Обмен байта, расположенного в сегменте данных по смещению DATA2, с регистром AL
При обмене с ячейкой памяти не имеет значения, какой операнд адресует эту ячей-кун. Например, инструкции xchg al, (dij и xchg [di],al выполняют одно и то же действие.
В процессорах 80386—Pentium 4 инструкция xchg может оперировать с 32-битными данными. Например, команда xchg еах, евх выполняет обмен содержимого регистров ЕВХ И ЕАХ.
Инструкции LAHFvt SAHF
Инструкции IAHF и sahf используются довольно редко — они были некогда введены в процессор 8086 для обеспечения совместимости с программами, разработанными для 8-битного микропроцессора 8085, что уже не актуально. Команда lahf передает младший байт регистра флаюв в регистр АН, а команда sahf выполняет обратное действие.
Команда sahf используется при работе с арифметическим сопроцессором в следующей ситуации. Регистр состояния сопроцессора копируется в регистр АХ командой fstsw ах, а затем инструкция sahf передает старший байт АХ в регистр FLAGS центрального процессора. Последующая проверка флагов позволяет выявить некоторые из состояний сопроцессора11 12. Эта возможность рассмотрена в г.шве 14.
Инструкция XLAT
Инструкция xlat преобразует содержимое регистра al в число из таблицы, хранящейся в памяти. Эта команда выполняет доступ к массиву байт по номеру элемента, что часто применяется в задачах преобразования кодов. При выполнении инструкции xlat сначала вычисляется сумма содержимого AL и ВХ; она используется в качестве смешения при доступе к байту в сегменте данных. Содержимое адресуемого байта копируется в регистр AL. Это единственная инструкция, при выполнении которой происходит сложение 8- и 16-битных чисел.
11 Порядок задания операндов нс имеет значения также и при обмене между регистрами. — Пер.
12 Виты слова состояния сопроцессора и регистра FLAGS сочетаются таким образом, что при выполнении пары команд FSTSW АХ и SAHF свойства результата предыдущей операции с плавающей точкой (знак, равенство нулю) отражаются именно в тех флагах центрального процессора, в которых обычно содержатся сведения о результате целочисленной операции. Эго обстоятельство позволяет при работе с сопроцессором использовать тс же команды условного перехода, что и при Целочисленных операциях центрального процессора. — Пер.
184
Гпава 4
рассмотрим листинг, приведенный в примере 4.9. В памяти по смещению table задана таблица кодов семисегментного светодиодного индикатора. Инструкция xlat преобразует двоично-десятичное число, заданное в регистре AL, в семисегментный код; результат записывается в AL.
Пример 4.9. Преобразование двоично-десятичного числа в семисегментный код
.MODEL SMALL	; выбор модели SMALL
_ J00				.DATA		; начало сегмента данных
. Д'С1	ЗЕ	06 5В 4F	TABLE	DB	3FH, 6, 5BH, 4FH	; таблица 7-сегментных
						; кодов
	66	6D 7D 27		DB	66H, 6DH,7DH,27H	
	7F	6F		DB	7FH,6FH	
	00		CODE7	DB		; место для результата
l 'J'J				.CODE		; начало сегмента кода
				.STARTUP		; точка входа в программу
uci7	ВО	04		MOV	AL, 4	; запись тестовых данных
	вв	0000 R		MOV	BX,OFFSET TABLE	; смещение таблицы TABLE
ОС 1 с	D7			XLAT		; преобразование кода
001D	Л г	000А R		MOV	CODE7,AL	; сохранить результат
				.EXIT		; выход в DOS
				END		; конец исходного текста
На рис. 4.17 показано выполнение команды xlat в соответствии с листингом примера 4.9 при следующих значениях: table = ЮООН, DS = ЮООН и AL = 05Н (двоично-десятичное число 5). После преобразования AL = 6DH.
Рис. 4.17. Выполнение инструкции xlat (перед загрузкой 6DH в регистр AL)
Инструкции IN и OUT
В табл. 4.17 приведены варианты команд ты и оит, выполняющих операции ввода-вывода (р8 обозначает адрес порта в диапазоне О—0FFH, заданный непосредствен-
Инструкции передачи данных 185
ним операндом). Во всех вариантах команд in и out обмен между портами и микропроцессором выполняется через регистры AL, АХ или ЕАХ. Инструкция in читает данные из внешнего устройства в al, ка или еах; команда оит записывает содержимое al, ах или еах в устройство. Следует напомнить, что регистр ЕАХ имеется только в процессорах 80386 и выше.
	Таблица 4.17. Инструкции in и out
Обозначение	Действие
IN AL,p8	Чтение байта из порта по адресу р8 в регистр AL
IN АХ,р8	Чтение слова из портов с адресами р8 и р8 + 1 в регистр АХ
IN ЕАХ,р8	Чтение двойного слова из четырех портов с адресами от р8 до рй + 3 в регистр ЕАХ
IN AL, DX	Чтение байта из порта, адресуемого регистром DX, в регистр AL
IN AX,DX	Чтение в регистр АХ слова из двух портов по адресам DX и DX + 1
IN EAX,DX	Чтение в регистр ЕАХ двойного слова из 4 портов, начиная с адреса в DX
OUT p8,AL	Запись байта из регистра AL в порт по адресу р8
OUT p8,AX	Запись слова из регистра АХ в порты р8 и р8 +1
OUT p8,EAX	Запись двойного слова из регистра ЕАХ в порты с адресами от р8 ДО р8 +3
OUT DX,AL	Запись байта из регистра AL в порт, адресуемый регистром DX
OUT DX,AX	Запись слова в два порта с адресами DX и DX+1 из регистра АХ
OUT DX, EAX	Запись двойного слова в 4 порта, адресуемых регистром DX начиная с адреса, указанного в DX
Номер порта задается либо фиксированным, либо переменным. Фиксированный адрес — 8-битный. При выдаче в шину адреса он расширяется нулями до 16 бит. Например, при выполнении инструкции in al,6ан адрес порта 6АН выдается на адресные линии АО—А15 в виде 16-битного числа 006АН. Состояние сигналов на линиях А16-А19 (в процессорах 8086/8088), AI6-A23 (в 80286/80386SX), А16-А24 (в 80386SL/80386SLC/80386EX) и А16—А32 (в 80386—Pentium 4) при выполнении операций in и out не определено.
Переменный 16-битный адрес задается содержимым регистра DX, которое может быть изменено при выполнении программы.
На рис. 4.18 показано выполнение команды оит 19н,ах. Эта инструкция передает содержимое регистра АХ в порты по адресам 19Н и 20Н. По шине адреса передается число 0019Н, по шине данных — содержимое АХ; управляющий сигнал IOWC (I/O Write Control) при передаче сбрасывается в 0.
В примере 4.10 приведена программа для получения звукового сигнала из динамика IBM PC. Динамик подключен к порту 61Н. Звук включается одновременной установкой в 1 первых двух разрядов порта 61Н. Заметим, что в программе используются команды or и and — для установки и сброса отдельных разрядов. Эти команды подробно рассмотрены в главе 5. Инструкция mov сх,4ооон и последующая команда
186
Гпава 4
loop ы обеспечивают задержку между включением и выключением звука. Если записать в регистр СХ большее число, звук будет продолжительней.
Рис. 4.18. Сигналы на системной шине при выполнении команды OUT 19Н,АХ
Пример 4.10. Получение звукового сигнала из динамика IBM PC
	.MODEL TINY	; выбрать модель TINY
оооо	.CODE	; начало сегмента кода
	.STARTUP	; начало программы
0100 Е4 61	IN AL,61H	; чтение порта 61Н
и102 ОС 03	OR AL,3	; установив биты 0 и 1,
0104 Е6 61	OUT 61H,AL	; включить динамик
0106 В9 1000	MOV C.Y,10C'0H	; счетчик задержки
0109	LI:	
0109 Е2 ЕЕ	LOOP LI	; цикл задержки
010В Е4 61	IN AL,61H	; прочитать порт 61Н
010D 24 ЕС	AND AL,0FCH	; очистив биты 0 и 1,
010F Е6 61	OUT 61H,AL	; выключить динамик
	.EXIT	; выход в DOS
	END	; конец исходного текста
Инструкции MOVSX м MOVZX
В процессорах 80386—Pentium 4 введены команды пересылки movsx (Move and Sign-eXtend) и movzx (Move and Zero-eXtend). Они позволяют расширять передаваемые данные нулями (zero-extend) или значением знакового бита (sign-extend). Примеры инструкций movsx и movzx приведены в табл. 4.18.
Команда movzx записывает в старшую часть приемника нули. Так, например, при записи командой movzx 8-битного значения 34Н в 16-битный приемник число преобразуется в 16-битное — 0034Н. Инструкция movzx часто используется для преобразования беззнаковых 8- или 16-битных значений в 16- или 32-битные.
Инструкции передачи данных
187
	Таблица 4.18. Инструкции movsx и movzx
Обозначение	Действие
MOVSX CX,BL	Передает BL в СХ, с расширением знака
MOVSX ЕСХ,АХ	Передает АХ в ЕСХ, с расширением знака
MOVSX ВХ,DATAI	Передает байт datai в ВХ, с расширением знака
MOVSX ЕАХ,[EDI]	Передает в ЕАХ слово из сегмента данных по смещению EDI, с расширением знака
MOVZX DX,AL	Передает, дополняя нулями, AL в DX
MOVZX EBP,DI	Передает, дополняя нулями, DI в ЕВР
MOVZX DX,DATA2	Передает в DL байт из сегмента данных по смещению data2, обнуляя DH
MOVZX EAX,DATA3	Передает в АХ слово из сегмента данных по смещению DATA3, обнуляя старшее слово регистра ЕАХ
Команда movsx копирует знаковый бит источника в старшие биты приемника. Например, 8-битная отрицательная величина 84Н при записи в 16-битный приемник преобразуется в 16-битную величину без потери знака — FF84H. Знаковый бит 8-битного числа 84Н равен 1, поэтому биты старшего байта приемника устанавливаются в 1. Инструкция movsx используется для преобразования 8- или 16-битных знаковых чисел в 16- или 32-битные, с сохранением величины и знака.
Инструкция BSWAP
Инструкция bswap (byte swap), доступная в процессорах 80486—Pentium 4, меняет местами байты 32-битного регистра. Первый байт обменивается с четвертым, второй — с третьим. Например, в результате*^ выполнения команды bswap еах при ЕАХ = 00112233Н значение ЕАХ станет равным 33221100Н. Порядок байт, в результате, меняется на обратный. Инструкция bswap применяется для преобразования формы представления слов и двойных слов — между форматами Intel и Motorola.
Группа команд CMOV
Группа команд условного копирования cmov (conditional move) впервые появилась в процессорах Pentium Pro и Pentium II. В табл. 4.19 приведены многочисленные варианты инструкций cmov. Команды этой группы передают данные лишь при выполнении некоторого условия13. Например, команда cmovz копирует данные, если результат предыдущей инструкции равен нулю (zero). Приемником при выполнении инструкции cmov может быть только 16- или 32-битный регистр, а источником — регистр или данные в памяти (той же размерности).
Поскольку эти инструкции отсутствуют в системе команд Pentium, их использование возможно только при поддержке ассемблером директивы .686. Если эта дирек-
13 Если условие нс выполнено, то команда CMOV равносильна пустой операции. — Пер.
188
Гпава 4у
тива в вашей версии ассемблера не предусмотрена, команды cmov придется кодировать вручную при помощи директивы db. Код операции для команд cmov равец^
0F4xH, где х — код условия в диапазоне О—F (коды условия см. в Приложении 2). Зд^ кодом операции следует байт mod-reg-r/м. Пример кодирования инструкции cmov1
приведен в примере 4.Н.
Пример 4.11. Задание инструкции cmovb ах,вх при помощи директивы db
0000 OF 42 СЗ DB 0FH,42H,0C3H	; код инструкции CMOVB АХ, ВХ
Таблица 4.19. Инструкции условного копирования
Обозначение	Условие	Действие
CMOVB	С = 1	Передать, если установлен признак "ниже" (Below)
CMOVAE	с = о	Передать, если "выше или равно" (Above or Equal)
CMOVBE	Z = 1 или С = 1	Передать, если "ниже или равно" (Below or Equal)
CMOVA	Z=0nC=0	Передать, если "выше" (Above)	»
CMOVE/CMOVZ	Z= 1	Передать, если "равно" (Equal)14	] ч
CMOVNE/CMOVNZ	Z = 0	Передать, если "не равно" (Not Equal) или, что-то же i самое, если не "ноль" (Not Zero)
CMOVL	S<> О	Передать, если "меньше" (Less than)	3
CMOVLE	Z = 1 или S <> О	Передать, если "меньше или равно" (Less than or^ Equal)
CMOVG	Z=0nS=O	Передать, если "больше" (Greater than)	I
CMOVGE	S = O	Передать, если "больше или равно" (Greater than orJ Equal)
CMOVS	S = 1	Передать, если знак отрицательный (Sign)
CMOVNS	s = o	Передать, если знак неотрицательный (No Sign)
CMOVC	C = 1	Передать, если перенос (Carry)	* |
CMOVNC	c = o	Передать, если нет переноса (No Carry)	$
CMOVO	0 = 1	Передать, если переполнение (Overflow)	|
CMOVNO	0 = 0	Передать, если нет переполнения (No Overflow)	*
CMOVP/CMOVPE	p = 1	Передать, если parity or set if parity even
CMOVNP/CMOVPO	P = 0	Передать, если нет паритета (No Parity) или, иначе j говоря, паритет нечетный (Parity Odd)	u
14 Признаки "равно" (equal) и "ноль" (zero) соответствуют одному и тому же флагу Z регистр11 FLAGS, так что мнемоники CMOVE и CMOVZ обозначают одну и ту же машинную команду. — Пер-
Инструкции передачи данных 189
4.6.	Префиксы переназначения сегмента
Префикс переназначения сегмента позволяет при доступе к данным в памяти изменить сегмент, выбираемый процессором по умолчанию. Префикс может быть добавлен почти к любой инструкции, адресующей данные в памяти. В машинном пред-С|авлении префикс переназначения сегмента — это дополнительный байт перед кодом команды. Префикс обычно не ставится перед инструкциями передачи управления, поскольку они всегда адресуют сегмент кода15. В процессорах 80386— Pentium 4 допускаются дополнительные префиксы fs и gs.
рассмотрим пример. Инструкция mov ах, [dij по умолчанию выполняет доступ к данным в текущем сегменте данных. Предположим, что данные находятся в дополнительном сегменте. Для доступа к ним используем префикс переназначения сегмента: MOV AX,ES:[DIJ.
В табл. 4.20 приведены примеры команд с переназначением сегмента. Напомним, что при включении префикса длина инструкции увеличивается на один байт. Также увеличивается и время выполнения. Поэтому использование префиксов в программе рекомендуется свести к минимуму.
Таблица 4.20. Примеры инструкций с префиксом переназначения сегмента
Обозначение	Адресуемый сегмент	Сегмент по умолчанию
MOV Ал, DS:[ВР]	Data — данные	Stack — стек
МО'.’ AX,ES: [ВР]	Extra — дополнительные данные	Stack — стек
MOV	SS:[DI]	Stack — стек	Data — данные
MOV .AX, CS: LIST	Code — инструкции	Data —данные
MOV AX,ES:[SI]	Extra — дополнительные данные	Data — данные
LODS ES:DATA1	Data —данные	Extra — дополнительные данные
MOV EAX,FS:DATA2	Data — данные	FS
MOV BL,GS:[ECX]	Data — данные	GS
4.7.	Введение в язык ассемблера
Ассемблер обеспечивает два способа организации программы: за счет полного описания сегментов (этот способ универсален и поддерживается всеми ассемблерами) либо посредством сокращенных директив, доступных при указании модели памяти, этом разделе мы рассмотрим оба способа, с объяснением наиболее важных дирек-
Тив- Справочник по директивам ассемблера см. в Приложении 1.
15 и
ивключение составляют команды типа JMP/CALL [ADDR], где ADDR определено как слово или двойное слово, в котором сформирован ближний или дальний адрес перехода. По умолчанию z'Sdr находится в сегменте данных, и переназначение сегмента допускается. Например.
ES: [ADDR], CALL CS: [ADDR] И т. п. — Пер.
190
Гпава 4
Директивы
Наиболее важные директивы, или псевдооператоры языка ассемблера, приведены в табл. 4.2I. Директивы определяют способ трансляции операнда инс1рукции пли фрагмента программы. Некоторые директивы генерируют данные в памяти или влияют на машинный код инструкций. К ним относится, например, директива db, которая резервирует данные в памяти (байты) и присваивает им начальные значения. Напротив, директива byte ptr нс резервирует память, а лишь уточняет размерность данных в памяти, косвенно адресуемых через индексный п/или базовый регистр.
Таблица 4.21. Наиболее используемые директивы ассемблера
Директива	Назначение
.286	Выбор набора инструкций микропроцессора 80286
.286Р	Выбор инструкций защищенного режима микропроцессора 80286
.386	Выбор инструкций процессора 80386
. 386Р	Выбор инструкций защищенного режима процессора 80386
.486	Выбор инструкций процессора 80486
. 486Р	Выбор инструкций защищенного режима процессора 80486
.586	Выбор инструкций Pentium
.586Р	Выбор инструкций защищенного режима Pentium
.287	Выбор сопроцессора 80287
.387	Выбор сопроцессора 80387
.EXIT	Выход в DOS
.MODEL	Выбор программной модели
.STARTUP	Установка точки входа в программу, если выбрана программная модель
ALIGN 2	Выравнивание данных по границе слова (align 4 задает выравнивание по границе двойного слова)
ASSUME	Устанавливает соответствие между сегментными регистрами и сегментами, определенными в программе
BYTE	Указывает, что операнд имеет размерность байта (равносильно byte ptr)
DB	Определяет байты (один, как минимум)
DD	Определяет двойные слова
DQ	Определяет 8-байтные (64-битные) слова
DT	Определяет 10-байтные (80-битные) слова
DUP	Задает повтор элементов списка
DW	Определяет двухбайтные слова
DWORD	Указывает, что операнд имеет размерность двойного слова (равносильно DWORD PTR)
Инструкции передачи данных
191
	Таблица 4.21 (окончание)
Директива	Назначение
END	Завершает текст программы
ENDM	Завершает макроопределение
ENDP	Завершает определение процедуры
ENDS	Завершает сегмент или структуру данных
EQU	Определяет новое имя со значением и типом указанного выражения
FAR	Определяет дальний указатель
MACRO	Обозначает начала макроопределения
NEAR	Определяет ближний указатель
OFFSET	Возвращает смещение указанного объекта в памяти
ORG	Устанавливает смещение в программном сегменте равным заданному значению
PROC	Обозначает начало определения процедуры
PTR	Обозначает указатель
SEGMENT	Определяет начало программного сегмента
.STACK	Определяет начало сегмента стека
STRUC	Определяет начало структуры данных
USES	Задает сохранение и восстановление указанных регистров в процедуре
USE16	Включает режим 16-битных инструкций для процессоров 80386—Pentium 4
USE32	Предписывает генерирование ассемблером инструкций 32-битного режима
WORD	Указывает, что операнд имеет размерность слова (равносильно word ptr)
По умолчанию, если в начале программы не указана директива выбора процессора (например, .386 или .386р), ассемблер использует инструкции 8086/8088. Директива .396 предписывает использование команд реального режима процессора 80386. а директива .386р— инструкций защищенного режима 80386. Эти директивы в настоящее время применяются довольно часто, поскольку вновь разрабатываемое программное обеспечение полностью ориентировано на микропроцессоры 80386— Pentium 4. Это, в первую очередь, относится к программам для 32-битной операционной системы Windows.
Директивы определения данных
Директивы db (define byte), dw (define word) и dd (define doubleword), с которыми вы ’’ознакомились в главе Ц применяются для резервирования и инициализации данных в памяти. В программах, работающих с арифметическим сопроцессором, обычно используются дополнительные директивы для определения 8- и 10-байтных данных — dq (define quadword) и dt (define ten bytes). Необязательное имя перед ключе-’’Ым словом db/dw/dd/dq/dt получает значение адреса данных, определяемых директивой.
192	Глава 4 >
- <
Пример 4.12 демонстрирует использование этих директив в программе. Для задания : начала сегмента данных применяется оператор segment; имя в начале этого операто- ' ра используется для обозначения сегментного адреса. Определение сегмента посредством оператора segment является стандартным и универсальным (полное определение). Сокращенный вариант предполагает использование оператора .data при предварительном указании модели памяти. Последний оператор в примере 4.12— директива ends, обозначающая конец сегмента. Имя сегмента (list_seg) может быть любым, на ваше усмотрение. Число сегментов не ограничено.
Пример 4.12. Использование директив db, dw и dd
0000		LIST-SEG SEGMENT			
0000	01 02 03	DATAI	DB	1,2,3	; определить байты
0003	45		DB	45H	; 16-ричное начальное значение
0004	41		DB	'A'	; начальное значение - ASCII-код
0005	F0		DB	11110000B ; начальное значение - двоичное	
0006	000С 000D	DATA2	DW	12,13	; определить слова
000А	0200		DW	LIST1 ;	начальное значение - смещение LIST1
ооос	2345		DW	2345H	; 16-ричное начальное значение
000Е	00000300	DATA3	DD	300H	; аналогично
0012	4007DF3B		DD	2.123 ;	начальное значение - действительное
0016	544269Е1		DD	3.34E+12	; аналогично
001А	00	LISTA	DB	9	; зарезервировать один байт
001В	000А [ ??	LISTB	DB	10 DUP (	?) ; зарезервировать десять байт
0025	] 00		ALIGN 2		; выравнивание по границе слова
0026	0100 [ 0000	LISTC	DW	100H DUP	(0); массив слов
0226	J 0016 [	LIST_9 ????????		DD	22 DUP (	?)	; массив двойных слов
027Е 02Е2	0064( 06 ]	J SIXES LIST SEG	DB ENDS	100 DUP	(6) ; массив байт

В примере 4.12 продемонстрированы различные варианты определения данных. Kj видите, один оператор может определять более одного элемента данных (наприме по адресу метки datai). При задании значений элементов использованы двоичны шестнадцатеричные и десятичные числа, а также ASCII-символы16. При определ нии двойных слов (с адреса метки иатаз) начальные значения заданы действитеЛ^ ными числами, хранятся они как числа с плавающей точкой одинарной точности, и
।
16 При определении слов (с адреса метки DATA2) в качестве инициализирующего значения TalCJ?J использовано имя LIST1. В результате, в памяти сформирован ближний указатель на °бъе1Р LIST1. Поскольку фрагмент в примере 4.12 не содержит определения LIST1, это имя долЖ# быть задано в другой части программы. — Пер.
Инструкции передачи данных 193
Неопределенное начальное значение задается знаком вопроса. Элемент данных, за-ишнын знаком вопроса, обычно инициализируется нулем17. Директива dup (duplicate) используется для задания и инициализации массива. Так, например, выражение ю dup (?) в списке начальных значении задает десять элементов данных неопределенной величины. Оператор datai db io dup (2) резервирует десять байт в памяти со значением два (02Н); метка первого байта массива именуется в дальнейшем DATA1.
Директива align 2 в примере 4.12 задает выравнивание последующего элемента данных или машинной инструкции по границе слова, a align 4 — по границе двойного с юва. В процессорах Pentium—Pentium 4 используется также директива align 8 — дня выравнивания в памяти 8-байтных данных в формате действительных чисел двойной точности. Выравнивание сокращает время доступа к данным. Так, например, доступ к слову, расположенному но четному адресу, выполняется вдвое быстрее, чем к слову но нечетному адресу. Заметим, что использование директивы align не имеет смысла при указании модели памяти, поскольку модель определяет выравнивание сегмента в целом18. Заметим также, что директива align нс понадобится вам в том случае, если вы определяете сначала двойные слова, затем обычные слова, а байты — в конце.
Директивы ASSUME, EQU и ORG
Директива equ вводит новое имя п присваивает ему значение числа, ASCII-кода или другого имени. Введение символических имен делает программу понятней и упрощает ее отладку и сопровождение. В примере 4.13 показано использование директивы equ н определенных ею имен.
Пример 4.13. Использование директивы equ
:эоа - J009	TEN NINE	EQU 10 EQU 9
во	0А	MOV AL,TEN
-Л2 04	09	ADD AL,NINE
Ключевое слово this используется в директивах this byte, this word и this dword. “hn директивы позволяют создавать синонимы для имен, определенных в начале операторов db/dw/dd/dq/dt. Синонимы разных типов позволяют адресовать одну и ту
В некоторых ситуациях значения, заданные знаком вопроса, действительно будуг неопределенными. Например, если при компоновке сегмент с неопределенными значениями помещается в конец Исполняемой программы, то, возможно, его данные с неопределенными начальными значениями вообще нс будут записаны в ЕХЕ-файл. При запуске программы загрузчик выделит память для всех сегментов, но данные в конце последнего сегмента инициализированы не будуг, и их значения окажукя случайными. — Пер.
'Эффективность директивы ALIGN зависит от того, какое выравнивание задано для сегмента в Пелом (в директиве SEGMENT или в сокращенных директивах, связанных с моделью программы). Если, например, сегмент должен быть выровнен но границе байта (то есть нс выровнен вообще), любая директива ALIGN бесполезна. Если сегмент выравнивается по границе слова, то директива ALIGN 2 имеет смысл, a ALIGN 4 — бесполезна. — Пер.
7 Лак ЗК4
194
Гпава 4
же область данных как байт, слово или двойное слово. Пример использования директивы this byte приведен в примере 4.14.
Пример 4.14. Использование директив this и org
0000	DATA_SEG	SEGMENT
0100	ORG 100H
0100	DATA1 EQU THIS BYTE
0100 0000 0102	DATA2 DW ?	
	DATA_SEG	ENDS
0000	CODE_SEG	SEGMENT 'CODE'
	ASSUME CS	:CODE_SEGZDS:DATA_SEG
0000 КА 1Е	0100 R	MOV BL, DATA1	
0004 А1 ОН	30 R	MOV AXZDATA2	
000Л 8А ЗЕ	0101 R	MOV BHZDATA1+1	
000.8	CODE SEG	ENDS
В примере 4.14 также показано применение директивы org (origin). В примере эта директива устанавливает начальное смещение в сегменте data_seg равным 100Н19. Еще одна новая директива — assume — сообщает ассемблеру имена, выбранные для сегментов кода, данных, дополнительных данных и стека. Если директива assume не указана, то ассемблер ничего не знает о назначении сегментов (что равносильно оператору assume nothing) и добавляет префикс переназначения сегмента ко всем инструкциям, адресующим данные20. Оператор assume используется только при полном определении сегментов.
Директивы PROCn ENDP
Директивы proc и endp обозначают начало и конец определения процедуры, или подпрограммы. Структура программы при использовании этих директив становится яснее. Кроме того, в отсутствие этих директив или при их неправильном использовании21 вам придется явно указывать дальность вызовов и возвратов — командами CALLF, CALLN, RF.TF И RETN22. В ДИреКТИВЗХ PROC И ENDP ДОЛЖНО бЫТЬ ЗаДЗНО ИМЯ ПрО
19 Начальное смешение по умолчанию равно нулю. Оператор ORG 100Н в примере резервирует 256 байт в начале сегмента DATA_SEG. — Пер.
20 Директива ASSUME обеспечивает автоматическую подстановку префикса переназначения сегмента при обращении к данным по имени. Ассемблер знает, в каком сегменте определено имя, а также — посредством ASSUME — информирован о соответствии между сегментами в программе и сегментными регистрами. При косвенной адресации автоматическая подстановка префиксов невозможна — нет информации о сегменте. Отсутствие ASSUME, если ассемблер это позволяет, отключает автоматическую подстановку префиксов переназначения сегмента. — Пер.
21 Процедура может быть определена и без использования директив PROC/ENDP — меткой в начале процедуры. При использовании PROC этой директиве должна соответствовать парная директива ENDP; кроме того, пары PROC/ENDP не должны быть вложенными. — Пер.
22 При указании в директиве PROC атрибуга FAR или NEAR (действует по умолчанию) вызов процедуры может быть запрограммирован без указания "дальности" — оператором CALL. Также, команды возврата (в теле процедуры) могут быть заданы операторов RET. Зная "дальность" процедуры, ассемблер автоматически подставляет на место операторов CALL и RET инструкции CALLN/CALLF И RETN/RETF. — Пер.
Инструкции передачи данных
195
цедуры. После ключевого слова proc, обозначающего начало процедуры, указывается атрибут near или far. Определение NEAR-процедуры и оператор ее вызова должны находиться в одном сегменте кода. Определение FAR-процедуры может быть задано в произвольном кодовом сегменте. Ближние (near) процедуры называют также локальными, а дальние процедуры (far) — глобальными, подразумевая под этим, что глобальная процедура может быть вызвана из любой точки программы, а локальная — только из текущего сегмента кода. Метки в процедуре также могут быть определены как локальные (near) или глобальные (far).
В примере 4.15 показана процедура, которая складывает значения в регистрах вх, сх и dx и помещает результат в регистр ах. Конечно, эта короткая процедура не представляет какой-либо практической ценности, но она хорошо иллюстрирует применение директив proc и endp. Заметим, что действия, выполняемые процедурой, желательно описывать в комментариях перед ее определением, с указанием регистров, в которых передаются входные значения и возвращаются результаты, а также регистров, изменяемых при выполнении процедуры.
Пример 4.15. Сложение значений регистров вх, сх и dx с записью результата в ах
0000	ADDEM	PROC	FAR	; начало процедуры
0000 03	D9	ADD	BX,CX	
0002 03	DA	ADD	BX, DX	
0004 83	C3	MOV	AX, BX	
0006 CB		RET		
0007	ADDEM	ENDP		; конец процедуры
Ассемблер Microsoft MASM версии 6.x позволяет указать в директиве proc перечень регистров, которые должны быть сохранены при выполнении процедуры. Для этого используется директива uses со списком регистров, в соответствии с которым ассемблер автоматически генерирует команды push в начале процедуры и команды pop в конце — перед инструкцией ret. Так, например, оператор adds proc uses ах вх сх задает сохранение и восстановление регистров ах, вх и сх. В примере 4.16 приведен пример процедуры, написанной на MASM 6.Х с использованием директивы uses. Обратите внимание, что регистры в списке разделены не запятыми, а пробелами. Заметим также, что команды push и pop, автоматически сгенерированные ассемблером, попадают в листинг, только если в исходном тексте указана директива .listall.
Пример 4.16. Использование процедуры с директивой uses для сохранения регистров вх, сх и dx
U000	ADDS PROC NEAR USES BX CX DX
0000 53	pash	bx
0001 51	push	CX
0002 52	push	dx
0003 03 D8	ADD	BX, AX
0005 03 СВ	ADD	CX, BX
0007 03 D1	ADD	DX,CX
0009 8В С2	MOV	AX, DX
	RET	
196
Глава 4
ОСОБ 5 А	;	pop	dx
ОООС 59	;	pop	сх
ОООЬ 5В	;	pop	Ьх
COGE СЗ	;	ret	OOOOOh
иOOF	ADDS ENDP
Организация памяти
Сегментная структура программы описывается на языке ассемблера одним из двух способов: при помощи моделей либо посредством полного определения каждого сегмента. Модели памяти, с которыми вы познакомились в главе 2 и 3, уникальны для ассемблера MASM. Модели же в ассемблере TASM несколько отличаются от моделей в MASM. Полное определение сегментов поддерживается всеми ассемблерами, включая ассемблер фирмы Intel. Если модели удобны в простых задачах, то полное определение больше подходит дня сложных приложении, поскольку дает больше возможностей по управлению памятью. В этой книге все примеры простые, поэтому здесь предпочтение отдано моделям памяти. Модели упрощают разработку интерфейсных процедур (т. е. процедур на ассемблере, вызываемых из программ на языках С или C++), вместе с тем, полное описание, безусловно, имеет свои преимущества.
Модели памяти
В ассемблере MASM доступны модели памяти с наименованиями от tiny до huge: (полный список см. в Приложении /). Модель памяти определяется оператором .model. Модель tiny означает, что данные и команды помещаются в один сегмент размером 64 Кбайт, что вполне подходит для большинства программ небольшого размера. Модель small предполагает, что данные помещаются в один сегмент, а программный код — в другой сегмент (всего не более 128 Кбайт).
Пример 4.17 демонстрирует применение оператора .model в программе копирования 100-байтного блока данных lista в блок данных listb. В этом примере также показано определение стека и сегментов данных и кода. Директива .emit о задает возврат в DOS с кодом ошибки 0 (нет ошибки). Если директива .exit задана без параметра, то выход в DOS все равно произойдет, но значение кода ошибки при этом не определено. Для обозначения адресов сегментов используются специальные директивы, например, @data (см. Приложение /). Две команды при входе в программу — mov ах, @data и movds,ax— в MASM б.л* программируются одной директивой .startup. Директива .startup также отмечает точку входа в программу, избавляя от необходимости указывать стартовый адрес в операторе end. Также использование моделей памяти упрощает включение фрагментов па ассемблере в проекты на языке C/C++ в системах Microsoft C/C++ и Borland C/C++.
Пример 4.17. Использование директивы .model
.model small
.STACK 100H	; определить сегмент стека
.DATA	; определить сегмент данных
Инструкции передачи данных
197
0000 0064 [	LISTA	DB 100 DUP (?)
] 0064 0064[ ]	LISTB	DB 100 DUP (?) .CODE	; определить сегмент кода
0000 B8	P. 0003 8E CO 0005 8E D8 0007 EC 0008 BE 0000 R 000B BE 0064 R 000E B9 0064 ООН E3/A4 0013	HEPE:	MOV AX,@DATA ; адрес сегмента данньс< - в ES и DS MOV ES,AX MOV DS,AX CLD	; move data MOV SI,OFFSET LISTA MOV DI,OFFSET LISTB MOV CX,100 REP MOVSB .EXIT 0	; выход в DOS END HERE
Полное определение сегментов
В примере 4.18 показан листинг программы с полным определением сегментов. Следует отметить, что при использовании систем Borland C/C++ или Microsoft C/C++ полное определение сегментов необходимо при включении ассемблерной процедуры в проект на языке C/C++. Как видите, исходный текст в примере 4.18 увеличился по сравнению с примером 4.17. Вместе с тем, структура сегментов здесь более отчетлива, поскольку границы сегментов обозначены парными директивами segment и ends. Сегмент по имени stack_seg определен с атрибутом stack — это сегмент стека. Память под стек зарезервирована внутри сегмента stack_seg оператором dw loo dup (?) и составляет 256 слов. В соответствии с описанием сегмента стека ассемблер и компоновщик вычислят сегмент и смещение вершины стека и поместят их значения в регистры ss:sp.
Пример 4.18. Задание сегментов директивой segment
0000
0000 0100[
1
0200
STACK_SEG SEGMENT STACK DW 100H DUP (?)
STACK SEG ENDS
0000	DATA SEG SEGMENT 'DATA'
00U0 0064[ LISTA DB 100 DUP (?)
0064 0064[ LISTB DB 100 DUP (?)
00C3
DATA SEG ENDS
198
Гпава 4
0000
CODE_SEG SEGMENT 'CODE' ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEG
0000	MAIN	PROC FAR
0000 В8	R	MOV	AX,DATA_SEG ; адрес сегмента данных - в DS и ES
0003 8Е СО	MOV	ES,AX
0005 8Е D8	MOV	DS,AX
0007 FC	CLD	; копировать данные
0008 BE 0000 R	MOV	SI,OFFSET LISTA
000В BF 0064 R	MOV	DI,OFFSET LISTB
000Е В9 0064	MOV	CX,100
ООП F3/A4	REP MOVSB	
0013 В4 4С	MOV	AH,4CH	; выход в DOS
0015 CD 21	INT	21H
0017	MAIN	ENDP
0017	CODE_	_SEG ENDS
	END	MAIN
Данные определены в сегменте data_seg. Это два массива, обозначенных метками lista и listb, по 100 байт в каждом. Следует отметить, что имена сегментов могут быть выбраны любыми. Обычно в директивах определения данных указывается класс 'data'23, что необходимо для организации символической отладки средствами отладчика CodeView. (Отладчик CodeView входит в дистрибутив ассемблера MASM.) Запуск CodeView выполняется командой cv, с указанием имени файла, из командной строки DOS. Если при определении сегментов был задан класс 'data', CodeView обеспечивает отладку с использованием имен исходной программы. В противном случае отладка по-прежнему возможна, но уже без символов. Другие стандартные классы — 'stack' и 'code' — рассмотрены в Приложении /. Заметим, что символическая отладка в CodeView предполагает также указание класса 'code* при описании сегмента кода.
Программа в сегменте code_seg определена в виде дальней процедуры24. До начала исполняемой части программы задан оператор assume с перечнем предполагаемых значений сегментных регистров: например, cs = code_seg.
23 Имя класса имеет значение при объединении сегментов. Например, объединение одноименных сегментов из разных исходных модулей происходит лишь в том случае, если класс у них один и тог же (также при определении каждого из этих сегментов должен быть задан атрибут PUBLIC). Класс 'DATA' является стандартным в том смысле, что он назначается сегментам данных при трансляции с языка С. Именно это имя класса — 'DATA' — следует указывать в определении сегментов данных при объединении программ на языках ассемблер и C/C++. — Пер.
24 Определение главной программы в виде FAR-процедуры обычно подразумевает следующее. В начале программы в стек записывается дальний указатель на начало PSP (Program Segment Prefix), где хранится инструкция INT 20Н — один из возможных вариантов выхода в DOS. Оператор RET, заданный в конце программы, отрабатывается как RETF. В результате, управление передается нд инструкцию INT 20Н, и программа завершается. В итоге этих ухищрений программа выглядит как FAR-процедура, вызываемая из DOS командой CALLF. Но в примере,’приведенном автором, выход в DOS запрограммирован явно — функцией 4СН прерывания 21Н (что является лучшим решением). В этом случае определение программы в виде FAR-процедуры лишено смысла. — Пер.
Инструкции передачи данных
199
После загрузки регистров ES и DS значением сегментного адреса сегмента данных data_seg программа выполняет копирование 100 байт из массива lista в массив LISTB. Затем выполняется выход в DOS. Обратите внимание, что загрузчик не записывает в регистры DS и ES значение data_seg — эти регистры следует инициализировать до обращения к сегменту данных25.
Последний оператор в программе — это end main. Оператор end отмечает конец исходного текста программы, а метка после ключевого слова end указывает точку входа в программу (смещение первой исполняемой команды).
При определении сегментов кода для микропроцессоров 80386—Pentium 4 используется дополнительный атрибут — useig или USE32. Атрибуг USE16 предписывает генерирование инструкций 16-битного режима, a use32 — 32-битного. В программах для DOS следует указывать атрибут USE16, если в начале программы выбран процессор 80386—Pentium 4. Дело в том, что при наличии директивы .386 (.486 и т. д.) MASM считает все сегменты по умолчанию 32-битными и генерирует инструкции для 32-битного режима. В листинге, приведенном в примере 4.19, выбран процессор 80386, а кодовый сегмент определен с атрибутом USE16.
Пример 4.19. Вариант задания кодового сегмента с использованием атрибута use 16
0000 0000 0100[		.386	; выбрать процессор 80386 STACK SEG SEGMENT STACK DW 100H DUP (?)
	????	
0200	]	STACK_SEG .ENDS
0000		DATA_SEG SEGMENT ' DATA'
0000	0064[ LISTA ??	DB 100 DUP (?)
	1	T-
0064	0064[ LISTB ??	DB 100 DUP (?)
00С8	]	DATA_SEG ENDS
0000		CODE_SEG SEGMENT USE16 'CODE' ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEG
0000		MAIN PROC FAR
0000	В8	R	MOV AX,DATA_SEG ; адрес сегмента данных - в DS и ES
0003	8Е СО	MOV ES,AX
0005	8Е D8	MOV DS,AX
0007	FC	CLD	; копировать данные
0008	BE 0000 R	MOV SI,OFFSET LISTA
25 Загрузчик автоматически устанавливает значения регистров SS:SP и CS:1 Р. Регистры ES и DS после загрузки адресуют сегмент PSP. — Пер.
200
Гпава 4
СООВ BF 0064 В	MOV	DI,OFFSET LISTB
иООЕ В9 0064	MOV	CX,100
ООН F3/A4	REP MOVSВ	
0013 В4 4С	MOV	AH,4CH	; выход в DOS
0015 CD 21	INT	21H
0017	MAIN	ENDP
0017	CODE	_SEG ENDS
	END	MAIN
Пример программы
В примере 4.20 приведен листинг программы, с полным определением сегментов, для ввода символов с клавиатуры и отображения их на экране. Эла программа, хотя и тривиальна, представляет собой пример законченного приложения, работающего на всех персональных компьютерах IBM PC. Также здесь демонс*1 рнруек’я обращение к функциям DOS. (Справочник по функциям DOS. с указанием параметров вызова, см. в Приложении /.) Функции DOS обеспечивают работу с клавиатурой, принтером и дисками.
Программа определена в виде дальней процедуры main. В программе используется только один сегмент — кодовый. Сегмент данных опущен, поскольку данные в памяти здесь не нужны. Сегмент стека также не определен, поскольку в данном случае достаточно пространства в 128 байт, распределяемого по умолчанию при загрузке. (Компоновщик выдаст предупреждение, что стек не определен.) Стек в этой иро-1раммс используется только при вызове функций DOS командой int 21н.
Из функций DOS здесь использованы функции с номерами 06Н и 4СН. Номер функции загружается в регистр АН перед выполнением инструкции int нн. Функция 06Н при значении регистра DL = 0FFH опрашивает буфер ввода клавиазуры без ожидания нажатия клавиши. Если при завершении функции флаг Z = I, то буфер пуст. Если Z = 0, это означает, что символ прочитан и его ASCII-код сохранен в регистре AL. Ожидание нажатия клавиши в программе оформлено в виде цикла — загрузка регистров АН и DL и вызов прерывания INT 21Н выполняются до тех пор, пока флаг Z не обнулится.
При вводе символа с клавиатуры программа выходит из цикла ожидания. Полученный в регистре AL код сравнивается с кодом символа @. Если коды различны, то программа выводит веденный символ на экран и возвращается к чтению очередного символа с клавиатуры. Если же была нажата клавиша @, то программа завершается.
Функция 06Н при значении регистра dl не равного 0FFH отображает на экране ASCII-код, заданный в регистре. После вывода полученного символа выполняется инструкция jmp, и программа продолжается с адреса, указанного меткой main.
При вводе символа @ программа переходит к метке maini, где запрограммирован вызов DOS-функции номер 4СН. Эта функция завершает программу.
Дополни тельная информация об ассемблере содержится в Приложении /. (В Приложении / приведен полный перечень средств ассемблера и компоновщика, а также функций DOS и BIOS.) В последующих главах рассматривается применение ассемблера для решения различных типов задач.
Инструкции передачи данных
201
Пример 4.20. Эхо-печать до нажатия клавиши @
0000 CODE_SEG SEGMENT 'CODE'
ASSUME CS:CODE_SEG
0000		MAIN	PROC	EAR	
0000	В 4	06	MOV	AH, 6	; чтение символа с клавиатуры
0002	В2	ЕЕ	MOV	DL,0FEH	
0004	CD	21	INT	21H	
0008	74	F8	ЗЕ	MAIN	; клавиша не нажата
0003	ЗС	40	CMP	AL,'@'	; символ @?
000А	74	08	JE	MAIN1	; да
00GC	В4	06	MOV	AH, 6	; отобразить символ
000Е	8А	DO	MOV	DL, AL	
0010	CD	21	INT	21H	
0012	ЕВ	ЕС	JMP	MAIN	; повторить
0014		MAIN1:			
0014	В4	4 С	MOV	АН,4CH	; выход в DOS
0016	CD	21	INT	21H	
0018		MAIN	ENDP		
0018 CODE SEG ENDS
END MAIN
В примере 4.21 приведена эта же программа с использованием модели памяти вместо полного определения сегментов. Сравните эти варианта и обратите внимание, насколько модель памяти может сократить текст программы26.
Пример 4.21. Оформление программы эхо-печати при задании модели памяти
.MODEL TINY
0000	. CODE .STARTUP	
0100	MAIN:		
0000 В4 06	MOV АН,6	; чтение символа с клавиатуры
0002 В2 ЕЕ	MOV DL,0FFH	
0004 CD 21	INT 21H	
0006 74 F8	JE MAIN	; клавиша не нажата
0008 ЗС 40	CMP AL, '@'	; символ @ ?
ОООА 74 08	JE MAIN1	; да
000С В4 06	MOV AH, 6	; отобразить символ
000Е 8А D0	MOV DL,AL	
0030 CD 21	INT 21H	
0012 ЕВ ЕС	JMP MAIN	; повторить
0014	MAIN1:		
	.EXIT	; выход в DOS
	END	
26 При разработке незривиальных программ эффект от применения моделей незначителен. — Пер.
202
Гпава 4
Итоги
□ Инструкции передачи данных выполняют обмен данными между:
•	регистрами;
•	регистром и памятью;
•	регистром и стеком;
•	памятью и стеком;
•	аккумулятором и портом ввода-вы вода;
•	аккумулятором и регистром флагов;
•	регистром флагов и стеком.
Передача данных из памяти в память выполняется только инструкцией movs.
□	К инструкциям передачи данных относятся mov, push, pop. xchg, xlat, in, out, lea, LDS, LES, LSS, LGS, LFS, LAHF, SAHF, а ТаКЖС СТрОКОВЫе ИНСТРУКЦИИ LODS, STOS, MOVS, INS И OUTS.
□	Первый байт машинной инструкции содержит код операции. Код операции определяет действие, выполняемое микропроцессором. Перед кодом операции может быть задан один или несколько префиксов.
О Бит D в машинном коде инструкции определяет направление передачи данных. Если D = 0, то источник задан полем REG, а приемник — полем R/М. При D = I поле R/М обозначает источник, а поле REG -- приемник.
□	Бит W определяет размерность данных. Если W = 0, то размерность — байт, а при W = 1 — слово. В процессорах 80386—Pentium 4 бит W = 1 означает слово пли двойное слово.
□	Поле MOD определяет метод адресации в сочетании с полем R/М. Значение MOD = 00 говорит о том, что смещение при адресации данных в памяти отсутствует; при MOD = 01 смещение задано знаковым байтом; при MOD = 10 используется 16-битное смещение. Во всех лих вариантах поле R/М содержит информацию о методе адресации памяти. Код MOD = II означает регистровую адресацию, поле R/М при этом содержит код регистра. Код MOD =10 в процессорах 80386—Pentium 4 обозначает 32-битное смещение.
□	Поля REG и R/М содержат трехбитный код регистра при MOD =11. Всего имеется три группы по 8 регистров разной размерности, а именно — байт (АН, AL. ВН, BL, СН, CL, DH и DL), 16-битное слово (АХ, ВХ, СХ, DX, SP, ВР, DI и S1) и 32-битное двойное слово (ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP. EDI и ESI).
□	Если поле MOD задает адресацию данных в памяти, то значения REG и R/M выбирают один из следующих режимов адресации (в 16-битном режиме): (bx+di], [Bx+si], [bp+di], [bp+si], [вх], [вр], [di] или [si]. В процессорах 80386—Pentium 4 поле R/М содержит код 32-битного регистра (ЕАХ, ЕВХ, ЕСХ, EDX, EBP, EDI или ESI) либо одного из режимов индексной адресации памяти с масштабированием. При выборе последней (R/M = 100) инструкция содержит дополнительный байт (байт масштаба-индекса-базы) для задания базового и индексного регистров и масштабного коэффициента.
Инструкции передачи данных
203
□	При адресации памяти процессор выбирает сегмент данных, по умолчанию. Исключение составляет косвенная адресация с использованием регистра ВР или ЕВР. В этом случае используется сегмент стека.
□	Копирование сегментных регистров выполняется только командами mov, push, и pop. Инструкция mov позволяет обменивать данные между сегментным регистром и любым 16-битным регистром общего назначения. Инструкции mov cs,reg и pop cs недопустимы, поскольку их выполнение привело бы к изменению части полною адреса следующей инструкции. В процессорах 80386—Pentium 4 имеются дополнительные сегментные регистры FS и GS.
□	Для передачи данных между регистром/памятью и стеком предназначены инструкции push и pop. Команда push также допускает запись в стек непосредственных данных. Команды push и pop позволяют передавать данные между стеком и регистром флагов, сохранять и восстанавливать все 16- или 32-битныс регистры общего назначения. В стек может быть записано только слово или двойное слово. При записи в стек 16-битного слова наиболее значимый байт помещается по адресу SP - 1, а наименее значимый — по адресу SP - 2. После записи содержимое SP уменьшается на 2. В процессорах 80386—Pentium 4 введены варианты команд push/pop для копирования 4-байтных двойных слов.
□	Команды pushf и popf выполняют обмен данными между регистром флагов и стеком. Инструкции pusha и рора сохраняют и восстанавливают все регистры общего назначения. В процессорах 80386—Pentium 4 для сохранения и восстановления 32-битного регистра флагов используются команды pushed и popfd.
□	Инструкции lea, lds и les загружают адрес в регистр или в пару регистров. Команда lea записывает в произвольный 16-битный регистр смещение указанного объекта; lds и les загружают в 16-битный регистр и в DS или ES адрес из двойного слова в памяти. В процессорах 80386—Pentium 4 имеются дополнительные инструкции lfs, lgs и lss — для записи адреса в 16-битный регистр и сегментный регистр FS, GS ИЛИ SS.
□	Строковые инструкции используют для адресации памяти регистры DI и/или S1. В SI указывается смещение источника в сегменте данных, а в DI — смещение приемника в дополнительном сегменте данных.
□	Флаг направления D выбирает режим автоувеличения или автоуменьшения значений регистров DI/S1 при выполнении строковых инструкций. Режим автоувеличения включается при D = 0; для обнуления флага D используется инструкция cld. При выполнении инструкции std устанавливается режим автоуменьшения (D = 1). Регистр DI и/или SI при выполнении строковой операции нал байтом, словом или двойным словом уменьшается или увеличивается, соответственно, на 1, 2 или 4.
□	Команда lods загружает в регистр AL, АХ или ЕАХ данные, расположенные в сегменте данных по смещению SI; инструкция stos сохраняет AL, АХ или ЕАХ в дополнительном сегменте данных по смещению DI; инструкция movs передает байт, слово или двойное слово из памяти по адресу DS:SI в память по адресу ES:DL
□	Инструкция ins вводит данные из порта ввода-вывода, адресуемого регистром DX, и сохраняет их в памяти по смещению D1. Инструкция outs считывает данные из памяти по смешению SI и передает их в порт по адресу DX.
204
Гпава 4
□	Перед строковой инструкцией может быть задан префикс rep — для повторного выполнения инструкции. Число повторений определяется значением регистра СХ.
О В языке ассемблера используются константные выражения с операторами арифметических и логических действий. Пример: команда mov ах,34*3, которая записывает в регистр АХ число 102.
О Команда перекодировки xlat записывает в регистр AL значение из таблицы, адресуемое суммой регистров ВХ и AL.
О Команды in и оит передают данные между регистром AL, АХ или ЕАХ и портом или портами ввода-вывода. Номер порта в командах in и out может быть задан фиксированным (числом в диапазоне 0—0FFH) или переменным (в регистре DX).
□	Начиная с процессоров Pentium Pro и Pentium II, в систему команд включена Iрупиа инструкций условной передачи данных — cmov. Инструкция cmovcc передает данные при выполнении условия сс.
□	Префикс переназначения сегмента позволяет изменить сегментный регистр, используемый по умолчанию при обращении к памяти. Например, при выполнении инструкции mov ах, [вх] процессор использует сегмент данных, а при выполнении команды mov ax,es:[bx] он обращается к дополнительному сегменту данных, назначенному префиксом es. Сегментные регистры FS и GS процессоров 80386—Pentium 4 используются лишь при задании одноименных префиксов переназначения; никакая команда нс использует их но умолчанию.
□	Команды movzx и movsx, доступные в процессорах 80386 и выше, позволяют расширить размерность данных при копировании от 8/16 до 16/32 бит. Команда movzx заполняет старшие биты приемника нулями, a movsx — значением знакового бита источника.
□	Директивы db, dw и dd совместно с dup применяются для определения данных в памяти.
П Директива эквивалентности equ вводит новое имя, значение и тип которого совпадают со значением и типом указанного выражения.
П При полном описании сегментов начало сегмента задается директивой segment, а его окончание — директивой ends.
Cl Директива assume устанавливает соответствие между именами программных сегментов и сегментными регистрами CS, DS, ES и SS при полном определении сегментов. Для процессоров 80386—Pentium 4 директива assume также может определять назначение сегментных регистров FS и GS.
П Директивы proc и endp отмечают начало и конец процедуры. Атрибут uses директивы proc, доступный в MASM 6.л\ предписывает ассемблеру генерировать команды для сохранения в стеке указанных регистров — при входе в процедуру, и для их восстановления — при выходе.
□	По умолчанию ассемблер предполагает, что программа написана для процессора 8086/8088. Чтобы воспользоваться расширениями процессоров 80286—Pentium, следует указать в программе соответствующую директиву от .286 до .586. Если эта директива поставлена после оператора .model, ассемблер генерирует 16-бит-
Инструкции передачи данных 205
ные инструкции, а если наоборот, то генерируются инструкции 32-битного режима.
□ Модель памяти позволяет немного сократить исходный текст программы, но усложняет разработку больших программ.
Контрольные вопросы
I.	Какая информация задана в первом байте инструкции, нс содержащей префиксов?
2.	Какую информацию несут биты D и W машинного кода инструкции?
3.	Какая информация содержится в поле MOD?
4.	Какой регистр задан в команде, если REG — 010, W = 0, а режим инструкций — 16-битный9
5.	Каким образом кодируется доступ к 32-битным регистрам в микропроцессоре 80486?
6.	Какой метод адресации памяти выбран, если R/M = 001, MOD = 00, а режим инструкций — 16-битный?
7.	Какой сегментный регистр используется по умолчанию при косвенной адресации через регистр:
a)	SP
б)	ЕВХ
в)	DI
г)	ЕВР
д)	SI
8.	Какая инструкция кодируется 16-бигным числом 8В07Н?
9.	Какая инструкция закодирована числом 8В1Е004СН?
10.	Как выглядит инструкция mov si, [вх<-2] в машинном представлении?
11.	Каким кодом представлена инструкция MOV ESI, [ЕАХ] в микропроцессоре Pentium 11 при условии, что режим инструкций — 16-битный?
12.	Почему инструкция mov CS, ах ошибочна?
13.	Запишите последовательность команд для загрузки в сегментный регистр числа ЮООН.
14.	Какова размерность данных инструкций PUSH и POP для процессоров 8086—80286?
15.	Какой сегментный регистр нельзя указывать в команде pop?
16.	Какие регистры сохраняются в стеке командой PUSHA?
17.	Какие регистры сохраняются в стеке командой PUSHAD?
18.	Опишите действие следующих инструкций:
a)	push ах
б)	POP ESI
В)	PUSH [ВХ]
Г) PUSHED
л) POP DS
С)	PUSHD 4
19.	Объясните, что происходит при выполнении инструкции PUSH вх. По каким адресам в памяти сохраняются регистры ВН и BL. если SP = 0100Н, a SS = 0200Н?
20.	Что происходит при выполнении инструкции push ЕАХ. Куда записываются составляющие регистра ЕАХ, если значение регистра SP = 01 ООН, a SS = 0200Н?
206
Гпава 4
21.	На сколько увеличивается значение регистра SP при выполнении 16-битной инструкции POP?
22.	Назовите одно из возможных сочетаний значений регистров SP и SS, если вершина стека находится по адресу 02200Н?
23.	В чем разница между инструкциями MOV DI,NUMB и LEA DI,NUMB?
24.	Какая команда более эффективна — MOV с оператором offset или lea?
25.	В чем разница между инструкциями MOV SI,OFFSET NUMB 11 LEA SI,NUMB?
26.	Опишите действие инструкции lds BX,numb.
27.	В чем разница между инструкциями lds и LSS?
28.	Запишите последовательность инструкций для передачи слов, расположенных в сегменте данных по смещениям numb и NUMB+1, в регистры ВХ, DX и SI.
29.	Для чего предназначен флаг направления?
30.	Какие инструкции устанавливают и сбрасывают флаг направления?
31.	В каких сегментах находятся операнды строковых инструкций, адресуемые регистрами DI и Si?
32.	Объясните действие инструкции LODSB.
33.	Объясните действие инструкции stosw.
34.	Объясните действие инструкции OUTSB.
35.	С какими командами используется префикс rep и для чего он предназначен?
36.	Напишите последовательность команд для копирования 12 байт из массива SOURCE в массив dest, в предположении, что флаг направления D = 0.
37.	Где находится информация о номере порта для команды INSB?
38.	Запишите инструкцию для обмена содержимого регистров ЕВХ и ESI.
39.	Какая из инструкций LAHF и SAHF применяется при разработке программ в настоящее время?
40.	Объясните, как инструкция xlat изменяет содержимое регистра AL.
41.	Напишите короткую программу с использованием инструкции XLAT для преобразования BCD-чисел 0—9 в коды ЗОН—39Н. Поместите таблицу перекодировки в сегмент данных по смешению table.
42	Объясните действие инструкции in al, 12Н.
43.	Объясните действие инструкции out dx,ax.
44.	Для чего используется префикс переназначения сегмента?
45.	Запишите инструкцию для записи в регистр АН байта, расположенного в памяти по адресу, заданному регистром ВХ.
46.	Запрограммируйте обмен содержимого регистров АХ и ВХ, ЕСХ и EDX, S1 и DI.
47.	Объясните действие инструкции процессора Pentium Pro cmovne cx,dx?
48.	Какая директива позволяет запрограммировать команду CMOVNS ЕСХ, ЕВХ, если ассемблер нс поддерживает набор команд Pentium Pro?
49.	Какую функцию выполняют директивы ассемблера?
50.	Для чего предназначены директивы DB, DW и DD?
51.	Напишите директиву, которая резервирует 30 байт памяти для массива LIST1.
52.	Для чего предназначена директива EQU?
53.	Для чего предназначена директива .386?
Инструкции передачи данных
207
54.	Для чего предназначена директива .model?
55.	Если начало сегмента задано директивой .data, какой вариант организации памяти используется в данном случае?
56.	Если начало сегмента задано директивой segment, какая организация памяти используется в данном случае?
57.	Какую функцию выполняет команда INT 21Н при значении регистра АН = 4СН?
58.	Какими директивами обозначаются начало и конец процедуры?
59.	Объясните смысл атрибута USES директивы PROC в MASM 6.x.
60.	Как задать ассемблеру режим генерирования 16-битных инструкций при использовании команд микропроцессора Pentium П?
61.	Разработайте ближнюю процедуру, которая копирует содержимое регистра AL в четыре смежных ячейки памяти, расположенные в сегменте данных со смещением DI.
62.	Разработайте дальнюю процедуру, которая записывает в регистры АХ, ВХ, СХ, DX и SI содержимое слова, расположенного в памяти по адресу CS:DATA1.
ГЛАВА 5
Арифметические и логические инструкции
Введение
В этой главе мы рассмотрим арифметические и логические инструкции. К арифметическим инструкциям относятся сложение, вычитание, умножение, деление, сравнение. инвертирование, инкремент и декремент. Логические инструкции включают в себя операции "И" (and), "ИЛИ" (gr), "Исключающее ИЛИ" (xor), отрицание (not). сдвиги, циклические сдвиги, а также логическое сравнение (test). В системе команд процессоров 80386—Pentium 4, кроме того, имеются инструкции xadl. shri>, shlp, команды проверки и поиска бит. В этой главе также рассмотрены строковые инструкции сравнения, используемые для поиска по таблицам (scas) и поэлементного сравнения массивов (cmps).
Если вы знакомы с 8-битными микропроцессорами, вы обнаружите, что система команд процессоров 8086—Pentium 4 гораздо более гибкая, поскольку большинство инструкций оперирует не с одним, а с двумя операндами. Но даже если вы только приступаете к изучению микропроцессоров, вы с легкостью освоите простые и удобные арифметические и логические команды процессоров 8086—Pentium 4.
Темы главы
В этой главе рассмотрены следующие вопросы:
□	использование арифметических и логических инструкций для выполнения элементарных операций двоичной, BCD- и ASCII-арифметики;
□	применение машинных операций and, or и xor для обработки бит;
□	инструкции сдвигов и циклических сдвигов;
□	инструкции, специфические для процессоров 80386—Pentium 4: обмен со сложением. сравнение с обменом, сдвиги удвоенной точности, проверка биг и поиск бит:
□	проверка содержимого таблиц посредством строковых инструкций сравнения и поиска.
5.1. Сложение, вычитание и сравнение
Практически в любом микропроцессоре имеются инструкции сложения, вычитания и сравнения — их мы рассмотрим в этом разделе, с примерами.
Арифметические и логические инструкции
209
Сложение
Инструкция сложения (add) реализована в самых разнообразных формах. В этом разделе подробно рассмотрены инструкции add для сложения 8-, 16- и 32-битных двоичных данных, а также инструкция adc, позволяющая при сложении учитывать перенос1. Для прибавления единицы в систему команд включена инструкция инкремента (enc). Также предусмотрены команды для сложения данных в форматах BCD и ASCII. В завершение этой темы мы рассмотрим инструкцию xadd процессоров 80486—Pentium 4.
Методы адресации, доступные в инструкциях add, проиллюстрированы примерами в табл. 5.1. Здесь использованы почти все методы, рассмотренные в главе 3. (Конечно, все варианты адресации, число которых составляет около 32000, продемонстрировать невозможно.) В командах add запрещена адресация память-память; также недопустимо задание в качестве операнда сегментного регистра. Вообще для сегментных регистров возможны только операции копирования, сохранения в стеке и восстановления из стека. Заметим также, что 32-битные регистры доступны только в процессорах 80386—Pentium 4.
Таблица 5.1. Инструкции сложения
Команда	Действие
ADD AL,BL	AL = AL + BL
ADI? CX,DI	CX = CX + DI
ADD EPP,EAX	EBP = EBP + EAX
ADD CL,44H	CL = CL + 44H
ADD BX,245FH	BX = BX + 245FH
ADD EDX,12345H	EDX = EDX + 00012345H
ADD [BX],AL	Прибавление содержимого регистра AL к байту, расположенному в сегменте данных по смещению, указанному в регистре ВХ, с сохранением суммы в том же байте
ADD CL,[BP]	Прибавление к содержимому регистра CL байта из сегмента стека по смещению, указанному в регистре ВР, с записью суммы в CL
ADD AL,[EBX]	Суммирование содержимого регистра AL с содержимым сегмента данных по смещению, указанному в ЕВХ, с записью суммы в регистр AL
ADD BX,[SI + 2]	Прибавление к содержимому регистра ВХ слова из сегмента данных по смещению SI + 2, с сохранением результата в ВХ
ADD CL,TEMP	Суммирование байта из сегмента данных по смещению temp с содержимым регистра CL, с записью результата в CL
ADD BX,TEMP[DI]	Сложение слова, расположенного в сегменте данных по смещению temp + Di, с содержимым регистра ВХ; результат записывается в ВХ
* Используется при сложении данных многократной точности, поскольку даст возможность учесть перепое, возникший в результате предыдущего сложения. — Пер.
210			 Г~
Таблица 5.1 (окончат*)		
Команда		Действие
ADD	[ВХ + DI],DL	Прибавление содержимого регистра DL к содержимому сегме* данных по смещению ВХ + DI, с сохранением результата в сегм * те данных
ADD	BYTE PTR [DI] , 3	Прибавление числа 3 к байту из сегмента данных по смещенц указанному в регистре DI	*0,
ADD	ВХ,[EAX + 2+ECX]	Сложение слова, расположенного в сегменте данных по смеш». нию ЕСХ*2 + ЕАХ, с содержимым регистра ВХ; сумма сохраняете в ВХ
Сложение при регистровой адресации
В примере 5.1 приведена простая процедура, в которой слагаемые заданы регистровыми операндами. В этом примере суммируется содержимое регистров АХ, ВХ, СХ и DX; 16-битный результат формируется в регистре АХ.
Пример 5.1. Сложение содержимого регистров АХ, ВХ, СХ и DX
0000	ADDS PROC NEAR
0000 03 СЗ	ADD АХ,ВХ
0002 03 Cl	ADD AX,CX
0004 03 C2	ADD AX,DX
0006 C3	RET
0007	ADDS ENDP
Арифметические и логические операции всегда оказывают воздействие на регистр флагов. Флаги прерывания и трассировки остаются прежними; изменяются биты младшего байта регистра флагов, а также флага переполнения. В частности, инструкции add модифицируют содержимое флагов знака, нуля, вспомогательного переноса, переноса, паритета и переполнения. Заметим, что при выполнении большинства инструкций передачи данных, рассмотренных в главе 4, никакие флаги не из меняются.
Сложение при непосредственной адресации
Непосредственная адресация применительно к командам add означает сЛ°ЖС^т с константой. Байтовое сложение с непосредственным операндом иллюстр пример 5.2. В этом примере в регистр DL сначала загружается число 12Н му помощи команды пересылки с непосредственной адресацией. Затем к содер*и регистра DL прибавляется 33Н — командой сложения, также с неп1среДмСТуД>наГ операндом. Результат сложения (45Н) сохраняется в регистре DL, а флаги У ливаются следующим образом:
□	Z = 0 (результат не ноль)
□	С = 0 (нет переноса)
фактические и логические инструкции
211
0
CJ CJ
0
. ₽ 0 (вспомогательный перенос отсутствует) А
$ = О (результат — положительное число)
р 0 (нечетный паритет)
О = О (мег переполнения)
Пример 5’2’ Сложение чисел	и ЗЗН
R^ 12	DL' 12Н
ОООб В"
ло riO С 2 33 ADD DL,33H
0008
Сложение данных в памяти и в регистре
g примере 5-3 приведен листинг программы получения суммы двух байтов, расположенных в сегменте данных по смещениям numb и numb+i; результат сохраняется в регистре AL.
| Пример 5.3. Суммирование двух байтов памяти с сохранением результата в AL
; Процедура для сложения Сайтов NUMB и NUMBH
; Результат -- в регистр AL
; Изменяет содержимое регистра DI
0000	SUMS	PROC	NEAR
0000 BE	0000 в.	MOV	DI,OFFSET NUMB ; смещение NUMB
0003 во	00	MOV	AL, 0	; обнуление суммы
0005 02	05	ADD	AL,[DI]	; прибавить NUMB
0007 02	45 01	ADD	AL, [DI + 1]	; прибавить NUMB+1
00ОА СЗ		RET	
ооов	SUMS	ENDP	
Процедура
Регистр DI
индексный регистр DI смещение numb. Через
sums сначала загружает в
выполняется доступ к данным в сегменте данных, по смещениям numb и Заметим, что загрузка смещения в самой процедуре — не лучшее решение; Ычно адрес устанавливают перед вызовом процедуры — до оператора call. После гРУзки адреса в регистр DI выполняется инструкция add al, [di], она прибавляет к д^ИстРУ AL содержимое байта памяти по смещению numb. Предварительно регистр соде°^НУЛЯеТСИ‘ СледУюшая инстРУкпия сложения — add al, [di+1] — прибавляет к рс^РЖим°му регистра AL содержимое байта памяти по смещению мимв+1. В итоге, ЯмжСТр AL содержит сумму байтов, расположенных в сегменте данных по смещени-И NUMB+1.
*ение элементов массива
* 9. в	. . .
Чц, примере 5.4 приведена процедура, выполняющая суммирование элементов с Рами 3, 5 и 7.
это список данных, расположенных в памяти последовательно. Предпо-что имеется массив array, состояний! из 10 байт, пронумерованных от О
212

Пример 5.4. Суммирование отдельных элементов массива
; процедура для сложения элементов 3, 5 и 7 массива ARRAY ; Результат - в регистр AL
; Использует регистр SI (изменяет его содержимое без восстановления)
эоОС	SUM PROC NEAR
0000 ВО 00	MOV AL,0	; обнулить сумму
000/? BE 0003	MOV SI,3	; смещение третьего элемента
0065 02 84 0002 R	ADD AL,ARRAY[SI]	; прибавить третий элемент
0009 02 84 0004 R	ADD AL,ARRAY[S1+2]	; прибавить пятый элемент
00UD 02 84 0006 R	ADD AL,ARRAY[S1+4]	; прибавить седьмой элемент
ООП СЗ	RET
0012	SUM ENDP
В этом примере сначала обнуляется сумма в регистре AL. Затем в регистр SI записывается номер третьего элемента массива. Инструкция add al, array [si ] прибавляет содержимое этого элемента к al. Последующие инструкции добавляют к al значения пятого и седьмого элементов; смещение для доступа к этим элементам задано относительно индекса в si (= 3) — как si + 2 (= 5) и si + 4 (= 7).
Предположим, что массив содержит 16-битные данные, и требуется сформировать в регистре АХ 16-битную сумму элементов 3, 5 и 7. В примере 5.5 приведена процедура, написанная для процессоров 80386—Pentium 4 с использованием индексной адресации с масштабированием. В регистр ЕВХ загружается адрес array, номер текущего элемента массива формируется в ЕСХ. Масштабный коэффициент 2 удваивает смещение, заданное в регистре ЕСХ, что позволяет обращаться к двухбайтному элементу массива по его номеру.
Пример 5.5. Сложение элементов массива слов

; Процедура для сложения элементов массива с номерами 3, 5 и 7
; Результат - в регистр АХ
; Изменяет содержимое регистров ЕВХ и ЕСХ
0000			SUM	PROC	NEAR		
0000	661	BB	00000000 R	MOV	EBX,OFFSET ARRAY	; смещение ARRAY	
0006	66|	B9	00000003	MOV	ECX, 3	; номер элемента 3	
ОООС	67&	8B	04 4B	MOV	AX,[EBX+2*ECX]	; прибавить элемент	3
0010	66|	B9	00000005	MOV	ECX, 5	; номер элемента 5	
0016	67&	03	04 4B	ADD	AX,[EBX+2*ECX]	; прибавить элемент	5
001A	66|	B9	00000007	MOV	ECX, 7	; номер элемента 7	
0020	67ir	03	04 4B	ADD	AX,[EBX+2*ECX]	; прибавить элемент	7
0024	C3			RET			
0025			SUM	ENDP			
Инкремент
Команда инкремента inc увеличивает на 1 содержимое регистра, за исклю4 сегментного, или ячейки памяти. В табл. 5.2 приведены примеры инструкиИ для процессоров 8086—Pentium 4.
^метические и логические инструкции	213
Таблица 5.2. Инструкции inc	
^н/7	Действие	 BL = BL + 1 iNCSF	SP=SP+1 iKC FAX	ЕАХ = ЕАХ +	1	
tnc	ртк 1ВД	Увеличивает на 1 байт по смещению ВХ	
inc word PTR	Увеличивает на 1 слово из сегмента данных по смещению SI	
inc DWOPr ptr [ЕСХ] Прибавляет 1 к двойному слову по смещению ЕСХ tnc data’	Инкрементирует данные по смещению datai	
При косвенно!! адресации в командах inc необходимо указывать размерность данных посредивом директив byte ptr, word ptr или dword ptr. Иначе ассемблер не может определить размерность операции. Например, инструкция inc [di] может относиться к байту, слову или двойному слову. Напротив, команда inc byte pi’r [di] определенно указывает на байт в памяти, inc word ptr [di] — на слово, a inc dword ptr [Di] — на двойное слово.
В примере 5.6 приведен вариант программы из примера 5.3 с использованием инструкции инкремента для адресации байтов numb и numbh. Инструкция inc di изменяет содержимое регистра D1 так, что этот регистр указывает на байт, следующий за байтом numb.
; Пример 5.6. Процедура из примера 5.3 с использованием команды inc i...........................................................
; Процедура для сложения байтов NUMB и NUMB+1			
'• Результат	в регистр	AL	
' Изменяет	содержимое регистра DI		
0000	SUMS PROC	NEAR	
0000 ВЕ ООО	0 R	MOV	DI,OFFSET NUMB	; смещение NUMB
°°03 BU со 0005 02 05	MOV	AL, 0	; обнуление суммы
	ADD	AL,[DI]	; прибавить NUMB
000? 4?	INC	DI	; смещение NUMB+1
0008 Op с5 000д соз °00в	ADD RET SUMS ENDP	AL,[DI]	; прибавить NUMB+1
*НетРУкция inc воздействует на флаги процессора, но, в отличие от команды сло-уКа^151, Не изменяет флаг переноса. Эта команда часто используется для установки ^о'.ате'г,я ,,а следующий элемент массива байт. При работе с массивами слов для Исли применяют команду add di,2 — этот вариант предпочтительней использо-УКцИЯ Двух команд INC DI- При работе с массивами двойных слов для модификации ЧСн3ите;1я используется команда add di,4. В некоторых случаях, когда при увели-указателя требуется сохранить исходное значение флага переноса, команда ^Меняется последовательностью двух или четырех команд inc.
2™_______________________________________________________________2jaeaS
^****«*.
Сложение с переносом
Команда сложения с переносом (adc) не юлько суммирует операнды, но и прибав ляет к результату значение флага переноса (С). Эта инструкция используется, в ос' пивном, при обработке данных, размерность которых превышает 16 бит (на процес' сорах 8086—80286) или 32 бита (на процессорах 80386—Pentium 4).
Примеры инструкций adc приведены в табл. 5.3. Инструкция adc модифицируй (|viani таким же образом, как add.
Таблица 5.3. Инструкции adc
Команда	Действие
ADC АС,АН ADC СХ,ВХ	AL = AL + АН + перенос СХ = СХ + ВХ + перенос
adc евх,edx	ЕВХ = ЕВХ + EDX + перенос
ADC DH,[ВХ]	Прибавляет к содержимому регистра DH байт из сегмента данных по смещению, указанному регистром ВХ, и значение переноса, сохраняя результат в регистре DH
ADC ВХ, i ВР + 2]	Прибавляет к регистру ВХ значение слова, расположенного в сегменте стека по смещению вр + 2, а также значение флага переноса
АВС ЕСХ,[ЕВХ]	Суммирует значения содержимого регистра ЕСХ, флага переноса и двойного слова из сегмента данных по смещению, указанному регистром ЕВХ; результат записывает в регистр ЕСХ
Рассмотрим сложение 32-битных данных в процессоре 8086—80286. Пусть одно из 32-битных чисел задано в паре регистров ВХ и АХ, а второе — в регистрах DX и СХ. Иллюстрация сложения данных удвоенной размерности приведена на рис. 5.1.
Рис. 5.1. Использование 16-битных команд ADD и ADC для 32-битного сложения
суМ'
Процедура для решения этой задачи приведена в примере 5.7. Эта проиеДУР^ (|арс ми руст данные в парах регистров ВХ—АХ и DX—СХ, формируя результат
215
арифметические и логические инструкции
еГпстров ВХ—АХ. Сначала выполняется сложение содержимого регистров АХ и поскольку в них хранятся наименее значимые части слагаемых. В результате с/10ж^ния может возникнуть перенос. Перенос отражается во флаге С — он устанавливается в 1, если результат превышает предел FFFFH. Если сумма меньше этого предела, то флаг С обнуляется. Команда adc, при сложении наиболее значимых |6-би1иых составляющих данных, учитывает наличие переноса, который мог возникнуть при выполнении предыдущей команды add.
Пример 5.7. 32-битное сложение в процессоре 8086/8088
0000	SUM32 PROC NEAR
0СОО 0 3	Cl	ADD	АУ.,СХ
0002 13	DA	ADC	BX, DX
0004 03	RET
0005	SUM32 ENDP
Напишем аналогичную процедуру для процессора 80386—Pentium 4, предназначенную для суммирования 64-битных данных. Вместо 16-битных регистров воспользуемся 32-битными. Процедура приведена в примере 5.8.
Пример 5.8. Сложение 64-битных данных в процессоре 80386—Pentium 4
; Процедура суммирует 64-б’лтные данные, находящиеся в парах регистров ; ЕВУ.-ЕАХ и EDX-EUX
; Результат - в паре регистров ЕВХ-ЕАХ
0000	SUM64	PROC	NEAR
0000 66|	03 С1	ADD	EAX, ECX
0003 66|	1 3 DA	ADC	EBX,EDX
0006 С'		RET	
0007	SUM64	ENDP	
Команда обмена и сложения в процессорах 80486—Pentium 4
h
° систему команд процессора 80486 была включена новая команда обмена и сложения (xadd). Инструкция xadd складывает содержимое источника и приемника, сохраняя результат в приемнике. В отличие от других команд сложения, после сохра-НеНия результата исходное значение приемника копируется в источник. Команда xadd — одна из немногих инструкций, модифицирующих значение источника.
Н'
‘Пример, если содержимое регистра BL = 12Н, a DL = 02Н, то в результате вы-°Лнения команды xadd bl,dl регистр BL содержит сумму (14Н), а регистр DL— х°Дное значение приемника (12Н). Эта команда реализована для регистров и дан-х в памяти любой размерности — 8, 16 и 32 бит.
Считание
РУкния вычитания (sub) предусмотрена для всех методов адресации и для дан-1ц Размерностью 8, 16 и 32 бит. Для уменьшения данных на единицу предназначе-к°Манда декремента dec. Также реализованы команды для вычитания BCD- и
216/лаааб
ASCH-данных. Для обработки данных многократной размерности в систему команд введена инструкция вычитания с заемом — ивв.
В табл. 5.4 приведены примеры инструкций вив. В этих инсзрукциях допускаются любые методы адресации; недопустимо задание обоих операндов в памяти, сегментный регистр также не может быть операндом команды вычитания. Подобно большинству арифметических инструкций, команда sub воздействует на флаги процессора.
Таблица 5.4. Инструкции вычитания
Команда	Действие
SUB CL, BL	CL = CL-BL	’
SUB AX,SP	AX = AX - SP
SUB ЕСХ,EBP	ECX = ECX - EBP
SUB Did, cFH	DH = DH-6FH
SUB AX,0CCCCH	AX = AX - CCCCH
SUB ESI,2000300H	ESI = ESI - 2000300H
SUE [DI],CH	Вычитает содержимое регистра CH из слова, расположенного в сегменте данных по смещению DI
SUB CH,[BP]	Вычитает байт, находящийся в сегменте стека по смещению ВР, из содержимого регистра СН
SUE AH,TEMP	Вычитает байт, расположенный в сегменте данных по смещению temp, из регистра ан
SUB DI,TEMP[ESI]	Вычитает из содержимого регистра DI слово, хранящееся по смещению temp + ESI
SUB ECX,DATA1	Вычитает из содержимого регистра ЕСХ двойное слово, находящееся в сегменте данных по смещению datai
Вычитание при регистровой адресации
В примере 5.9 приведена последовательность инструкций вычитания с регистровыми операндами. В этом примере 16-битное содержимое регистров СХ и DX вычитается из содержимого регистра ВХ. После каждого вычитания микропроцессор модифицирует значения флагов.
.........................................................................
Пример 5.9. Пример вычитания с регистровыми операндами	......2
0000 2В D9
0002 2В DA
SUB ВХ,СХ
SUB ВХ, DX
Вычитание непосредственного значения
В примере 5.10 приведены инструкции, вычисляющие разность чисел 22Н И Число 22Н загружается в регистр СН при помощи инструкции пересылки с исП
дриФметические и логические инструкции
217
(.hiiicm непосредственной адресации. Затем выполняется команда sub с непосред-с11ным операндом 44Н. Полученная разность между 22Н и 44Н сохраняется в llicipc СН. Флаш после команды sub установлены следующим образом:
Z 0 (результат не ноль)
JOIT СТНе ре г
а
о С = I (зием)
£1 д = I (полуперенос)
0 s = I (результат отрицательный)
g р = I (четный паритет)
g О -- 0 (нет переполнения)
Пример 5.10. Вычитание непосредственного значения
0000 Вг 22	MOV СН,22Н
0002 80 ED 44 SUB CH,44Н
Флаги переноса (С и А) после вычитания содержат значения заемов. Заметим, что в приведенном примере переполнения не возникает. Результат вычитания числа 44Н (+68) из 22Н (+34) равен 0DEH (-34) — это значение находится в диапазоне знаковых байтов, поэтому переполнения нет. Переполнение при 8-битных данных возникает, если результат больше +127 или меньше -128.
Декремент
Инструкция декремента (dec) вычитает I из регистра или содержимого памяти. В табл. 5.5 приведены примеры использования инструкции dec.
Таблица 5.5. Инструкции декремента
Команда	Действие
DEC ВЫ	BH = BH - 1
dec сх	сх = СХ - 1
DEC EDX	EDX = EDX - 1
dec byte ptr [di]	Вычитает 1 из содержимого байта, расположенного в сегменте дан-
dec word ptr[bp]	ных по смещению, указанному в регистре DI Вычитает 1 из содержимого слова, находящегося в сегменте стека по смещению, указанному в регистре ВР
°Ec d;vORD ptrfebx]	Вычитает 1 из двойного слова по смещению, указанному в регистре
^гглчв	ЕВХ Вычитает 1 из содержимого сегмента данных по смещению numb
^Кт Косве,,но” адресации памяти в инструкции dec приходится использовать ди-
BYTE PTf< word ptr или dword ptr, иначе ассемблер не может определить ерность данных. Например, инструкция dec [si] неоднозначна, поскольку ре-
218

г метр SI может указывать на байт, на слово или на двойное слово. Размерность ных становится ясной, если записать лу команду как dec byte pi*r [si] dec WORD PTR [DI], или DEC DWORD PTR [SI].
Дан-или
Вычитание с заемом
Инструкция вычитания с заемом (sbb) подобна обычной инструкции сив, но при вычитании учитывается также заем, зафиксированный во флаге переноса С. Чаще всего эта команда применяется при вычитании данных многократной размерности — длиннее I6 (для процессоров 8086—80286) или 32 бит (для процессоров 80386—Pentium 4). При вычитании таких составных данных требуется распространять заем между их частями, подобно тому, как в командах сложения (add/adc) распространяется перенос.
Примеры инструкций sbb приведены в табл. 5.6. Инструкция sbb модифицирует флаги так же, как sub. Обратите внимание, что вычитание непосредственного значения при косвенной адресации вычитаемого требует уточнения размерности директивой BYTE PTR, WORD PTR ИЛИ DWORD PTR.
Таблица 5.6. Инструкции вычитания с заемом
Команда
Действие
SBB AH,AL	AH = AH - AL - перенос
SBB АХ,ВХ	AX = AX - ВХ - перенос
SBB ЕАХ, ЕСУ.	ЕАХ = EAX - ECX - перенос
SBB CL, 2	CL = CL - 2 - перенос
SBB BYTE PTR[DIj,3	Вычитает из байта по смещению, указанному в регистре DI, число 3 и значение флага С
SBB [DI],AL	Вычитает из байта по смещению, указанному в регистре DI, содержимое регистра AL и значение флага С
SBB DI,[BP т 2]	Уменьшает содержимое регистра DI на величину флага С и на величину 16-битного слова из сегмента стека по смещению ВР + 2
SBB AL, [EBX + ECX]	Вычитает из содержимого регистра AL содержимое байта, расположенного в сегменте данных по смещению ЕВХ + ЕСХ, и значение заема			-
Предположим, что в паре регистров ВХ и АХ находится 32-битное число, а в па^ регистров SI и DI — другое 32-битное число. Использование заема (флага С) вычитании 16-битных составляющих иллюстрирует рис. 5.2.
В примере 5.11 приведен листинг вычитания 32-битных данных при помощи 16-ных команд. Сначала выполняется вычитание наименее значимых 16-битнЫ* ставляющих — командой sub. При вычитании следующих частей данных исп ется команда sbb. В примере команда sub вычисляет разность между знамен регистров АХ и D1; затем команда sbb вычитает с заемом содержимое регистр
из ВХ.
дриФмеТИЧеСКИв И логические инструкции
219
Листинг 5.11. Вычитание данных удвоенной размерности
0004 2В С7
0006 IB DE
SUB АХ,DI
SBB BX,SI
Сравнение
Инструкция сравнения (смр) выполняет вычитание, не изменяя значение приемника, — только для установки флагов. Сравнение позволяет оценить соотношение между значением регистра или данных в памяти и другим значением. За командой сир обычно следует условная команда, позволяющая принять решение по результату сравнения, отраженному в регистре флагов, — например, команда условного перехода.
В табл. 5.7 приведены примеры инструкции сравнения с использованием методов адресации, доступных в командах сложения и вычитания. Так же, как и для этих команд, для сравнения нельзя задавать сегментный регистр, и только один из операндов может находиться в памяти.
	Таблица 5.7. Инструкции сравнения
Команда СНР CL.BL АХ, SP ebp,es1 СМР АХ,2000Н 'Dll ,СН	Действие CL-BL AX-SP EBP-ESI АХ - 2000Н Вычисление разности между байтом по смещению, указанному
Cl- [ВР]	в регистре DI и регистром СН Вычисление разности между регистром CL и байтом в сегменте стека по смещению, указанному в регистре ВР
220________________________________________________________________________Гпавах
Таблица 5.7 (окончание) Команда	Действие
СМР	АН,TEMP	Вычисление разности между содержимым регистра АН и байтом в сегменте данных по смещению temp
СМР	D1,TEMP[BX]	Вычисление разности между содержимым регистра DI и словом по смещению temp + ВХ
СМР	AL,[EDI + ESI]	Вычисление разности между содержимым регистра AL и байтом из сегмента данных по смещению EDI + ESI
В примере 5.12 приведен листинг, сочетающий команду сравнения и условного перехода. Здесь содержимое регистра AL сравнивайся с числом ЮН. Затем выполняется переход по условию больше или равно (беззнаковое). Переход на метку sober произойдет, если содержимое регистра AL будет больше или равно ЮН. При сравнении беззнаковых чисел также используются условные переходы jb (jump below — переход, если меньше), ja (jump above — переход, если больше) и jbe (jump below or equal — переход, если меньше или равно) — мы подробно рассмотрим их в главе 6.
Пример 5.12. Условный переход после сравнения
0000 ЗС 10 CMP AL, ЮН
0002 73 1С JAE SUBER
; сравнить AL с ЮН
; переход, если AL >= ЮН
Инструкция сравнения и обмена в процессорах 80486—Pentium 4
Инструкция сравнения и обмена cmpxchg, имеющаяся в процессорах 80486—Pentium 4, сравнивает приемник с аккумулятором. Если они равны, то источник копируется в приемник; а если не равны, то приемник копируется в аккумулятор. Эта инструкция реализована для 8-, 16-и 32-битных данных.
Например, инструкция cmpxchg cx,dx сравнивает содержимое регистра СХ с АХ. Если СХ = АХ, то в регистр АХ передается значение DX; если же содержимое регистра СХ отличается от АХ, то в АХ копируется значение СХ. Если операнды байтовые, то подразумевается регистр AL, а если данные 32-битные — ЕАХ.
В процессорах Pentium—Pentium 4 имеется также инструкция cmpxchgbb для сравнения пары 8-байтных слов. Эта команда сравнивает 64-битные числа, одно из кото_ рых задано в регистрах EDX:EAX, а другое находится в памяти. Например, HHCT?Zv. ция cmpxchgsb temp при temp = EDX:EAX записывает в temp число из ЕСХ.Ь’ если temp отличается от EDX:EAX. то значение temp копируется в рсги EDX:EAX.
5.2. Умножение и деление
оцесе®*
Операции умножения и деления были включены в систему команд микропр ров не сразу. В ранних 8-битных микропроцессорах эти действия приходилос поднять сочетанием сдвигов, сложений и вычитаний. Этот недостаток был Др| рован в последующих процессорах. В настоящее время процессоры rd
221
дрнфметические и логические инструкции
р ntiuni 4 содержат специальные средства, позволяющие сократить выполнение ум-ожения до одного такта; раньше — в предыдущих версиях микропроцессоров Hg0x86 — на это требовалось около 40 тактов.
умножение
Операндами инструкций умножения могут быть байты, слова или двойные слова. Предусмотрены команды умножения для знаковых целых (imul) и беззнаковых це-дых чисел (миь). Умножение 32-битных значений возможно только в процессорах 80386—Pentium 4. Произведение всегда имеет размерность вдвое больше размерности сомножителей. То есть умножение 8-битных чисел дает 16-битный результат; произведение 16-битных сомножителей имеет размерность 32 бита; перемножение 32-битных чисел дает 64-битный результат.
флаги О и С при умножении изменяются, отражая свойства результата. (Другие флаги изменяются непредсказуемым образом.) Например, если старшие 8 бит результат при 8-битном умножении равны нулю, то С = О = 0. Обнуление флагов С и О означает, что размерность результата не превышает размерности сомножителей (т. е. при байтовом умножении результат помещается в байте), а С = О = 1 — что результат имеет удвоенную размерность. При 16-битном умножении С = О = 0 в том случае, если старшее слово результата равно нулю. При умножении 32-битных величин С ~ О = 0 означает, что значащие биты результата полностью представлены 32-битным значением.
Восьмибитное умножение
При 8-битном умножении, как знаковом, так и беззнаковом, множимое находится в регистре AL. Множителем может быть любой 8-битный регистр или байт в памяти. Непосредственный множитель допустим лишь в специальной инструкции знакового умножения, которую мы обсудим чуть позже. В инструкциях умножения указывается только один операнд, поскольку второй операнд — всегда регистр-аккумулятор. Например, инструкция миь вь умножает содержимое регистра AL на содержимое &L, считая сомножители беззнаковыми. После умножения беззнаковый результат Удвоенной размерности записывается в регистр АХ. Примеры инструкций 8-битного Умножения приведены в табл. 5.8.
Таблица 5.8. Инструкции 8-битного умножения
Команда
KUL СЬ
1MUL DH
lMUL EyTE PTR[BX]
14 TEMP
Действие
Содержимое регистра AL умножается на содержимое CL; беззнаковый результат помещается в регистр АХ
Содержимое регистра AL умножается на содержимое DH; знаковый результат помещается в регистр АХ
Содержимое регистра AL умножается на байт, расположенный в сегменте данных по смещению, указанному в регистре ВХ; знаковый результат помещается в регистр АХ
Содержимое регистра AL умножается на байт, расположенный в сегменте данных по смещению temp; беззнаковый результат помещается в регистр АХ
222
Предположим, что в регистрах BL и CL содержатся S-битные беззнаковые чис Требуется перемножить их и сохранить 16-битный результат в регистре DX. Очеви но, что выполнить заданное действие одной командой нс удастся, хотя бы потом что один из сомножителей необходимо скопировать в регистр AL. Решение эт й задачи показано в примере 5.13. Предварительно в регистры BL и CL загружаю^ значения 5 и К). Результат произведения этих значений после выполнения комаи* ды mul из регистра АХ копируется в регистр DX.
 Пример 5.13. Перемножение 8-битных чисел	q
0000	ВЗ	05	MOV	BL, 5	•загрузить данные
0002	В1	од	MOV	CL, 10	
0004	ед	01	MOV	AL, CL	установить значение множимого
0006	F6	F.3	MUL	BL	; умножить
0008	8В	D0	MOV	DX,AX	; скопировать результат
При знаковом умножении отрицательный результат представлен в дополнительном коде. На языке ассемблера команда знакового умножения обозначается мнемоникой IMUL.
Умножение 16-битных слов
Умножение слов похоже на умножение байт. Разница лишь в том. что множимое находится не в регистре AL, а в АХ, а результат получается не в регистре АХ, а в паре регистров DX—АХ. В регистр DX записывается старшая часть 32-битного результата умножения. Примеры инструкций 16-битного умножения приведены в табл. 5.9.
Таблица 5.9. Инструкции 16-битного умножения
Команда	Действие
MUL СХ	Содержимое регистра АХ умножается на содержимое СХ; беззнаковый результат сохраняется в паре регистров DX—АХ
IMUL DI	Содержимое регистра АХ умножается на содержимое DI; знаковый результат сохраняется в паре регистров DX—АХ
MUL WORD PTRU	^1] Содержимое регистра АХ умножается на слово из сегмента данных по смещению, указанному в регистре SI; беззнаковый результат сохран ется в паре регистров DX—АХ			—
Инструкция 16-битного умножения с непосредственным операндом
Микропроцессоры 8086/8088 не допускают умножения с непосредственным °пе^ой дом; в процессорах 80186—Pentium 4 это возможно при использовании спеии'	и
инструкции. Этот вариант инструкции умножения работает со знаковыми ми ^jcTp-предполагает задание трех операндов. Первый операнд — 16-битный Ре тИЙ приемник; второй операнд — 16-битное множимое в регистре или в памяти» операнд — 8- или 16-битный множитель, заданный непосредственным знамен»
223
фактические и логические инструкции
имер. инструкция jmul cx,dx,12h умножает содержимое регистра DX на 12Н, ИаПР|1Яя 16-битный знаковый результат в регистре СХ. Если непосредственное зна-задано байтом, то при умножении оно преобразуется в 16-битное число с *|СН,ц!ре,,,,ем знака- Еще °Д|,Н пример — команда iitje вх, number, юоон, которая раС жаеТ слово number на ЮООН и записывает произведение в регистр ВХ. Прием-' к множимое должны иметь одинаковую размерность — 16 бит.
цик н
умно*ение З2'битных данных
процессорах 80386—Pentium 4 допускается 32-битное умножение, знаковое и без-«1КОв°е- При 32-битном умножении содержимое регистра ЕАХ перемножается па 31,1 оацд, заданны!! в инструкции. Произведение размерностью 64 бита сохраняется ° пегистрах EDX—ЕАХ, причем регистр ЕАХ содержит наименее значимую часть В зутьтата. Примеры инструкций 32-битного умножения приведены в табл. 5.10.
Таблица 5.10. Инструкции 32-битного умножения
Команда	Действие
MUL ЕС/.	Содержимое регистра ЕАХ умножается на содержимое ЕСХ; беззнаковый результат сохраняется в регистрах EDX—ЕАХ
IMUL EDI	Содержимое регистра ЕАХ умножается на содержимое EDI; знаковый результат сохраняется в регистрах EDX—ЕАХ
MUL DWORD PTR[ЕСХ]	Содержимое регистра ЕАХ умножается на двойное слово из сегмента данных по смещению, указанному в ЕСХ; беззнаковый результат сохраняется в регистрах EDX—ЕАХ
Деление
Подобно умножению, деление предусмотрено для знаковых (idiv) и беззнаковых (div) операндов — 8- и 16-битных, а в процессорах 80386—Pentium 4 также и ^-битных. Размерность делимого всегда вдвое больше размерности делителя. Это означает, что при 8-битном делении 16-битное число делится на 8-битное; при о-битном делении делимое и делитель имеют размерность 32 и 16 бит соответствии©; при 32-битном делении делимое — 64-битное, а делитель — 32-битный. Посредственные операнды в инструкциях деления не предусмотрены.
^Лаги ПРИ делении изменяются непредсказуемым образом. При делении возможны ибки двуХ типов: делитель равен 0 или переполнение частного2. Переполнение . ’икает при делении большого значения на сравнительно малое. Например, при Ра3ИТНом Делении АХ = 3000 на число 2 полученный результат (1500) превышает гснеСРН°СТЬ ^а,^та В этом случае, как и при делении на ноль, микропроцессор эКраРИрует прерывание. В большинстве систем это прерывание вызывает вывод на рцв н сообщения об ошибке3. Прерывание по ошибке деления и другие типы пре-ний мы рассмотрим в главе 6.
НИи^Цсству, это одна ошибка — переполнение Реакция процессора на переполнение при деле-’’Рсрывапие по вектору 0. — Пер.
После сообщения об ошибке программа автоматически завершается. — Пер.
224
Глава 5
Восьмибитное деление
При S-битном делении в регистре АХ находится делимое, а делитель задан любым 8-битным регистром или ячейкой памяти. После деления частное сохраняется в ре> гистрс AL, а остаток — в АН. При знаковом делении частное может бьпь положительным или отрицательным числом в дополнительном коде; знак остатка равен знаку делимого4.
Например, если содержимое регистра АХ = 0010Н (+16) и BL = 0FDH (-3), то в результате выполнения инструкции idiv bl регистр AX-01FBH. Это значит, что частное равно -5 (в регистре AL), а остаток — +1 (в регистре АН). При делении -16 на +3 частное равно —5 (в регистре AL), а остаток равен -1 (в регистре АН) Примеры инструкций 8-битного деления приведены в табл. 5.11.
	Таблица 5.11. Инструкции 8-битного деления
Команда	Действие
DIV CL	Содержимое регистра АХ делится на содержимое CL; беззнаковое частное сохраняется в регистре AL, а остаток — в АН
IDIV BL	Содержимое регистра АХ делится на содержимое BL; знаковое частное сохраняется в регистре AL, а остаток — в АН
DIV BYTE PTR[BP]	Содержимое регистра АХ делится на содержимое байта, расположенного в сегменте стека по смещению, указанному в регистре ВР; беззнаковое частное сохраняется в регистре AL, а остаток — в АН
При S-битном делении делимое, если оно задано байтом, следует предварительно преобразовать в 16-битную величину — в регистре АХ. Это преобразование выполняется для знаковых и беззнаковых чисел по-разному. При расширении беззнакового 8-битного числа старший байт следует обнулить; для этого можно воспользоваться инструкцией movzx процессоров 80386—Pentium 4, рассмотренной в главе 4. При расширении знаковых величин старшая часть данных заполняется значением знакового бита. Предусмотрена специальная инструкция cbw (convert byte to word — преобразование байта в слово) для расширения байта, в результате ее выполнения значение, находящееся в регистре AL, передается в АХ с сохранением знака. В процессорах S03S6—Pentium 4 есть еще одна возможность — использовать команду movsx (см. главу 4).
В примере 5.14 приведена программа, выполняющая деление беззнаковых байт, находящихся в памяти по смещениям numb и numbi. Частное сохраняется в байте ANSQ» а остаток — в байте ansr. Обратите внимание, что число, скопированное в регистр AL из numb, расширяется до 16 бит с обнулением старшего байта регистра АН.
Пример 5.14. Беззнаковое деление двух байтов в памяти
0000 АО 0000 R	MOV AL,NUMB ; загрузить NUMB
0003 В4 00
MOV АН,0
; расширить АХ нулями
Это означает, что при делении -5 на 2 частное равно —2, а остаток — —I. Если бы у тот же знак, что у делимого, то результатом —5/2 было бы частное, равное —3, и °
статор Р
ный + I. — Пер.
драматические
и логические инструкции
225
	36 0002 R	DIV	NUMB1	; разделить AX на NUMB1
q009 л~	0003 R	MOV	ANSQ,AL	; сохранить частное
пООС	26 0004 R	MOV	ANSR,AH	; сохранить остаток
(Jv v 0000 АО	0000 R	MOV	AL,NUMB	; загрузить NUMB
0003 S’5	00	MOV	AH, 0	; расширить нулями
0005	36 0002 R	DIV	NUMB1	; разделить на NUMB1
0009 А2	0003 R	MOV	ANSQ,AL	; сохранить частное
000С 88	26 0004 R	MOV	ANSR,AH	; сохранить остаток
В примере 5.15 приведен вариант этой же программы, рассчитанный на знаковые значения. Вместо расширения регистра AL нулями здесь используется знаковое расширение, выполняемое командой cbw.
Г пример 5.15. Знаковое деление двух байтов в памяти
0000 АО 0000 R	MOV	AL,NUMB	; загрузить NUMB в AL
0003 98	CBW		; расширить знак AL в АН
0004 Гб ЗЕ 0002 R	1DIV	NUMB1	; разделить на NUMB1
0008 А2 0003 R	MOV	ANSQ,AL	; сохранить частное
000В 88 26 0004 R	MOV	ANSR,AH	; сохранить остаток
Деление с 16-битным делителем
Инструкции 8- и 16-битного деления похожи, но в 16-битном варианте делимое находится не в регистре АХ, а в паре регистров DX—АХ и, кроме того, является не 16-битным, а 32-битным. После деления частное записывается в АХ, а остаток — в DX. В табл. 5.12 приведены примеры инструкций 16-битного деления.
Таблица 5.12. Инструкции 16-битного деления
Команда Действие
v сх	Содержимое регистров DX—АХ делится на содержимое СХ; беззнаковое частное
записывается в регистр АХ, остаток — в DX
lDlv SI Содержимое регистров DX—АХ делится на содержимое SI; знаковое частное записывается в регистр АХ, остаток — в DX
Iv numb Содержимое регистра АХ делится на содержимое сегмента данных по смещению ________numb; беззнаковое частное записывается в регистр АХ, остаток — в DX
nojfa? Делением 16-битное делимое следует преобразовать в 32-битное. Если пред-Рах беззнаковое деление, то в регистр DX следует записать ноль. В процессора з , 6-—Pentium 4 для расширения числа нулями предусмотрена команда movzx5. ton ПуКопого Расширения содержимого регистра АХ до содержимого пары регист-Л"~АХ предусмотрена команда cwd (convert word to doubleword — преобра-
Cri0c06 11 здесь бесполезна: нужно нс расширять АХ до ЕАХ, а просто обнулить DX, любым ~~ посредством MOV DX, О, ИЛИ SUB DX, DX, ИЛИ XOR DX, DX. — Пер.
384
226
CfSjas
зование слова в двойное слово); в процессорах 80386—Pentium 4 также может бк. использована команда movsx6.	ь,Ть
В примере 5.16 приведен листинг программы деления 16-битных знаковых чис а именно числа —100, разметенного в регистре АХ, на +9, помещенного в СХ струкция cwd преобразует число, заданное в регистре АХ, в значение, которое п мешается в паре регистров DX—АХ. Результаты деления сохраняются в регистп DX и АХ: в АХ — часi ное (равно -11), а в DX — остаток (равен -1).
Пример 5.16. Знаковое деление 16-битных чисел
	В8	FF9C	MOV	AX,-100	; загрузка	делимого -100
0003	В 9	0009	MOV	CX, 9	; загрузка	делителя +9
ооиб	99		CWD		; знаковое	расширение делимого
0007	F7	F9	IDIV	CX		
Деление с 32-битным делителем
В процессорах 80386—Pentium 4 предусмотрена команда 32-битного деления для знаковых и беззнаковых чисел. Делимое размерностью 64 бит записывается в паре регистров EDX—ЕАХ, делитель задан в инструкции. Частное размерностью 32 бита сохраняется в регистре ЕАХ, а 32-битный остаток — в EDX. В принципе, эта инструкция аналогична командам 8- и 16-битного деления и отличается от них только размерностью операндов; примеры команд 32-битного деления приведены в табл. 5.13. Преобразование двойного слова из регистра ЕАХ в 8-байтное слово, размещаемого в паре регистров EDX—ЕАХ, выполняется инструкцией cdq (convert doubleword to quadword — преобразование двойного слова в учетверенное), с расширением знака.
Таблица 5.13. Инструкции 32-битного деления
Команда	Действие			
DIV ЕСХ	Содержимое пары регистров EDX—ЕАХ делится на содержимое ЕСХ; беззнаковое частное записывается в регистр ЕАХ, остаток-* в EDX
DIV DATA2	Содержимое пары регистров EDX—ЕАХ делится на двойное слс^ находящееся в сегменте данных по смещению data2; беззнако частное записывается в регистр ЕАХ, остаток — в EDX
IDIV DWORD PTRfEDI]	Содержимое пары регистров EDX—ЕАХ делится на двойное о, которое хранится в сегменте данных по смещению, Ука^^ ^а-регистре EDI; знаковое частное записывается в регистр ЬАл. ток — в EDX		—***
Использование остатка	_
й — Что делать с остатком, полученным при делении? Одна из возможностей ус«' зонать его для округления частного; если не анализировать остаток, то час
6 Использование MOVSX при 16-битном делении также нс имеет смысла. — Пер.
227
^фМетические и логические инструкции
тсЯ. При беззнаковом делении округление выполняется за счет сравнения остатка ^^цыиенным вдвое делителем.
с У*
сТццг с использованием округления приведен в примере 5.17. Здесь выполняется ^с11це содержимого регистра АХ па содержимое BL, затем остаток удваивается и вНлвастся с регистром BL. По результату сравнения принимается решение о кор-
^цИ11 частного — командой inc.
^Пример
5.17.	Округление частного при беззнаковом делении
о0оо	Гб	F3	DIV		BL
0002	02	Е4	ADD	АН, АН
0004	ЗА	ЕЗ	СМР	АН, BL
0006	72	02	JB	NEXT
0008	FE	СО	INC	AL
000А		NEXT:		
; разделить
; удвоить остаток
; сравнить в делителем
; округлить частное
Из целочисленного остатка можно получить дробный остаток. Для этого после деления следует обнулить регистр AL, предварительно сохранив его значение (частное) в другом регистре или ячейке памяти. Значение регистра АХ используется затем в качестве делимого, при том же значении делителя. Результат — дробный остаток.
В примере 5.18 приведен листинг программы получения дробного остатка от деления 13 на 2. Восьмибитное частное сохраняется в ячейке ansq, затем регистр AL обнуляется. Содержимое регистра АХ вновь делится на 2. После деления в регистре AL будет записано число 80Н. В двоичном коде это 10000000. Двоичная точка находится перед крайним правым битом AL, и дробный остаток равен 0.10000000 в двоичном представлении, т. е. 0.5. Остаток сохраняется в ячейке памяти ansr.
Пример 5.18. Получение дробного остатка
°°00 В8 QC0D °°03 ВЗ 02 0005 F6 F3	MOV MOV DIV	AX, 13 BL, 2 BL	; загрузить ; загрузить ; разделить	13 13 на 2
“°7 А2 0003 R ООп»	MOV	ANSQ,AL	; сохранить	частное
во оо ООпс г.	MOV	AL, 0	; обнулить ]	регистр 1
2 С F6 F3 ООпр	DIV	BL	; получить ।	остаток
Е д2 0004 R	MOV	ANSR,AL	; сохранить	остаток
S О Л
• Арифметика BCD- и ASCII-данных
МИкро
ПроцсссоР способен выполнять арифметические операции над данными в *Чци2ах BCD (двоично-десятичные) и ASCII — при помощи специальных инст-h и Коррекции, t	।
(*)0Р‘мата BCD используются в терминальном оборудовании, например, в ь,х аппаратах, где арифметические действия выполняются относительно ред-
228
ко. ASCII-арифметика используется при работе с числами, заданными ASCIK волами7.
СИМ.
BCD-арифметика
Данные в формате BCD можно складывать и вычитать командами двоичной апиж метики add и sub. Результат сложения следует скорректировать инструкцией п (decimal adjust after addition — десятичная коррекция после сложения), a результат вычитания — инструкцией das (decimal adjust after subtraction — десятичная коррек ция после вычитания). Результат коррекции — правильное BCD-число.
Сложение или вычитание с коррекцией выполняется для двузначных десятичных чисел в формате упакованных BCD-чисел (в одном байте — две цифры). Инструк-ции daa/das корректируют результат сложения/вычитания в регистре AL.
Инструкция DAA
Инструкция daa выполняется сразу после команды add или adc для приведения результата к двоично-десятичному формату. Предположим, что регистры DX и ВХ содержат четырехзначные упакованные BCD-числа. В примере 5.19 приведена программа, которая складывает BCD-числа в регистрах DX и ВХ, сохраняя результат в регистре СХ.
Пример 5.19. Сложение 4-значных упакованных BCD-чисел
0000 ВА 1234	MOV	DX,1234H	; загрузить 1234
0003 ВВ 3099	MOV	ВХ,3099H	; загрузить 3099
0006 8А СЗ	MOV	AL, BL	; сложить содержимое
0008 02 С2	ADD	AL, DL	; регистров BL и DL
000А 27	DAA		; скорректировать
000В 8А С8	MOV	CL, AL	; результат — в регистр CL
000D 8А С7	MOV	AL,BH	; сложить ВН, DH и перенос
000F 12 С6	ADC	AL,DH	
ООП 27	DAA		; скорректировать
0012 8А Е8	MOV	CH, AL	; результат — в регистр СН
Поскольку инструкция daa обрабатывает только две цифры в регистре AL, 0/13 мые могут быть только 8-битными. После сложения значений регистров BL результат, перед сохранением в регистре CL, корректируется инструкцией DAA‘ ь1«т выполняется сложение содержимого регистров ВН и DH с переносом; Р63 вновь корректируется инструкцией daa и сохраняется в регистре СН. В приве примере число 1234 прибавляется к 3099; в итоге, регистр СХ содержит сУ|^наЧеН^ Заметим, что 1234 в формате упакованных BCD-чисел — это 16-ричное I234H.
7 Например, при обработке баз данных в DBF-формате, где все данные (даже численное)
лены строками ASCH-символами. — Пер.
229
ифМ?тические и логические инструкции
Ийсгрукчия DAS
цукини das применяется в аналогичных ситуациях, но не после сложения, а ’вычитания. В примере 5.20 приведена программа, подобная программе из п°Смера 5.19, для вычисления разности между содержимым регистров DX и ВХ. ^есто daa здесь используется команда das, а вместо add/adc — инструкции sub/sbb.
^Пример 5.20. Вычитание 4-значных упакованных BCD-чисел					
лП00	ВА	1234	MOV	DX,1234H	; загрузить 1234
(JUV V оооз	вв	3099	MOV	ВХ,3099H	; загрузить 3099
оооб	8А	сз	MOV	AL, BL	; вычесть содержимое регистра DL
0008	2А	02	SUB	AL, DL	; из содержимого регистра BL
000А	2F		DAS		; скорректировать
ооов	8А	08	MOV	CL, AL	; результат - в регистр CL
000D	8А	С7	MOV	AL, BH	; вычесть содержимое регистра DH
000F	1А	Об	SBB	AL, DH	
ООП			DAS		; скорректировать
0012	8А	£8	MOV	CH, AL	; результат — в регистр СН
ASCII-арифметика
ASCII-числа кодируются ASCII-символами 'О'—’9’, в диапазоне кодов ЗОН—39Н. Для работы с ASCII-числами предусмотрено четыре инструкции: ааа (ASCII adjust after addition — ASCII-коррекция после сложения), aad (ASCII adjust before division — ASCII-коррекция перед делением), aam (ASCII adjust after multiplication — ASCII-коррекция после умножения) и aas (ASCII adjust after subtraction — ASCII-коррекция после вычитания). Эти инструкции используют регистр АХ в качестве источника и приемника.
правильного результата. Например.
Инструкция ААА
Двоичное сложение пары ASCII-цифр не дает правильного результата. Например, сложить 'Г и '9' (31Н и 39Н), результат составит 6АН. Числа 1 и 9 должны бы-Дать в сумме ASCII-число 10, т. е. пару кодов 31Н и ЗОН. Если после сложения Не AQHl1Tb И,1СТРУКЦИЮ ааа, значение в регистре АХ станет равным 0100Н. Это еще (•|л,.^И"ЧИсло, но после прибавления кода 3030Н ('00') оно станет равным ЗВОН । Инструкция ааа обнуляет регистр АН, если результат меньше 10, и прибавляет & с°Держимому регистра АН, если результат больше 10.
^Римере 5.21 приведена программа сложения ASCII-чисел. Обратите внимание, Коцан^еРЖимое регистра АН перед сложением обнуляется в результате выполнения ДЬ1 mov ах, 31н. В регистр AL при этом записывается код 31Н (’Г).
5.21. Сложение ASCII-чисел
05
0031	MOV	АХ,31Н
39	ADD	AL,39Н
	ААА	
3030	ADD	АХ,ЗОЗОН
; загрузить '1'
; прибавить '9'
; скорректировать
; преобразование результата в ASCII-код
230
Гпава 5
Инструкция AAD
В отличие от других инструкций коррекции, инструкция aad применяется не после, а перед операцией: перед делением. В регистре АХ перед выполнением инструкции aad записывается двузначное неупакованное BCD-число (отличается от ASCII-формата тем, что старшие тетрады байтов обнулены). После коррекции в регистре АХ находится двоичное число, которое можно использовать в качестве делимого; результат 8-битного деления сохраняется в регистрах AL (частное) и АН (остаток).
В примере 5.22 приведена программа деления числа 72, заданного в формате неупакованных BCD-чисел, на 9. Код 0702Н загружается в регистр АХ и преобразуется инструкцией aad в двоичное число 72, или 48Н.
Пример 5.22. Коррекция делимого в формате упакованных BCD-чисел
0000 ВЗ 09	MOV	BL, 9	; загрузить делитель
0002 В8 0702	MOV	AX,0702H	; загрузить делимое
0005 D5 0А	AAD		; скорректировать
0007 F6 F3	DIV	BL	
Инструкция ААМ
Инструкция аам выполняется после перемножения неупакованных BCD-цифр (т. е. чисел в диапазоне от 0 до 9). В примере 5.23 приведен листинг программы, которая умножает 5 на 5. Произведение 0019Н сохраняется в регистре АХ. После коррекции результата командой аам регистр АХ содержит код 0205Н — число 25 в формате неупакованных BCD-данных. Прибавив 3030Н, получим результат в формате ASCII-чисел — 3235Н.
; Пример 5.23. Коррекция произведения
0000 ВО 05	MOV	AL, 5	; загрузить множимое
0002 В1 05	MOV	CL, 5	; загрузить множитель
0004 F6 Е1	MUL	CL	
0006 D4 0А	ААМ		; скорректировать
Инструкция аам выполняет требуемое преобразование за счет деления содержимого регистра АХ на 10. Остаток записывается в регистр AL, частное — в АН. Инструкция аам кодируется двумя байтами; во втором байте записывается значение делителя — 10, или ОАН. Это значение может быть произвольным; например, если во втором байте машинного кода аам записано ОВН, инструкция аам использует делитель 118.
Команда аам позволяет также выполнять преобразование из двоичных чисел в неупакованные BCD. Если число в регистре АХ ограничено диапазоном 0—99, инст
8 Ассемблер позволяет указывать делитель при команде ААМ и множитель при команде AAD — в виде AAM/AAD <п>. Примеры — ААМ 16, AAD 2 и т. д. Практический интерес представляют значения п = 2, 10, 16. — Пер.
Арифметические и логические инструкции 231
рукция аам корректно преобразует его в BCD-формат. Например, если содержимое регистра АХ = 060Н (96), то после выполнения инструкции адм в нем будет сформирован код 0906Н — число 96 в формате неупакованных BCD-чисел. Добавив 3030Н, получим результат в формате ASCH-чисел.
В примере 5.24 показано преобразование 16-битного значения регистра АХ в четырехзначное ASCII-число, с использованием команд div и аам. (Заметим, что приведенная программа пригодна для преобразования чисел в диапазоне 0—9999.) Сначала в регистр DX записывается ноль, а затем 32-битное значение пары регистров DX—АХ делится на 100. После деления в регистре АХ будет записано частное, а в DX — остаток. Например, если содержимое регистра АХ = 24510, то после деления на 100 частное будет в регистре АХ = 2, а остаток в DX = 45. Частное от деления на 100 — это число сотен, а остаток — число единиц. Единицы и сотни преобразуются в BCD-формат командами аам, с добавлением 3030Н для получения ASCII-чисел.
Пример 5.24. Преобразование числа в диапазоне 0—9999 в ASCII-формат
0000 33 D2	XOR	DX, DX	; обнулить регистр DX
0002 В9 0064	MOV	CX,100	; разделить DX—AX на 100
0005 F7 F1	DIV	CX	
0007 D4 0А	ААМ		; преобразовать частное в BCD
0009 05 3030	ADD	AX,3030H	; преобразовать в ASCII
000С 92	XCHG	AX, DX	; повторить для остатка
GOOD D4 0А	ААМ		
CC0F 05 3030	ADD	AX,3030H	
В примере 5.25 полученное десятичное число отображается на экране DOS-функцией 02Н. Для преобразования содержимого регистра AL в BCD-формат используется инструкция аам, после чего, для дальнейшего преобразования в ASCII-формат, — команда add ах,зозон. Символ ддя DOS-функции 02Н формируется в регистре DL. Сначала выводится наиболее значимая цифра (из регистра АН), затем — наименее значимая (из регистра AL). Заметим, что вызов DOS-функции (INT 21Н) изменяет значение регистра AL.
Пример 5.25. Отображение двоичного 8-битного числа в десятичном формате
; Программа отображает число, загруженное в регистр AL (48Н),
• в десятичном формате		
	.MODEL TINY	; выбрать модель TINY
0000	.CODE	; начало сегмента кода
	.STARTUP	; начало программы
0100 ВО 48	MOV AL,48H	; загрузить в AL тестовое значение
0102 В4 00	MOV AH, 0	; обнулить регистр АН
0104 D4 0А	AAM	; преобразовать в BCD
0106 05 3030	ADD AX,3030H;	; преобразовать в ASCII
0109 8А D4	MOV DL,AH	; вывести наиболее значимую цифру
010В В4 02	MOV AH,2	
010D 50	PUSH AX	; сохранить наименее значимую цифру
010Е CD 21	INT 21H	
232
ОНО
58
POP
АХ
; восстановить AL
0111
0113
8А DO
CD 21
MOV
INT
DL, AL 21Н
; отобразить наименее значимую цифру
.EXIT
; выход в DOS
END
конец исходного текста
Инструкция AAS
Инструкция aas используется для коррекции содержимого регистра АХ после вцЧи тания. Например, при вычитании 35Н из 39Н результат 04Н нс требует коррекции В данном случае выполнение инструкции aas не изменит значений регистров АН AL. Напротив, после вычитания 38Н из 37Н выполнение инструкции aas изменит значение в регистре AL (оно станет равным 09Н) и уменьшит значение регистра АН на I.
5.4. Логические команды
Базовые логические инструкции — это and, or, xor и not. Инструкция test представляет собой разновидность операции and и тоже относится к логическим инструкциям. Мы также рассмотрим команду neg, сходную по действию с not9.
Логические операции позволяют манипулировать отдельными битами: устанавливать их в I, сбрасывать в 0 и инвертировать. Эти операции часто требуются при работе с периферийными устройствами вычислительной системы. Все логические инструкции воздействуют на флаги процессора10 11: флаги переноса (С) и переполнения (О) обнуляются, а остальные отражают свойства результата.
При использовании логических команд следует иметь в виду, что биты в байтах, словах и двойных словах нумеруются от 0й. Бит номер 0 — это крайний бит справа. В байте биты нумеруются от 0 до 7, в слове — от 0 до 15. В двойном слове крайний бит слева имеет номер 31.
Инструкция AND
Инструкция and выполняет логическое умножение, иначе логическую операцию И» в соответствии с таблицей истинности, показанной на рис. 5.3 и в логических жениях обозначается символом >'л". По этой таблице результат X логического у жения булевых переменных А и В равен 1, только если обе переменные А и В Р 1. При прочих сочетаниях А и В значение X равно 0. Запомните, что 0 л х -любом х, а 1 л 1 = 1.
9 Команда арифметической инверсии NEG относится к арифметическим инструкциям-поразрядной инверсии NOT — логическая. — Лер.
10 За исключением команды NOT. — Пер.
11 То, что биты отсчитываются от 0, необходимо учитывать, в основном, при использован проверки и поиска бит (ВТ, BSF и т. д ), где используются номера бит. — Пер.
233
фМ^тические и логические инструкции
vKUiiH and может заменить соответствующие электронные логические элемен-комбинаторных схем при достаточном запасе производительности, что осо-тЫ часто используется во встроенных системах управления. (Пример микрокон-®еНН°еоа для построения встроенных систем — однокристальная микро-ЭВМ Intel со структурой IBM PC.) Время выполнения команды and даже в микро-цессорс 8086 составляет всего лишь 1 мкс. Реализация логических функций про-nP°UHibiM способом позволяет значительно сократить стоимость системы. Стои-логического элемента "И" составляет около $0.40, в то время как стоимость ^яНцОй памяти для хранения команды and оценивается как $0.0001. Замена П°Сяннтгорных схем логическими инструкциями широко используется в системах управления12.
А В X
0	0	0
0	1	0
1	0	0
1	1	1
X
а)	б)
Рис. 5.3. Таблица истинности для операции "И" (а) и обозначение логического элемента "И13" (б)
Операция and позволяет выборочно обнулить, или маскировать, некоторые биты приемника. Пример маскирования бит показан на рис. 5.4. Четыре бита слева обнуляются, поскольку соответствующие биты маски равны 0. Остальные биты маски равны I и соответствующие биты приемника не изменяются.
хххх	хххх	Исходное значение
Операция "И"	0 0 0 0	1	1	1	1 Маска
0000	хххх	Результат
Рис. 5.4. Обнуление бит инструкцией and
сег^НСТрукциях and применимы почти все методы адресации. В таких инструкциях один Нь,и Регистр не может быть использован для хранения операнда, и только иНст% 3 ог,еРаидов может находиться в памяти. В табл. 5.14 приведены примеры РУКций and.
----------------
^ЬНых Рамм,,°я реализации комбинаторных схем создан особый класс управляющих вычисли-’’’ 1,Р°гРаммируемые логические контроллеры. При разработке программного /1ог,1ческих контроллеров используются графические изображения логических эле-ц еР. °*рамма при этом выглядит как релейно-контактная пли функциональная схема. —
и Да;
В к,|,,гс приведены условные графические обозначения логических элементов в с американским стандартом, который отличается от принятого в России. — Рсд.
234		s
	Таблица 5.14. Примеры инструкций and
Команда	Действие
AND AL,BL	AL = AL л BL
AND CX,DX	CX = CX a DX
AND ECX,EDI	ЕСХ = ECX a EDI
AND CL,33H	CL = CL a 33H
AND DI,4FFFH	DI = DI a 4FFFH
AND ESI,34H	ESI = ESI a 00000034H
AND AX,[DI]	Логическое умножение бит содержимого регистра АХ на биты слова находящегося в сегменте данных по смещению, указанного в регистре DI
AND ARRAY[SI], AL	Логическое умножение байта, расположенного в сегменте данных по смещению array + SI, и содержимого регистра AL; результат сохраняется в сегменте данных
AND [EAX],CL	Логическое умножение содержимого регистра CL на содержимое сегмента данных по смещению, указанному в регистре ЕАХ; результат сохраняется в памяти
Преобразование ASCII-чисел в BCD может быть выполнено инструкцией and — для этого маска должна содержать 0 в старшей тетраде и I в младшей. В результате маскирования старшей тетрады значения ASCll-кодов ЗОН—39Н преобразуются в двоичные числа 0—9. В примере 5.26 приведена короткая программа, преобразующая ASCII-число, хранящееся в регистре ВХ, к BCD-формату. Инструкция and в этом примере выполняет преобразование сразу двух ASCII-цифр.
Листинг 5.26. Преобразование ASCII-числа в формат BCD
0000 ВВ 3135	MOV ВХ,3135Н
0003 81 ЕЗ 0F0F AND BX,0F0FH
; загрузить ASCII-число
; маскировать старшие тетрады
; регистров BL и ВН
Инструкция OR
Инструкция or выполняет логическое сложение, иначе логическую 0,,e^JJ,||-"ИЛИ", в соответствии с таблицей истинности на рис. 5.5 и в логических выра ях обозначается символом "v”. Результат логической функции "ИЛИ" равен хотя бы одно из входных значений равно I. Результат равен 0 только в том
когда оба входных значения равны.
Во встроенных системах управления инструкция or позволяет заменить лоГ^к элементы "ИЛИ" комбинаторных схем. Выигрыш в стоимости — такой же,
замене элементов "И".
Рис. 5.6 иллюстрирует применение операции "ИЛИ" для установки бит в 1 мере произвольное число объединяется по "ИЛИ" с маской, содержащей
сКИС ПРН
В лРг
В MJ”4'
^риФметические и логические инструкции
235
Й тетраде, т. е. (хххх хххх) v (0000 1111). Результат равен хххх 1111 — четыре бита папа установлены в 1, а прочие остались без изменения. Таким образом, операция ^д|Г используется для установки бит в 1, а операция "И” — для обнуления бит.
А в х
0	0	0
0	1	1
1	0	1
1	1	1
=г>--
а)	б)
рис. 5.5. Таблица истинности для операции "ИЛИ" (а) и обозначение логического элемента "ИЛИ" (б)
хххх	хххх	Исходное значение
Операция "ИЛИ" 0 0 0 0	1	1	1	1 Маска
хххх	1111	Результат
Рис. 5.6. Установка бит инструкцией OR
В инструкциях or используются все методы адресации; не допускается только задание в качестве операнда сегментного регистра. Примеры инструкций or приведены в табл. 5.15.
Таблица 5.15. Примеры инструкций or
Команда
Действие
АН,ВЬ	AH = AH v BL
°R SI,[)X 0R ЕАХ, ЕВХ °R dH,0A3H °R Sp, 990DH °R EBP, io °* D3<, [BX]	SI = SI v DX EAX = EAX v EBX DH = DH vA3H SP = SP v 990DH EBP = EBP v 0000000AH Логическое сложение содержимого регистра DX с содержимым слова, расположенного в сегменте данных по смещению, указанному в регистре ВХ
Rt)ATEs!Dl +	2],al Логическое сложение байта, находящегося в сегменте данных по смещению dates + DI + 2, с содержимым регистра AL
Чк"°Ло*ИМ, . PDev-r.	что в регистре АХ находится результат умножения двух BCD-чисел,
Чц T"P°Hai 4Hoe BCD-	1ный командой аам. Результат представляет собой двузначное неупа-
	-число. В примере 5.27 приведена программа, преобразующая резуль-
236
тат в пару ASCll-цифр. Преобразование выполняется командой or ах,зозон: 0305Н в регистре АХ становится равным 3335Н. Заметим, что вместо or в данно^ случае можно воспользоваться командой сложения: add ах,зозон.
Пример 5.27. Преобразование неупакованного BCD-числа в ASCII-формат
0000	во	05	MOV	AL, 5	; 'загрузить сомножитель
0002	ВЗ	07	MOV	BL, 7	
0004	'го	ЕЗ	MUL	BL	
0006	D4	0А	ААМ		; коррекция произведения
0008	0D	3030	OR	AX, 3030H	; преобразование в ASCII-формат
Инструкция XOR
Разница между инструкциями xor и or заключается в том, что при входных значениях I и I функция or возвращает 1, a xor - 0.
В соответствии с таблицей истинности, показанной на рис. 5.7, функция xor возвращает 1 в том случае, если входные значения различны. Если они совпадают, то результат инструкции xor равен 0. По этой причине элемент, соответствующий этой функции, также называют компаратором. Функция xor, иначе говоря, выполняет логическую операцию "Исключающее ИЛИ" и в логических выражениях обозначается символом "Ф".
а)
Рис. 5.7. Таблица истинности для операции/'Исключающее ИЛИ" (а) и обозначение соответствующего логического элемента (б)
В инструкциях xor используются все методы адресации, но при этом не допускаете* задание в качестве операнда сегментного регистра. Примеры инструкций xor при*0 лены в табл. 5.16.
Таблица 5.16. Примеры инструкций xor
Команда
XOR CH,DL
XOR SI,BX
Действие
СН = СН Ф DL
SI = SI Ф ВХ
. тические и логические инструкции			237
		Таблица 5.16 (окончание)
	Действие	
r.DI XOR ЕВ-' ХОК Ан,оен X0R XOR Esl' '°0 XOR OX-	ЕВХ = ЕВХ Ф EDI АН = АН © ЕЕН DI = DI Ф 00DDH ESI = ESI Ф 00000064Н Операция "Исключающее ИЛИ" над содержимым регистра DX и слова, расположенного в сегменте данных по смещению, указанному в регистре SI	
XOR dates • di + 2] ,AL Операция "Исключающее ИЛИ" над содержимым регистра AL и байтом, находящимся в сегменте данных по смещению DATES + DI + 2
Инструкция хор обеспечивает замену аналогичных дискретных элементов в комбинаторных схемах при разработке встроенных систем управления; выигрыш в стоимости — такой же, как при замене элементов "И" и "ИЛИ".
Инструкция xor используется для инвертирования отдельных битов данных, как показано на рис. 5.8.
	X	X	X	X	X	X	X	X	Исходное значение
“Исключающее ИЛИ"	0	0	0	0	1	1	1	1	Маска
	X	X	X	X	X	X	X	X	Результат
Рис. 5.8. Инвертирование бит инструкцией XOR
Пусть требуется инвертировать значения десяти старших бит регистра ВХ без изменения остальных шести бит. Эту задачу выполняет инструкция xor bx,offcoh. Итак, команда xor изменяет значение бит на противоположное, and обнуляет биты, a or устан а вливает. Эти инструкции позволяют реализовать любые логические функ-и на уровне бит регистров и ячеек памяти.
Из применений команды xor — обнуление значения регистра. Эта операция РУетСТ б,,ТЬ вь,полнена командой mov, например, mov сн,оон. Но эта команда коди-ги<^Яптремя байтами, в то время как инструкция xor сн,сн, также обнуляющая ре-р <~Н, занимает в памяти всего два байта.
6HJMepe 5.28 приведена короткая последовательность инструкций для изменения иНве Регистра СХ: биты 0 и 1 обнуляются, биты 9 и 10 устанавливаются в 1, бит 12 а ИрУется. Установка в 1 выполняется командой or, сброс в 0 — инструкцией
^^Инвертирование — командой xor.
5.28. Листинг
°°°0 81
программы, использующей команды or, and и xor
С9	0600	OR
Е1	FC	AND
F1	1000	XOR
СХ,0600Н
СХ, 0FFFCH
СХ, ЮООН
; установить биты 9 и 10
; обнулить биты 0 и 1
; инвертировать бит 12
238(лава $
Инструкции проверки бит
Инструкция test выполняет операцию and, но, в отличие от команды and, она це изменяет значение приемника, воздействуя только на флаги процессора. Методы адресации в инструкции test — те же самые, что в инструкции and. Примеры команды test приведены в табл. 5.17.
	Таблица 5.17. Примеры инструкций test
Команда	Действие
TEST DL, DH	Логическое умножение содержимого регистров DL и DH, без изменения регистра DL
TEST СХ,ВХ	Логическое умножение содержимого регистров СХ и ВХ, без изменения регистра СХ
TEST EDX,ЕСХ	Логическое умножение содержимого регистров EDX и ЕСХ, без изменения регистра EDX
TEST АН,4	Логическое умножение содержимого регистра АН на 4 (проверка второго бита регистра АН)
PEST ЕАХ, 256	Логическое умножение содержимого регистра ЕАХ на 256 (проверка восьмого бита регистра АХ/ЕАХ, или нулевого бита АН)
Инструкция test подобна команде смр. Разница в том, что test обычно используется для проверки значения одного бита (или, реже, нескольких отдельных бит), в то время как смр проверяет значение целого байта или слова. После выполнения команды test флаг нуля Z = 1, если проверяемый бит равен 0; Z = 0 (результат не ноль), если проверяемый бит установлен в 1.
За инструкцией test, как правило, следует условная команда, например, инструкция условного перехода jz (jump if zero — переход по нулю) или jnz (jump if not zero — переход, если результат не ноль). В приемнике команды test находятся данные для проверки, а в источнике — маска, обычно в виде непосредственного значения. Для проверки крайнего бита справа (бит номер 0) маска равна 1; бит номер I проверяет-
ся маской 2, следующий бит — маской 4 и т. д.
В примере 5.29 приведена короткая программа для проверки крайних битов — и справа — в регистре AL. Маска 1 используется для проверки правого бита, а (80Н) — для проверки крайнего бита слева. После каждой команды test выполня# ся инструкция jnz. В зависимости от результатов проверки программа выполня линейно (если биты 0 и 7 равны 0) либо переходит на одну из меток right (
бит 0 равен 1) или left (если бит 7 равен I, а бит 0 равен 0).
Пример 5.29. Проверка битов 0 и 7
0000 А8 01	TEST	AL, 1	; проверка	бита справа
0002 75 1С	JNZ	RIGHT	; переход	на метку RIGHT, если 1
0004 АЗ 80	TEST	AL,128	; проверка	бита слева
0006 75 38	JNZ	LEFT	; переход	на метку LEFT, если 1
ифМетические и логические инструкции
239
оцессорах 80386—Pentium 4 имеются дополнительные инструкции для проверки с указанием его номера. Инструкции этой группы приведены в табл. 5.18.
В ПР бига
Таблица 5.18. Инструкции проверки бита
Команд3	Действие
ВТ	Проверка в приемнике бита, номер которого задан в источнике
втс	Проверка и инверсия заданного бита
BTR	Проверка и обнуление заданного бита
BTS	Проверка и установка в 1 заданного, бита
gee четыре инструкции проверяют значение бита в приемнике; номер бита определяется значением источника. Например, инструкция вт ах, 4 выполняет проверку бита 4 регистра АХ. Результат отображается во флаге переноса С. Если бит установлен в I. флаг С = I; если бит сброшен, то С = 0.
Инструкции btc/btr/bts после проверки бита изменяют его значение. Так, инструкция втс ах, 4 инвертирует значение бита 4 после его проверки, btr ах, 4 обнуляет бит 4 (после его проверки), a bts ах, 4 устанавливает бит 4 в 1 (после его проверки).
В примере 5.30 приведена программа, выполняющая те же действия, что и программа в примере 5.28. В этом варианте программы для обнуления бит используется команда btr (вместо and), для установки — bts (вместо or), а для инвертирования — втс (вместо xor).
I Пример 5.30. Программирование базовых логических операций командами bts, btr и втс
0000 OF ВА	Е9 09	BTS	СХ, 9	; установить бит 9
0004 0F ВА	Е9 ОА	BTS	СХ, 10	; установить бит 10
0008 OF ВА	F1 00	BTR	СХ,0	; обнулить бит 0
°00С OF ВА	F1 01	BTR	СХ, 1	; обнулить бит 1
0010 0F ВА	F9 ОС	ВТС	СХ, 12	; инвертировать бит 12
Инструкции NOTw NEG g
процессорах 8086-Pentinm 4 к°Манда ^Кого Все	. I...... ----------— |------ ------- ---!..—.... --------
При ет°Ды адресации (при этом не допускается использовать сегментный регистр).
еРы инструкций not и neg приведены в табл. 5.19.
предусмотрены две команды инвертирования:
NOT для логического (побитового) инвертирования и neg — для арифмети-инвертирования. Эти команды работают с одним операндом и допускают
Таблица 5.19. Примеры инструкций not и neg
Действие
Логическое инвертирование содержимого регистра СН
Арифметическое инвертирование содержимого регистра СН
240
		—.— Таблица 5.19 (окончание)			
Команда		Действие	
NEG	Ал	Арифметическое инвертирование содержимого регистра АХ	
NOT	ЕВХ	Логическое инвертирование содержимого регистра ЕВХ	
NEG	ЕСХ	Арифметическое инвертирование содержимого регистра ЕСХ	
NOT	TEMP	Логическое инвертирование содержимого сегмента данных по НИЮ TEMP	смеще-
NOT	BYTE PTRfBX]	Логическое инвертирование байта, расположенного в сегменте по смещению, указанному в регистре ВХ	данных
Инструкция not изменяет значение всех бит байта, слова или двойного слова на противоположное. Результатом команды neg является число с обратным знаком в дополнительном коде. Команда not относится к логическим операциям, a neg — к арифметическим.
5.5. Сдвиги, в том числе и циклические
Команды сдвигов и циклических сдвигов, наряду с инструкциями and, or, xor и not, обеспечивают работу с данными на уровне отдельных бит, что часто используется при управлении внешними устройствами. Поддерживаются различные варианты сдвигов и циклических сдвигов, для регистров и данных в памяти.
Сдвиги
При сдвиге последовательность бит источника смешается влево или вправо. Сдвиг на и бит влево означает умножение на 2+", а сдвиг вправо — деление на 2”п. Сдвиги, выполняемые без учета знакового бита, называются логическими; при арифметических сдвигах знаковый разряд исходного значения сохраняется. Действие команд сдвига показано на рис. 5.9.
На рис. 5.9 показаны два сдвига вправо и два сдвига влево. При логических сдви1^* в освобождающихся позициях формируется 0—в крайней позиции справа сдвиге влево) или в крайней позиции слева (при сдвиге вправо). Имеется команды арифметического сдвига. Арифметический и логический сдвиги идентичны. Сдвиги вправо различаются — при арифметическом сдвиге в к^а че-позиции справа воспроизводится исходное значение знакового бита, а при ском сдвиге эта позиция обнуляется.
Логические сдвиги используются для умножения и деления беззнаковых операции над знаковыми данными выполняются за счет арифметических При каждом сдвиге влево на один бит значение данных удваивается, а прcHbIyaC^ вправо — уменьшается вдвое. То есть, сдвиг на два бита увеличивает или У значение данных в 4 раза.	доПУ®*
Примеры инструкций сдвига приведены в табл. 5.20. Все методы тимы, нельзя лишь использовать в качестве операнда сегментный РеГИ
241
фактические и логические инструкции
в может быть задано двумя способами — непосредственным значением или с сД0>| ь10 регистра CL. Если число сдвигов задано регистром CL, его значение по-П°М°ф1Г1ОЛ11ения операции остается прежним. Заметим, что число сдвигов вычисляем6 модулю 32, т. е. счетчик 33 задает сдвиг на один бит (1 — остаток от деления 3^а32)-
Операнд
SAL
Рис. 5.9. Действие инструкций сдвига
Таблица 5.20. Примеры инструкций сдвига
Действие
SHL дх, 1
SHR ВХ,12
SHR ЕСХ,10
S*L DATAI, CL
SAR SI,2 ^JDX,14
Логический сдвиг содержимого регистра АХ на один бит влево
Логический сдвиг содержимого регистра ВХ на 12 бит вправо
Логический сдвиг ЕСХ на 10 бит вправо
Арифметический сдвиг байта, расположенного в сегменте данных по смещению datai, влево на число бит, заданное регистром CL
Арифметический сдвиг содержимого регистра SI на два бита вправо
Арифметический сдвиг содержимого регистра EDX на 14 бит вправо
Чим
gPe 5-31 приведены два варианта сдвига содержимого регистра DX на 14 бит *^Ром ПеРв°м варианте число сдвигов задано непосредственным значением. Во сЧетиВарианте число 14 загружается в регистр CL, который используется в качества сдвигов.
-------------------------------------------------------------[asss
Пример 5.31. Варианты задания числа сдвигов
0000 С1 Е2 0Е	SHL DX,14	; константа
0003 Bl 0Е	MOV CL,14	
0005 D3 Е2	SHL DX,CL	; переменное значение
Пусть требуется умножить содержимое регистра АХ на I0. Решение этой задачи пои помощи сдвигов и сложений показано в примере 5.32. Сначала исходное значение удваивается за счет сдвига влево на одну позицию. Удвоенное значение сохраняется и его копия увеличивается в 4 раза за счет сдвига влево на две позиции. Полученное восьмикратное значение складывается с удвоенным значением, в результате чего получается исходное число, умноженное на Ю. Число Ю в двоичном коде выглядит как ЮЮ. Позиции единиц определяют число слагаемых и количество сдвигов для вычисления слагаемых. С использованием сдвигов и сложений можно составить программу для умножения на любую константу. Заметим, что этот способ умножения эффективен лишь в ранних версиях микропроцессоров Intel.
| Пример 5.32. Умножение посредством сдвигов и сложений	> 4
0000 0002 0004 0007	DI Е0 8В D8		Умножение АХ на 10			(1010) ; AX*2 ; AX* 8
			02	SHL MOV SHL ADD	AX, 1 BX,AX AX,2 AX, BX	
	С1 03	Е0 СЗ				
			Умножение АХ		на 18	(10010)
0009	D1	Е0		SHL	AX, 1	; AX*2
000В	8В	D8		MOV	BX,AX	
000D	С1	Е0	03	SHL	AX, 3	; AX*16
0010	03	СЗ		ADD	AX,BX	
			Умножение АХ		на 5	(101)
0012	8В	D8		MOV	BX,AX	
0014	D1	Е0		SHL	AX, 1	; AX*2
0016	D1	Е0		SHL	AX, 1	; AX* 4
0018	03	СЗ		ADD	AX, BX	
Сдвиги с удвоенной точностью (80386—Pentium 4)
Начиная с процессора 80386, в систему команд включены сдвиги с удвоенной том ностью: инструкции shld (shift left — сдвиг влево) и shrd (shift right — сдвиг впр * В отличие от рассмотренных команд сдвига, в инструкциях shld и shrd указыва три операнда: первый — 16- или 32-битный регистр или данные в памяти, bT°POqcC-16- или 32-битный регистр. Инструкции shld и shrd модифицируют флаги пр°
сора.
Рассмотрим действие этих команд на примерах. Инструкция shrd ах,вх,12 вь1ПоеГи* ет логический сдвиг содержимого регистра АХ на 12 бит вправо. Содержимое стра ВХ не изменяется, но его 12 младших (правых) бит копируются в 12 стар
243
рфметические и логические инструкции —
bix) бит регистра АХ. Счетчик сдвигов может быть задан константой или регист-, CL как в других инструкциях сдвига.
ром
ЛйСтрукння shld евх, есх, 16 сдвигает влево содержимое регистра ЕВХ. После сдвига ержимого регистра ЕВХ в его младшее слово копируется старшая часть регистра Содержимое ЕСХ остается прежним.
циклические сдвиги
у|нстрУкции Циклического сдвига переметают значения бит содержимого регистра иди данных в памяти по кольцу так, что вытолкнутый разряд передается в освободившуюся позицию на противоположном конце — либо напрямую, либо через бит переноса14. Эти инструкции часто используются для сдвига данных многократной размерности. Действие инструкций вращения показано на рис. 5.10.
RCL
ROL
RCR
ROR
Рис. 5.10. Действие инструкций циклического сдвига
в инструкциях циклического сдвига тс же самые, что и в коман-: сдвигов задается константой или регистром CL. Примеры инст-
JT°4H адресации i Рук СД-ИГа' Счетчик & Ии Циклического сдвига приведены в табл. 5.21.
^Римере 5.33 приведена программа сдвига 48-битного числа на одну позицию вле-Нь*По°СТаи ,ЯЮ1П1,е ^-битного значения заданы регистрами DX, ВХ и АХ. Сначала МоГо Ниется сдвиг наименее значимой части (АХ). При этом старший бит содержи-*ГИстРа АХ передается во флаг С. Сдвиг следующей составляющей (ВХ) вы-ется командой вращения через бит переноса; при этом значение бита С, полу-
СС*Цй сдвиг иначе называют сдвигом но кольну. — Пер.
244 Глав*»
чеццое на первом шаге, передается в младший бит регистра ВХ. Значение бита пе^ pciioca С, полученное в результате выполнения инструкции rcl вх,1, используете^ при следующем сдвиге для формирования младшего бита старшей части результа ‘ та (DX).
Пример 5.33. Сдвиг данных многократной размерности
0000 DI Е0 0002 DI D3 0004 DI D2	SHL АХ,1	j RCL ВХ,	1	'л RCL DX,	1	( 1 4 Таблица 5.21. Примеры инструкций циклического сдвига
Команда	п -Действие
ROL SI,14	Сдвиг содержимого регистра SI по кольцу на 14 бит влево
RCL BL,6	Циклический сдвиг содержимого регистра BL влево через бит переноса на 6 разрядов
ROL ЕСХ,18	Циклический сдвиг содержимого регистра ЕСХ влево на 18 бит
RCR АН,СЬ	Сдвиг содержимого регистра АН вправо по кольцу через бит переноса; число сдвигов задано регистром CL
ROR WORD PTR[BP),2	Циклический сдвиг слова, расположенного в сегменте стека по смещению, указанному в регистре ВР, на 2 позиции вправо
Инструкции сканирования бит
Инструкции сканирования бит позволяют определить номер первого бита, установленного в 1, не сдвигая содержимого данных. Эти инструкции доступны только в процессорах 80386—Pentium 4.
Таких инструкций две — bsf (bit scan forward — сканирование бит вперед) для сканирования в прямом направлении, от младших бит к старшим, и bsr (bit scan reverse — сканирование бит назад) для сканирования в обратном направлении. Обе инструкции выполняют поиск в источнике команды первого бита, установленного в 1. Команда bsf ведет поиск слева направо, a bsr — справа налево, начиная® крайней правой позиции. При обнаружении 1 флаг нуля Z сбрасывается, а номер позиции сохраняется в приемнике. Если ни один из разрядов источника не соД®Р* жит 1 (т. е. источник равен нулю), флаг Z устанавливается в 1.
Рассмотрим, например, выполнение инструкции bsf евх,еах при ЕАХ = бОООООООН* Эта инструкция сканирует биты регистра ЕАХ в направлении от младших бит старшим. Первый бит, установленный в 1, находится в позиции 30. В результа » в регистр ЕВХ записывается число 30, и флаг Z обнуляется. Если заменить инстрУ* цию bsf на bsr, то для того же значения регистра ЕАХ в регистр ЕВХ будет запИ но число 29, а флаг нуля Z будет равен 0.
245
фМетИЧеСКИв И логические ИНСТРУКЧИИ
5 6 СРавнение СТРОК
,оВые инструкции (movs, lods, stos, ins и outs), рассмотренные в главе 4, дают С'ГР0^ bHbie преимущества при обработке блоков данных и удобны в применении. зНаЧ1м разделе вы познакомитесь с дополнительными строковыми командами — для ВэТ данных в массиве (scas) и для сравнения содержимого двух массивов cmps.
цнстрУкЧия SCAS
трукция сканирования строки scas (string scan — сканирование строки) сравни-И т содержимое регистра AL, АХ или ЕАХ с байтом, словом или двойным словом блока памяти. Сравнение выполняется за счет вычитания, без изменения значений ,ккумулятора и данных в памяти. Байтовая инструкция обозначается мнемоникой sCASb, команда для сравнения слов — мнемоникой scasw, а команда для сравнения двойных слов обозначается как scasd. Во всех случаях данные для сравнения находятся в аккумуляторе и в дополнительном сегменте данных по смещению DL Заметим, что действующий по умолчанию сегмент ES не может быть изменен префиксом переназначения сегмента.
Подобно другим строковым инструкциям, scas использует флаг D для выбора направления изменения регистра-указателя DL Циклическое выполнение инструкции scas обеспечивается префиксами повторения.
Предположим, что по смещению block определен 100-байтный массив. Требуется выяснить, не содержится ли в этом массиве байт со значением 0. Решение с использованием инструкции scasb приведено в примере 5.34. В этом примере перед командой scasb задан префикс repne (repeat while not equal — повторить пока не эквивалентно). Префикс repne организует повторное выполнение инструкции scasb, пока сх не ноль и значения сравниваемых данных различны. Другой префикс repe (repeat while equal — повторить пока эквивалентно) задает повторное выполнение строковой команды, пока содержимое регистра СХ не будет равно 0 и данные совпадают. Любой префикс повторения уменьшает содержимое регистра СХ, не изме-Няя флагов, при каждом выполнении строковой команды. Сама же инструкция SCASB модифицирует флаги.
5-34. Поиск байта со значением О
0003	BF 0011 R M0V	DI'0FFSET BL0CK '	смещение данных
0004	CLD	'	Режим автоинкРемента
00q7	В9 0064	MOV	СХД00	;	счетчик
OoQg	32 СО	XOR	AL,AL	;	обнуление регистра	AL
F2/AE	REPNE SCASB	;	поиск
Пред
ЩСНЬ1 °л°жим, что при обработке текстовых данных пробелы должны быть пропу-На ПроцедУРа для пропуска пробелов приведена в примере 5.35. Предполагается, Ьходе регистр D1 адресует строку ASCII-символов; максимальная длина стро-^а^т- Поскольку требуется пропустить данные с определенным значением, scasb используется с префиксом repe. Инструкция scasb повторяется, пока
содержимое регистра DI указывает на пробелы, в пределах 256 байт. (ASC(j пробела равен 20Н.)
Пример 5.35. Процедура пропуска пробелов в тексте
0000	SKIP	PROC FAR
0000 FC		CLD	; режим автоинкремента
0001 В9 0100		MOV CX,256 ; счетчик
0004 ВО 20		MOV AL,20H ; ASCII-код пробела
0006 F3/AE		REPE SCASB ; поиск
0008 СВ		RET
0009	SKIP	ENDP
Инструкция CMPS
Инструкция сравнения строк cmps (compare strings — сравнение строк) сравнивает элементы двух массивов. Для сравнения байт используется команда cmpsb; для слов — команда cmpsw, а для двойных слов — cmpsd. Данные для сравнения находятся в сегменте данных по смещению, указанному в регистре SI, и в дополнительном сегменте по смещению DI. Инструкция cmps изменяет значения обоих указателей SI и DI. Обычно команда cmps применяется с префиксом repe или repne. Эти префиксы обозначаются так же, как repz (repeat while zero — повторять пока ноль) и repnz (repeat while not zero — повторять пока не ноль).
В примере 5.36 приведена процедура, которая сравнивает две области памяти line и table до несовпадения значений. Перед командой cmpsb указан префикс repe, что обеспечивает продолжение поиска до обнаружения разницы в данных. Цикл поиска продолжается, пока содержимое регистра СХ не будет равно 0 и данные совпадут. После завершения цикла cmpsb результат поиска отражается во флагах процессора. Данные в массивах различны, если на выходе содержимое регистра СХ не равно О или флаг Z = 1 (последняя пара данных не одинакова)15.
...........................................................................
Пример 5.36. Сравнение двух массивов
0000		MATCH	PROC	FAR		
0000	BE	0075 R	MOV	SI,OFFSET	LINE	; смещение LINE
0003	BF	007F R	MOV	DI,OFFSET	TABLE	; смещение TABLE
0006	FC		CLD			; режим автоинкремента SI/DI
0007	B9	000A	MOV	CX,100		; счетчик
000A	F3/A6		REPE	CMPSB		; поиск несовпадения
000С СВ	RET
GOOD	MATCH ENDP
вовсе не означает, что поиск неудачен. ®о3^нО фЛ®г епрпирй плпр nninikiY TimTnMV не СХ. 3 ИМС
15 СХ =0 после завершения цикла SCASB поиск закончился успешно как раз на последней паре данных. Поэтому не СХ, а — дает во всех случаях достоверную информацию об успешности поиска; значен RPE/REPNE SCAS/CMPS проверяется, например, командой JZ/JNZ. — Пер.
^тические и логические инструкции
247
0
0
Итоги
ГлОжение (add) может быть 8-, 16- или 32-битным. Инструкция add допускает \обые операнды, кроме сегментного регистра. Большинство флагов (С, A, S, Z, р л О) в результате выполнения инструкции add изменяются. Команда сложения переносом adc суммирует указанные операнды и содержимое флага переноса В процессорах 80486—Pentium 4 имеется дополнительная инструкция xadd, Сочетающая сложение с обменом.
Инструкция инкремента (inc) увеличивает на I байт, слово или двойное слово в пегистре или в памяти. Эта инструкция оказывает воздействие на флаги, подобно команде add, хотя и не изменяет флаг переноса. При косвенной регистровой адресации в команде inc следует использовать директиву byte ptr, word ptr или DWORD PTR.
0 Операндами команды вычитания (sub) могут быть байты, слова или двойные слова в регистрах или в памяти. Допускаются почти все методы адресации; нельзя задавать только сегментные регистры. Команда вычитания модифицирует те же флаги, что и команда add. Имеется команда вычитания с заемом sbb.
□	Команда декремента (dec) уменьшает на 1 содержимое регистра или данных в памяти. Методы адресации, недопустимые в командах dec, — это непосредственная, а также регистровая с указанием сегментного регистра. Инструкция dec не изменяет флаг переноса; при косвенной адресации она предполагает использование директивы BYTE PTR, WORD PTR ИЛИ DWORD PTR.
□	Инструкция сравнения (смр) представляет собой особую форму команды вычитания — без сохранения разности. Результатом этой команды является установка флагов процессора в соответствии со значением разности операндов. В процессорах 80486—Pentium 4 имеется дополнительная команда сравнения с обменом — cmpxchg. Инструкция cmpxchg8b процессоров Pentium—Pentium 4 сравнивает и обменивает значения 8-байтных данных.
0
С]
0
Умножение предусмотрено для байтов, слов и двойных слов и может быть знаковым (imul) или беззнаковым (mul). При 8-, 16- и 32-битном умножении один из сомножителей находится в регистрах AL, АХ или ЕАХ, произведение формируется в регистрах АХ, DX—АХ или в EDX—ЕАХ. В процессорах 80186— Pentium 4 имеется специальная инструкция imul с тремя операндами, последний Из которых задан непосредственным значением. Пример — инструкция вх,сх,з, которая выполняет умножение содержимого регистра СХ на 3,
Формируя произведение в регистре ВХ.
В
качестве делителя могут быть указаны 8-, 16- и 32-битные данные. Предусмот-^ны команды знакового (idiv) и беззнакового деления (div). При 8-, 16- и рду1ТН0*1 операции делимое находится в регистрах АХ, DX—АХ или EDX—
X, частное формируется в регистрах AL, АХ или ЕАХ, а остаток — в АН, DX EDX. Остаток от знакового деления имеет тот же знак, что и делимое.
езудьтат сложения или вычитания упакованных BCD-чисел корректируется Миса,1д°и DAA или das. При сложении, вычитании, умножении и делении ASCII-ел коррекция выполняется командами ааа, aas, аам и aad.
д^СтРУкция аам позволяет преобразовать двоичное число в неупакованное BCD. Иные для коррекции, в диапазоне ООН—63Н, и результат команды находятся в
248
□
□
□
регистре AX. Команда аам выполняет преобразование за счет деления сп мого регистра АХ на 10, с сохранением остатка в регистре AL и частного в Инструкции and, or xor выполняют логические операции над битами б й слов или двойных слов, в регистрах и ячейках памяти. Эти команды молил Т°В* руют все флаги, в частности обнуляют флаги переноса (С) и переполнения (О)*И' Инструкция test выполняет логическое умножение без сохранения резул Целью этой инструкции является установка флагов для дальнейшей проверки^ Команды not и neg выполняют логическое и арифметическое инвертирова операнда.	НИс
□
В системе команд предусмотрено 8 инструкций сдвигов и циклических сдви Все они могут оперировать с байтом, словом или двойным словом в регистре ил в памяти. Первым операндом в этих командах указывается источник (он же пп емник) данных; второй операнд содержит счетчик сдвигов — либо в виде непо” средственного значения, либо в регистре CL. В процессорах 80386—Pentium 4 имеются также две команды сдвига удвоенной точности (shrd и shld).
□	Инструкция сканирования строки (scas) сравнивает содержимое регистров AL, АХ или ЕАХ с содержимым дополнительного сегмента данных по смещению DI.
□	Инструкция сравнения строк (cmps) сравнивает байты, слова или двойные слова двух областей памяти. Одна область, в дополнительном сегменте данных, адресуется смещением в регистре D1, а другая, в главном сегменте данных, — смещением в регистре SL
□	Префиксы repe и repne позволяют зациклить выполнение инструкций scas и cmps. Префикс repe продолжает выполнение строковой инструкции, пока данные равны, а префикс repne — пока не равны.
□	В примере 5.37 приведена программа с использованием инструкций, рассмотренных в этой главе. Программа выполняет поиск ASCII-строки bug в видеобуфере (он находится по адресу В800:0000). Если символы строки bug найдены, отображается символ "Y", а если не найдены, то ”N". Поиск выполняется с использованием команды cmpsb.
Пример 5.37. Использование строковой инструкции cmpsb в программе
; Программа ищет слово BUG в видеобуфере ; Если найдено, отображает Y, иначе - N
.MODEL SMALL ; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 42 55- 47	DATAI DB ' BUG'	; определить BUG
0000 “	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 В8 В800	MOV AX,0B800H	; номер сегмента В800 —
001А 8Е СО	MOV ES,AX	; в регистр ES
001С В9 07D0	MOV CX,25*80	; счетчик
001F FC	CLD	; режим автоувеличения
0020 BF 0000	MOV DI,0	; позиция в видеобуфере
этические и логические инструкции
249
L1:
		0000 R ОА	MOV PUSH CMPSE ONE INC	SI,OFFSET DATAI ; смещение BUG	
				DI J L2 DI	; сохранить позицию ; В? ; переход, если не 'В' ; следующая позиция
0026 0027 0028	дб 75 Л 7				
002А	4 *		CMPSB		; U?
002В	А° 75	Об	JNE	L2	; переход, если не 'U'
002е	47		INC	DI	; следующая позиция
002^	дб		CMPSB		; G?
002*	В2	с О	MOV	DL, ' Y'	; загрузить Y
оозо					; (вдруг найден BUG)
0032 0034	74	09 L2:	JE	L3	; переход, если не найден
лП34	5F		POP	DI	; восстановить позицию
0035	83	С7 02	ADD	DI,2	; следующее знакоместо
0038	Е2	Е9	LOOP	LI	; повторять для всего экрана
003А	57		PUSH	DI	; сохранить позицию
оозв	В2	4Е	MOV	DL,'N'	; отобразить N, если не BUG
003D		L3:			
003D	5F		POP	DI	; очистить стек
003Е	В4	02	MOV	AH, 2	; вывести символ
0040	CD	21	INT	21H	; из регистра DL
			.EXIT		; выход в DOS
			END		; конец исходного текста
Поч,
4.
Контрольные вопросы
I-	Запишите инструкцию add для прибавления:
а)	содержимого регистра ВХ к АХ
6)	12Н к AL
в)	содержимого регистра EDI к ЕВР
г)	22Н к содержимому регистра СХ
^Данных, адресуемых регистром S1, к AL
} 2 содержимого регистра СХ к данным по адресу FROG
-<сму инструкция add ЕСХ, ах ошибочна?
^°*Но ли прибавить содержимое регистра СХ к DS командой add?
ц^ите значения флагов (С, A, S, Z и О) и результата в регистре АХ после выполнения ^РУКЦИИ ADD ах, dx при АХ = 1001Н, a DX = 20FFH.
CL^HTe последовательность инструкций для суммирования значений регистров AL, BL, ’ UL и АН, с сохранением результата в регистре DH.
последовательность инструкций для сложения значений регистров АХ, ВХ, СХ, с описью суммы в регистр DI.
| 1)6 ВЬ|ИТе команды Для сложения регистров ЕСХ, EDX и ESL Сумму сохраните в регист-
&Х инструкцию, которая прибавляет к содержимому регистра DX значения регистра Флага переноса.
5.

7.
250

9. Запишите команду для прибавления 1 к содержимому регистра SP.
10. Чего не хватает в инструкции INC [ВХ]?
11. Запишите команду SUB для вычитания:
12.	а)	содержимого регистра ВХ из СХ б)	ОЕЕН из регистра DH в)	содержимого регистра DI из S1 г)	3322Н из содержимого регистра ЕВР д)	данных по адресу SI из СН е)	данных, находящихся на 10 слов дальше ячейки, адресуемой регистром SI, из рсгист pa DX ж)	содержимого регистра AL из данных по смешению frog Каковы результаты вычитания содержимого регистра ВН из DL, если до выполнения команды DL = 0F3H, а BH = 72Н (укажите величину разности и значения флагов)?
13.	Напишите последовательность инструкций для вычитания чисел, хранящихся в регистрах DI, SI и ВР из регистра АХ. Сохраните разность в регистре ВХ.
14. 15. 16. 17. 18.	Запишите инструкцию для вычитания 1 из регистра ЕВХ. Объясните действие инструкции SBB [DI-4 ] ,DX Объясните разницу между командами SUB и СМР. Где формируется результат умножения 8-битных данных? В каких регистрах формируется результат умножения 16-битных данных? В каком регистре находится младшая, а в каком старшая часть результата?
19. 20. 21. 22.	Что происходит с флагами О и С при умножении? Где сохраняется результат инструкции MUL EDI? В чем разница между командами IMUL и MUL? Напишите последовательность инструкций для получения 16-битного значения третьей степени 8-битного числа, заданного регистром DL. (Сначала загрузите в регистр DL число 5.)
23. 24. 25. 26. 27. 28. 29.	Объясните действие инструкции imul bx,dx, ЮОн. Какой регистр используется в качестве делителя при 8-битном делении? В каком регистре формируется частное при 16-битном делении? Как микропроцессор реагирует на ошибки при выполнении команды деления? Объясните разницу между командами idiv и div. Где формируется остаток при 8-битном делении? Напишите последовательность инструкций для деления содержимого регистра BL на ло, находящееся в регистре CL, и умножения результата на 2. Конечный 16-битныи F
30.	зультат сохраните в регистре DX. Какие инструкции используются при выполнении арифметических операций над
31.	числами?	. Какие инструкции используются при выполнении арифметических операций над
32.	числами? Объясните, как инструкция аам выполняет преобразование двоичных чисел в ВС
33.	мат	регИ' Запишите последовательность инструкций для преобразования беззнакового числа e|fjt стре АХ (в диапазоне 0—65535) в пятизначное BCD-число, расположенное в се данных по смещению, указанному в регистре ВХ. Старший знак сохраняется перв значащие нули допустимы.
^фметические и логические инструкции
251
Запишите последовательность инструкций для сложения 8-значных BCD-чисел, храня-щихся в регистрах АХ—ВХ и СХ—DX. (В АХ и СХ — наиболее значимые части BCD-чнеел). Результат — в СХ—DX.
35-
Запишите инструкцию AND для логического умножения:
а)	содержимого регистров ВХ и DX, с сохранением результата в регистре ВХ
б)	ОЕАН и содержимого регистра DH
в)	содержимого регистров DI и ВР, с записью результата в регистр DI
г)	1122Н и содержимого регистра ЕАХ
д)	данных по адресу, указанному в регистре ВР и содержимого регистра СХ, с сохранением результата в памяти
е)	данных, находящихся в сегменте данных за 4 слова до ячейки, адресуемой регистром SI, и содержимого регистра DX; результат — б DX
ж)	содержимого регистра AL и данных по смещению what; результат — в байте what
36 Запишите последовательность инструкций для обнуления трех старших бит регистра DH, без изменения остальных бит; результат сохраните в регистре ВН.
37.	Напишите инструкцию OR для логического сложения:
а)	содержимого регистра BL с АН, с сохранением результата в регистре АН
б)	88Н с содержимым регистра ЕСХ
в)	содержимого регистра DX с SI; результат — в регистр SI
г)	1122Н с содержимым регистра ВР
д)	данных по адресу ВХ с содержимым регистра СХ, с записью результата в память
е)	данные, находящиеся на расстоянии +40 байт от ячейки, адресуемой регистром ВР, с регистром AL; результат — в регистр AL
ж) содержимого регистра АН с данными по адресу WHEN, с сохранением результата по ад-
ресу WHEN
38.	Запишите последовательность инструкций для установки в 1 пяти младших бит регистра DI, без изменения остальных бит. Результат сохраните в регистре SI.
39.	Запишите инструкцию XOR для выполнения операции "Исключающее ИЛИ":
а)	содержимого регистров ВН и АН; результат — в регистр АН
б)	99Н и содержимого регистра CL
в)	содержимого регистров DX и DI; результат — в регистр DX
г) 1А23Н и содержимого регистра ESP
40.
41.
<2.
<3. ч
д) Данных по смещению, указанных в регистре ЕВХ и содержимого регистра DX, с сохранением результата в памяти
е) Данных, находящихся на расстоянии 30 слов за ячейкой, адресуемой регистром ВР, с регистром DI; результат — в регистр DI
*) содержимого регистра DI с данными по смещению well; результат — в DI
^пищите последовательность инструкций для установки в 1 четырех младших бит, обну-ения трех старших бит и переключения битов 7—9 регистра АХ.
Чем разница между инструкциями and и test?
^апищите инструкцию для проверки значения бита 2 регистра СН.
Чем разница между инструкциями not и neg?
^пишите инструкцию, выполняющую:
б)Сдвиг содержимого DI на 3 бита вправо, с обнулением трех старших бит
сД»иг битов регистра AL влево на одну позицию, с обнулением старшего бита
252 Гпава 5
в)	циклический сдвиг содержимого регистра AL на три бита влево
г)	циклический сдвиг через перенос регистра EDX, вправо на одну позицию
д)	сдвиг содержимого регистра DH вправо на один бит, с сохранением знакового бита
45.	Объясните действие инструкции scasb?
46.	С каким сегментом связан указатель DI при выполнении строковых команд?
47.	Для чего нужен флаг D?
48.	Объясните воздействие префикса repe на выполнение инструкции SCASB.
49.	При каких условиях завершается выполнение команды repne SCASB?
50.	Для чего предназначена команда CMPSB?
51.	Запишите последовательность инструкций для поиска байта со значением 66Н в массиве размером 300Н байт с адреса, соответствующего метке LIST.
52.	Что произойдет при выполнении команды int 21н, если АН = 02Н, a DL = 43Н?
ГЛАВА 6
Инструкции передачи управления
Введение
Инструкции передачи управления позволяют при выполнении программы изменять последовательность отработки фрагментов кода.
Решение об изменении последовательности выполнения чаше всего принимается по результатам инструкций сир или test и реализуется командами условного перехода. В этой главе рассмотрены инструкции передачи управления, включая переходы, вызовы подпрограмм, возвраты, прерывания, а также команды управления процессором.
В этой главе вы также познакомитесь с логическими операторами ассемблера (директивами. if, .ELSE, .ELSEIF, .ENDIF, .WHILE, .ENDW, .REPEAT И .UNTIL), ДОСТУПНЫМИ В MASM 6.x и TASM 5 .x. Логические операторы, реализованные в стиле языка С, позволяют автоматизировать структурное программирование на языке ассемблера.
Темы главы
В этой главе рассмотрен ряд следующих тем:
□	применение условных и безусловных переходов для управления последовательностью выполнения программы;
□	применение логических блоков .if, .repeat и .while в программе на*языке ассемблера;
□	использование инструкций вызова и возврата при разработке процедур;
□	механизм прерываний и команды для вызова прерываний;
□	применение управляющих команд для модификации флагов;
□	применение команд enter и leave при разработке процедур.
6.1.	Инструкции перехода
Инструкция безусловной передачи управления jmp (jump — переход) позволяет пропустить фрагмент программы и продолжить выполнение с инструкции, находящейся по адресу перехода. Команда условного перехода принимает решение о переходе по результатам проверки данных. Результаты отражены во флагах; значения которых оцениваются командами условного перехода. Инструкции, выполнение которых
254
Гпава 6
зависит от условий, выраженных состоянием флагов процессора, — это условный переход и условная установка1.
Применение инструкций передачи управления мы проиллюстрируем примерами, с использованием команд циклов loop, с которыми вы познакомились в главе 5; команды циклов тоже относятся к командам передачи управления.
Безусловный переход
На рис. 6.1 представлены инструкции безусловных переходов трех типов: короткого (short), ближнего (near) и дальнего (far). Инструкция короткого перехода кодируется двумя байтами, что позволяет передавать управление на расстояние от —128 до +127 байт от команды, следующей за командой перехода. Трехбайтовая команда ближнего перехода расширяет диапазон передачи управления до ±32 Кбайт, в пределах текущего сегмента кода. Напомним, что сегменты имеют циклическую организацию; это означает, что за смещением FFFFH следует смещение 0000Н. Поэтому при переходе с адреса FFFFH на два байта вперед управление будет передано по адресу 0001Н. Таким образом, переход в пределах ±32 Кбайт достигает любого адреса в текущем сегменте кода. Наконец, пятибайтная инструкция дальнего перехода допускает передачу управления по всей доступной памяти. Короткий и ближний переходы также называют внутрисегментными, а дальние — межсегментными.
Код операции
Е В	Смещение
Код операции
Е 9	Смещение Младший байт	Смещение Старший байт
Код операции
Е А	IP Младший байт	IP Старший байт	CS Младший байт	CS Старший байт
Рис. 6.1. Три формы инструкции JMP: короткого (а), ближнего (б) и дальнего (в) безусловного перехода
В процессорах 80386—Pentium 4 дальность ближнего перехода в защищенном режиме может достигать ±2 Гбайт; при этом переход по-прежнему ограничен текущим сегментом кода, размер которого может достигать 4 Гбайт. В реальном режиме ближний переход ограничен ±32 Кбайт. В защищенном режиме процессоров 80386—
1 Также условное копирование, которое рассмотрено при изучении команд передачи данных. — Пер.
Инструкции передачи управления
255
Pentium 4 доступна команда ближнего перехода с 32-битным смещением (на рис. 6.1 не показана).
Короткий переход
Короткий переход, будучи относительным, допускает перемещение команды перехода в адресном пространстве. Перемещение возможно потому, что в машинном коде короткого перехода задан не абсолютный адрес, а дальность перехода. Дальность короткого перехода ограничена значениями +127 и —128. На рис. 6.2 приведена иллюстрация команды короткого перехода. При ее выполнении микропроцессор расширяет знаковое значение смещения до 16 бит и складывает его с указателем инструкций (ip/eip).
CS = 1000Н
IP = 0002Н
Новое значение
IP = IP + 4 (0006Н)
Рис. 6.2. Короткий переход на четыре байта вперед
В примере 6.1 приведен листинг программы использования инструкции короткого перехода для пропуска фрагмента программы. В этом примере также продемонстрировано применение метки (т. е. символического обозначения адреса) в инструкции перехода. Обратите внимание, короткий переход в операторе jmp short next обозначен явно — директивой short. Большинство ассемблеров выбирают наиболее короткую форму перехода, и вторая команда перехода (jmp start), скорее всего, тоже будет закодирована в форме короткого перехода. В первой команде адрес перехода вычисляется как сумма адреса следующей инструкции (0009Н) и смещения (17Н), расширенного со знаком до 16-битной величины (0017Н); таким образом, адрес перехода равен 0017Н + 0009Н = 0020Н.
Пример 6.1. Вариант применения инструкции короткого перехода
0000 33 DB	XOR ВХ,ВХ
0002 В8 0001 START: MOV АХ,1
256
Гпава 6
0005 03 СЗ 0007 ЕВ 17	ADD JMP	AX, BX SHORT NEXT
0020 8В D8	NEXT: MOV	BX, AX
0022 ЕВ DE	JMP	START
Адрес перехода в примере 6.1 обозначен меткой. Например, выполнение команды jmp next передает управление на метку next. Метка в программе определяется именем с двоеточием (next:). Заметим, что адрес в числовом виде обычно не используется. Дальность disp относительного перехода в числовом виде может быть задана при помощи конструкции $ + disp, где $ обозначает текущий адрес. Например, команда jmp $+2 передает управление на два байта вперед.
Ближний переход
Ближний переход также является относительным и отличается от короткого перехода только большим диапазоном. Ближний переход передает управление в пределах текущего сегмента кода — на расстояние ±32 Кбайт. При работе в защищенном режиме процессоров 80386 и выше дальность внутрисегментного перехода может быть расширена до ±2 Гбайт. Ближний переход кодируется тремя байтами, первый из которых содержит код операции, а в следующих двух задано знаковое 16-битное смещение. В процессорах 80386—Pentium 4 смещение задано 32 битами; длина команды составляет 5 байт. При выполнении перехода знаковое смещение, заданное в коде команды, прибавляется к указателю инструкций 1Р. Поскольку диапазон знакового смещения равен ±32 Кбайт, ближний переход в реальном режиме обеспечивает передачу управления в любую точку текущего сегмента кода. В защищенном режиме 32-битных процессоров максимальный объем сегмента кода — 4 Гбайт; при использовании 32-битного смещения диапазон перехода составляет ±2 Гбайт — в пределах всего сегмента размером до 4 Гбайт. Действие инструкции ближнего перехода в реальном режиме показано на рис. 6.3.
Короткие и ближние переходы заданы смещением, и поэтому они могут перемещаться в пределах сегмента. Расстояние между командой и точкой перехода при этом не изменяется. Эта особенность коротких и ближних переходов, наряду с сегментной моделью памяти, обеспечивает перераспределение памяти за счет простого перемещения фрагмента программы. В результате, программы допускают загрузку в произвольные области памяти без модификации.
В примере 6.2 показана программа из примера 6.1 с увеличенным диапазоном переходов. Первая инструкция перехода (jmp next) передает управление команде по смещению 0200Н в текущем сегменте кода. Обратите внимание, что код этой инструкции представлен в виде Е9 0200 r. Буква r означает, что при компоновке переход по адресу 0200Н вычисляется как относительный (relocatable). После компоновки машинный код команды jmp next выглядит как Е9 F6 01 — смещение, вычисленное компоновщиком, равно 01F6H.
Пример 6.2. Команды ближнего перехода
0000 33 DB	XOR ВХ,ВХ
0002 В8 0001 START: MOV АХ,1
Инструкции передачи управления
257
0005 03 СЗ	ADD АХ,ВХ
0007 Е9 0200 R	JMP NEXT
0200 8В D8 NEXT: MOV ВХ,АХ 0202 Е9 0002 R	JMP START
Рис. 6.3. Ближний переход с прибавлением смещения равного 0002Н к содержимому регистра IP
Дальний переход
Инструкция дальнего перехода изменяет значения регистров CS и IP, как показано на рис. 6.4. Дальний переход кодируется пятью байтами; в байтах 2 и 3 задано значение смещения, а в байтах 4 и 5 — сегментный адрес (в реальном режиме) или селектор (в защищенном режиме). Селектор выбирает дескриптор, в котором хранится базовый адрес сегмента. Смещение, заданное 16- или 32-битным словом, определяет расстояние от начала сегмента.
Листинг с использованием команд дальнего перехода показан в примере 6.3. Тип перехода в команде jmp start задан явно — директивой far ptr2. Дальний переход генерируется также при передаче управления на так называемую дальнюю мешку. Заметим, что дальняя метка может находиться только в другом исходном модуле. В текущем модуле, где задан переход, эта метка описывается как внешняя — при помощи директивы extrn. В примере 6.3 директивой extrn задана дальняя метка up. Предполагается, что метка up определена в другом исходном модуле как глобальная. (Один из способов сделать метку глобальной — поставить после ее имени двойное Двоеточие; пример — label::). Поскольку up обозначает дальнюю метку, оператор имр up транслируется в команду дальнего перехода.
2 Иначе переход на метку START, заданную в том же сегменте, транслируется как ближний. — Пер.
9 Зак 384
258
Гпава 6
А3129
А3128
А3127
А3126
10004
10003
10002
10001
10000
Рис. 6.4. Дальний переход с заменой содержимого регистров CS и IP непосредственными значениями
Пример 6.3. Команды дальнего перехода
	EXTRN	UP:FAR
0000 33 DB		XOR ВХ, BX
0002 В8 0001	START:	MOV AX,1
0005 03 СЗ		ADD AX,BX
0007 Е9 0200 R		JMP NEXT
0200 8В D8	NEXT:	MOV BX,AX
0202 ЕА 0002 		R	JMP FAR PTR START
0207 ЕА 0000 		Е	JMP UP
При объединении модулей в исполняемую программу компоновщик подставляет в команды jmp far ptr start и jmp up значения адресов, соответствующих меткам start и up. Эти значения зависят от размещения программных секций при компоновке модулей. В файле-листинге такие величины помечены прочерками------.
Буква после прочерка объясняет причину, по которой значение пока не известно. Внешнее имя отмечается буквой е (External). Буква r (Relocatable) говорит о том, что величина зависит от адреса сегмента. Поля, отмеченные прочерком, заполняются при компоновке.
Переход по адресу, заданному содержимым регистра
В качестве операнда инструкции перехода может быть указан 16- или 32-битный регистр. Переход в этом случае косвенный, адрес перехода задан содержимым регистра. Если в командах ближнего и короткого переходов адрес задан смещением от следующей команды, то при косвенном переходе в регистре записан абсолютный адрес, который передается непосредственно в указатель инструкций. (При ближнем и коротком переходах смещение прибавляется к указателю инструкций IP.) Напри
Инструкции передачи управления
259
мер, команда jmp ах копирует содержимое регистра АХ в IP, что позволяет передать управление в любую точку текущего сегмента кода. В процессорах 80386—Pentium 4 возможны косвенные переходы в соответствии с содержимым 32-битного регистра. Например, инструкция jmp еах передает управление в пределах текущего кодового сегмента размером до 4 Гбайт по смещению, заданному в регистре ЕАХ.
В примере 6.4 показан листинг программы, использующей инструкцию jmp ах для перехода по значению элемента таблицы адресов. Программа вводит символы с клавиатуры, преобразуя цифры от Т до '3' в двоичные числа 0, 1 или 2 и игнорируя прочие символы. Результат преобразования в регистре АХ используется для выбора адреса перехода в таблице table. Поскольку адреса 16-битные, число в регистре АХ удваивается и, в результате, содержит смещение от начала таблицы — 0, 2 или 4. В регистр SI загружается адрес начала таблицы, и после сложения с АХ регистр SI указывает на элемент таблицы адресов со значением one, two или three. Этот элемент копируется в ах командой mov axz [si] , и последующая команда jmp ах передает управление на одну из меток one, two или three.
Пример 6.4. Косвенный переход с использованием таблицы адресов
; Программа выполняет ввод с клавиатуры, ; отображая символы '1', '2' или '3'
.MODEL SMALL ; выбор модели SMALL
0000	.DATA	;	: начало сегмента данных
0000 0030 R	TABLE DW ONE	;	: таблица адресов
0002 0034 R	DW TWO	
0004 0038 R	DW THREE	
0000	.CODE	;	: начало сегмента кода
	.STARTUP	;	: точка входа в программу
0017	TOP:	
0017 В4 01	MOV AH,1	;	г ввод с клавиатуры в регистр AL
0019 CD 21	INT 21H	
001В 2С 31	SUB AL,31H ;	• преобразование в двоичное число
001D 72 F8	JB TOP	;	 переход, если меньше 1
001F ЗС 02	CMP AL, 2	
0021 77 F4	JA TOP	;	: переход, если больше 3
0023 В4 00	MOV AH,0	;	: АХ := AL*2
0025 03 СО	ADD AX,AX	;	I (результат — 0, 2 или 4)
0027 BE 0000	R	MOV SI,OFFSET	TABLE ; смещение таблицы адресов
002А 03 F0	ADD SI,AX	; смещение слова в таблице
002С 8В 04	MOV AX,[SI]	; чтение адреса ONE, TWO
		; или THREE
002Е FF Е0	JMP AX	; переход по этому адресу
0030	ONE:	
0030 В2 31	MOV DL,'1'	;	г загрузить '1' для вывода на дисплей
0032 ЕВ 06	JMP ВОТ	
0034	TWO:	
0034 В2 32	MOV DL,'2'	;	: загрузить '2'
0036 ЕВ 02	JMP ВОТ	
0038	THREE:	
°038 В2 33	MOV DL,'3'	;	: загрузить '3'
260
Гпава 6
00ЗА	ВОТ:
003А В4 02	MOV АН, 2	; вывод на дисплей
003С CD 21	INT 21Н
.EXIT	; выход в DOS
END	; конец исходного текста
Косвенный переход при индексной адресации
Инструкция перехода допускает операнд в квадратных скобках. Использование данных в памяти для указания адреса позволяет передавать управление по адресу из таблицы, без предварительной записи его в регистр. В таблице адресов заданы 16-битные смещения для внутрисегментных косвенных переходов или 32-битные адреса в формате сегмент-смещение для межсегментных косвенных переходов. (Рассматриваемый переход с подобным методом адресации называется дважды косвенным.) По умолчанию переход транслируется как внутрисегментный, если не задана директива far ptr. Программа в примере 6.5 выполняет те же действия, что и программа в примере 6.4, но переход по таблице адресов выполняется иначе — командой jmp table [si]. В целом, этот вариант — наиболее компактный.
Пример 6.5. Переход по таблице адресов с использованием дважды косвенной адресации
	.MODEL SMALL ;	выбор модели SMALL
0000	. DATA	начало сегмента данных
0000 0030 R	TABLE DW ONE	таблица адресов
0002 0034 R	DW TWO	
0004 0038 R	DW THREE	
0000	. CODE	начало сегмента кода
	.STARTUP	точка входа в программу
0017	TOP:	
0017 В4 01	MOV AH,1	ввод с клавиатуры в регистр AL
0019 CD 21	INT 21H	
001В 2С 31	SUB AL,31H	преобразование в двоичное число
001D 72 F8	JB TOP	переход, если меньше 1
001F ЗС 02	CMP AL,2	
0021 77 F4	JA TOP	переход, если больше 3
0023 В4 00	MOV AH,0	АХ := AL*2
0025 03 СО	ADD AX,AX	(результат — 0, 2 или 4)
0027 03 F0	MOV SI,AX	
0029 FF А4 0000 R JMP TABLE [SI]		; переход по адресу ONE,
		; TWO или THREE
002D	ONE:	
002D В2 31	MOV DL,'1'	загрузить '1' для вывода на дисплей
002F ЕВ 06	JMP ВОТ	
0031	TWO:	
0031 В2 32	MOV DL,'2’	загрузить '2'
0033 ЕВ 02	JMP ВОТ	
0035	THREE:	
0035 В2 33	MOV DL, '3'	загрузить '3'
Инструкции передачи управления
261
0037	ВОТ: •
0037 В4 02	MOV АН,2	; вывод на дисплей
0039 CD 21	INT 21Н
.EXIT	; выход в DOS
END	; конец исходного текста
При доступе к таблице адресов применяется тот же механизм адресации, что и в командах копирования данных. Инструкция jmp table [si] считывает 16-битное число, хранящееся в сегменте кода по смещению SI + table. Прочитанное значение используется в качестве адреса перехода. По умолчанию оператор jmp table [si] задает внутрисегментный переход. При этом предполагается, что элементы таблицы — 16-битные. Переход трактуется ассемблером как дальний (межсегментный), если массив table определен директивой dd, или в самой инструкции поставлена директива far ptr. При дальнем переходе предполагается, что таблица содержит 32-битные указатели В формате сегмент:смещение.
Команды условного перехода и условной установки
Команды условного перехода для 16-битных процессоров кодируются в форме короткого относительного перехода. Поэтому дистанция условного перехода ограничена пределами +127 и —128 байт от команды, следующей за переходом. В процессорах 80386—Pentium 4 условные переходы могут быть не только короткими, но и ближними, что позволяет передавать управление по всему текущему сегменту кода. Заметим, что ассемблер MASM 6.x выбирает дальность условного перехода автоматически. В табл. 6.1 приведены все инструкции этой группы с условиями перехода.
Таблица 6.1. Инструкции условного перехода
Команда	Установка флагов для перехода	Условие перехода
JA/JNBE	С = 0 nZ = 0	Беззнаковое больше (above)
JAE/JNB	С = 0	Беззнаковое больше или равно (above or equal)
JB/JNAE	С = 1	Беззнаковое меньше (below)
JBE/JNA	С = 1 или Z = 1	Беззнаковое меньше или равно (below or equal)
JC	С = 1	Установлен флаг переноса
JE/JZ	Z = 1	Не равно/не ноль (not equal/not zero)
JG/JNLE	Z=0nS=O	Знаковое больше (greater than)
JGE/JNL	s = o	Знаковое больше или равно (greater than or equal)
JL/JNGE	S<> О	Знаковое меньше (less than)
JLE/JNG	Z = 1 или S <> О	Знаковое меньше или равно (less than or equal)
JNC	С = 0	Нет переноса
JNE/JNZ	Z = 0	Не равно/не ноль (not equal/not zero)
JNO	0 = 0	Нет переполнения
262
Гпава 6
Таблица 6.1 (окончание)
Команда	Установка флагов для перехода	Условие перехода
JNS	S = 0	Нет знака (no sign)
JNP/JPO	Р = 0	Нет паритета (no parity)
JO	0 = 1	Установлен флаг переполнения
JP/JPE	р = 1	Установлен флаг паритета (parity)
JS	S= 1	Установлен флаг знака (sign)
JCXZ	сх = о	Содержимое регистра СХ равно нулю
JECXZ	ЕСХ = 0	Содержимое регистра ЕСХ равно нулю
Инструкции условного перехода проверяют флаги знака (S — sign), нуля (Z — zero), переноса (С — carry), паритета (Р — parity) и переполнения (О — overflow). Если проверяемое условие истинно, управление передается на метку, заданную в команде перехода. Например, команда jc выполнит переход, если установлен флаг переноса С. Если условие ложно, программа продолжается со следующей команды.
Команды условного перехода в большинстве своем проверяют значение только одного флага и их действие понять несложно. При сравнении числовых значений используются уже не столь очевидные условия, связанные сразу с несколькими флагами.
Условия перехода после сравнения знаковых и беззнаковых чисел различны. На рис. 6.5 показана кодировка знаковых и беззнаковых чисел на примере 8-битных данных. Обратите внимание, коду FFH соответствуют разные знаковые и беззнаковые байтовые данные: если беззнаковое число (255) больше 0, то знаковое (-1) — меньше 0.
Рис. 6.5. Кодирование 8-битных знаковых и беззнаковых чисел
Инструкции передачи управления	263
При сравнении знаковых чисел применяются инструкции jg, jl, jge, jle, je и jne. Буквы g (greater) и l (less) в обозначении условий "больше" и "меньше" подразумевают сравнение именно знаковых данных. При сравнении беззнаковых чисел используются условные переходы ja, jb, jae, jbe, je и jne; в них "больше" и "меньше" обозначаются соответственно буквами a (above) и в (below).
Прочие команды условного перехода проверяют по одному флагу, например, С или Р. Заметим, что инструкции je и jz обозначают одну и ту же команду. Также, например, ja (jump if above — переход, если больше) означает то же самое, что jnbe (jump if not below or equal — переход, если не больше или равно). В большинстве случаев ja понятней, но .jnbe также применяется3.
Инструкция jcxz/jecxz, выполняющая переход, если значение регистра СХ/ЕСХ = 0, — это единственная команда условного перехода, которая не проверяет флагов. Решение о переходе принимается по значению регистра СХ или ЕСХ; флаги процессора при этом не изменяются.
Листинг программы с использованием инструкции jcxz приведен в примере 6.6. Команда scasb выполняет поиск числа ОАН в таблице байтов. После поиска командой jcxz оценивается величина счетчика, организованного с помощью регистра СХ. Если счетчик равен нулю (переход произошел), значит, искомое значение не найдено4. На выходе из процедуры флаг С установлен или обнулен ь зависимости от результатов поиска; его значение оценивается в программе, вызвавшей процедуру scan. Результат поиска может быть проверен инструкцией jne, вместо jcxz. Условие ne после repne scasb означает, что при последнем сравнении данные по-прежнему не равны.
Пример 6.6. Поиск числа ОАН в массиве байт
; Процедура ищет в 100-байтной таблице число ОАН
; Адрес таблицы задан в регистре SI
0017	SCAN PROC NEAR
0017 В9 0064	MOV СХ,100	; загрузить счетчик
001А ВО 0А	MOV AL,ОАН	; AL := ОАН
001С FC	CLD	; режим автоинкремента
00ID F2/AE	REPNE SCASB	; поиск числа ОАН в массиве из 100 байт
00IF F9	STC	; установить перенос, если нашли
0020 ЕЗ 01	JCXZ NOT_FOUND ; не нашли?
0022 F8	CLC	; обнулить перенос
0023	NOT_FOUND:
0023 СЗ	RET	; выход из процедуры
°°24	SCAN ENDP
Если фрагмент программы после команды сравнения выполняется при условии BE (результат сравнения — больше или равно), то логика условных переходов вынуждает программировать обход этого фрагмента по обратному условию (NBE или А) — командой JNBE или JA. Иногда проще дописать к ВЕ букву N, чем вспоминать, что А = -.(BE). — Пер.
Вообще-то условие СХ = 0 не дает оснований для таких выводов. Вдруг число ОАН находится в Конце массива? Тогда при последнем сравнении будут одновременно выполнены условия Е (совпадение) и СХ = 0 (конец массива). Условие Е, очевидно, важнее — поэтому JCXZ следует заменить
На jne. - Пер.
264
Гпава 6
Инструкции условной установки
В дополнение к условным переходам в систему команд процессоров 80386— Pentium 4 включены условные установки. В условных переходах и установках используется одинаковый набор условий. Инструкция условной установки записывает в заданный байт число 01Н или ООН, в зависимости от результата проверки условия. Команды условной установки приведены в табл. 6.2.
Таблица 6.2. Инструкции условной установки		
Команда	Условие установки во флагах	Условие установки
SETB	С = 1	Беззнаковое меньше (below)
SETAE	С = 0	Беззнаковое больше или равно (above or equal)
SETBE	С = 1 или Z = 1	Беззнаковое меньше или равно (below or equal)
SETA	C=0nZ=0	' Беззнаковое больше (above)
SETE/SETZ	Z= 1	Равно/ноль (equal/zero)
SETNE/SETNZ	Z = 0	Не равно/не ноль (not equal/not zero)
SETL	S<> О	Знаковое меньше (less than)
SETLE	Z = 1 или S <> О	Знаковое меньше или равно (less than or equal)
SETG	Z=0nS=O	Знаковое больше (greater than)
SETGE	S = O	Знаковое больше или равно (greater than or equal)
SETS	S = 1	Установлен флаг знака (sign)
SETNS	s = o	Нет знака (no sign)
SETC	C = 1	Установлен флаг переноса (carry)
SETNC	c = o	Нет переноса (no carry)
SETO	0= 1	Установлен флаг переполнения (overflow)
SETNO	0 = 0	Нет переполнения (no overflow)
SETP/SETPE	p = 1	Установлен флаг паритета (parity)
SETNP/SETPO	P = 0	Нет паритета (no parity)
Инструкции условной установки позволяют отложить принятие решения, запомнив результат предшествующего сравнения в 8-битном регистре или ячейке памяти. Например, команда setnc мем сохраняет значение переноса в байте мем; в дальнейшем можно выяснить состояние флага С на момент выполнения setnc мем, сравнив содержимое мем с 0.
Инструкция LOOP
Инструкция loop — это комбинация декремента содержимого регистра СХ с условным переходом jnz. Команда loop декрементирует содержимое регистра СХ; затем.
Инструкции передачи управления 265
если СХ <> 0, выполняется переход по заданному адресу. При обнулении регистра СХ в результате декремента программа продолжается со следующей инструкции. В процессорах 80386—Pentium 4 команда loop уменьшает либо содержимое регистра СХ, либо ЕСХ, в зависимости от текущего режима инструкций. В 16-битном режиме loop работает с регистром СХ, в 32-битном — с ЕСХ. Если обозначить команду loop мнемоникой loopw, то в любом режиме используется регистр СХ; при обозначении loopd всегда применяется регистр ЕСХ.
Программа в примере 6.7 прибавляет к каждому слову массива block2 значение слова из массива blocki, используя команду loop для организации счетного цикла. Чтение и запись элементов массивов выполняется командами lodsw и stosw. Команда add ax,es: [di] прибавляет к содержимому регистра АХ слово из дополнительного сегмента данных. Массив block2 помещен в дополнительный сегмент данных для того, чтобы можно было воспользоваться командой stosw; эта команда записывает данные в память по адресу es: [di]. Значение в регистре ES устанавливается в начале программы — явным образом, т. к. директива .startup инициализирует только регистр DS. В этом примере дополнительный сегмент данных совпадает с главным, поэтому содержимое регистра DS копируется в регистр ES; копирование выполняется через регистр-аккумулятор, поскольку прямая передача из сегментного регистра в сегментный регистр недопустима.
Пример 6.7. Поэлементное сложение массивов слов
; Поэлементное сложение массивов BLOCKI и BLOCK2;		
; сумма сохраняется в массиве BLOCK2 .MODEL SMALL	; выбор модели SMALL 0000	.DATA	; начало сегмента данных		
0000	0064 [ BLOCKI 0000 1	DW 100 DUP (?)	; 100-байтный массив BLOCKI
00С8 0000	J 0064 [ BLOCK2 0000 ]	DW 100 DUP (?)	; 100-байтный массив BLOCK2 .CODE	; начало сегмента кода .STARTUP	; точка входа в программу
0017	8С D8	MOV АХ,DS	; совмещение сегментов данных
0019	8Е СО	MOV ES,АХ
001В	FC	CLD	; режим автоувеличения
001С	В9 0064	MOV СХ,100	; счетчик
001F	BE 0000 R	MOV SI,OFFSET BLOCKI ; смещение BLOCKI
0022	BF 00С8 R	MOV DI, OFFSET BLOCK2 ; смещение BLOCK2
0025	LI:	
0025	AD	LODSW	; скопировать в регистр /XX ; элемент массива BLOCKI
0026	26:03 05	ADD AX,ES:[DI] ; прибавить к содержимому АХ ; элемент массива BLOCK2
0029	AB	STOSW	; сохранить сумму в массиве BLOCK2
002А	E2 F9	LOOP L1	; повторить 100 раз .EXIT	; выход в DOS
END
; конец исходного текста
266
Гпава 6
Условные циклы
Подобно префиксу rep, инструкция loop также располагает вариантами с дополнительными условиями. Это команды loope и loopne. Инструкция цикла loope выполняет переход, если содержимое регистра СХ О 0 (после декремента) и соблюдено условие равенства. Если условие равенства не выполнено или значение регистра СХ = 0, то программа продолжается со следующей команды. Команда loopne действует подобным же образом, выполняя переход при значении регистра СХ <> 0 и условии неравенства (ne). В процессорах 80386—Pentium 4 команды циклов используют в качестве счетчика регистр СХ или ЕСХ, в зависимости от текущего режима инструкций. При задании команд loope/loopne в виде loopew/looped счетчиком является регистр СХ, а обозначения loopnew/loopned подразумевают в качестве счетчика регистр ЕСХ — независимо от режима инструкций.
Операторы loope/loopne и loopz/loopnz обозначают одни и те же команды циклов. На практике чаще используются обозначения loope и loopne.
6.2.	Логические блоки в языке ассемблера
Управлять последовательностью выполнения программы проще, если вместо условных переходов пользоваться специальными директивами языка ассемблера: .if, .ELSE, . ELSEIF И .ENDIF. ЭТИ ДИреКТИВЫ, а также конструкции .REPEAT-. UNTIL И .while-.endw, включены в ассемблер MASM, начиная с версии 6.0.
Пример использования директив условного выполнения показан в примере 6.8. В этом примере проверяется версия DOS; если версия ниже 3.3, программа завершается — DOS-функцией 4СН. Для получения кода версии DOS используется функция ЗОН прерывания INT21H. Исходная программа с использованием директив .if— .endif приведена в примере 6.8, а.
Пример 6.8, а. Исходная программа
MOV АН,ЗОН
INT 21Н	; получить номер версии DOS
.IF AL<3 && АН<30
MOV АН,4СН ; завершить программу
INT 21Н
.ENDIF
Листинг 6.8, б. Результат трансляции программы из примера 6.8, а
0000 В4 30	MOV	АН,ЗОН
0002 CD 21	INT	21H	; получить номер версии DOS
	.IF	AL<3 && AH<30
0004 ЗС 03	*	cmp	al,003h
0006 73 09	*	jae	@C0001
0008 80 FC 1Е *	cmp	ah,OlEh
000В 73 04	*	jae	OCOOOl
000D В4 4С	MOV	АН,4CH	; завершить программу
Инструкции передачи управления
267
OOOF CD 21
ООН
INT 21Н .ENDIF @СООО1:
В примере 6.8, б показан результат трансляции исходного текста. Команды, подставленные на место директив .if и .endif, отмечены знаком *. Оператор .if al<3 && ан<зо сравнивает коды версии и подверсии DOS со значениями 3 и 30. Если номер версии (значение регистра AL) меньше 3 и номер подверсии (значение регистра АН) меньше 30, то выполняются команды mov ан,04с и int 21н. Оператор операций отношения && обозначает логическое произведение условий AL<3 и АН<30 в операторе .if al<3 && ан<зо. Полный перечень операторов, обозначающих операции отношения, применимых с директивой .if, приведен в табл. 6.3. Нетрудно заметить, что эти операторы условий заимствованы из языков высокого уровня, например, таких как C/C++.
Таблица 6.3. Операторы операций отношения, используемых с оператором .if
Операторы операций отношения	Условие
==	Равно
>	Не равно Больше
<	Больше или равно Меньше
<=	Меньше или равно
&	Биты установлены в 1 Обратное условие
&&	Объединение условий по логической функции "И"
1 1	Объединение условий по логической функции "ИЛИ"
В примере 6.9 показан еще один листинг программы с применением директивы .if. Программа решает задачу преобразования вводимых с клавиатуры ASCII-символов нижнего регистра в аналогичные символы, но только уже верхнего регистра. Ввод с клавиатуры выполняет DOS-функция 06Н. В данном примере с директивой .if используется логическая операция "И" (оператор операции отношения — &&) для объединения условий, определяющих, относится ли введенный ASCII-символ к символу в нижнем регистре или нет. После преобразования символ выводится на экран. Программа завершается при нажатии комбинации клавиш <Ctrl>+<C>, что соответствует вводу ASCII-кода ОЗН. Директива .listall осуществляет вывод в файл-листинг всех без исключения команд, сгенерированных ассемблером. В результате, в листинге показана метка @startup, соответствующая директиве .startup; а также видны команды, созданные директивой .exit, — они выполняют вызов DOS-функции 4СН, которая возвращает управление в DOS.
268
Гпава 6
Пример 6.9. Преобразование ASCII-символов нижнего регистра в верхний
; Ввод с клавиатуры, преобразование символов из нижнего регистра ; в верхний и их вывод
; При нажатии комбинации клавиш <Ctrl>+<C> — завершение
	.MODEL TINY , .LISTALL	; выбрать модель TINY ; отобразить в листинге все операторы
0000	. CODE	г начало сегмента кода
	.STARTUP	: точка входа в программу
0100	*	^Startup:	
0100	MAIN1:	
0100 В4 06	MOV AH, 6	: ввод с клавиатуры без эхо-печати
0102 В2 FF	MOV DL,0FFH	
0104 CD 21	INT 21H	
0106 74 F8	JE MAIN1	;	: клавиша не нажата?
0108 ЗС 03	CMP AL, 3	;	: нажата комбинация
010А 74 10	JE MAIN2	;	: клавиш .<Ctrl>+<C>?
.IF AL>— 1 а 1 && AL<—1z1
010С	ЗС 61	*	cmp	al, 'a'
010Е	72 06	*	jb	OCOOOl
ОНО	ЗС 7А	*	cmp	al, 'z '
0112	77 02	* ja	OC0001
0114	2С 20	SUB	AL,20H
		.ENDIF	
0116	*	@00001:	
0116	8А D0	MOV	DL,AL ; эхо-печать
0118	CD 21	INT	21H
ОНА	ЕВ Е4	JMP	MAIN1 ; повтор ввода
011С		MAIN2:	
		.EXIT	; выход в DOS	
011С	В4 4С	*	MOV	ah, 04Ch
011Е	CD 21	*	INT	21H
END	; конец исходного текста
В этом примере оператор .if al >= 'а' && al <= • z• определяет, относится ли введенный символ к диапазону символов латинского алфавита в нижнем регистре. Если величина в регистре AL больше или равна ASCII-коду 'а' и не превышает значения ASCII-кода У, выполняются инструкции между директивами .if и .endif. В данном случае это один оператор (sub al,20h); он вычитает 20Н из содержимого регистра AL, преобразуя число из диапазона 'a'-'z' к диапазону 'а'—У. Команды, реализующие проверку содержимого регистра AL и обход инструкции sub al,20h, помечены знаком *. Метка @coooi обозначает конец условного блока и используется в командах условного перехода при проверке условий, используемых совместно с директивой .IF.
Другой вариант применения директивы .if показан в примере 6.10. Эта программа вводит символ с клавиатуры и преобразует его в 16-ричный код.
При выполнении условия AL>='a' && AL<='f управление передается на инструкцию sub al, 57н. Если символ не принадлежит диапазону 'a'-'f, то программа переходит к следующей проверке, заданной оператором .elseif al>='a' && al<='f'. Здесь вы
Инструкции передачи управления
269
являются и преобразуются символы от 'Д' до 'F'. Прочие символы обрабатываются командой sub al, зон, заданной между директивами .else и .endif. Результат преобразования сохраняется в сегменте данных по смещению temp.
Пример 6.10. Преобразование ASCII-кода 16-ричной цифры в числовое значение
; Ввод 16-ричной цифры с клавиатуры и ее сохранение, после преобразования
; в двоичное число 0—15, в байте TEMP
	.MODEL SMALL	; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 00 TEMP	DB ?	; байт для сохранения числа
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 В4 01	MOV AH,1	; ввод символа
0019 CD 21	INT 21H	
	.IF	AL>=1 a1 & &	AL<='f'	; в диапазоне от 'а' до 'f?
0023 2С 57	SUB AL,57H	
	.ELSEIF AL>-'A'	&& AL<='F' ; в диапазоне от 'А' до 'F'?
002F 2С 37	SUB AL,37H	
	.ELSE	; при других значениях
0033 2С 30	SUB AL,ЗОН	
	.ENDIF	
0035 А2 0000 R	MOV TEMP,AL	
	.EXIT	; выход в DOS
	END	; конец исходного текста
Циклы DO-WHILE
Ассемблер MASM 6.x, подобно языкам высокого уровня, поддерживает структурное программирование циклов с условиями продолжения и завершения. Рассмотрим сначала цикл do-while с условием продолжения. Цикл начинается с директивы .while, с указанием условия, и завершается директивой .endw.
Листинг с использованием цикла do-while приведен в примере 6.11. В этом примере символы, прочитанные с клавиатуры, сохраняются в массиве виг, пока не будет нажата клавиша <Enter> (ASCII-код 0DH). Предполагается, что массив виг находится в дополнительном сегменте данных, поскольку для записи в него используется инструкция stosb. Команды, соответствующие директивам .while и .endw, помечены знаком *. После ввода символа с кодом 0DH в массив дописывается символ $, который ограничивает вывод строки символов функцией 9 прерывания DOS — INT 21Н.
Пример 6.11. Сохранение символов в массиве
; Ввод строки с клавиатуры и, после нажатия клавиши <Enter>, ; вывод этой строки
	.MODEL SMALL	; выбор модели памяти
0000	.DATA	; начало сегмента данных
0000 0D 0А MES	DB 13,10	; ASCII-коды возврата каретки и ; перевода строки
270
Глава 6
0002 0100 [			BUF DB 256 DUP (?)	буфер для ввода строки
		00		
0000		J	. CODE .STARTUP	начало сегмента кода точка входа в программу
0017	8С	D8	MOV AX, DS	совмещение сегментов данных
0019	8Е	СО	MOV ES,AX	
001В	FC		CLD	режим автоувеличения
001С	BF	0002	R	MOV DI,OFFSET BUF ; .WHILE AL != ODH	смещение буфера цикл до нажатия клавиши <Enter>
001F 0021	ЕВ	05	*	jmp @00001 0COOO2:	
0021	В4	01	MOV AH,1	ввод с клавиатуры с эхо-печатью
0023	CD	21	INT 21H	
0025 0026	АА	*	STOSB . ENDW @C0001:	сохранить код клавиши конец цикла
0026	ЗС	0D	*	emp al,00Dh	
0028	75	F7	*	jne @C0002	
002А	С6	45 FF 24 MOV BYTE PTR [DI-1j		,'$’ ; записать $ в конце строки
002Е	ВА	0000	R	MOV DX,OFFSET MES	; смещение строки MES
0031	В4	09	MOV AH, 9	; вывод строки MES
0033	CD	21	INT 21H .EXIT END	; выход в DOS
Программа в примере 6.11 продолжается, пока выполняется условие в операторе .while: значение регистра AL не равно 0DH. Но при первом выполнении оператора .while al != odh значение регистра AL случайно5. Более корректное решение приведено в примере 6.12. Здесь для завершения цикла используется директива .break, выполняемая в теле цикла после ввода символа. Оператор .while 1 определяет бесконечный цикл, выход из которого обеспечивает директива .break при значении регистра AL равном 0DH. Заметим, что директива .break может быть задана в любой точке внутри цикла.
Директива .continue, не показанная в этом примере, может быть задана в теле цикла, подобно директиве .break, но, в отличие от последней, обеспечивает не выход из цикла, а условный переход к началу цикла. Например, оператор .continue .if al == 15 возобновляет цикл, если содержимое регистра AL равно 15. Заметим, что одноименные операторы break и continue языка С действуют аналогично.
Пример 6.12. Применение директивы .break
0000
.MODEL small
.DATA
5 В результате, символ в начале BUF окажется лишним — мы его не вводили. Также нс исключено, что при первом же выполнении цикла в регистре AL случайно окажется число 0DH и программа завершится до первого ввода. — Пер.
Инструкции передачи управления
271
0000 0002	0D 0А MES * DB 13,10	; память ; для строки
	0100 [ BUF DB 256 DUP (?)	
	00	
0000 0017	J .CODE .STARTUP 8С D8	MOV АХ, DS	; ES := DS
0019 001В	8Е СО	MOV ES,AX FC	CLD	; режим автоувеличения
001С	BF 0002 R	MOV DI,OFFSET BUF	; смещение BUF
001F 001F	.WHILE 1 * @00001: B4 01	MOV AH,1	: бесконечный цикл : ввод с клавиатуры
0021 0023	CD 21	INT 21H AA	STOSB	: сохранить код в BUF
0024	.BREAK .IF AL == 0DH ; 3C 0D	cmp al,00Dh	: выход из цикла, если код 0DH
0026 0028 002А 002А	74 02	je @C0002 . ENDW EB F5 *	jmp @C0001 * 0COOO2: C6 45 FF 24 MOV BYTE PTR [DI-1] , '$' ;	• добавить литеру $
002Е	BA 0000 R	MOV DX,OFFSET MES	;	 вывести строку
0031 0033	B4 09	MOV AH,9 CD 21	INT 21H .EXIT	
END
В примере 6.13 приведен листинг программы, использующий конструкцию do-while для отображения содержимого регистра ЕАХ на экране, в десятичном формате. Сначала в регистр ЕАХ записывается некоторое тестовое значение (123455). При анализе числа, хранящегося в регистре ЕАХ, используются два бесконечных цикла. В первом цикле содержимое регистра ЕАХ делится на 10 до обнуления частного. После каждого деления остаток, представляющий очередную значащую цифру результата, сохраняется в стеке. В стек также загружаются ASCII-коды запятой, разделяющей каждые три знака результата. Для счета знаков между запятыми используется регистр CL. Когда значение в регистре CL достигает 3, в стек записывается ASCII-код запятой, и счетчик обнуляется. Вывод результата преобразования выполняется во втором цикле. После команды pop dx директива .break проверяет содержимое регистра DX на равенство 10 — это значение записано в стек после завершения цикла преобразования и отмечает конец строки для вывода на экран. Заметим, что процедура, приведенная в примере 6.13, пригодна для использования в любой программе, где требуется отображать десятичные числа в пределах до четырех миллиардов.
Пример 6.13. Вывод на экран содержимого регистра еах в десятичном формате
' Вывод содержимого ЕАХ в десятичном формате
' Тысячи, миллионы и миллиарды разделяются запятой .MODEL TINY .386	; выбор процессора 80386
272
Гпава 6
0000	.CODE . STARTUP
0100	66| В8 0001E23F MOV ЕАХ,123455; загрузить тестовые данные
0106	Е8 0004	CALL DISPE	; вывод содержимого регистра ЕАХ .EXIT
; Процедура выводит содержимое регистра ЕАХ на экран в десятичном формате
010D	DISPE PROC NEAR
010D 66| ВВ 0000000А MOV ЕВХ,10	; делитель 10
0113 53	PUSH ВХ	; сохранить младшую часть числа
0114 В1 00	MOV CL,0	; счетчик знаков для вывода запятой
.WHILE 1	; первый бесконечный цикл
0116 66| ВА 00000000	MOV EDX,0 ; обнулить регистр EDX
011С 66| F7 F3	DIV ЕВХ	; разделить EDX:EAX на 10
011F 80 С2 30	ADD DL,ЗОН ; преобразовать в ASCII
0122 52	PUSH DX	; сохранить остаток
.BREAK .IF ЕАХ == 0 ; выход, если частное ноль
0128 FE Cl	INC CL	; инкремент счетчика знаков
.IF CL == 3; если равен 3
012F 6А 2С	PUSH	запомнить запятую
0131 В1 00	MOV CL,0; обнулить счетчик
.ENDIF
.ENDW	; конец первого цикла
.WHILE 1	; второй цикл
0135 5А	POP DX	; восстановить остаток
.BREAK .IF DL == 10 /выход, если остаток 10
013В В4 02	MOV АН,2	;вывод цифры
013D CD 21	INT 21Н
.ENDW
0141 СЗ	RET
0142	DISPE ENDP
END
Циклы REPEAT-UNTIL
В ассемблере MASM 6.x предусмотрена еще одна конструкция для задания циклов — repeat-until. Инструкции, заданные в теле этого цикла, отрабатываются повторно, пока условие, заданное в .until, не будет выполнено. Директива .repeat задает начало цикла, директива .until отмечает нижнюю границу цикла и включает в себя условие окончания.
В примере 6.14 приведен еще один вариант программы из примера 6.11— по-видимому, наилучший. В этом варианте использован логический блок repeat-until. Программа вводит символы с клавиатуры и записывает их в буфер — пока, в результате нажатия клавиши <Enter>, не обнаружит символ 0DH. Команды, сгенерированные при трансляции директивы .repeat и оператора .until al == odh, отмечены в примере 6.14 значком *.
Инструкции передачи управления
273
Пример 6.14. Вариант программы из примера 6.11 с использованием цикла repeat-until
.MODEL SMALL
0000	.DATA
0000 0D 0A MES	DB 13,10
0002 0100 [ BUF	DB 256 DUP (?)	; память для строки
00
]
0000	.CODE
.STARTUP
0017 8C	D8	MOV	/XX, DS	;	совместить сегменты данных
0019 8E	CO	MOV	ES,AX
001В FC	CLD	;	режим автоувеличения
001C BF	0002 R MOV	DI,OFFSET BUF ;	смещение BUF
.REPEAT
001F	* 0COOO1:
001F В4 01	MOV АН, 1	; ввод с клавиатуры с эхо-печатью
0021 CD 21	INT 21Н	
0023 АА	STOSB	; сохранить введенный символ
		; в строке BUF
	.UNTIL AL ==	0DH
0024 ЗС 0D *	cmp al, OODh	
0026 75 F7 *	jne @C0001	
0028 С6 45 FF 24	MOV BYTE PTR	[DI-1],'$' ; добавить в конец строки
		; символ $
002С В4 09	MOV AH,9	; отобразить MES и BUF
002Е ВА 0000 R	MOV DX,OFFSET	MES
0031 CD 21	INT 21H	
.EXIT
END
Конструкция repeat-until может также завершаться директивой .untilcxz, которая транслируется в инструкцию loop. В примере 6.15 показан листинг с использованием директивы .untilcxz при поэлементном сложении байтовых массивов one и two. Результаты сложения записываются в массив three. Каждый из массивов содержит по 100 байт, соответственно, цикл повторяется 100 раз. Предполагается, что массив three находится в дополнительном сегменте данных, а массивы one и two — в главном сегменте данных.
Пример 6.15. Использование конструкции repeat-until для задания счетного цикла
012С В9 0064 012F BF 00С8 R	MOV CX,100		; счетчик ; смещения массивов
	MOV	DI,OFFSET THREE	
0132 BE 0000 R	MOV	SI,OFFSET ONE	
0135 ВВ 0064 R	MOV ВХ,OFFSET TWO .REPEAT 0138	* ОС0001: 0138 AC	LODSB 0139 02 07	ADD AL,[BX]			
274
Гпава 6
013В АА
013С 43
STOSB
INC ВХ
.UNTILCXZ
013D Е2 F9	loop ОС0001
6.3.	Процедуры
Процедуры, или подпрограммы. — важнейшее средство построения структуры программной системы. Процедура представляет собой группу инструкций для выполнения некоторой задачи — типовой, в большинстве случаев. Процедура хранится в памяти в единственном экземпляре, но может быть вызвана многократно и из разных точек программы. Это позволяет сократить объем программы и упрощает ее разработку. Вместе с тем, выполнение команд вызова процедуры call и возврата из нее ret требуется при каждом обращении к процедуре, что замедляет программу.
При вызове процедуры — командой call — адрес возврата сохраняется в стеке. Команда возврата ret считывает значение с вершины стека и записывает его в регистр IP, передавая управление команде, следующей за call.
Начало определения процедуры обозначается директивой proc, а окончание — директивой endp. В директивах proc и endp обязательно указывается имя процедуры. После ключевого слова proc, кроме имени, задается также тип процедуры: near (ближняя — для внутрисегментного вызова) или far (дальняя — для межсегментного вызова). Варианты определения процедур разных типов приведены в примере 6.16. Начиная с MASM 6.x, в директиву proc, после типа (near или far), может быть включен оператор uses. В нем перечисляются регистры, значения которых следует сохранить в стеке при входе в процедуру и восстановить при выходе. Команды для сохранения и восстановления регистров, указанных в операторе uses, генерируются автоматически.
[ Пример 6.16. Разичные варианты определения процедур
0000			SUMS	PROC NEAR
0000	03	СЗ		ADD AX,BX
0002	03	С1		ADD AX,CX
0004	03	С2		ADD AX, DX
0006	СЗ			RET
0007			SUMS	ENDP
0007			SUMS1	PROC FAR
0007	03	СЗ		ADD AX,BX
0009	03	С1		ADD AX,CX
000В	03	С2		ADD AX,DX
000D	св			RET
000Е			SUMS1	ENDP
000Е			SUMS2	PROC NEAR USES BX CX DX
ООН	03	СЗ		ADD AX, BX
0013	03	С1		ADD AX,CX
Инструкции передачи управления
275
0015 03 С2 MOV 'АХ, DR’
RET
001В	SUMS2 ENDP
Команды ret в этих процедурах кодируются по-разному: ближний возврат — кодом СЗН, а дальний — кодом СВН. Команда ближнею возврата извлекает из стека 16-битное число и записывает его в указатель инструкций; передача управления ограничена текущим сегментом кода. Команда дальнего возврата считывает из стека два 16-битных числа и помещает их в регистры 1Р и CS, выполняя переход в любую точку доступного адресного пространства.
Инструкция CALL
Команда call передает управление указанной процедуре. В отличие от команды jmp, команда call не только выполняет переход, но также сохраняет в стеке адрес следующей команды. Этот адрес используется командой ret для возврата управления команде, следующей за командой вызова.
Ближний вызов
Команда ближнего вызова в процессорах 8086—80286 кодируется тремя байтами: в первом байте содержится код операции, а в следующей паре байт — смещение
Рис. 6.6. Воздействие ближнего вызова на стек и указатель инструкций
276
Гпава 6
в пределах ±32 Кбайт, как в команде ближнего перехода. В защищенном режиме процессоров 80386—Pentium 4 смещение может быть закодировано 32-битным значением; диапазон перехода, в итоге, доведен до ±2 Гбайт. При ближнем вызове в стеке сохраняется смещение следующей инструкции, т. е. значение регистра IP или Е1Р. Заметим, что, в отличие от команд jmp, короткий вызов процедуры в систему команд не включен. Ближний вызов может быть задан явно — мнемоникой calln. Тем не менее ближний вызов рекомендуется обозначать мнемоникой call, предварительно указав в директиве proc атрибут near.
Зачем понадобилось сохранять содержимое регистра IP или EIP в стеке? Указатель инструкций ip/eip адресует следующую команду в программе. При выполнении команды call содержимое регистров 1P/EIP сохраняется потому что, после отработки процедуры, программа могла продолжиться с инструкции, следующей за call. Сохранение адреса возврата в стеке, при вызове процедуры, показано на рис. 6.6.
Дальний вызов
Дальний вызов подобен дальнему переходу — он позволяет передать управление в любую точку адресного пространства. Команда дальнего вызова кодируется пятью
Память
SP —►
Рис. 6.7. Действие инструкции дальнего вызова
Инструкции передачи управления 277
байтами: в первом байте — код операции, а за ним — значения смещения и сегмента для записи в регистры IP и CS. Смещение хранится в байтах 2 и 3, а сегментный адрес — в байтах 4 и 5.
Инструкция дальнего вызова, прежде чем передать управление по заданному адресу, помещает в стек текущее содержимое регистров IP и CS; действие инструкции показано па рис. 6.7. Дальний вызов генерируется ассемблером при обращении (call) к процедуре, в описании которой указан атрибут far. Дальний вызов может быть задан явно — мнемоникой calle; первый вариант (call) предпочтительней.
Вызов по значению регистра
Инструкции call, подобно инструкциям jmp, допускают косвенную передачу управления по содержимому регистра. Рассмотрим, например, выполнение команды call вх. Сначала эта инструкция сохраняет в стеке текущее содержимое регистра IP. Затем копирует значение из регистра ВХ в 1Р. Поскольку содержимое регистра CS не изменяется, переход ограничен текущим сегментом кода. Смещение может быть задано любым 16-битным регистром, кроме сегментного.
В примере 6.17 приведена программа, в которой инструкция call с регистровым операндом вызывает процедуру disp. (В этом примере процедуру disp можно было бы вызвать непосредственно — командой call disp.) Перед выполнением команды call вх в регистр ВХ записывается смещение процедуры — offset disp. Программа вывод на экран строку "ОК".
Пример 6.17. Косвенный вызов процедуры
; Вывод сообщения "ОК" на экран процедурой DISP		
	.MODEL TINY	; выбрать модель TINY
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0100 ВВ ОНО R	MOV BX,OFFSET	DISP ; в регистр ВХ - смещение DISP
0103 В2 4F	MOV DL,'O'	; вывести 'О'
0105 FF D3	CALL BX	
0107 В2 4В	MOV DL, 'K’	; вывести ’К'
0109 FF D3	CALL BX	
	.EXIT	; выход в DOS
; Процедура для	вывода ASCII-кода из регистра DL на экран	
ОНО	DISP	PROC NEAR	
ОНО В4 02	MOV AH,2	; DOS-функция 02Н
0112 CD 21	INT 21H	; вызов функции DOS
0114 СЗ	RET	; возврат из процедуры
0115	DISP	ENDP	
	END	; конец исходного текста
Вызов с косвенной адресацией данных
Команда call с косвенно адресуемым операндом в памяти позволяет выбрать процедуру из списка процедур. Выбор определяется значением регистра, в котором задано смещение от начала таблицы адресов переходов.
278
Гпава 6
В примере 6.18 приведен листинг программы с тремя подпрограммами, выбор между которыми определяется значением цифры, введенной с клавиатуры, в диапазоне от 1 до 3. Код цифры в регистре AL, в диапазоне от 'Г до '3', преобразуется в 16-битное смещение 0, 2 или 4 в регистре ВХ. В результате при выполнении команды CALL TABLE [ВХ] ПРОИСХОДИТ ВЫЗОВ ОДНОЙ ИЗ Подпрограмм ONE, TWO ИЛИ THREE. Процедура one, вызываемая при нажатии клавиши <1>, выводит на экран латинскую букву 'А'; процедура two, по нажатию клавиши <2>, выводит букву 'В'; процедура three, по клавише <3> — букву 'С.
Пример 6.18. Вызов подпрограммы по таблице адресов
; Программа вызывает процедуру ONE, TWO или THREE, используя адреса
	.MODEL SMALL	; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 0000 R	TABLE DW ONE	; таблица адресов
0002 0007 R	DW TWO	
0004 000Е R	DW THREE	
0000	.CODE	; начало сегмента кода
0000	ONE PROC NEAR	
0000 В4 02	MOV AH,2	; вывод буквы А
0002 В2 41	MOV DL,’A’	
0004 CD 21	INT 21H	
0006 СЗ	RET	
0007	ONE ENDP	
0007	TWO PROC NEAR	
0007 В4 02	MOV AH,2	; вывод буквы В
0009 В2 42	MOV DL,' B'	
000В CD 21	INT 21H	
000D СЗ	RET	
000Е	TWO ENDP	
000Е	THREE PROC NEAR	
000Е В4 02	MOV AH,2	; вывод буквы С
0010 В2 43	MOV DL,'C'	
0012 CD 21	INT 21H	
0014 СЗ	RET	
0015	THREE ENDP	
	.STARTUP	; точка входа в программу
002С	TOP:	
002С В4 01	MOV AH, 1	; ввод символа в AL
002Е CD 21	INT 21H	
0030 2С 31	SUB AL,31H	; преобразовать в двоичное число
0032 72 F8	JB TOP	; меньше 0?
0034 ЗС 02	CMP AL, 2	
0036 77 F4	JA TOP	; больше 2?
0038 В4 00	MOV AH,0	; вычислить смещение в таблице адресов
003А 8В D8	MOV BX,AX	
ООЗС 03 DB	ADD BX,BX	
Инструкции передачи управления
279
003Е ЕЕ 97 0000 R CALL TABLE [ВХ]; вызов процедуры .EXIT	; выход в DOS
END	; конец исходного текста
Вызов с помощью таблицы адресов может быть дальним, если инструкция call задана в виде call ear ptr [si]. Вызов по команде call table [si] будет дальним, если по адресу table определен массив двойных слов — директивой dd. При дальнем вызове с косвенной адресацией памяти 32-битный адрес перехода считывается из двойного слова, расположенного в сегменте данных по смещению, указанному в регистре S1 или SI + table.
Инструкция RET
Инструкция возврата из подпрограммы (ret) считывает из стека 16-битное число (при ближнем возврате) и помещает его в регистр 1Р. При дальнем возврате из стека извлекается 32-битное значение, затем его 16-битные составляющие копируются в регистры IP и CS. Дальность возврата определяется атрибутом near или far в описании процедуры. Действие инструкции ret в процессорах 8086—80286 показано на рис. 6.8.
Стек
Ближний возврат
Перед вызовом:
SP = FFFD
SS = А000 IP =1004
Рис. 6.8. Воздействие инструкции ближнего возврата на стек и указатель инструкций
В защищенном режиме процессоров 80386—Pentium 4 инструкция дальнего возврата считывает из стека 6 байт. В первых четырех байтах хранится 32-битное смещение
280
Гпава 6
для записи в регистр EIP, а в последних двух — значение селектора для записи в регистр CS. Команда ближнего возврата в защищенном режиме 32-битных процессоров извлекает из стека 4-байтное смещение и записывает его в регистр Е1Р.
В систему команд включена инструкция возврата с непосредственным операндом, при выполнении которой указатель стека увеличивается на заданное число. Смещение регистра указателя стека (SP) происходит после считывания адреса возврата; приращение содержимого регистра SP задано в команде непосредственным значением. Команда ret с непосредственным операндом находит применение в программах, следующих соглашениям о вызовах процедур в стиле языка Pascal. (В языке С предполагается, что очистка стека от параметров выполняется не в процедуре, а в программе, вызвавшей эту процедуру.) В языках высокого уровня параметры передаются подпрограммам через стек. При завершении процедуры параметры следует удалить из стека; непосредственное значение в команде ret как раз задает число лишних байтов.
Пример команды ret с непосредственным операндом приведен в примере 6.19. Команда ret 4, после извлечения из стека адреса возврата, прибавляет к содержимому регистра SP число 4. В результате из стека будут удалены два 16-битных параметра, записанных командами push ах и push вх. Заметим, что в программах на ассемблере команда ret с непосредственным операндом почти нс встречается — она обычно применяется трансляторами с языков высокого уровня. Для доступа к параметрам в процедуре используется регистр ВР, т. к. при косвенной адресации через регистр ВР процессор выбирает сегмент стека по умолчанию.
г Пример 6.19. Доступ к параметрам в стеке и очистка параметров при возврате | из процедуры
0000 В8 001Е 0003 ВВ 0028 0006 50			MOV АХ,30 MOV ВХ,40	
			PUSH АХ PUSH ВХ CALL ADDM	; первый параметр ; второй параметр ; суммирование параметров
0007 0008	53 Е8	0066		
0071		ADDM	PROC NEAR	
0071	55		PUSH BP	; сохранить ВР
0072	8В	ЕС	MOV BP,SP	; установить ВР на кадр стека
0074	8В	46 04	MOV AX,[BP+4]	; прочитать первый параметр
0077	03	46 06	ADD AX,[BP+6]	; прибавить второй параметр
007А	5D		POP BP	; восстановить ВР
007В	С2	0004	RET 4	; возврат с удалением параметров
007Е		ADDM	ENDP	
Дальность возврата по команде ret может быть задана явно: retn или ret г. Эти варианты команды ret, так же как варианты calln и calle инструкции call, применять не рекомендуется — дальность вызова и возврата должна определяться атрибутами near или far директивы proc.
Инструкции передачи управления
281
6.4.	Введение в прерывания
Прерывание — это вызов подпрограммы, сгенерированный либо по сигналу от периферийного устройства (внешнее прерывание), либо в результате выполнения команды. В последнем случае прерывание инициируется либо специальной инструкцией вызова прерывания, либо ошибкой при выполнении некоторых команд. Внутренние прерывания также называются исключениями^. Прерывание, какого бы типа оно ни было, приостанавливает текущую программу и вызывает процедуру обслуживания прерывания.
В этом разделе мы рассмотрим программные прерывания — внутренние прерывания, вызов которых выполняется специальными командами: int, into и int з. Вы познакомитесь с понятием вектора прерывания, а также с командой возврата из прерывания IRET.
Векторы прерываний
Векторы прерываний в реальном режиме — это двойные слова, хранящиеся в таблице векторов, расположенной в первых 1024 байтах стандартной памяти (по адресам 000000Н—0003FFH). В защищенном режиме таблица векторов заменяется таблицей дескрипторов прерываний с восьмибайтными элементами. Процессор обеспечивает хранение и использование 256 векторов прерываний; в каждом из векторов записан адрес процедуры обработки прерывания. В табл. 6.4 перечислены векторы прерываний, зарезервированные фирмой Intel, с указанием номера прерывания, адреса в таблице векторов и причины прерывания. Адрес процедуры обработки прерывания, записанный в векторе, представлен в формате сегмент: смещение, т. е. содержит пару 16-битных значений для записи в регистры IP и CS. Первые два байта вектора образуют смещение, а следующая пара байт — сегментный адрес.
Таблица 6.4. Предопределенные векторы прерываний
Номер	Адрес	В каких процессорах реализовано	Причина прерывания
0	ОН—зн	Во всех	Переполнение при делении
1	4Н—7Н	Во всех	Завершение команды при установленном флаге трассировки (Т)
2	8Н—ВН	Во всех	Немаскируемое прерывание по входу NMI
3	СН—FH	Во всех	Точка останова
4	ЮН—13Н	Во всех	Переполнение
5	14Н—17Н	80186—Pentium 4	Выход за пределы массива при выполнении команды BOUND
6	18Н—1ВН	80186—Pentium 4	Недействительный код операции
7	1СН—1FH	80186—Pentium 4	Эмуляция сопроцессора
6 Исключение — это внутреннее прерывание но ошибке, предполагающее повюрное выполнение команды, вызвавшей прерывание. — Пер
282
Гпава 6
Таблица 6.4 (окончание)			
Номер	Адрес	В каких процессорах реализовано	Причина прерывания
8	20Н—23Н	80386—Pentium 4	Двойная ошибка
9	24Н—27Н	80386	Нарушение границ сегмента сопроцессором
А	28Н—2ВН	80386—Pentium 4	Недействительный сегмент состояния задачи
В	2СН—2FH	80386—Pentium 4	Сегмент отсутствует в памяти
С	ЗОН—ЗЗН	80386—Pentium 4	Нарушение стека
D	34Н—37Н	80386—Pentium 4	Общая защита
Е	38Н—ЗВН	80386—Pentium 4	Страничная ошибка
F	ЗСН—3FH	—	(Зарезервировано)
10	40Н—43Н	80286—Pentium 4	Ошибка сопроцессора
11	44Н—47Н	80486SX	Ошибка выравнивания
12	48Н—4FH	Pentium/Pentium 4	Ошибка контроля процессора
13—1F	50Н—7FH	—	(Зарезервировано)
20—FF	80Н—3FFH	—	Пользовательские прерывания
Первые 32 вектора зарезервированы фирмой Intel для всех поколений микропроцессоров. (Векторы с 32 по 255 доступны для пользователей.) Некоторые из них связаны с программными ошибками, такими как деление на ноль или переполнение при делении. Некоторые прерывания имеют отношение к математическому сопроцессору. Ряд прерываний из диапазона 0—32 используется в IBM PC для вызова системных функций (прерывания ЮН, 17Н и т. д.). Прерывания по векторам 1—7, 9, 16 и 17 действуют как в реальном, так и в защищенном режимах; прочие — только в защищенном.
Инструкции вызова прерываний
В системе команд микропроцессора имеются три команды прерывания: int, into и int з. В реальном режиме эти инструкции считывают значение вектора из таблицы векторов и вызывают процедуру, адресуемую вектором. В защищенном режиме инструкции прерывания получают дескриптор прерывания из соответствующей таблицы. Дескриптор содержит адрес процедуры обработки прерывания, по этому адресу передается управление. Вызов прерывания подобен дальнему вызову подпрограммы: управление передается в пределах всего адресного пространства, при этом в стеке сохраняется адрес возврата — текущие значения регистров IP/EIP и CS.
Инструкция INT
Инструкция int позволяет вызвать любое из 256 прерываний; номер прерывания от 0 до 255 (ООН —FFH) указывается после мнемоники int. Например, инструкция
Инструкции передачи управления
283
int юо вызывает программу обработки прерывания, адрес которой записан в векторе 100; вектор 100 хранится в памяти по адресам 190Н—193Н. Адрес, по которому хранится двойное слово вектора, равен номеру прерывания, умноженному на 4. Например, инструкция int юн вызывает процедуру обработки прерывания, адрес которой в реальном режиме расположен в памяти, начиная с адреса 40Н (ЮН * 4). В защищенном режиме адрес дескриптора прерывания равен произведению номера прерывания на 8, поскольку дескрипторы занимают по 8 байт.
Команда int кодируется двумя байтами. За кодом операции, в первом байте, следует байт с номером вектора. Исключение составляет специальная однобайтная команда прерывания int з, предназначенная для установки точек останова в отладчиках.
Инструкция int выполняет следующие действия:
1.	Сохраняет в стеке регистр флагов.
2.	Обнуляет флаги Т и 1.
3.	Сохраняет в стеке содержимое регистра CS.
4.	Считывает из вектора прерывания значение для записи в регистр CS.
5.	Сохраняет в стеке содержимое регистра IP/EIP.
6.	Считывает из вектора прерывания значение для записи в регистр 1P/EIP.
7.	Записывает в регистры CS и IP/E1P значения из вектора, тем самым передавая управление процедуре обработки прерывания.
Инструкция int, в отличие от команды дальнего вызова процедуры, сохраняет в стеке не только содержимое регистров CS и IP, но также содержимое регистра флагов. То есть, дальнему вызову при выполнении инструкции int предшествует операция PUSHF.
Заметим, что выполнение команды int приводит к сбросу флага прерывания I, что запрещает внешние прерывания, запросы которых подключены к входу INTR (interrupt request) процессора. При значении 1 = 0 вход INTR блокирован; при I = 1 микропроцессор проверяет сигнал на входе 1NTR после каждой выполненной команды.
Программные прерывания используются в основном для обращения к функциям операционной системы или BIOS — при этом не требуется знать адрес системной процедуры. Таким образом — через программные прерывания — вызываются функции для работы с принтером, дисплеем и дисками. Применение инструкции int не только избавляет от необходимости определять адреса системных процедур, но также сокращает объем программы, т. к. команды int занимают по два байта, а дальние вызовы — по пять.
Инструкция IRET/IRETD
Инструкция возврата из прерывания (iret) используется для завершения процедур обслуживания программных и аппаратных прерываний. В отличие от команды возврата ret, инструкция iret восстанавливает из стека не только регистры IP и CS, но и регистр флагов. То есть, команда iret выполняет сначала операцию popf, а затем — RETF.
Команда iret восстанавливает из стека исходные значения флагов I и Т. Поэтому если внешние прерывания были разрешены до вызова процедуры обработки прерывания, то они вновь будут разрешены при выполнении команды iret.
284
Гпава 6
В защищенном режиме процессоров 80386—Pentium 4 для возврата из процедуры обработки прерывания используется команда iretd. Команда iretd, в отличие от iret, восстанавливает указатель инструкций полностью — не только младшие 16 бит регистра IP, но все 32 бита расширенного регистра EIP.
Инструкция INT3
Инструкция int з вызывает специальное программное прерывание в отладчиках; при помощи этой инструкции реализуются точки останова. При установке точки останова команда int з заменяет собой любую команду, поскольку ее длина минимальна — один байт. Прочие команды int кодируются двумя байтами.
Инструкция INTO
Инструкция into вызывает прерывание по вектору 4, если установлен флаг переполнения (О). При значении 0 = 0 инструкция into равносильна пустой операции. Эта инструкция используется для проверки результата сложения или вычитания знаковых чисел. Знаковое переполнение может быть выявлено также инструкцией условного перехода jo.
Процедуры обработки прерываний
Предположим, что в некоторой системе постоянно вычисляется сумма регистров DI, SI, ВР и ВХ, с формированием результата в регистре АХ. Поскольку в данной системе это — задача общего назначения, имеет смысл оформить ее в виде процедуры обработки прерываний и обращаться к ней командой int. (Этот пример мы рассматриваем только для иллюстрации процедур обслуживания прерываний; на практике использование программных прерываний обычно ограничивается системными вызовами.) Решение показано в примере 6.20. Процедура ints отличается от дальних процедур командой возврата — iret вместо ret.
Пример 6.20. Вариант процедуры обработки программного прерывания
0000	INTS	PROC FAR
0000 03	СЗ	ADD AXZBX
0002 03	С5	ADD AXZBP
0004 03	С7	ADD AXZDI
0006 03	С6	ADD AXZSI
0008 CF		IRET
0009	INTS	ENDP
Управление внешними прерываниями
Рассмотрим две команды для управления входом INTR, пока не углубляясь в подробности внешних прерываний. Команда разрешения внешних прерываний sti записывает 1 во флаг I, разрешая прием запросов на прерывания по входу 1NTR. Инструкция запрета внешних прерываний сы обнуляет флаг I, запрещая опрос входа INTR. В процедурах обработки программных прерываний принято разрешать аппаратные прерывания, выполняя команду sti сразу при входе в процедуру. Если этого
Инструкции передачи управления 285
не сделать, то при-длительной блокировке внешних прерываний возможны серьезные нарушения в работе системы.
Прерывания в IBM PC
Прерывания в IBM PC несколько отличаются от прерываний, представленных в табл. 6.4, поскольку первые модели IBM PC были собраны на основе микропроцессора 8086/8088. Из прерываний, перечисленных в табл. 6.4, в первых персональных компьютерах IBM PC использовались только прерывания 0—4.
Поскольку персональные компьютеры на базе процессора 8086/8088 работают в реальном режиме, таблица векторов прерываний расположена в памяти по адресам 00000Н—003FFH. Прерывания в IBM PC перечислены в табл. 6.5. Некоторыми из них мы воспользуемся в последующих главах. Пример прерывания, специфического для IBM PC, — прерывание от системного таймера, генерируемое с частотой’ 18,2 Гц.
Таблица 6.5. Номера прерываний в IBM PC
Номер	Причина прерывания
0	Деление на ноль
1	Трассировка
2	Немаскируемое прерывание по входу NMI
3	Точка останова
4	Переполнение
5	Печать копии экрана	или инструкция bound
6	Неправильная инструкция
7	Эмуляция сопроцессора
8	Метка времени от системного таймера	(18,2 Гц)
9	Нажатие/отпускание клавиши на клавиатуре
А Сигнал запроса прерывания IRQ2 на входе ведущего контроллера прерываний (в АТ используется для подключения ведомого контроллера)
В—F	Сигналы запросов прерывания IRQ3—IRQ7 на входах контроллера прерывания
10	Видео-BIOS
11	Запрос информации об оборудовании
12	Запрос размера стандартной памяти
13	Низкоуровневый доступ к дискам
14	Обслуживание СОМ-портов
15	Различные системные функции
16	Обслуживание клавиатуры
17	Обслуживание параллельных портов (LPT)
286
Гпава 6
Таблица 6.5 (окончание)
Номер	Причина прерывания
18	ROM BASIC
19	Перезагрузка
1А	Функции часов реального времени
1В	Нажатие комбинации клавиш <Ctrl>+<Break>
1С	Пользовательская процедура обработки прерываний от системного таймера
1D	Указатель таблицы параметров подсистемы видео
1Е	Указатель таблицы параметров дисковой подсистемы
1F	Указатель таблицы графических образов литер
20	Завершение программы	(DOS	1.0)
21	Функции DOS
22	Завершение программы
23	Нажатие комбинации клавиш <Ctrl>+<C>
24	Критическая ошибка
25	Чтение диска
26	Запись на диск
27	Завершение программы	с сохранением ее в памяти
28	DOS свободна
2F	Мультиплексное прерывание
31	Функции интерфейса защищенного режима DPMI (DOS Protected Mode Interface)
33	Функции драйвера мыши
67	Функции интерфейса VCPI	(Virtual Control Program Interface) драйвера HIMEM.SYS
70—77	Сигналы запросов прерывания IRQ8—IRQ15 на входах ведомого контроллера
прерываний
Прерывания ООН—1FH и 70Н—77Н присутствуют в IBM PC независимо от типа установленной операционной системы. Операционная система DOS предоставляет дополнительно прерывания 20Н—2FH. Базовая система ввода-вывода BIOS занимает векторы UH—1FH, видео-BIOS — вектор ЮН, а прерывания от внешних устройств — вектора ООН—0FH и 70Н—77Н.
6.5. Управляющие инструкции
Последняя группа команд реального режима — это управляющие команды. В нее входят такие команды, как установка, сброс и инвертирование флага переноса, проверка входов BUDY и TEST и т. п.
Инструкции передачи управления 287
Команды STC, CLC и СМС
Флаг переноса (С) сохраняет значение переноса или заема при сложении или вычитании данных многократной точности. Часто флаг С используют как признак ошибки при выполнении процедур и системных функций. Непосредственное изменение флага С обеспечивают следующие инструкции: команда stc (set carry) устанавливает флаг С в 1, команда clc (clear carry) обнуляет флаг С и команда смс (complement carry) инвертирует флаг С.
Применение флага переноса ограничивается, в основном, операциями сложения и вычитания данных многократной точности. Поэтому флаг С часто используется как признак успешного или неуспешного завершения процедуры. Предположим, некая процедура читает данные с диска в память. Эта операция может пройти успешно, а может закончиться ошибкой — например, если файл с указанным именем не существует. В первом случае процедура обнуляет флаг С (нет ошибки), а во втором — устанавливает в 1 (ошибка). Подобным образом — установкой или сбросом флага С — сообщает о своем исходе большинство функций DOS и BIOS.
Инструкция WAIT
Инструкция wait опрашивает вход BUSY процессоров 80286 и 80386 или аналогичный вход TEST микропроцессора 8086/8088. Если команда wait выполняется в тот момент, когда вход BUSY = 1, то ничего не происходит и программа продолжается со следующей инструкции. Если, напротив, вход BUSY = 0, то микропроцессор будет дожидаться установки сигнала BUSY в 1.
Вход BUSY /TEST микропроцессора обычно подключен к выходу BUSY арифметического сопроцессора 8087—80387. Это соединение позволяет центральному процессору дожидаться завершения работы сопроцессора. Поскольку процессоры 80486—Pentium 4 включают в себя арифметический сопроцессор, сигнал BUSY в них не используется7.
Инструкция HLT
Инструкция hlt (halt) останавливает выполнение программы. Процессор выходит из состояния останова, вызванного командой hlt, при аппаратном или программном сбросе или при выполнении прямого доступа к памяти. Инструкция hlt используется для синхронизации программы с внешними прерываниями.
Инструкция NOP
При программировании в машинных кодах пустая операция (nop) позволяла резервировать место для добавления инструкций при отладке и сопровождении програм
7 То, что в процессорах 80486—Pentium 4 изменены названия контактов и схема подключения сопроцессора, команду WAIT нс упраздняет. — Лер.
288
Гпава 6
мы8. Команда nop (no operation) используется также для формирования временных задержек. Заметим, что точность интервалов времени при использовании команд nop невелика, поскольку в современных процессорах на время выполнения влияют конвейеризация и кэширование.
Префикс LOCK
Префикс lock сбрасывает в 0 выход LOCK процессора на время выполнения инструкции. В результате блокируются системные компоненты, подключенные к магистрали, — в частности, отключаются внешние ведущие устройства на шине. Пример инструкции с префиксом lock — команда lock: mov al,(si). При выполнении операции MOV AL, [SI] выход LOCK= 0.
Инструкция ESC
Инструкция esc (escape) передает информацию от центрального процессора в сопроцессор 8087—Pentium 4. При выполнении команды esc микропроцессор, при необходимости, выставляет адрес памяти или выполняет пустую операцию. Все инструкции сопроцессора начинаются командой esc; код операции сопроцессора задан шестью битами кода команды esc.
Команда esc никогда не используется отдельно от команд сопроцессора. Код команды esc входит в машинный код инструкций сопроцессора (eld, fst, fmul и т. д.). Команды сопроцессора рассматриваются в главе 13.
Инструкция BOUND
Инструкция bound, доступная в микропроцессорах 80186—Pentium 4, сочетает сравнение с условным прерыванием по вектору 5. Эта команда выполняет знаковое сравнение содержимого 16- или 32-битного регистра со значениями двух слов или двойных слов в памяти. В этих словах заданы нижняя и верхняя границы диапазона. Если величина регистра не попадает в этот диапазон, генерируется прерывание по вектору 5. Если проверяемое значение в диапазоне, процессор переходит к следующей инструкции программы.
Например, в команде bound si,data слово по смещению data задает нижнюю границу диапазона, а слово по смещению data + 2 — верхнюю границу. Если при выполнении этой команды число в регистре SI окажется меньше нижней границы в data или больше верхней границы в data + 2 байт, то процессор сгенерирует прерывание по вектору 5. Заметим, что при входе в прерывание по команде bound процессор сохраняет в стеке адрес именно этой команды, а не следующей за ней9.
8 Ассемблеры MASM и TASM подставляют команды NOP в ситуациях, когда предварительная оценка ассемблером длины машинной команды оказывается завышенной. Такие ситуации вероятны при опережающих ссылках — когда имя, указанное в операторе, в данный момент неизвестно (определено в конце программы). — Пер.
9 Прерывания с сохранением в стеке адреса команды, вызвавшей прерывание, называются исключениями. После команды IRET инструкция BOUND будет выполнена повторно. — Пер.
Инструкции передачи управления
289
Инструкции ENTER и LEAVE
Инструкции enter и leave, доступные в процессорах 80186—Pentium 4, применяются для работы с кадром стека. Кадр стека формируется после передачи параметров в процедуру через стек. В кадре стека также хранятся локальные переменные процедуры.
Команда enter создает кадр стека, сохраняя содержимое регистра ВР и затем загружая в него значение вершины стека. После выполнения команды enter данные кадра стека доступны косвенно через регистр ВР. В команде enter указываются два операнда: в первом — число байт для локальных переменных, во втором — уровень вложенности процедуры.
Рассмотрим выполнение команды enter 8, о. Действие этой команды показано на рис. 6.9 — она резервирует восемь байт в кадре стека; уровень вложенности процедуры равен нулю. Сначала инструкция enter 8,о сохраняет содержимое регистра ВР на вершине стека, затем загружает его содержимым регистра SP, после чего вычитает 8 из регистра SP. В результате, команда резервирует 8 байт для временных данных; по смещению [вр] находится верхний байт области временных данных. Команда leave выполняет обратное действие, загружая в регистры SP и ВР их исходные значения.
Кадр стека ------
Рис. 6.9. Кадр стека, созданный инструкцией ENTER 8,0
Работа с кадром стека показана в примере 6.21. Процедура обращается к двум 16-битным параметрам и использует пару 16-битных временных данных. В этом примере кадр стека создается на уровне главной программы10.
10 Обычно команды ENTER н LEAVE включаются в процедуру, а не в вызывающую программу. Пер.
Ю Зак 384
290
Гпава 6
| Пример 6.21. Программа создающая, использующая и удаляющая кадр стека
; Вызов подпрограммы с передачей параметров в кадр стека		
0000 С8 0004 00 0004 Al 00С8 R	ENTER 4,0 MOV АХ,DATAI	; создать кадр стека размером 4 байта
0007 89 46 ГС 000А Al 00CA R	MOV [BP-4],АХ MOV AX,DATA2	; сохранить первый параметр
000D 89 46 ГЕ	MOV [BP-2],AX	; сохранить второй параметр
0010Е8 0100 R	CALL SYS	; вызвать процедуру SYS
00138В 46 ГС	MOV AX,[BP-4]	; прочитать первый результат
0016АЗ 00С8 R	MOV DATAI,AX	; сохранить
00198В 46 FE	MOV AX,[BP-2]	; прочитать второй результат
001САЗ 00CA R 001F С9	MOV DATA2,AX LEAVE	; сохранить
; Подпрограмма,	, использующая параметры кадра стека
0100	SYS PROC NEAR
0100 60	PUSHA
0101 8В 46 FC	MOV AX, [BP-4]	; прочитать первый параметр
0104 8В 5Е FE	MOV BX,[BP-2]	; прочитать второй параметр
	...	; обработка параметров
0130 89 46 ГС	MOV [BP-4],АХ ; записать первый результат
0133 89 5Е FE	MOV [ВР-2],ВХ	; записать второй результат
0136 61	РОРА
0137 СЗ	RET
0138	SYS ENDP
Итоги
□	В системе команд предусмотрено три варианта инструкций безусловного перехода: короткий, ближний и дальний. Короткий переход обеспечивает передачу управления на расстояние от +127 до -128 байт. Ближний, или внутрисегментный, переход с 16-битным знаковым смещением в диапазоне ±32 Кбайт допускает передачу управления в пределах текущего сегмента кода. Дальний, или межсегментный, переход передает управление в любую точку адресного пространства. В процессорах 80386—Pentium 4 диапазон ближнего перехода расширен до ±2 Гбайт, за счет использования 32-битного знакового смещения.
□	Метка, указанная в командах безусловного и условного переходов, должна быть определена в программе — как имя с двоеточием (label:). Например, если в программе объявлена метка doggy:, то команда jmp doggy передает управление по адресу DOGGY.
□	Смещение, указанное в машинном коде короткого или ближнего перехода, представляет собой разность между адресом следующей инструкции и адресом перехода.
О Косвенный переход передает управление по адресу, указанному в регистре или в памяти. Если адрес перехода задан в памяти, то передача управления может быть
Инструкции передачи управления
291
внутрисегментной (адрес задан 16-битным словом в памяти) или межсегментной (адрес задан двойным словом).
□	Условные переходы проверяют один или несколько флагов С, Z, О, Р и S. При выполнении условия команда передает управление по заданному адресу; иначе программа продолжается со следующей инструкции. В процессорах 8086—80286 дальность условных переходов ограничена +127 и —128 байтами; в процессорах 80386 и выше смещение может быть закодировано 16-битным знаковым числом, что расширяет диапазон условных переходов до ±32 Кбайт.
□	К группе команд условного перехода также относятся инструкции циклов. Команда loop декрементирует значение регистра СХ и, если СХ <> 0, передает управление на заданную метку. Команды loope/loopz и loopne/loopnz после декремента содержимого регистра СХ выполняют переход, если СХ О 0 и выполнено условие e/z или ne/nz соответственно. В процессорах 80386—Pentium 4 предусмотрены дополнительные команды loopd, looped и loopned, использующие в качестве счетчика регистр ЕСХ.
□	В систему команд процессоров 80386—Pentium 4 включены инструкции условной установки. Эти команды записывают в указанный байт число 1, если условие выполнено, или 0, если не выполнено.
□	Директивы ле и .endif позволяют программировать принятие решений в стиле языка С. При трансляции этих директив ассемблер генерирует соответствующие команды сравнений и переходов.
□	Директивы .while/.endw и .repeat/.until позволяют программировать на ассемблере ЦИКЛЫ DO-WHILE И REPEAT-UNTIL.
□	Процедура, или иначе подпрограмма, — это набор инструкций для решения некоторой, обычно, типовой задачи. Процедура может быть вызвана многократно и из разных точек программы. Вызов осуществляется командой call, возврат — инструкцией ret. Определение процедуры открывает директива proc, в которой указывается имя и тип процедуры, директива endp завершает определение процедуры.
□	Инструкция call представляет собой комбинацию команд push и jmp. Команда call сохраняет в стеке адрес возврата и передает управление указанной процедуре. При ближнем вызове в стек записывается содержимое регистра IP, а при дальнем — содержимое регистров IP и CS.
□	Инструкция ret возвращает управление из процедуры на команду, следующую за вызовом. При ближнем возврате из стека считывается 16-битное смещение для записи в регистр IP. При дальнем возврате считываются два слова — смещение и сегментный адрес для записи в регистры IP и CS.
□	Прерывания вызываются либо при помощи инструкций, подобных call, либо по сигналам от периферийных устройств. Выполнение текущей программы при прерывании приостанавливается, управление передается процедуре обслуживания прерываний. В конце процедуры специальная команда iret возвращает управление прерванной программе.
О В реальном режиме вектор прерывания представляет собой 4-байтный дальний указатель (в формате сегмент:смещение) на процедуру обработки прерываний.
292
Гпава 6
Таблица для хранения 256 векторов прерываний занимает 1 Кбайт в начале системной памяти. Назначение первых 32 векторов предопределено фирмой Intel; прочие 224 вектора оставлены для программных прерываний. В защищенном режиме размер вектора прерывания составляет восемь байт, а таблица векторов может быть размещена в любой области памяти.
□	При входе в прерывание микропроцессор сохраняет в стеке регистр флагов и содержимое регистров IP и CS. Затем флаги Т и I обнуляются — тем самым отключается трассировка и блокируются внешние прерывания по входу INTR. Наконец, из таблицы векторов считывается адрес процедуры обработки прерывания, и выполняется переход по этому адресу.
□	Программные прерывания по командам int используются вместо дальних вызовов для обращения к системным функциям. В машинном представлении инструкция int на три байта короче инструкции call.
□	Выход из процедуры обработки прерываний выполняется специальной инструкцией возврата iret. Команда iret извлекает из стека значения для записи их в регистры IP и CS, а также исходное значение регистра флага.
□	Команда into вызывает прерывание, если флаг переполнения 0=1.
□	Команда cli запрещает внешние прерывания по входу INTR, обнуляя флаг прерывания I. Флаг I также обнуляется при входе в прерывание — автоматически. Команда sti вновь разрешает прерывания по входу INTR, устанавливая флаг I в 1.
□	Флаг переноса С обнуляется, устанавливается и инвертируется командами clc, stc и смс соответственно.
□	Инструкция wait проверяет состояние входа BUSY или TEST микропроцессора. Если BUSY / TEST = 1, команда wait завершается; если BUSY / TEST = 0, то команда wait продолжает опрос входа BUSY / TEST , пока сигнал на нем не станет равным 1. Вход TEST микропроцессора 8086/8088 в процессорах 80286— 80386 называется BUSY. В процессорах 80486—Pentium 4 вход BUSY / TEST отсутствует.
□	Префикс lock обнуляет выход LOCK микропроцессора на время выполнения инструкции. Команда esc используется для передачи кода команды в арифметический сопроцессор.
□	Инструкция bound сравнивает содержимое 16-битного регистра с границами диапазона, заданными в двух смежных словах памяти. Если значение регистра оказывается вне диапазона, генерируется прерывание по вектору 5.
□	Инструкции enter и leave используются при работе с кадром стека. Кадр стека — это область данных в стеке для передачи параметров процедуре. В кадре стека также размещаются локальные переменные процедуры. Команда enter создает кадр стека, а инструкция leave удаляет его из стека. Кадр стека в процедуре адресуется регистром ВР.
□	В примере 6.22 приведена программа с использованием некоторых команд, рассмотренных в данной главе. В этой программе определена процедура для вывода
Инструкции передачи управления
293
на дисплей null-строки (т. е. строки символов, ограниченной байтом со значением 0). Главная программа несколько раз обращается к этой процедуре, задавая разные строки для вывода.
Пример 6.22. Программа вывода строк
; Программа выводит на экран строки процедурой STRING .MODEL SMALL ; выбор модели SMALL
0000				.DATA MES1 MES 2	DB DB	; начало сегмента данных 13,10,10,0	
0000 0004	0D 0А 0А 00						
	54	68	69 73			'This is a	sample line.',0
65	2Е	; 00					
0000				.CODE		; начало	сегмента кода
; Процедура вывода строки
; Адрес строки — в регистре SI, конец строки задан байтом 0
; Процедура изменяет значения регистров АХ, DX и SI
0000	STRING PROC NEAR
0000	AC	LODSB	; прочитать очередной символ строки
0001	ЗС 00	CMP AL,0	; 0?
0003	74 08	JE STRING1
0005	8A DO	MOV DL,AL ; скопировать символ в регистр DL
0007	В4 02	MOV АН,2	; вывести содержимое регистра DL
0009	CD 21	INT 21Н
000В	ЕВ F3	JMP STRING ; повтор
GOOD	STRING1:
GOOD	СЗ	RET	; возврат из процедуры
000E	STRING ENDP
	.STARTUP	; точка входа в программу
0025	FC	CLD	; режим автоувеличения
0026	BE 0000 R	MOV SI,OFFSET MES1 ; в регистр SI - адрес строки MES1
0029	Е8 FFD4	CALL STRING	; вывод строки MES1
002C	BE 0004 R	MOV SI,OFFSET MES2 ; в регистр SI — адрес строки MES2
002F	E8 FFCE	CALL STRING	; вывод строки MES2
	.EXIT	; выход в DOS
	END	; конец исходного текста
Контрольные вопросы
1.	Что представляет собой короткий переход?
2.	Какой переход позволяет передать управление в любую точку текущего сегмента кода?
3.	Какая инструкция jmp позволяет выполнить переход в любую точку адресного пространства памяти?
4.	Какой переход кодируется пятью байтами?
5.	Каков диапазон ближнего перехода в процессорах 80386—Pentium 4?
294
Гпава 6
6.	Переход какого типа (короткий, ближний или дальний) генерируется ассемблером при передаче управления на расстояние:
а)	02ЮН байт
б)	0020Н байт
в)	Ю000Н байт
7.	Что означает дополнительное двоеточие при определении метки?
8.	Какой регистр или регистры модифицируются при выполнении ближнего перехода?
9.	Какой регистр или регистры модифицируются при дальнем переходе?
10.	Куда передает управление инструкция JMP АХ? Какова дальность перехода?
11.	В чем разница между командами jmp DI и jmp [Dl]?
12.	Чем команда jmp [DI] отличается от jmp far ptr [Dl]?
13.	Какие пять флагов проверяют команды условного перехода?
14.	Как работает инструкция JA?
15.	При каком условии выполняется переход по команде JO?
16.	Какие команды условного перехода применяются при сравнении знаковых данных?
17.	Какие команды условного перехода используются при сравнении беззнаковых чисел?
18.	Какие команды условного перехода проверяют сразу два флага Z и С?
19.	При каком условии выполняется переход по команде jcxz?
20.	Запишите инструкцию для установки регистра AL по условию "ноль"?
21.	Какой регистр использует команда LOOP?
22.	Какой регистр использует команда LOOPD процессора Pentium 4?
23.	Объясните действие команды LOOPE.
24.	Напишите последовательность команд, с использованием инструкции LOOP, для обнуления массива размером 150Н, расположенного в дополнительном сегменте данных со смещения DATA.
25.	Напишите последовательность команд для подсчета количества беззнаковых байт со значением больше 42Н. Результат подсчета сохраните в байте, расположенном в сегменте данных по смещению UP. Включите в программу подсчет числа байт со значением меньше 42Н; результат сохраняйте в байте по смещению down.
26.	Какие команды сгенерирует ассемблер при трансляции следующего фрагмента:
.IF AL==3
ADD AL,2
.ENDIF
27.	Какой цикл задает оператор .while 1?
28.	Напишите последовательность команд для передачи байт массива blocka в массив blockb до тех пор, пока в BLOCKA не будет обнаружен байт со значением 0. Воспользуйтесь конструкцией REPEAT-UNTIL.
29.	Для чего предназначена директива . break?
30.	Используя конструкцию do-while, напишите последовательность команд для поэлементного сложения байтовых массивов blocka и blockb, с записью суммы в blockb. Если сумма равна 12Н, программа завершается.
31.	Что такое процедура (подпрограмма)?
32.	Объясните действие ближнего и дальнего вызова.
Инструкции передачи управления
295
33.	Как выполняется инструкция ближнего возврата?
34.	Какая инструкция завершает выполнение процедуры?
35.	Какой директивой определяется начало процедуры?
36.	Как задают дальность процедуры?
37.	Объясните действие инструкции RET 6.
38.	Составьте ближнюю процедуру, которая возводит в куб число, сохраненное в регистре СХ, нс изменяя при этом никаких регистров, кроме СХ.
39.	Составьте процедуру для умножения значений регистров DI и SI, а затем последующего деления произведения на 100Н. Результат на выходе из процедуры должен быть записан в регистр АХ. Значения регистров, кроме АХ, не должны изменяться.
40.	Составьте процедуру для сложения содержимого регистров ЕАХ, ЕВХ, ЕСХ и EDX. При переносе запишите 1 в регистр EDI. Если перенос не возникнет, обнулите содержимое регистра EDI. Результат процедуры — в регистр ЕАХ.
41.	Что означает понятие "прерывание”?
42.	Какие команды используются для вызова процедур обработки прерываний?
43.	Какие типы прерывания вы знаете?
44.	Для чего предназначен вектор прерывания 0?
45.	Придумайте иллюстрацию вектора прерывания и объясните назначение его составляющих.
46.	Чем инструкция IRET отличается от RET?
47.	Какие действия выполняет команда IRETD?
48.	При каком условии инструкция INTO вызывает прерывание?
49.	В каких ячейках памяти хранится вектор прерывания 40Н?
50.	Какие инструкции управляют входом INTR микропроцессора?
51.	Какие прерывания обслуживают параллельный порт LPT?
52.	Какие прерывания обслуживают ввод с клавиатуры в IBM PC?
53.	Какая инструкция проверяет состояние входа BUSY микропроцессора?
54.	При каких условиях инструкция BOUND прервет выполнение программы?
55.	Каков размер кадра стека, созданного командой enter 16,0?
56.	Какой регистр сохраняется в стеке при выполнении команды enter?
57.	Какая инструкция передает код операции в арифметический сопроцессор?
58.	Что такое null-строка?
59.	Объясните функционирование процедуры string из примера 6.22.
60.	Измените программу в примере 6.22 так, чтобы она выводила ваше имя.
ГЛАВА 7
Возможности программирования на ассемблере
Введение
В этой главе рассмотрены примеры разработки программ с использованием функций BIOS/DOS и макросредств ассемблера MASM. Подробное описание функций DOS и BIOS приведено в Приложении I.
В этой главе обсуждаются макрокоманды, технология модульного программирования с использованием библиотек, функции BIOS/DOS для ввода с клавиатуры, вывода на дисплей и файлового ввода-вывода, функции драйвера мыши, обработка прерываний и разработка резидентных программ.
Темы главы
В этой главе рассмотрены следующие вопросы:
□	применение ассемблера MASM и компоновщика для разработки программ из нескольких модулей;
□	использование директив extrn и public в модульных программах;
□	объединение часто используемых процедур в библиотеку;
□	директивы macro и endm, определение и вызов макрокоманд;
□	последовательный и случайный доступ к файлам;
□	вызовы функций DOS и BIOS;
□	перехват прерываний с использованием функций DOS;
□	операторы условной трансляции;
□	работа с драйвером мыши.
7.1. Модульное программирование
Крупные программные проекты разрабатываются, как правило, группой программистов, что подразумевает разбиение программы на модули. Раздельно разработанные модули объединяются в исполняемую программу компоновщиком (например, компоновщиком в составе пакета MASM 6.x). В этом разделе рассмотрены вопросы, связанные с компоновкой, созданием и использованием библиотек объектных модулей, и, в частности, применение директив extrn и public при разработке многомодульных программ.
Возможности программирования на ассемблере
297
Ассемблер и компоновщик
Программа-ассемблер преобразует исходный модуль с операторами языка ассемблера в объектный модуль. В примере 7.1 приведена программа диалога при трансляции исходного файла NEW.ASM с использованием MASM 6.11. В этом примере трансляция запускается из командной строки DOS. Заметим, что при использовании среды разработки Programmer's WorkBench вызывать программы через командную строку не требуется. В частности, исходный файл с расширением ASM может быть создан и отредактирован непосредственно в среде WorkBench.
\ Пример 7.1. Диалог ассемблера MASM 6.11 при вызове его из командной строки
С:\MASM611\FILES>ml /Flnew.lst new.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
Assembling: new.asm
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.
Object Modules [.objJ: new.obj
Run File [new.eze]: "new.exe"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:
C:\MASM611\FILES>
После имени программы транслятора (ML) указывается имя исходного файла. Переключатель /F1 задает создание файла-листинга с расширением LST и указанным именем — NEW.LST. Получение файла-листинга (что, в принципе, не обязательно) помогает локализовать ошибки. В файле-листинге содержится отчет о результатах ассемблирования с информацией о сгенерированных машинных кодах, в шестнадцатеричном формате. Файл перекрестных ссылок с расширением CRF, в этом примере не созданный, содержит список имен с перечислением ссылающихся на них операторов.
Компоновщик (linker program), вызываемый на второй стадии выполнения программы ML, читает объектные файлы, созданные ассемблером, и объединяет их в исполняемую программу с расширением EXE.
Исполняемый файл размером до 64 Кбайт может быть преобразован к формату СОМ. Программа COM-формата должна начинаться со смещения 100Н (таким образом, максимальный размер преобразуемого файла составляет 64 К— 100Н байт). Программа ML генерирует файл с расширением СОМ, если выбрана модель памяти tiny и точка входа задана по смещению 100Н. Заметим, что среда разработки Programmer's WorkBench также может быть настроена на создание исполняемого файла формата СОМ. Преимущество COM-файлов заключается, в основном, в более быстрой загрузке исполняемого файла в память. Кроме того, по сравнению с
298
Глава 7
аналогичными программами ЕХЕ-формата COM-программы занимают меньше места на диске.
В примере 7.2 приведен вывод программы ML при трансляции трех модулей — NEW, WHAT и DONUT. Программа ML выполняет и ассемблирование, и компоновку (хотя компоновщик может быть вызван и напрямую — командной строкой LINK). Заметим, что до вызова компоновщика необходимо выполнить ассемблирование модулей без ошибок.
{ Пример 7.2. Трансляция программы из нескольких модулей
С:\MASM611\FILES>ml new.asm what.asm donut.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
Assembling: new.asm
Assembling: what.asm
Assembling: donut.asm
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.
Object Modules [.obj]: new.obj+
Object Modules [.obj]: "what.obj" +
Object Modules [.obj]: "donut.obj" Run File [new.exe]: "new.exe" List File [nul.map]: NUL Libraries [.lib]:
Definitions File [nul.def]:
C:\MASM611\FILES>
Компоновщик, вызываемый из программы ML, предлагает ввести имена объектных модулей ("Object Modules"), созданных ассемблером. В этом примере используются три объектных модуля: NEW, WHAT и DONUT. Имя главного модуля (NEW) вводится первым.
Имена библиотечных файлов вводятся при запуске программы ML после имен исходных модулей и переключателя /LINK. (В примере библиотека не задана.) Предположим, что программа NEW.ASM обращается к библиотеке NUMB.LIB. В этом случае транслятор следует вызвать командной строкой:
ML NEW.ASM /LINK NUMB.LIB.
Директивы PUBLIC и EXTRN
Роль директив public и extrn в модульном программировании весьма существенна. Мы используем директиву public для указания имен инструкций, данных и сегментов, доступных в других модулях программы. Директива extrn позволяет указать внешние имена, на которые ссылается данный модуль. Без этих операторов — public и extrn — модули, даже будучи скомпонованными, не могли бы взаимодействовать.
Возможности программирования на ассемблере
299
В директиве public перечисляются глобальные имена модуля, доступные извне. Глобальным может быть объявлено имя адреса перехода (метка) или данных, а также имя сегмента в целом. (Глобальные программные сегменты с одинаковым именем и классом при компоновке объединяются в один физический сегмент.) Программа, использующая директиву public, приведена в примере 7.3.
Пример 7.3. Программа, использующая директиву public
.MODEL SMALL
.DATA
PUBLIC DATA1	; имена DATA1 и DATA2 — глобальные
PUBLIC DATA2
0000 0064[ DATA1 DB 100 DUP (?)
00
]
0064 0064[ DATA2 DB 100 DUP (?)
00
]
.CODE
.STARTUP PUBLIC READ	; имя READ — глобальное
	READ	PROC	FAR
0006	B4 06	MOV	AH,6	; ввод с клавиатуры
0008	B2 FF	MOV	DL,0FFH
000A	CD 21	INT	21H
000C	74 F8	JE	READ	; клавиша не нажата?
000E	CB	RET	
READ ENDP
END
Директива extrn объявляет имя внешним; такое объявление может быть выполнено в пределах программных сегментов данных и кода. Если внешнее имя обозначает данные, то вместе с ним следует указать размерность данных — атрибутом byte, word или dword. Для внешней метки или имени процедуры следует уточнить дальность — атрибутом near или far. В примере 7.4 приведен листинг программы объявления внешних имен — данных и подпрограммы. Обратите внимание — ссылки на внешние имена помечены справа прочерком и буквой е.
Пример 7.4. Объявление внешних имен
.MODEL SMALL .DATA
EXTRN DATA1:BYTE
EXTRN DATA2:BYTE
EXTRN DATA3:WORD
EXTRN DATA4:DWORD .CODE
EXTRN READ:FAR .STARTUP
300
Гпава 7
0005 BF 0000 	E MOV	DX,OFFSET DATAI
0008 B9 000A	MOV	CX, 10
000B	START:	
000B 9A 0000 	E CALL	READ
0010 AA	STOSB	
ООН E2 F8	LOOP	START
.EXIT
END
Библиотеки
Библиотеки — это коллекции процедур общего назначения, применяемых в различных программах. Набор процедур после ассемблирования объединяется в библиотечный файл программой-библиотекарем LIB, входящей в состав пакета MASM. Файл библиотеки указывается при компоновке исполняемой программы, ссылающейся на процедуры библиотеки.
Зачем вообще нужны библиотеки? Библиотека позволяет хранить в одном файле объектные модули с процедурами для решения однотипных задач. При компоновке в исполняемую программу включаются не все процедуры, а только те, что требуются конкретной программе.
Создание файла библиотеки
Файл библиотеки создается программой-библиотекарем LIB. Рассмотрим пример. В примере 7.5 приведены два исходных файла с процедурами read key и echo, из которых мы создадим библиотеку. Обратите внимание, имена процедур следует объявить глобальными — директивой public. В примере имена исходных файлов и глобальных процедур совпадают, хотя это не обязательно. Поскольку процедуры объявлены с атрибутом far, компоновщик имеет возможность разместить их в отдельном сегменте, не связывая с сегментом главного модуля.
Пример 7.5. Модули READ_KEY И ECHO
; Первый модуль библиотеки, читает символ с клавиатуры и возвращает его ; в регистр AL .MODEL TINY PUBLIC READ KEY
	READ_KEY	PROC	FAR
0000	52	PUSH	DX
	READ_KEY1:		
0001	B4 06	MOV	AH, 6
0003	B2 FF	MOV	DH,0FFH
0005	CD 21	INT	21H
0007	74 F8	JE	READ_KEY1
0009	5A	POP	DX
000A	CB	RET	
	READ_KEY	ENDP	
		END	
Возможности программирования на ассемблере
301
; Второй модуль библиотеки, отображает символ из регистра AL на экране
.MODEL TINY
PUBLIC ECHO
ECHO PROC FAR
0000 52	PUSH DX
0001 B4 06 MOV AH,6
0003 8A DO MOV DL,AL
0005 CD 21 INT 21H
0007 5A	POP DX
0008 CB	RET
ECHO ENDP
END
После ассемблирования исходных файлов из примера 7.5 полученные объектные модули объединяются программой LIB в библиотеку, как показано в примере 7.6. Результат объединения в данном примере — библиотечный файл IO.LIB.
Пример 7.6. Выполнение программы-библиотекаря LIB
C:\MASM611\FILES\LIB
Microsoft (R) Library Manager Version 3.20.010
Copyright (C) Microsoft Corp. 1983-1992. All rights reserved.
Library name: IO
Library file does not exist. Create? Y
Operations: READ_KEY+ECHO
List file: IO
Программа LIB сначала запрашивает имя библиотеки. При вводе имени 10 создается файл IO.LIB. Поскольку файл новый, программа-библиотекарь просит подтвердить его создание. Затем выводится строка operations: — библиотекарь предлагает ввести имена модулей и задать операцию. В строке List file: указывается имя файла-листинга для записи списка процедур, содержащихся в библиотеке. Вариант файла-листинга показан в примере 7.7. В нем перечислены глобальные имена и приведены сведения о размерах модулей.
Пример 7.7. Файл-листинг, созданный программой-библиотекарем LIB
ECHO.......ECHO READ_KEY............ READ_KEY
READ_KEY Offset: 00000010H Code and data size: BH
READ_KEY
ECHO Offset: 00000070H Code and data size: 9H
Чтобы добавить модуль к существующей библиотеке, в строке Operations: следует указать имя добавляемого объектного модуля со знаком плюс. Для удаления модуля из библиотеки его имя записывается со знаком минус.
Напомним, что в исполняемый модуль при компоновке будут включены только те модули из библиотеки, которые имеют отношение к вашей программе. Не забудьте
302
Гпава 7
в исходном модуле объявить имя библиотечной процедуры внешним с помощью директивы extrn. Например, если вы используете процедуру echo, то в вызывающем модуле следует задать директиву extrn echo: far.
Макрокоманды
Макрокоманда — это группа инструкций, выполняющих, подобно процедуре (подпрограмме), некоторую типовую задачу. Вместе с тем, макрокоманды и процедуры отличаются друг от друга разным способом вызова. Выполнение команд процедуры происходит за счет передачи управления инструкцией call. Напротив, при каждом вызове макрокоманды в программу подставляются все инструкции из макроопределения.
Макроопределение как бы создает новую операцию, добавляя имя макрокоманды к списку команд процессора. Имя, назначенное при.определении макрокоманды, указывается при вызове; после имени могут быть указаны параметры. Макрокоманды выполняются быстрее процедур, поскольку не требуют дополнительных команд call и ret. Инструкции из макроопределения подставляются в программу заново во всех точках вызова макрокоманды.
Макроопределение вводится директивой macro и заканчивается endm. Перед ключевым словом macro указывается имя макрокоманды; имена формальных параметров перечисляются в конце директивы. Например, директива move macro а, в открывает определение макрокоманды move с двумя параметрами: айв. Последний оператор макроопределения endm записывается отдельной строкой; метка перед оператором endm не допускается.
Пример определения и вызова макрокоманды приведен в листинге 7.8. В начале программы задано определение макрокоманды, которая передает слово из памяти по адресу в в слово по адресу а. Макрокоманда, после ее определения, вызывается дважды; в листинге 7.8 показаны соответствующие макроподстановки (операторы макроподстановок отмечены числом — в данном случае 1). Операторы макроподстановок, показанные в листинге 7.8, в исходной программе не фигурируют — их создает ассемблер. Обратите внимание, что комментарии в макроопределении начинаются не с одинарного, а с двойного символа точки с запятой (;;). Заметим, что макрокоманды необходимо определить до первого обращения к ним, поэтому макроопределения обычно записывают в начале сегмента кода1.
Пример 7.8. Определение макрокоманды и ее вызов
MOVE MACRO А,В
PUSH АХ
MOV АХ,В	; А и В — слова в памяти
MOV А,АХ	; или 16-битные регистры
POP АХ
ENDM
1 Обращение к макрокоманде, определение которой находится ниже в тексте, может быть нс замечено транслятором; макроподстановка при этом не выполняется. — Пер.
Возможности программирования на ассемблере
303
0000	50			1	MQVE PUSH	VARI,VAR2 AX	; вызов макрокоманды	MOVE
0001	А1	0002	R	1	MOV	AX, VAR2		
0004	АЗ	0000	R	1	MOV	VARI,AX		
0007	58			1	POP	AX		
0008	50			1	MOVE PUSH	VAR3,VAR4 AX	; вызов макрокоманды	MOVE
0009	А1	0006	R	1	MOV	AX,VAR4		
ооос	АЗ	0004	R	1	MOV	VAR3,AX		
000F	58			1	POP	AX		
Локальные переменные в макрокомандах
Для задания меток в теле макроопределения используются локальные имена, определяемые директивой local. Эти имена действительны только в пределах макроопределения. Пример локальной метки приведен в листинге 7.9. Если бы метка readi не была локальной, то при втором вызове макрокоманды метка с этим именем была бы задана повторно, что было бы ошибкой.
Пример 7.9. Пример локальной метки в макрокоманде
READ MACRO A	; ввод с клавиатуры
LOCAL READI	; READI - локальная метка
PUSH DX	
READI:	
MOV AH, 6	
MOV DL,0FFH	
INT 21H	
JE READI	
MOV A,AL	
POP DX	
ENDM	
READ VAR5	; ввод символа в VAR5
0000 52	1	PUSH DX	
0001	1 ??0000:	
0001 B4 06	1	MOV AH, 6	
0003 B2 FF	1	MOV DL, 0FFH	
0005 CD 21	1	INT 21H	
0007 74 F8	1	JE ??0000	
0009 A2 0008 R 1	MOV VAR5,AL	
000C 5A	1	POP DX	
READ VAR6	; ввод символа в VAR6
GOOD 52	1	PUSH DX	
000E	1	??0001:	
000E B4 06	1	MOV AH, 6	
0010 B2 FF	1	MOV DL,0FFH	
0012 CD 21	1	INT 21H	
304
Глава 7
0014 74	F8	1	JE	??0001
0016 А2	0009	R	1	MOV	VAR6,AL
0019 5A	1	POP	DX
В этом примере символы вводятся с клавиатуры и сохраняются в памяти по адресу, заданному параметром вызова макрокоманды. Обратите внимание, каким образом выполняется подстановка локальной метки readi. Ассемблер подставляет разные метки с символами ?? в начале — метки получаются уникальными.
Директива local следует непосредственно за директивой macro, без промежуточных комментариев или пустых строк. Иначе ассемблер считает директиву local ошибочной.
Размещение макроопределений в отдельном файле
Если поместить макроопределения в отдельный файл, то этот файл в дальнейшем может быть подключен к исходным модулям, использующим макрокоманды. Включение текста из другого файла при ассемблировании выполняется директивой include. Файлы с макроопределениями иногда называют библиотеками макрокоманд, хотя они не являются библиотеками в обычном смысле. Библиотеки макрокоманд хранят, как правило, в файлах с расширениями INC или МАС.
Директивы public при создании библиотек макрокоманд не используются, поскольку подключение макроопределений происходит до компоновки. Предположим, что макрокоманды хранятся в файле MACRO.МАС каталога C:\ASSM. В программе, использующей макрокоманды из этого файла, должна быть задана директива include C:\assm\macro.mac. Текст макроопределений из файла MACRO.МАС включается в программу так, как если бы он был набран в тексте этой программы. Поэтому включение библиотек макрокоманд не требует ни директивы public, ни директивы EXTRN.
Макрокоманды и директивы условной трансляции
Директивы условной трансляции в макрокомандах позволяют выбирать фрагменты исходного текста при макроподстановках. Эти директивы напоминают по форме условные операторы и циклы языков высокого уровня: if-then, if-then-else, do-while и repeat-until. В отличие от операторов структурного ассемблера MASM директивы условной трансляции записываются без точки. Например, оператор .if относится к директивам структурного ассемблера (логический блок условного выполнения), a if — к директивам условного ассемблирования. В макрокомандах могут быть заданы обе директивы — if и .if.
Директивы условной трансляции
Директивы условной трансляции, подобные операторам if-then и if-then-else языков высокого уровня, приведены в табл. 7.1.
Директивы if и endif ограничивают область условной трансляции. Если условие, заданное в директиве if, не выполнено, ассемблер пропускает операторы между директивами if и endif.
Возможности программирования на ассемблере
305
Таблица 7.1. Директивы условной трансляции
Директива	Условие
IF	Значение аргумента — истина
IFB	Аргумент пустой
IFE	Значение аргумента — не истина
IFDEF	Имя определено
IFNB	Аргумент не пустой
IFNDEF	Имя не определено
IFIDN	Аргументы равны
IFDIF	Первый аргумент отличается от второго
В примере 7.Ю приведен вариант использования директив if, else и endif для задания ширины и длины листа бумаги. В начале программы определены константы true и false — единицей и нулем. Затем, в зависимости от значений констант widt и lengt, определяются значения байтов wide и long. В примере 7.Ю, а приведена исходная программа, в примерах 7. Ю, б и 7.Ю, в — результаты трансляции при WIDT = LENGT = TRUE И При WIDT = FALSE И LENGT = TRUE.
При трансляции программы из примера 7.10, а действия ассемблера определяются присвоениями true или false константам widt и lengt. При widt = lengt = true (в примере 7.10, б) ассемблер устанавливает ширину страницы равной 72, а длину — максимальной. При трансляции программы из примера 7.10, в назначается ширина страницы 80 символов. Вариант, когда длина страницы равна 66, в примере не приведен.
Пример 7.10, а. Исходная программа
TRUE FALSE	EQU 1 EQU 0	; истина — 1 ; ложь — 0
WIDT	EQU FALSE	; истина, если 72 столбца, и ложь, если 80
LENGT	EQU TRUE	; истина, если рулон, и ложь, если 66 строк
IF WIDT
WIDE DB 72
ELSE
WIDE DB 80
ENDIF
72 столбца
; 80 столбцов
IF LENGT
LONG DB -1 ELSE
LONG DB 66 ENDIF
; рулон
; 66 строк
306
Гпава 7
Пример 7.10, б. Результат трансляции при widt = true и lengt=true
IF WIDT 0000 48 WIDE DB 72 ELSE ENDIF	; 72 столбца
IF LENGT 0001 FF LONG DB -1 ELSE ENDIF	; рулон
Пример 7.10, в. Результат трансляции при widt = false и lengt = true
IF WIDT ELSE 0000 50 WIDE DB 80 ENDIF IF LENGT 0001 FF LONG DB -1 ELSE ENDIF	; 72 столбца ; 80 столбцов ; рулон
Другие условные операторы из табл. 7.1 продемонстрированы в дальнейшем изложении.
Директивы условной трансляции в макроопределениях
Директивы условной трансляции в макроопределениях отличаются от операторов структурного ассемблера, рассмотренных в главе 6. Так, например, в макроопределениях допускаются директивы repeat и while без точки, и для них не предусмотрены парные директивы until и endw. Заметим, что эти операторы доступны во всех версиях ассемблера MASM.
Операторы условий, используемые в директивах while и repeat, приведены в табл. 7.2. Заметим, что они отличаются от операторов, используемых в условной части циклов, — .while и .repeat (см. табл. 6.3).
Таблица 7.2. Операторы условий в директивах while и repeat
Оператор условий	Условие или операция
EQ	Равно
NE	Не равно
LE	Меньше или равно
LT	Меньше
GE	Больше или равно
Возможности программирования на ассемблере
307
	Таблица 7.2 (окончание)
Оператор условий	Условие или операция
GT	Больше
NOT	Логическое отрицание
AND	Логическое умножение
OR	Логическое сложение
XOR	Исключающее ’’ИЛИ"
Директива REPEAT в макрокомандах
Конструкция repeat-endm задает повторение последовательности операторов определенное число раз; счетчик повторений указывается после ключевого слова repeat. В результате группа операторов между директивами repeat и endm подставляется в программу заранее известное число раз.
Пример конструкции repeat-endm приведен в программе 7.11. Макрокоманда tests выводит на экран десять символов ASCII — цифры от 0 до 9. Директива repeat в теле макроопределения организует десятикратный повтор вывода символа на экран, каждый раз увеличивая ASCII-код символа. Перед началом цикла в регистр АН записывается номер функции DOS (06Н); начальное значение ASCII-кода (’О’) загружается в регистр DL. После каждого вызова DOS-функции (командой int 21н) генерируется инструкция инкремента регистра DL.
Повторяемые операторы в этом примере — это int 21н (вывод ASCII-кода, заданного в регистре DL, при значении АН = 6) и inc dl (модификация ASCII-кода). Операторы макроподстановки отмечены справа в примере 7.11 цифрами 1 и 2.
[Пример 7.11. Макрокоманда для вывода цифр от 0 до 9 с использованием Г директивы REPEAT
	TESTS	MACRO MOV AH,6 MOV DL,'O' REPEAT 10 INT 21H	
		INC DL ENDM ENDM	; следующая цифра
0000	MAIN	PROC FAR	
		TESTS	; вывести цифры от 0 до 9
0000 В4 06	1	MOV AH,6	
0002 В2 30	1	MOV DL, 'O'	
0004 CD 21	2	INT 21H	
0006 FE С2	2	INC DL	а
0008 CD 21	2	INT 21H	
308
Гпава 7
000А	FE	C2	2	INC	DL
ооос	CD	21	2	INT	21H
000Е	ЕЕ	C2	2	INC	DL
0010	CD	21	2	INT	21H
0012	ЕЕ	C2	2	INC	DL
0014	CD	21	2	INT	21H
0016	FE	C2	2	INC	DL
0018	CD	21	2	INT	21H
001А	FE	C2	2	INC	DL
001С	CD	21	2	INT	21H
001Е	FE	C2	2	INC	DL
0020	CD	21	2	INT	21H
0022	FE	C2	2	INC	DL
0024	CD	21	2	INT	21H
0026	FE	C2	2	INC	DL
0028	CD	21	2	INT	21H
002А	FE	C2	2	INC	DL
.EXIT
0031	MAIN ENDP
Директива WHILE в макрокомандах
Цикл в конструкции while-endm отличается от repeat-endm тем, что количество повторов не фиксировано. Цикл while-endm не счетный — он продолжается, пока выполнено условие в операторе, использующем директиву while.
В примере 7.12 приведена программа применения директивы while для определения байтовой таблицы square с квадратами чисел — от 1 и до предела, обусловленного размерностью элементов таблицы (иными словами, значения квадратов не должны превышать 255). В начале макроопределения вводится имя square, обозначающее адрес первого байта таблицы. Оператор while res lt 255 определяет данные со значением (seed*seed), увеличивая значение seed до тех пор, пока (seed*seed) будет меньше 255. Макроподстановка, приведенная в примере 7.12, показывает, что последнее значение в таблице равно 225 (Е1Н) — это квадрат числа 15 (0FH). Слева от операторов seed = seed + 1 и res = seed*seed в шестнадцатеричной системе показаны значения чисел и их квадратов.
Пример 7.12. Таблица квадратов целых чисел от 1 до 15
0000 SQUARE label byte
= 0001	SEED = 1
= 0001	RES = SEED'SEED
WHILE RES LT 255
DB RES
SEED = SEED+1
RES = SEED*SEED
ENDM
0000 01	1 DB RES
= 0002	1 SEED = SEED+1
= 0004	1 RES = SEED*SEED
; начало массива байт
; вычислить квадрат
Возможности программирования на ассемблере
309
0001 04 = 0003 = 0009
0002 09 = 0004 = 0010
0003 10 = 0005 = 0019
0004 19 = 0006 = 0024
0005 24 = 0007 = 0031
0006 31 = 0008 = 0040
0007 40 = 0009 = 0051
0008 51 = 000А = 0064
0009 64 = 000В = 0079
000А 79 = 000С = 0090
000В 90 = 000D = 00А9
000С А9 = 000Е = 00С4
000D С4 = 000F = 00Е1
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
1 DB RES
1 SEED = SEED+1
1 RES = SEED*SEED
Директива FOR в макрокомандах
Директива for позволяет организовать цикл с подстановкой параметра из списка, как в операторе read языка Basic. В примере 7.13 приведен листинг с использованием директивы for для вывода на экран списка символов. Этот список в макроопределении задан параметром chr:vararg. Ключевое слово vararg означает, что длина списка chr произвольна. При первом вызове макрокоманды disp генерируется код для вывода строки '’BARRY", при втором вызове — код для вывода строки "BREY”. Цикл for-endm повторяется столько раз, сколько параметров задано при вызове макрокоманды DISP.
310
Гпава 7
Пример 7.13. Посимвольный вывод строк с использованием конструкции for-endm
DISP MACRO CHR:VARARG
MOV AH,2
FOR ARG,<CHR>
MOV DL,ARG
INT 21H ENDM ENDM
DISP 'В', 'A', ' R' , ' R' , 'Y' ,
0000 В4 02	1	MOV АН,2
0002 В2 42	2	MOV DL, 'В'
0004 CD 21	2	INT 21Н
0006 В2 41	2	MOV DL,'A'
0008 CD 21	2	INT 21H
000А В2 52	2	MOV DL,'R'
000С CD 21	2	INT 21H
000Е В2 52	2	MOV DL, 'R'
0010 CD 21	2	INT 21H
0012 В2 59	2	MOV DL, ’Y’
0014 CD 21	2	INT 21H
0016 В2 20	2	MOV DL,' '
0018 CD 21	2	INT 21H
		DISP 'В', 'R*, 'E', 'Y
001А В4 02	1	MOV AH,2
001С В2 42	2	MOV DL,'B'
001Е CD 21	2	INT 21H
0020 В2 52	2	MOV DL,' R'
0022 CD 21	2	INT 21H
0024 В2 45	2	MOV DL, 'E'
0026 CD 21	2	INT 21H
0028 В2 59	2	MOV DL,'Y'
002А CD 21	2	INT 21H
Директивы IF, ELSE и ENDIF в макрокомандах
Конструкция if-else-endif в макроопределениях позволяет выбирать фрагменты макроподстановки в зависимости от значений фактических параметров. Напоминаем, что директива условной трансляции if существенно отличается от директивы условного выполнения .if; первая директива, доступная во всех версиях MASM, влияет исключительно на трансляцию макрокоманд, а вторая действует на этапе выполнения программы и доступна только в MASM 6.x.
В примере 7.14 приведен вариант использования макрокоманды с директивами условной трансляции if, ifb, inb, endif и else. В зависимости от значения фактического параметра макрокоманда ю генерирует команды для выполнения одного из нескольких возможных действий: ввода символа, вывода символа или перехода на
Возможности программирования на ассемблере
311
новую строку. Еслй при вызове макрокоманды ю параметр не задан, то генерируются команды для ввода символа. Вызов ю -1 транслируется в набор команд для вывода символов возврата каретки и перевода строки, т. е. для перехода на новую строку. При вызове макрокоманды ю • в • ассемблер генерирует код для вывода латинской буквы В.
Пример 7.14. Макрокоманда с директивами условной трансляции		
0000	.MODEL TINY .CODE	
	IO MACRO CHAR IFB <CHAR> MOV AH,1 ENDIF IFNB <CHAR> MOV AH, 2 IF CHAR EQ -1 MOV DL, 13 INT 21H MOV DL, 10 ELSE MOV DL,CHAR ENDIF ENDIF INT 21H ENDM .STARTUP	; CHAR пуст? ; функция ввода символа ; CHAR непуст? ; функция вывода символа ; CHAR равен -1? ; вывод символа возврата каретки ; следующий символ — перевод строки ; CHAR не равен -1 ; запись CHAR в DL
; Переход на новую строку, вывод 'BE', ввод символа и вновь переход						
; на 0100	новую В4 02		строку 1	10 MOV	-1 AH, 2	; переход на новую строку
0102	В2	0D	1	MOV	DL, 13	
0104	CD	21	1	INT	21H	
0106	В2	0А	1	MOV	DL, 10	
0108	CD	21	1	INT	21H	
010А	В4	02	1	IO MOV	'B' AH, 2	; вывод 'В'
010С	В2	42	1	MOV	DL,'B'	
010Е	CD	21	1	INT	21H	
ОНО	В4	02	1	IO MOV	•E' AH, 2	; вывод 'Е'
0112	В2	45	1	MOV	DL,'E'	
0114	CD	21	1	INT	21H	
0116	В4	01	1	IO MOV	AH, 1	; ввод символа
0118	CD	21	1	INT	21H	
312
Гпава 7
				10	-1
ОНА	В4	02	1	MOV	AH, 2
011С	В2	0D	1	MOV	DL, 13
С11Е	CD	21	1	INT	21H
0120	В2	0А	1	MOV	DL, 10
0122	CD	21	1	INT	21H
.EXIT
END
; переход на новую строку
Оператор ifb <char> в начале макроопределения проверяет, не пуст ли параметр char. Если параметр char пустой (т. е. фактический параметр не задан), генерируется инструкция mov ан, 1 (номер функции DOS для ввода символа), а за ней — вызов DOS (в конце макрокоманды).
Второй условный оператор ifnb <char> проверяет, задан ли параметр char. Если он задан (не пуст), то выполняется следующая конструкция if-else-endif, где проверяется содержимое непустого параметра char. Если параметр char равен —1, то генерируется код для отображения символов возврата каретки и перевода строки. Если значение char не равно —1, то в операторе else оно записывается в регистр DL для вывода на экран. Как видите, макрокоманда ю поддерживает целый набор функций посимвольного ввода-вывода за счет применения директив условной трансляции.
Модульное программирование
Модульное программирование начинается с разбиения задачи на подзадачи; модули для решения подзадач крупных проектов обычно разрабатываются разными программистами.
Модуль оформляется или в виде библиотеки макроопределений, включаемой непосредственно в исходные тексты, или в виде объектного модуля, подключаемого к программе при компоновке. Наборы объектных модулей могут объединяться в библиотеку.
7.2. Работа с клавиатурой и дисплеем
В большинстве приложений предполагается взаимодействие программы с консолью — клавиатурой и дисплеем. В этом разделе мы остановимся на программировании консольного ввода-вывода в операционной системе MS-DOS.
Ввод с клавиатуры функциями DOS
Рассмотрим основные функции DOS для ввода с клавиатуры. (Полный перечень функций DOS для ввода с клавиатуры приведен в Приложении /.) Данные поступают с клавиатуры в виде ASCII-кодов — одиночных или расширенных.
Таблица стандартных кодов ASCII приведена в главе 1 в табл. 1.7; расширенные коды в табл. 1.8 относятся к устройствам вывода (принтеру или дисплею), но не к клавиатуре. Заметим, что большинство кодов в табл. 1.7 соответствуют ASCII-кодам клавиатуры. Коды клавиатуры, с учетом служебных клавиш (<Shift>, <Ctrl> и <AIt>), приведены в табл. 7.3.
Возможности программирования на ассемблере
313
Таблица 7.3. Скан-коды и расширенные ASCII-коды клавиатуры
Клавиша	Скан-код	Расширенный ASCII-код при одновременном нажатии клавиши			
			<Shift>	<Ctrl>	<Alt>
Esc	01				01
1	02				78
2	03			03	79
3	04				7A
4	05				7B
5	06				7C
6	07				7D
7	08				7E
8	09				7F
9	0A				80
0	OB				81
	ОС				82
+	OD				83
Backspace	OE				OE
Tab	OF		OF	94	A5
Q	10				10
W	11				11
E	12				12
R	13				13
T	14				14
Y	15				15
U	16				16
I	17				17
0	18				18
P	19				19
1	1A				1A
1	1B				1B
Enter	1C				1C
Ctrl (левый)	1D				
Ctrl (правый)	1D	I I			
314
Гпава 7
Таблица 7.3 (продолжение)
Клавиша	Скан-код	Расширенный ASCII-код при одновременном нажатии клавиши			
			<Shift>	<Ctrl>	<Alt>
А	1Е				1Е
S	1F				1F
D	20				20
F	21				21
G	22				22
Н	23				23
J	24				24
К	25				25
L	26				26
	27				27
	28				28
	29				29
Shift (левый)	2А				
\	2В				
Z	2С				2С
X	2D				2D
с	2Е				2Е
V	2F				2F
в	30				30
N	31				31
М	32				32
	33				33
	34				34
/	35				35
/ (серый)	35			95	А4
Shift (правый)	36				
PrtSc	Е0 2А ЕО 37				
Alt (левый)	38				
Alt (правый)	38				
Возможности программирования на ассемблере
315
Таблица 7.3 (окончание)
Клавиша	Скан-код	Расширенный ASCII-код при одновременном нажатии клавиши			
			<Shift>	<Ctrl>	<Alt>
Пробел	39				
Caps Lock	ЗА				
F1	ЗВ	ЗВ	54	5Е	68
F2	ЗС	ЗС	55	5F	69
F3	3D	3D	56	60	6А
F4	ЗЕ	ЗЕ	57	61	6В
F5	3F	3F	58	62	6С
F6	40	40	59	63	6D
F7	41	41	5А	64	6Е
F8	42	42	5В	65	6F
F9		43	5С	66	70
F10	44	44	5D	67	71
F11	57	85	87	89	8В
F12	58	86	88	8А	8С
Num	45				
Scroll Lock	46				
Home	Е0 47	47	47	77	97
Стрелка вверх	48	48	48	8D	98
Page Up	Е0 49	49	49	84	99
- (серый)	4А				
Стрелка влево	4В	4В	4В	73	9В
Стрелка вправо	4D	4D	4D	74	9D
+ (серый)	4Е				
End	Е0 4F	4F	4F	75	9F
Стрелка вниз	Е0 50	50	50	91	АО
Page Down	Е0 51	51	51	76	А1
Ins	Е0 52	52	52	92	А2
Del	ЕО 53	53	53	93	АЗ
Pause	ЕО 10 45				
316
Гпава 7
Функции DOS для обслуживания клавиатуры обеспечивают:
□	ввод символа в режиме ожидания, вывод прочитанного символа на дисплей (эхо-печать);
□	проверку нажатия клавиши без ожидания;
□	буферизованный ввод строки.
Ввод символа с эхо-печатью
В примере 7.15 приведена процедура key для ввода символа с клавиатуры. Используется функция ввода 01Н с эхо-печатью. Нажатие комбинации клавиш <Ctrl>+<C> при выполнении этой функции приводит к завершению программы. Хотя способ ввода, реализованный в процедуре key, наиболее простой, но эхо-печать вводимых символов нежелательна в некоторых ситуациях.
Пример 7.15. Ввод символа с клавиатуры с эхо
0000	KEY	PROC	FAR
0000 В4 01		MOV	AH,1	; функция 01H
0002 CD 21		INT	21H	; ввод символа
0004 0А СО		OR	AL,AL	; проверка на 0, очистка флага С
0006 75 03		JNZ	KEY1
0008 CD 21		INT	21Н	; прочитать расширенный код
000А F9		STC	; С = 1 - код расширенный
000В	KEY1:		
000В СВ		RET	
ооос	KEY	ENDP	
Номер DOS-функции 01Н загружается в регистр АН, затем выполняется вызов DOS командой int 21н. Функция ожидает ввода символа; при нажатии клавиши ее символ выводится на дисплей, а ASCII-код сохраняется в регистре AL. При AL = 0 выполняется повторный вызов функции 01Н — для ввода второго байта расширенного кода (см. табл. 7.3). Процедура, приведенная в примере 7.15, устанавливает признак расширенного кода во флаге С. Предполагается, что в вызывающей программе после команды call key выполняется проверка флага С, например, инструкцией JC EXTENDED.
Ввод символа без эхо-печати
Функция 06Н вводит символ без эхо-печати. Расширенные коды клавиш поддерживаются, но, в отличие от функции 01Н, функция 06Н не реагирует на нажатие комбинации клавиш <Ctrl>+<C>. При вызове этой функции следует записать в регистр АН число 06Н, а в регистр DL — 0FFH (-1).
Пример вызова функции 06Н приведен в примере 7.16. Процедура keys, в отличие от процедуры key из примера 7.15, не отображает символы на дисплее.
Пример 7.16. Ввод символа с клавиатуры без эхо
ООО	KEYS PROC FAR
0000 В4 06	MOV АН,6	; функция 6
Возможности программирования на ассемблере
317
0002 В2 FF	MOV	DL,0FFH
0004 CD 21	INT	21H	; ввод символа
0006 74 F8	JE	KEYS	; клавиша не нажата
0008 0А СО	OR	AL,AL	; проверка на 0, сброс флага С
000А 75 03	JNE	KEYS1
000С CD 21	INT	21Н	; прочитать расширенный код
000Е F9	STC	; С = 1 — код расширенный
000F	KEYS1:	
000F СВ	RET	
0010	KEYS ENDP	
У функции 06Н имеется еще одна особенность. Если буфер клавиатуры не содержит символов, то функция устанавливает флаг Z и немедленно завершается. При наличии символа Z = 0. Поскольку функция 06Н не ожидает ввода, программа может до нажатия клавиши выполнять другие действия, периодически проверяя состояние ввода.
Ввод строки символов с эхо-печатью
Для ввода с клавиатуры строки символов предусмотрена функция ОАН; максимальная длина строки — 255 символов. Ввод завершается нажатием клавиши <Enter> (0DH); число вводимых символов ограничивается счетчиком, заданным при вызове функции. Для обращения к функции ОАН следует записать в регистр АН число ОАН, а в пару регистров DS:DX — адрес буфера для записи ASCII-кодов строки. В первом байте буфера следует задать максимально допустимую длину строки. При превышении допустимой длины строки при вводе выдается звуковой сигнал; символ, введенный последним, не отображается на экране и не сохраняется в буфере2. После завершения ввода во втором байте буфера записано число введенных символов.
В листинге 7.17 приведен пример ввода строк в буферы виг1 и BUF2. Перед вызовом функции ОАН в процедуре line в первый байт буфера записывается 255. Недостаток этой программы в том, что ввод второй строки перекрывает отображение первой строки3. Способ улучшения программы в примере 7.17 указан в следующем разделе.
Пример 7.17. Ввод двух строк текста DOS-функцией ОАН
.MODEL SMALL
0000	.DATA
0000 0101[ BUF1 DB 257 DUP (?)
00
; выбор модели SMALL
; начало сегмента данных
; определение массива BUF1
2 При нажатии клавиши <Enter> в буфере ввода сохраняется код 0DH. Поэтому максимальное количество символов на 1 меньше предела, заданного в первом байте буфера. Например, если первый байт буфера содержит число 8, то пользователь сможет ввести только 7 символов. После ввода седьмого символа клавиши ввода блокируются, и действуют только служебные клавиши — <Backspace> (удаление символа слева) и <Enter> (завершение ввода). — Пер.
3 Функция ОАН не переводит строку при нажатии клавиши <Enter>. — Пер.
318
Гпава 7
0101 0101[ BUF2		DB	257 DUP (?)	; определение массива BUF2
	00			
0000 0017	J С6 06 0000 R	FF	.CODE .STARTUP MOV BUF1,255	; начало сегмента кода ; точка входа в программу ; счетчик символов
001С	ВА 0000 R		MOV DX,OFFSET BUF1	; смещение массива BUF1
001F 0022	Е8 000F С6 06 0101 R	FF	CALL LINE MOV BUF2,255	; чтение строки ; счетчик символов
0027	ВА 0101 R		MOV DX,OFFSET BUF2	; смещение массива BUF2
002А	Е8 0004		CALL LINE .EXIT	; чтение строки ; выход в DOS
; Процедура LINE вводит строку с эхо-печатью,
; используя функцию ОАН прерывания 21Н
; На входе в регистре DX — смещение буфера в сегменте данных, ; в его первом байте — предельное число символов.
; На выходе во втором байте буфера	— длина введенной строки
0031	LINE PROC NEAR	
0031 В4 0А	MOV АН,ОАН	
0033 CD 21	INT 21Н	
0035 СЗ	RET	
0036	LINE ENDP	
END	; конец исходного текста
Вывод на дисплей функциями DOS
Для вывода на дисплей предусмотрены такие DOS-функции, как 02Н и 06Н (для одиночных символов) и 09Н (для строк). Хотя ввод с использованием функций 02Н и 06Н работает почти одинаково, мы рекомендуем вам пользоваться функцией 06Н, поскольку она позволяет также выводить символы на экран и, кроме того, нажатие комбинации клавиш <Ctrl>+<C> на нее не действует.
Вывод одиночного ASCII-символа
Рассмотрим пример использования функции 06Н. Программа в примере 7.18 выводит символы возврата каретки (0DH) и перевода строки (ОАН), обращаясь к функции 06Н используя макрокоманду disp (display). (Это именно то, что требуется для усовершенствования программы в примере 7.17 —переход на новую строку дисплея после ввода строки текста.)
[(Пример 7.18. Вывод символов возврата каретки и перевод строки макрокомандой disp
.MODEL TINY .CODE DISP MACRO A
MOV AH,06H
MOV DL,A
; модель TINY
; начало сегмента кода
; вывод символа
; функция DOS 06Н
; символ - в регистр DL
Возможности программирования на ассемблере
319
INT 21Н
ENDM
; вызов функции DOS
			.STARTUP		; точка входа в программу	
0100	В4	06	1	DISP 0DH MOV AH,06H	; возврат	каретки
0102	В2	0D	1	MOV DL,0DH		
0104	CD	21	1	INT 21H		
0106	В4	06	1	DISP 0AH MOV АН,06H	; перевод	строки
0108	В2	0А	1	MOV DL, 0AH		
010А	CD	21	1	INT 21H		
			.EXIT		; выход в	DOS
				END	; конец исходного текста	
Вывод строки символов
Функция DOS 09Н выводит на экран (в позиции курсора) строку ASCll-символов, которые завершаются символом $ (24Н); адрес строки указывается в регистрах DS:DX. Пример использования функции 09Н — вывод сообщения "This is a test line" — приведен в примере 7.19.
Пример 7.19. Вывод сообщения DOS-функцией 09Н
	.MODEL SMALL	; выбор модели SMALL
0000	.DATA	; начало сегмента данных
0000 0D 0А 0А 54 MES	DB 13,10,10,’This	is a test line.$*
68 69 73 20		
69 73 20 61		
20 74 65 73		
74 20 6С 69		
6Е 65 2Е 24		
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 В4 09	MOV AH,9	; функция 09Н
0019 ВА 0000 R	MOV DX,OFFSET MES	; смещение строки
001С CD 21	INT 21H	; вызов DOS
	.EXIT	; выход в DOS
	END	; конец исходного текста
Директива .exit генерирует пару команд mov ан,4сн и int 21н для вызова DOS-функции 4СН (завершение программы и выход в DOS, согласно Приложению /).
Видеофункции BIOS
В дополнение к функциям DOS прерывания INT 21Н, для вывода на дисплей мы можем также воспользоваться функциями видео-BIOS через прерывание INT ЮН. Функции BIOS позволяют не только выводить символы, но и управлять изображе
320
Гпава 7
нием; в частности устанавливать координаты курсора. Кроме того, функции BIOS выполняются обычно быстрее аналогичных функций DOS.
Позиционирование курсора
При использовании функций BIOS/DOS символы выводятся на экран в текущей позиции курсора. Позиционирование курсора дает возможность выводить символы в произвольных точках экрана, что позволяет, например, очистить экран, заполнив его пробелами от левого верхнего угла. Функция ОЗН прерывания ЮН дает текущие координаты курсора, а функция 02Н устанавливает новую позицию курсора. Параметры функций приведены в табл. 7.4.
Таблица 7.4. Функции прерывания INT ЮН для управления курсором
Значение регистра АН	Функция	Параметры
02Н	Установка позиции курсора	DH = номер строки, DL = номер колонки, ВН = номер страницы
ОЗН	Чтение текущих координат курсора	DH = номер строки, DL = номер колонки, ВН = номер страницы
Номер страницы в регистре ВН обычно устанавливается равным нулю — в большинстве программ другие страницы (1—7) дисплея не используются. Страница О доступна в текстовом режиме адаптеров CGA (Color Graphics Adapter), EGA (Enhanced Graphics Adapter) и VGA (Variable Graphics Array).
Координаты курсора отсчитываются от нуля. Точка отсчета — левый верхний угол экрана. В текстовом режиме с разрешающей способностью 80x25 номера колонок находятся в диапазоне 0—79, а номера строк — в диапазоне 0—24.
Пример 7.20 демонстрирует использование функций прерывания INT ЮН для очистки экрана. Вначале курсор устанавливается в позицию (0, 0), затем в каждой позиции экрана (80x25 = 2000 раз) выводится пробел — функцией DOS 06Н. В завершение курсор возвращается в исходную позицию с координатами (0, 0).
Пример 7.20. Очистка экрана
; Программа очищает экран и устанавливает курсор в верхний левый угол экрана
	.MODEL TINY	; выбрать модель TINY
0000	.CODE	; начало сегмента кода
	HOME MACRO	; установка курсора
		; в верхний левый угол экрана
	MOV AH,2	; функция 02Н
	MOV BH,0	; страница 0
	MOV DX,0	; строка 0, столбец 0
	INT 10H	; позиционировать курсор
	ENDM	
	.STARTUP	; точка входа в программу
	HOME	; курсор - в верхний левый угол экрана
Возможности программирования на ассемблере
321
0100	В4 02		.MOV АН, 2
0102	В7 00	]	MOV BH,0
0104	ВА 0000		MOV DX,0
0107	CD 10	1	INT 10H
0109	В9 07DC		MOV CX,25*80	; счетчик знакомест экрана
010С	В4 06		MOV АН,6	; функция 06Н
010Е ОНО	В2 20 MAIN1:		MOV DL,' '	; символ - пробел
оно	CD 21		INT 21Н	; вывести пробел
0112	Е2 ЕС		LOOP MAIN1	; повтор 2000 раз НОМЕ	; курсор - в верхний левый угол экрана
0114	В4 02	1	MOV АН,2
0116	В7 00	1	MOV ВН,0
0118	ВА 0060	1	MOV DX,0
011В	CD 10	1	INT 10Н .EXIT	; выход в DOS END	; конец исходного текста
Как вы можете убедиться после трансляции, компоновки и вызова этой программы, очистка экрана при заполнении его пробелами выполняется довольно медленно. Для ускорения программы воспользуемся возможностью прокрутки изображения функцией 06Н видео-BIOS.
При вызове функции 06Н прерывания ЮН запишем в регистр AL значение ООН — в этом случае все строки экрана заполняются пробелами4. Вариант очистки экрана при помощи функции 06Н приведен в примере 7.21. В этой программе используется также функция 08Н чтения атрибутов символа, используемых при заполнении экрана. При вызове функции прокрутки атрибуты записываются в регистр ВН; в байты регистра DX помещаются координаты нижнего правого угла области прокрутки — 4FH (79) и 19Н (25). Выполнив программу из примера 7.21, вы, несомненно, оцените преимущества функций видео-BIOS. Перечень функций прерывания ЮН см. в Приложении 1.
[ Пример 7.21. Очистка экрана
; Программа очищает экран и устанавливает курсор ; в верхний левый угол экрана
.MODEL TINY	; выбрать модель TINY
0000	.CODE	; начало сегмента кода
HOME MACRO	; курсор - в верхний левый угол экрана
MOV АН,2 MOV ВН,0 MOV DX,0 INT ЮН ENDM .STARTUP ; точка входа в программу 0100 В7 00	MOV ВН,0
0102 В4 08	MOV АН,8
4 AL О 0 задает счетчик строк при прокрутке, AL - 0 означает все строки экрана. — Пер.
11 Зак 384
322
Гпава 7
0104 CD 10	INT ЮН	; прочитать видеоатрибуты
0106 8А DF	MOV BL,BH	; установить номер страницы
0108 8А FC	MOV BH,AH	; загрузить атрибуты
010А В9 0000	MOV CX,0	; координаты верхнего левого угла экрана
010D ВА 194F	MOV DX,194FH	; число строк - 25, столбцов - 79
ОНО В8 0600	MOV AX,60OH	; функция прокрутки
0113 CD 10	INT 10H	; прокрутка экрана
	HOME	; курсор - в верхний левый угол
0115 В4 02	1	MOV AH,2	
0117 В7 00	1	MOV BH,0	
0119 ВА 0000 1	MOV DX,0	
011С CD 10	1	INT 10H	
	.EXIT	; выход в DOS
	END	
Макрокоманда для вывода символа
В завершение темы консольного ввода-вывода приведем пример макрокоманды для вывода одиночных символов. При вызове макрокоманды из примера 7.22 параметр может быть задан регистром или непосредственным значением — символом в кавычках или числовым ASCII-кодом.
Пример 7.22. Вывод символа макрокомандой disp
; Программа выводит строку АВ и символы возврата каретки
; и перевода строки					
				.MODEL TINY	; выбрать модель TINY
				.CODE	; начало сегмента кода
			DISP	MACRO VAR MOV DL,VAR MOV AH,6 INT 21H ENDM	; вывод символа
				.STARTUP	; точка входа в программу
				DISP 'A'	; вывод символа 'А'
0100	В2	41	1	MOV DL,'A'	
0102	В4	06	1	MOV AH,6	
0104	CD	21	1	INT 21H	
0106	ВО	42		MOV AL,'B'	; загрузить в AL код 'В'
				DISP AL	; вывод символа 'В'
0008	8А	D0	1	MOV DL,AL	
000А	В4	06	1	MOV AH,6	
ооос	CD	21	1	INT 21H DISP 13	; возврат каретки
000Е	В2	0D	1	MOV DL,13	
0010	В4	06	1	MOV AH,6	
0012	CD	21	1	INT 21H DISP 10	; перевод строки
0014	В2	0А	1	MOV DL,10	
Возможности программирования на ассемблере
323
0016 В4 Об	1	MOV АН,6
0018 CD 21	1	INT 21Н
.EXIT
END
; выход в DOS
; конец исходного текста
Работа с мышью
Взаимодействие с мышью обеспечивает прерывание INT ЗЗН. В отличие от DOS-функций прерывания INT 21Н, номер функции мыши следует задавать в регистре AL, а регистр АН обнулять (в большинстве случаев). Для обслуживания мыши предусмотрено около 50 функций; основные функции рассмотрены в этом разделе. Полный перечень функций прерывания ЗЗН для мыши, совместимой со стандартом Microsoft, приведен в Приложении 1.
Проверка наличия драйвера мыши
Наличие установленного драйвера мыши проверяется по содержимому вектора прерывания ЗЗН. Если значение вектора 0000:0000, драйвер не установлен. В некоторых системах вектор может быть ненулевым и при отсутствии драйвера; в этом случае вектор указывает на инструкцию iret (код CFH). Вектор можно прочитать функцией 35Н прерывания INT 21Н. Если вектор не равен 0000:0000, следует сравнить байт по адресу вектора с кодом CFH. Процедура проверки приведена в примере 7.23.
Пример 7.23. Процедура проверки наличия установленного драйвера мыши
; Выход: ; если С	: флаг С = 0, если драйвер мыши установлен;	
	: = 0,	то не установлен
0017 0017 В8	3533	CHKM PROC NEAR MOV АХ,3533Н	; прочитать вектор ЗЗН
001А CD 001С 8С 0026 F9 0027 СЗ 002Е F9 002F СЗ 0030 В8	33 СО 0000	INT 21Н	; в ES:BX MOV AX,ES .IF AX==0 && BX==0 ; вектор равен 0000:0000? STC	; драйвер отсутствует RET .ENDIF .IF BYTE PTR ES:[BX]==0CFH STC	;	если IRET, RET	;	то драйвер отсутствует .ENDIF MOV	AX, 0	;	начальная установка мыши
0033 CD 0039 F9 003С F8 003D СЗ ООЗЕ	33	INT ЗЗН .IF AX==0	; нет мыши? STC .ELSE CLC .ENDIF RET CHKM ENDP
324
Гпава 7
Если драйвер установлен, следует еще выяснить, подключена ли мышь к компьютеру. Для этого выполняется начальная установка драйвера и мыши — функцией О прерывания ЗЗН. Если на выходе содержимое регистра АХ = 0000Н, то это означает, что мышь не подключена. Процедура снкм возвращает результат проверки во флаге переноса: С = 0 означает, что драйвер установлен, а мышь подключена и работоспособна; С = 1 говорит о том, что мышь не поддерживается (драйвер и/или мышь не установлены).
Определение типа мыши и версии драйвера
Прерывание ЗЗН позволяет определить тип мыши, подключенной к системе, а также версию драйвера мыши. В примере 7.24 приведена программа, которая отображает эту информацию на экране, после проверок, выполняемых процедурой, примененной в листинге примера 7.23. Версия драйвера и тип мыши определяются функцией 24Н. Эта функция возвращает код версии драйвера в регистр ВХ (в ВН — номер версии, а в BL — номер модификации), а тип мыши — в регистр СН. Например, если драйвер имеет версию 8.00, то после выполнения функции 24Н содержимое регистра ВН = 08Н, а регистра BL = ООН. Тип мыши (в регистре СН) кодируется следующими значениями: 1 — bus, 2 — serial, 3 — InPort, 4 — PS/2 = 4 и 5 — Hewlett-Packard.
•.. .........- • .................. .....................................,... ..................... .
L Пример 7.24. Вывод версии драйвера и типа мыши	> л	1
.MODEL SMALL
0000	.DATA
0000 0D 0A 4E 6F 20 4D MES1	DB 13,10,'No MOUSE/MOUSE DRIVER found.$
4F 55 53 45 2F 4D	
4F 55 53 45 20 44	
52 49 56 45 52 20	
66 6F 75 6E 64 2E	
24	
001F 0D 0A 4D 6F 75 73 MES2	DB 13,10,'Mouse driver version '
65 20 64 72 69 76	
65 72 20 76 65 72	
73 69 6F 6E 20	
0036 20 20 20 20 20 20 Ml	DB	',13,10,'$'
20 0D 0A 24	
0040 004D R 0051 R	TYPES	DW T1,T2,T3,T4,T5
0058 R 005F R	
0064 R	
004A 42 75 73 24	T1	DB 'Bus$'
004E 53 65 72 69 61 6C T2	DB 'Serial$'
24	
0055 49 6E 50 6F 72 74 T3	DB 'InPort$'
24	
005C 50 53 2F 32 24	T4	DB ’PS/2$'
0061 48 50 24	T5	DB 'HP$'
0064 20 6D 6F 75 73 65 MES3	DB ' mouse installed.',13,10,'$'
20 69 6E 73 74 61	
Возможности программирования на ассемблере
325
6С 6С 65 64’ 2Е 0D
ОА 24
0000	.CODE .STARTUP
0017 Е8 0041	CALL CHKM	; проверка наличия драйвера и мыши
001А 73 05	JNC MAIN1	; установлены?
001С ВА 0000 R	MOV DX,OFFSET MES1
001F ЕВ 32	JMP MAIN2
0021	MAIN1:
0021 В8 0024	MOV AX,24H
0024 CD 33	INT 33H	; получить номер версии драйвера
0026 BF 0039 R	MOV DI,OFFSET Ml
0029 8А С7	MOV AL,BH	; записать старшую часть кода версии
002В Е8 004D	CALL DISP
002Е С6 05 2Е	MOV BYTE PTR [DI],'.' ; записать точку
0031 47	INC DI
0032 8А СЗ	MOV AL,BL	; записать младшую часть кода версии
0034 Е8 0044	CALL DISP
0037 ВА 0022 R	MOV DX,OFFSET MES2 ; отобразить версию
003А В4 09	MOV AH,9
003С CD 21	INT 21H
003Е BE 0043 R	MOV SI,OFFSET TYPES ; адрес таблицы типов мыши
0041 В4 00	MOV АН, 0
0043 8А С5	MOV AL,CH
0045 48	DEC AX
0046 03 F0	ADD SI,AX
0048 03 F0	ADD SI,AX
004А 8В 14	MOV DX,[SI]	; отобразить тип
004С В4 09	MOV AH,9
004Е CD 21	INT 21H
0050 ВА 0067 R	MOV DX,OFFSET MES3
0053	MAIN2:
0053 В4 09	MOV AH,9
0055 CD 21	INT 21H
.EXIT
; Процедура проверки наличия драйвера
; Выход: флаг С = О, если мышь присутствует; если С = О, то отсутствует
005B		CHKM	PROC NEAR	
005B	B8	3533	MOVAX,3533H	; прочитать вектор ЗЗН
005E	CD	21	INT 21H	; в ES:BX
0060	8C	CO	MOV AX, ES	
0062	0B	C3	OR AX,BX	; вектор равен 0000:0000?
0064	F9		STC	
0065	74	13	JZ CHKM1	; если, нет драйвера мыши
0067	26:	: 80 3F CF	CMP BYTE PTR ES:[BX] ,	, OCFH
006B	F9		STC	
00 6C	74	ОС	JE CHKM1	; если нет драйвера мыши
006E	B8	0000	MOV AX,0	
0071	CD	33	INT 33H	; начальная установка мыши
326
Гпава 7
0073 83 F8 00 CMP АХ,0
0076 F9	STC
0077 74 01	JZ СНКМ1
; если нет мыши
0079 F8	CLC
007A	CHKM1:
007A C3	RET
007B	CHKM ENDP
; Подпрограмма сохранения номера версии в формате ASCII
; Вход: AL — код версии, DS:DI — адрес результата
; Выход: номер версии в формате ASCII, записанный по адресу DS:DI
007В	DISP PROC NEAR
007В В4	00	MOV АН, 0
007D D4	0A	AAM	; преобразовать в BCD
007F 05	3030	ADD AX,3030H
0082 80	FC 30	CMP АН,ЗОН	; сохранить в коде ASCII
0085 74	03	JE DISP1	; ноль?
0087 88	25	MOV [DI],AH
0089 47	INC DI
008А	DISP1:
008А 88	05	MOV [DI],AL
008С 47	INC DI
008D СЗ	RET
008Е	DISP ENDP
END
Взаимодействие с драйвером мыши
Драйвер мыши работает как в текстовых, так и графических видеорежимах. В графических режимах курсор мыши отображается не прямоугольником, а стрелкой. В этом разделе вы узнаете, как пользоваться драйвером мыши в текстовом режиме. Процедура tm on в примере 7.25 отображает курсор, предварительно проверив наличие драйвера процедурой снкм. Значение флага С при выходе из процедуры tm on отражает наличие (С = 0) или отсутствие (С = 1) мыши и ее драйвера.
Пример 7.25. Проверка наличия драйвера и Отображение курсора мыши
; Процедура TM_ON с помощью процедуры СНКМ проверяет наличие
; драйвера мыши и отображает курсор мыши
; На выходе С = 0, если мышь и драйвер установлены;
f С = 1, если не установлены
0000	TM_ON PROC NEAR
0000	E8 FFDD	CALL CHKM	; проверка наличия драйвера
0003	72 06	JC TM_ON1	; не установлен?
0005 0008 000A 000B 000B oooc	B8 0001	MOV	АХ,1	;	отобразить	курсор мыши CD 33	INT	ЗЗН F8	CLC	;	мышь	установлена TM-ON1: СЗ	RET ТМ ON ENDP
Возможности программирования на ассемблере
327
Следующая программа, приведенная в примере 7.26, демонстрирует слежение за текущими координатами курсора после его включения процедурой tm on.
Пример 7.26. Отображение координат курсора мыши
.MODEL SMALL
0000	.DATA
0000 0D 58 20 50 6F	73 MES DB 13,'X Position= '
69 74 69 6F 6Е	3D
20	
000D 20 20 20 20 20	20 MX DB '
0013 59 20 50 6F 73	69	DB 'Y Position= '
74 69 6F 6E 3D	20
001F 20 20 20 20 20	20 MY DB	$'
24	
0026 0000	X DW ?	; позиция по координате X
0028 0000	Y DW ?	; позиция по координате Y
0000	.CODE
	.STARTUP
0017 E8 006D	CALL TM_ON	; включить курсор
001A 72 47	JC MAIN4	; драйвер не установлен?
001C	MAIN1:	
001C B8 0003	MOV АХ, 3	; прочитать состояние
001F CD 33	INT ЗЗН
0021 83 FB 01	СМР ВХ,1
0024 74 38	JE MAIN3	; левая кнопка нажата?
0026 ЗВ 0E 0026 R	СМР СХ,Х
002A 75 06	JNE MAIN2	; изменилась позиция по X?
002C 3B 16 0028 R	СМР DX,Y
0030 74 EA	JE MAIN1	; не изменилась позиция по Y?
0032	MAIN2:	
0032 89 0E 0026 R	MOV Х,СХ	; сохранить новую позицию
0036 89 16 0028 R	MOV Y,DX
003A BF GOOD R	MOV DI,OFFSET MX
003D 8B Cl	MOV AX,CX
003F E8 0051	CALL PLACE	; сохранить позицию по X в ASCII-коде
0042 BF 001F R	MOV DI,OFFSET MY
0045 Al 0028 R	MOV AX,Y
0048 E8 0048	CALL PLACE	; сохранить позицию no Y в ASCII-коде
004В B8 0002	MOV AX,2
004E CD 33	INT ЗЗН	; скрыть указатель мыши
0050 B4 09	MOV АН,9
0052 BA 0000 R	MOV DX,OFFSET MES
0055 CD 21	INT 21H	; отобразить координаты
0057 B8 0001	MOV AX, 1
005A CD 33	INT ЗЗН	; сделать указатель видимым
005C EB BE	JMP MAIN1	; следующий цикл
005E	MAIN3:	
005E B8 0000	MOV AX,0	; сброс драйвера
0061 CD 33	INT ЗЗН
326
Гпава 7
0073 83 F8 00 СМР АХ,0
0076 F9	STC
0077 74 01	JZ СНКМ1
; если нет мыши
0079 F8	CLC
007А
СНКМ1:
007А СЗ	RET
007В	СНКМ ENDP
; Подпрограмма сохранения номера версии в формате ASCII
; Вход: AL - код версии, DS:DI — адрес результата
; Выход: номер версии в формате ASCII, записанный по адресу DS:DI
007В	DISP PROC NEAR
007В В4 00	MOV АН,0
007D D4 0А	ААМ	; преобразовать в BCD
007F 05 3030	ADD АХ,ЗОЗОН
0082 80 FC 30	СМР АН,ЗОН	; сохранить в коде ASCII
0085 74 03	JE DISP1	; ноль?
0087 88 25	MOV [DI],АН
0089 47	INC DI
008А	DISP1:
008А 88 05	MOV [DI],AL
008С 47	INC DI
008D СЗ	RET
008Е	DISP ENDP
END
Взаимодействие с драйвером мыши
Драйвер мыши работает как в текстовых, так и графических видеорежимах. В графических режимах курсор мыши отображается не прямоугольником, а стрелкой. В этом разделе вы узнаете, как пользоваться драйвером мыши в текстовом режиме. Процедура tm on в примере 7.25 отображает курсор, предварительно проверив наличие драйвера процедурой снкм. Значение флага С при выходе из процедуры tm on отражает наличие (С = 0) или отсутствие (С = 1) мыши и ее драйвера.
Пример 7.25. Проверка наличия драйвера и отображение курсора мыши
; Процедура TM_ON с помощью процедуры СНКМ проверяет наличие
; драйвера мыши и отображает курсор мыши
; На выходе С = 0, если мышь и драйвер установлены;
; C = 1,	если не установлены
0000	TM_ON PROC NEAR
0000 E8	FFDD	CALL CHKM	; проверка наличия драйвера
0003 72	06	JC TM_ON1	; не установлен?
0005 B8	0001	MOV AX,1	; отобразить курсор мыши
0008 CD	33	INT ЗЗН
000A F8 000B 000B C3 oooc	CLC	; мышь установлена TM-ON1: RET ТМ ON ENDP
Возможности программирования на ассемблере
327
Следующая программа, приведенная в примере 7.26, демонстрирует слежение за текущими координатами курсора после его включения процедурой tm_on.
Пример 7.26. Отображение координат курсора мыши
.MODEL SMALL
0000	.DATA
0000 0D 58 20 50 6F	73 MES DB 13,'X Position= '
69 74 69 6F 6Е	3D
20	
000D 20 20 20 20 20	20 MX DB '
0013 59 20 50 6F 73	69	DB 'Y Position= '
74 69 6F 6E 3D	20
001F 20 20 20 20 20	20 MY DB	$'
24	
0026 0000	X DW ?	; позиция по координате X
0028 0000	Y DW ?	; позиция по координате Y
0000	.CODE
	.STARTUP
0017 E8 006D	CALL TM_ON	; включить курсор
001A 72 47	JC MAIN4	; драйвер не установлен?
001C	MAIN1:	
001C B8 0003	MOV АХ,3	; прочитать состояние
001F CD 33	INT ЗЗН
0021 83 FB 01	СМР ВХ,1
0024 74 38	JE MAIN3	; левая кнопка нажата?
0026 ЗВ 0E 0026 R	СМР СХ,Х
002A 75 06	JNE MAIN2	; изменилась позиция по X?
002C 3B 16 0028 R	СМР DX,Y
0030 74 EA	JE MAIN1	; не изменилась позиция по Y?
0032	MAIN2:	
0032 89 0E 0026 R	MOV Х,СХ	; сохранить новую позицию
0036 89 16 0028 R	MOV Y,DX
003A BE GOOD R	MOV DI,OFFSET MX
003D 8B Cl	MOV AX,CX
003F E8 0051	CALL PLACE	; сохранить позицию по X в ASCII-коде
0042 BF 001F R	MOV DI,OFFSET MY
0045 Al 0028 R	MOV AX,Y
0048 E8 0048	CALL PLACE	; сохранить позицию no Y в ASCII-коде
004В B8 0002	MOV AX,2
004E CD 33	INT ЗЗН	; скрыть указатель мыши
0050 B4 09	MOV АН,9
0052 BA 0000 R	MOV DX,OFFSET MES
0055 CD 21	INT 21H	; отобразить координаты
0057 B8 0001	MOV AX,1
005A CD 33	INT ЗЗН	; сделать указатель видимым
005C EB BE	JMP MAIN1	; следующий цикл
005E	MAIN3:	
005E B8 0000	MOV AX,0	; сброс драйвера
0061 CD 33	INT ЗЗН
328
Гпава 7
0063
MAIN4:
.EXIT
; Процедура проверки наличия драйвера
; Выход: флаг С = 0, если мышь присутствует; если С = 0, то отсутствует
0067	СНКМ PROC NEAR
0067 В8 3533	MOV АХ,3533Н	; прочитать вектор ЗЗН
006А CD 21	INT 21Н	; в ES:BX
006С 8С СО	MOV АХ, ES	
006Е 0В СЗ	OR АХ,ВХ	; вектор равен 0000:0000?
0070 F9	STC	
0071 74 13	JZ СНКМ1	; если нет драйвера мыши
0073 26: 80 3F	CF CMP BYTE PTR ES:	[ВХ],0CFH
0077 F9	STC	
0078 74 ОС	JE CHKM1	; если нет драйвера мыши
007А В8 0000	MOV AX,0	
007D CD 33	INT 33H	; начальная установка мыши
007F 83 F8 00	CMP AX,0	
0082 F9	STC	
0083 74 01	JZ CHKM1	; если нет мыши
0085 F8	CLC	
0086	CHKM1:	
0086 СЗ	RET	
0087	СНКМ ENDP
; Процедура проверяет наличие драйвера с помощью процедуры СНКМ
; и отображает курсор мыши
; На выходе С = 0, если мышь и драйвер установлены;
; С = 1, если не установлены
0087	TM_ON PROC NEAR
0087 ЕВ FFDD	CALL СНКМ	; проверка наличия драйвера
008А 72 06	JC TM_ON1
008С В8 0001	MOV АХ,1	; сделать указатель видимым
008F CD 33	INT ЗЗН
0091 F8	CLC
0092	TM_ON1:
0092 СЗ	RET
0093	TM_ON ENDP
; Процедура преобразования содержимого регистра АХ
; в строку десятичных цифр ; Адрес строки — DS:DI
0093			PLACE PROC NEAR	
0093	В9	0000	MOV CX,0	; обнулить счетчик
0096	ВВ	000А	MOV BX,10	; делитель
0099			PLACE1:	
0099	ВА	0000	MOV DX,0	; обнулить старшую часть делимого
009С	F7	F3	DIV BX	; разделить на 10
009Е	52		PUSH DX	
009F	41		INC CX	
00А0	83	F8 00	CMP AX,0	
00 АЗ	75	F4	JNE PLACE1	; частное не ноль?
Возможности программирования на ассемблере
329
00А5	PLACE2:
00А5 ВВ	0005	MOV ВХ,5
00А8 2В	D9	SUB ВХ,СХ
00AA	PLACE3:
00AA 5А	POP DX
00AB 80	С2 30	ADD DL,ЗОН	; преобразовать в ASCII-код
00AE 88	15	MOV [DI],DL	; сохранить цифру
00В0 47	INC DI
GOBI Е2	F7	LOOP PLACE3
00B3 83	FB 00	CMP BX,0
00В6 74	08	JE PLACE5
00В8 8В	CB	MOV CX,BX
00BA	PLACE4:
00BA С6	05 20	MOV BYTE PTR [DI],20H
00BD 47	INC DI
00BE Е2	FA	LOOP PLACE4
оосо	PLACE5:
00С0 СЗ	RET
00С1	PLACE ENDP
END
Программа, приведенная в примере 7.26, включает курсор мыши функцией 01Н прерывания ЗЗН (АХ = 0001Н). Затем она опрашивает состояние мыши функцией 0003Н. После выполнения функции 0003Н нажатия кнопок мыши фиксируются в регистре ВХ, координата X — в регистре СХ, а координата Y — в DX. Описание функций мыши см. в Приложении 1, Программа завершается при нажатии левой кнопки мыши, а координаты сравниваются с результатами предыдущего опроса в ячейках X и Y. Если координаты изменились, их новые значения сохраняются в памяти и отображаются на экране. Обратите внимание, что перед выводом текста на дисплей программа скрывает курсор мыши — функцией 0002Н. Если не выключить курсор, то возможны разные неприятные эффекты — от искажения изображения на экране (как минимум, на экране останется след от курсора мыши) до полного нарушения работоспособности системы.
7.3. Преобразования данных
В вычислительных системах данные часто приходится преобразовывать из одной формы представления в другую. В этом разделе рассмотрены преобразования между двоичными числами и их строковым представлением — десятичным или шестнадцатеричным. Преобразование двоичного числа в строку цифр выполняется перед отображением числа на дисплее, а обратное преобразование — при вводе числовых данных с клавиатуры.
Преобразование двоичного числа в строку ASCII-символов
Преобразование двоичного числа в последовательность ASCII-символов, представляющих число в десятичном формате, выполняется одним из следующих способов:
330
Гпава 7
□	инструкцией аам, если число меньше 100;
□	последовательным делением на 10, до обнуления частного.
В этом разделе мы рассмотрим оба способа.
Инструкция адм преобразует число, заданное в регистре АХ, в двузначное неупакованное BCD-число. Если исходное значение в регистре АХ равно, например, 0062Н (десятичное число 98), то после выполнения инструкции адм в регистре АХ будет сформирован код 0908Н. После прибавления к содержимому регистра АХ числа 3030Н получим пару ASCII-кодов — '9' и '8'. Программа приведена в примере 7.27: процедура disp выполняет преобразование числа, сохраненного в регистре AL (в диапазоне 0—99), и отображает полученную строку на экране. Ведущие (незначащие) нули (при выводе чисел от 0 до 9) преобразуются в пробелы. В примере 7.27 для проверки процедуры disp задан вывод числа 74.
Пример 7.27. Вывод двоичного числа в десятичном формате
; Программа вызывает процедуру DISP для вывода числа 74
	.MODEL TINY	; модель TINY
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0100 ВО 4А	MOV AL,4AH	; тестовые данные — в регистре AL
0102 Е8 0004	CALL DISP	; вывод содержимого AL в десятичном формате
	.EXIT	; выход в DOS
; Процедура вывода двоичного						содержимого регистра AL, e	; диапазоне
; от	0 j	50 !	Э9, в	десятичном формате (использует регистр			АХ без сохранения)
0109			DISP	PROC NEAR			
0109	52			PUSH DX		; сохранить содержимое	регистра DX
010А	В4	00		MOV	AH, 0	; обнулить регистр АН	
010С	D4	0А		AAM		; преобразовать в BCD	
010Е	80	С4	20	ADD	AH,20H		
0111	80	ГС	20	CMP	АН,20H	; в начале 0?	
0114	74	03		JE	DISP1	; да?	
0116	80	С4	10	ADD	АН,10H	; преобразовать в ASCII	-код
0119			DISP1:				
0119	8А	D4		MOV	DL, AH	; вывод первой цифры	
011В	В4	06		MOV	AH, 6		
011D	50			PUSH AX			
011Е	CD	21		INT	21H		
0120	58			POP	AX		
0121	8А	D0		MOV	DL,AL		
0123	80	С2	30	ADD	DL,ЗОН	; преобразовать вторую	цифру в ASCII
0126	CD	21		INT	21H	; вывод второй цифры	
0128	5А			POP	DX	; восстановить содержимое регистра DX	
0129	СЗ			RET			
012А			DISP	ENDP			
END	; конец исходного текста
Команда адм преобразует число в диапазоне 0—99 в двузначное неупакованное
BCD-число за счет деления содержимого регистра АХ на 10. Результат формируется
Возможности программирования на ассемблере 33 j
в регистре АХ: в регистре АН содержится частное, а в AL — остаток от деления Схема преобразования двоичного числа в цифры ASCII, за счет деления на основание системы счисления, может быть расширена на любое количество цифр. Кроме того, эта схема применима к любой системе счисления до 10. Например, преобразование в восьмеричный формат может быть выполнено за счет деления на 8.
Преобразование двоичного числа в строку десятичных цифр выполняется следующим образом.
1.	Разделить число на 10 и сохранить остаток, представляющий очередную цифру результата, в стеке.
2.	Повторять шаг 1 до получения нулевого частного.
3.	Извлекая числа из стека, выводить их на экран, предварительно увеличивая на ЗОН.
В примере 7.28 приведена программа, которая преобразует беззнаковое 16-битное число, находящееся в регистре АХ, в цифры ASCII и отображает их на экране. В этом примере результат очередного деления содержимого регистра АХ на 10 сохраняется в стеке для дальнейшего преобразования в ASCII-код5. Процедура dispx в примере 7.28 также заменяет ведущие (незначащие) нули пробелами.
Пример 7.28. Вывод беззнакового числа в десятичном формате
; Программа отображает на экране содержимое регистра АХ		
0000 0100 В8 04АЗ 0103 Е8 0004	.MODEL TINY	; .CODE	; .STARTUP	; MOV AX,4A3H	; CALL DISPX	; .EXIT	;		модель TINY ’ начало сегмента кода ’ точка входа в программу 	данные для вывода 	отображение содержимого АХ 	в десятичном формате 	выход в DOS
; Процедура :	вывода содержимого регистра AX (изменяет значение АХ)	
010А	DISPX PROC NEAR		
010А 52	PUSH DX	;	 сохранить содержимого DX, СХ и ВХ
010В 51	PUSH CX	
010С 53	PUSH BX	
010D B9 0000	MOV CX,0	;	 обнулить счетчик цифр
ОНО ВВ 000А	MOV BX,10	 делитель
0113	DISPX1:		
0113 ВА 0000	MOV DX,0	;	обнулить старшую часть делимого
0116 F7 F3	DIV BX	разделить DX:AX на 10
0118 52	PUSH DX	сохранить остаток
0119 41	INC CX	 счетчик цифр
011А 0В СО	OR AX,AX	частное равно 0?
011С 75 F5	JNZ DISPX1	;	нет?
5 Остатки приходится сохранять в стеке потому, что порядок формирования цифр результата (от младших к старшим) противоположен принятому порядку вывода цифр (от старших к младшим). — Пер.
332
Гпава 7
011Е	DISPX2:
011Е	5А	POP DX	; остаток - в регистр DX
011F	В4 06	MOV АН,6	; функция 06Н
0121	80 С2 30	ADD DL,ЗОН	; преобразовать остаток в ASCII-цифру
0124	CD 21	INT 21Н	; вывести на экран
0126	Е2 F6	LOOP DISPX2	; повторить для всех цифр
0128	5В	POP ВХ	; восстановить регистры ВХ, СХ и DX
0129	59	POP СХ
012А	5А	POP DX
012В	СЗ	RET
012С	DISPX ENDP
END	; конец исходного текста
Преобразование строки ASCII-символов в двоичное число
Задача преобразования строки ASCII-символов в двоичное число обычно возникает при вводе данных с клавиатуры. Если число состоит из одной цифры, то двоичный результат равен ASCII-коду цифры минус ЗОН. Преобразование числа из нескольких цифр предполагает дополнительные действия, помимо вычитания ЗОН из каждого ASCII-кода. Разность между ASCII-кодом и числом ЗОН прибавляется к двоичному результату, предварительно умноженному на 10.
Последовательность преобразования следующая.
1.	Обнулить двоичный результат.
2.	Вычесть ЗОН из ASCII-кода набранной на клавиатуре цифры, в результате преобразовав его в BCD-цифру.
3.	Умножить двоичный результат на 10 и прибавить к нему BCD-цифру.
4.	Повторять шаги 2 и 3 до завершения ввода.
Эта последовательность реализована в процедуре readn из примера 7.29. Преобразование продолжается, пока не будет введен символ, отличный от цифры. Результат преобразования возвращается в регистр АХ и сохраняется в памяти по адресу temp. (Если требуется вводить числа большей размерности, вместо 16-битного сложения следует воспользоваться 32-битным.)
Пример 7.29. Ввод десятичного числа
; Программа вводит десятичное число с клавиатуры
; и записывает его в слово по адресу TEMP		
	.MODEL SMALL	; модель TINY
0000	.DATA	; начало сегмента данных
0000 0000 TEMP	DW ?	; определить слово для записи результата
0000	.CODE	; начало сегмента кода
	.STARTUP	; точка входа в программу
0017 Е8 0007	CALL READN	; ввод числа
001А АЗ 0000 R	MOV TEMP,AX	; запись его в TEMP
	.EXIT	; выход в DOS
Возможности программирования на ассемблере
зз;
; Процедура ввода десятичного числа с клавиатуры, ; результат - в регистр АХ
0021	READN PROC NEAR
0021	53	PUSH ВХ	; сохранить содержимое регистров ВХ и СХ
0022	51	PUSH СХ
0023	В9 000A	MOV СХ, 10	; множитель
0026	ВВ 0000	MOV ВХ,0	; обнулить результат
0029	READN1:
0029	В4 01	MOV АН,1	; ввод символа без эхо-печати
002В	CD 21	INT 21Н
002D	ЗС 30	СМР AL,'О'
002F	72 14	JB READN2	; меньше 'О'?
0031	ЗС 39	СМР AL,'9'
0033	77 10	JA READN2	; больше '9'?
0035	2С 30	SUB AL,'О'	; преобразовать в ASCII
0037	50	PUSH АХ	; сохранить цифру
0038	8В СЗ	MOV АХ,ВХ	; умножить результат на 10
003А	F7 El	MUL СХ
003С	8В D8	MOV ВХ,АХ
003Е	58	POP АХ
003F	В4 00	MOV АН,0
0041	03 D8	ADD ВХ,АХ	; прибавить цифру к результату
0043	ЕВ Е4	JMP READN1	; повтор
0045	READN2:
0045	8В СЗ	MOV АХ,ВХ	; скопировать результат в регистр АХ
0047	59	POP СХ	; восстановить содержимое СХ и ВХ
0048	5В	POP ВХ
0049	СЗ	RET
004А	READN ENDP
END	; конец исходного текста
Ввод-вывод шестнадцатеричных чисел
Преобразования между двоичными и шестнадцатеричными данными сравнительно просты. Ввод-вывод в шестнадцатеричном формате применяется, как правило, только на системном уровне, но не на уровне пользовательского интерфейса.
Ввод шестнадцатеричных данных
Данные шестнадцатеричного формата обозначаются соответственно шестнадцатеричными цифрами 0—9 и A—F. ASCII-коды десятичных цифр 0—9 — это ЗОН—39Н, а коды букв — это 41Н—46Н (A—F) или 61Н—66Н (a—f). Желательно, чтобы процедура ввода шестнадцатеричных чисел работала как с прописными, так и со строчными буквами.
В примере 7.30 приведены две процедуры преобразования. Процедура conv предназначена для преобразования в двоичное число одной шестнадцатеричной цифры, заданной ASCII-кодом в регистре AL. Процедура readh вводит четырехзначное шестнадцатеричное число с клавиатуры и возвращает результат преобразования в регистр АХ. Последняя процедура может быть модифицирована для ввода шестнадцатеричного числа произвольной размерности.
334
Гпава 7
[ Пример 7.30. Ввод шестнадцатеричного числа
; Программа вводит с клавиатуры число в шестнадцатеричном формате, ; не более 4 цифр, и сохраняет результат
; в 16-битном слове по адресу
.MODEL SMALL
0000	.DATA
0000 0000 TEMP	DW ?
0000	.CODE
	.STARTUP
0017 Е8 0007	CALL READH
001А АЗ 0000 R	MOV TEMP,AX
	.EXIT
TEMP
; модель SMALL
; начало сегмента данных
; слово для записи результата
; начало сегмента кода
; точка входа в программу
; ввод шестнадцатеричного числа
; сохранение результата в TEMP
; выход в DOS
; Процедура ввода шестнадцатеричного числа с клавиатуры, ; без контроля ошибок.
/Результат - в регистр АХ. Использует подпрограмму CONV
0021	READH PROC NEAR
0021	51	PUSH CX	; сохранить содержимое BX и CX
0022	53	PUSH BX
0023	B9 0004	MOV CX,4	; запись 4 в регистры CX и SI
0026	8B Fl	MOV SI,CX
0028	BB 0000	MOV BX,0	; обнулить результат
002B	READH1:
002B	B4 01	MOV AH,1	; ввод символа с клавиатуры
002D	CD 21	INT 21H
002F	E8 000A	CALL CONV	; преобразование символа в двоичное число
0032	D3 ЕЗ	SHL BX,CL
0034	02 D8	ADD BL,AL	; формирование результата в регистре ВХ
0036	4Е	DEC SI
0037	75 F2	JNZ READH1	; повтор 4 раза
0039	8В СЗ	MOV АХ,ВХ	; переслать результат в регистр АХ
003B	5В	POP ВХ	; восстановить содержимое ВХ и СХ
003C	59	POP СХ
003D	СЗ	RET
003E	READH ENDP
; Процедура преобразования шестнадцатеричной цифры,
; находящейся в регистре AL в двоичное число от 0 до 15
003Е	CONV	PROC NEAR
003Е	ЗС 39	СМР AL,’9'
0040	76 08	JBE CONV2	; меньше 9?
0042	ЗС 61	CMP AL,’a’
0044	72 02	JB CONV1	; больше a?
0046	2С 20	SUB AL,20H	; преобразовать к верхнему регистру
0048	CONV1	
0048	2С 07	SUB AL,7
004А	CONV2	
004А	2С 30	SUB AL,ЗОН
004С	СЗ	RET
004D	CONV	ENDP
		END	; конец исходного текста
Возможности программирования на ассемблере
335
Вывод шестнадцатеричных чисел
Для вывода числа в шестнадцатеричном формате двоичное значение разделяется на 4-битные тетрады, каждая из которых преобразуется в шестнадцатеричную цифру. Для получения цифры значение тетрады, если оно находится в диапазоне 0—9, увеличивается на ЗОН, или на 37Н — для значений от 11 (А) до 15 (F).
В примере 7.31 приведена программа, использующая процедуру disph для вывода на дисплей содержимого регистра АХ в шестнадцатеричном формате. Исходное значение сдвигается на 4 бита по кольцу влево, что позволяет сразу выводить цифры в нужной последовательности — от старших к младшим. Поскольку шестнадцатеричное число в регистре АХ состоит из четырех тетрад, преобразование выполняется за 4 цикла.
^Пример 7.31. Вывод шестнадцатеричного числа
; Программа отображает значение содержимого регистра АХ
; в шестнадцатеричном формате, используя процедуру DISPH .MODEL TINY
0000	.CODE
.STARTUP
0100 B8 0ABC	MOV AX,0ABCH	; тестовые данные
0103 E8 0004	CALL DISPH	; вывод
.EXIT	; выход в DOS
; Процедура вывода содержимого регистра АХ
; в виде четырех шестнадцатеричных цифр
010А	DISPH PROC NEAR
010А 53	PUSH BX	; сохранить содержимое BX и CX
010В 51	PUSH CX
010С В1	04	MOV CL,4	; счетчик сдвигов влево
010Е В5	04	MOV CH, 4	; счетчик цифр
ОНО	DISPH1:
ОНО D3	CO	ROL AX,CL	; сдвиг на тетраду
0112 50	PUSH AX
0113 24	OF	AND AL,0FH	; преобразование в ASCII-код
0115 04	30	ADD AL,ЗОН
0117 ЗС	39	CMP AL,'9'
0119 76	02	JBE DISPH2
011В 04	07	ADD AL,7
011D	DISPH2:
011D В4	02	MOV AH,2	; вывод шестнадцатеричной цифры
011F 8А	DO	MOV DL,AL
0121 CD	21	INT 21H
0123 58	POP AX
0124 FE	CD	DEC CH
0126 75	E8	JNZ DISPH1	; повтор для четырех цифр
0128 59	POP СХ	; восстановить регистры
0129 5В	POP ВХ
012А СЗ	RET
012В	DISPH ENDP
	END	; конец исходного текста
336
Гпава 7
Табличные преобразования данных
Одно из наиболее эффективных средств реализации форматных преобразований — таблицы перекодировки. Эти таблицы формируются в памяти, а доступ к их элементам выполняется специальной инструкцией xlat, если элементы байтовые и их количество не превышает 256.
Преобразование в семисегментный код
Один из примеров использования таблицы перекодировки — преобразование двоичного числа в семисегментный код, для вывода на семисегментный индикатор, показанный на рис. 7.1.
Байт управления
0	g	f	е	d	с	b	а
Рис. 7.1. Семисегментный индикатор
Процедура преобразования и таблица семисегментных кодов, для чисел от 0 до 9, приведены в примере 7.32.
| Пример 7.32. Преобразование двоичного числа, хранящегося в регистре AL, | в семисегментный код
0000			SEG7	PROC	: FAR	
0000	53			PUSH ВХ		
0001	ВВ	0008 R		MOV	BX,OFFSET	TABLE
0004	2Е:	D7		XLAT	’ CS:TABLE	
0006	5В			POP	BX	
0007	СВ			RET		
0008	3F		TABLE	DB	3FH	0
0009	06			DB	6	1
000А '5В				DB	5BH	О
000В	4F			DB	4FH	3
ооос	66			DB	66H	4
000D	6D			DB	6DH	5
000Е	7D			DB	7DH	6
000F	07			DB	7	
0010	7F			DB	7FH	8
Возможности программирования на ассемблере
337
ООН 6F	DB 6FH ; 9
0012	SEG7’ END?
Преобразование выполняется двумя командами в предположении, что регистр AL содержит код от 0 до 9. Первая инструкция записывает адрес таблицы в регистр ВХ, а следующая инструкция (xlat) считывает в регистр AL код из таблицы — по смешению, заданному числом в регистре AL.
Поскольку в примере 7.32 таблица перекодировки находится в сегменте кода, в инструкции xlat указан префикс переназначения сегмента (cs). Операнд table задан в команде xlat только для того, чтобы можно было указать префикс cs:. Если таблица находится в сегменте данных, операнд в xlat не указывается6. Заметим, что переназначение сегмента данных в командах lods и movs программируется аналогичным образом.
Таблицы строк ASCII-символов
В некоторых приложениях требуется преобразовать числовой код в строку ASCII-символов. Пример — преобразование дня недели, заданного числом, в название дня. Задачи такого типа решаются за счет построения таблицы, содержащей адреса строк ASCII-символов.
Программа в примере 7.33 содержит определения строк с названиями дней и таблицу с адресами этих строк. При вызове процедуры преобразования (days) регистр AL содержит номер дня недели от 0 (’’Sunday” — воскресенье) до 6 (’’Saturday” — суббота). Например, при значении регистра AL = 2 процедура выводит на экран строку "Tuesday” (вторник).
р”..................................................................    :
Г Пример 7.33. Выдод текущего дня недели
; Программа отображает текущий день недели
; в соответствии с системной датой компьютера .MODEL SMALL
0000	.DATA
0000 000Е R 0015 R	DTAB	DW SUN, MON,TUE,WED, THU, FRI,SAT
001С R 0024 R	
002Е R 0037 R	
003Е R	
000Е 53 75 6Е 64 61 79 SUN	DB ’Sunday$’
24	
0015 4D 6F 6Е 64 61 79 MON	DB 'MondayS'
24	
001С 54 75 65 73 64 61 TUE	DB 'Tuesdays'
79 24	
0024 57 65 64 6Е 65 73 WED	DB 'Wednesdays*
64 61 79 24	
6 Аргумент команды XLAT на смещение не влияет — оно определяется только регистром ВХ, который всегда загружается отдельной командой перед XLAT. — Пер.
338
Гпава 7
002Е 54 61	68 75 72 73 64 79 24	THU	DB	'Thursday$'
0037 46 24	72 69 64 61 79	FRI	DB	'Friday$'
003Е 53 61 0000 0017 В4 0019 CD 001В Е8 0022 0022 52 0023 56	61 74 75 72 64 SAT 79 24 .CODE .STARTUP 2A	MOV АН,2АН 21	INT 21Н 0004	CALL DAYS .EXIT DAYS PROC NEAR PUSH DX PUSH SI		DB	'Saturday$' ; начало сегмента кода ; точка входа в программу ; прочитать день недели ; вывести на экран ; выход в DOS ; сохранить DX и SI
0024 BE 0027 В4 0029 03 002В 03 002D 8В 002F В4 0031 CD 0033 5Е 0034 5А 0035 СЗ	0000 R	MOV 00	MOV CO	ADD F0	ADD 14	MOV 09	MOV 21	INT POP POP RET	SI,OFFSET AH, 0 AX,AX SI, AX DX,[SI] AH, 9 21H SI DX		DTAB	смещение таблицы строк ; прочитать адрес строки ; вывести строку ; восстановить регистры
0036	DAYS ENDP
END	; конец исходного текста
Процедура days начинается с записи адреса таблицы в регистр SI. В регистре АХ формируется смещение от начала таблицы: число в регистре AL расширяется до 16 бит и увеличивается вдвое (поскольку элементы таблицы — слова, а не байты). После прибавления содержимого регистра АХ к содержимому SI последний содержит адрес элемента таблицы. По этому адресу находится указатель начала строки, который загружается в регистр DX командой mov dxz [si]. Затем строка с названием дня, расположенная по адресу ds:dx, отображается на экране DOS-функцией 09Н.
Пример табличного преобразования данных
Рассмотрим пример одновременного использования нескольких типов форматных преобразований. Предположим, требуется вывести на дисплей текущее время и дату. Программа, приведенная в примере 7.34, отображает время в формате 10:45 а.м. и дату В формате Tuesday, Мау 14, 2002.
Для получения текущего времени используется функция 2СН прерывания INT 21Н. Эта функция сохраняет часы в регистре СН, минуты — в CL, секунды — в DH, а сотые доли секунды — в регистре DL. Для получения текущей даты используется DOS-функция 2АН, которая записывает день недели в регистр AL, год — в СХ, день месяца — в DH, и месяц — в регистр DL.
Возможности программирования на ассемблере
339
h Пример 7.34. Вывод времени й даты в формате 10:45 А.м., Tuesday, Мау 14, 2002
.MODEL SMALL ; модель SMALL
.NOLISTMACRO ; не показывать макрорасширений
0000	.DATA	; начало сегмента данных
0000 0026 R 002F 0038 R 0042 004E R 0059 0062 R	R	DTAB DW SUN,MON,TUE,WED,THU,FRI,SAT R R
000E 006D R 0076 0080 R 0087 008E R 0093 001A 0099 R 009F 00A7 R 00B2 OOBB R 00C5	R	MTAB DW JAN,FEB,MAR,APR,MAY,JUN R R R	DW JUL,AUG,SEP,OCT,NOV,DCE R R 1
0026 53 75 6E 64 2C 20 24	61 79f SUN DB 'Sunday, $'
002F 4D 6F 6E 64 2C 20 24	61 79 MON DB 'Monday, $'
0038 54 75 65 73 79 2C 20 24	64 61 TUE DB 'Tuesday, $'
0042 57 65 64 6E 64 61 79 2C	65 73 WED DB 'Wednesday, $' 20 24
004E 54 68 75 72 61 79 2C 20	73 64 THU DB 'Thursday, $' 24
0059 46 72 69 64 2C 20 24	61 79 FRI DB 'Friday, $'
0062 53 61 74 75 61 79 2C 20	72 64 SAT DB 'Saturday, $’ 24
006D 4A 61 6E 75 79 20 24	61 72 JAN DB 'January $'
0076 46 65 62 72 72 79 20 24	75 61 FEB DB 'February $'
0080 4D 61 72 63 24	68 20 MAR DB 'March $'
0087 41 70 72 69 24	6C 20 APR DB 'April $'
008E 4D 61 79 20	24	MAY DB 'May $'
0093 4A 75 6E 65	20 24 JUN DB 'June $'
0099 4A 75 6C 79	20 24 JUL DB 'July $'
009F 41 75 67 75 20 24	73 74 AUG DB 'August $'
00A7 53 65 70 74 62 65 72 20	65 6D SEP DB 'September $' 24
00B2 4F 63 74 6F 72 20 24	62 65 OCT DB 'October $'
OOBB 4E 6F 76 65 65 72 20 24	6D 62 NOV DB 'November $'
00C5 44 65 63 65	6D 62 DCE DB 'December $'
65 72 20 24
340
Глава 7
0000 DISP ENDM 0017 E8 0007		.CODE MACRO CHAR PUSH AX PUSH DX MOV DL,CHAR MOV AH,2 INT 21H POP DX POP AX .STARTUP CALL TIMES CALL DATES .EXIT	; начало сегмента данных ; сохранить АХ и DX ; вывести символ ; восстановить АХ и DX ; начало программы ; вывод времени ; вывод даты ; выход в DOS
001A E8	00A3		
0021	TIMES	PROC NEAR	
0021 B4	2C	MOV АН,2CH	; прочитать системное время
0023 CD	21	INT 21H	
0025 B7	41	MOV BH,'A'	; AM
0027 80	FD ОС	CMP CH,12	
002A 72	05	JB TIMES1	; меньше 12:00?
002C B7	50	MOV BH, 'P'	; нет — РМ
002E 80	ED ОС	SUB CH,12	; уменьшить на 12
0031	TIMES1:		
0031 OA	ED	OR CH,CH	; проверить на ноль
0033 75	02	JNE TIMES2	
0035 B5	ОС	MOV CH,12	; изменить 0 на 12
0037	TIMES2:		
0037 8A	C5	MOV AL,CH	
0039 B4	00	MOV AH,0	
003B D4	OA	AAM	; преобразовать часы
003D OA	E4	OR AH,AH	
003F 74	OD	JZ TIMES3	; больше или равно 10?
0041 80	C4 30	ADD AH,'O'	; преобразовать десятки часов
		DISP AH	; и отобразить их
004E	TIMES3:		
004E 04	30	ADD AL,'O'	; преобразовать единицы часов
		DISP AL	; и отобразить их
		DISP ':'	; отобразить двоеточие
0064 8A	Cl	MOV AL, CL	
0066 B4	00	MOV AH,0	
0068 D4	OA	AAM	; преобразовать минуты
006A 05	3030	ADD AX,3030H	
006D 50		PUSH AX	
		DISP AH	; вывести десятки минут
0078 58		POP AX	
		DISP AL	; вывести единицы минут,
		DISP ' '	; пробел,
		DISP BH	; 'А' или 'Р',
		DISP '.'	; точку,
Возможности программирования на ассемблере
341
DISP	'М'	;	М,
DISP	'.'	;	точку
DISP	' '	;	и пробел
00BF	СЗ			RET	
ООСО			TIMES	ENDP	
оосо			DATES	PROC NEAR	
ООСО	В4	2А		MOV AH,2AH	; прочитать системную дату
00С2	CD	21		INT 21H	
00С4	52			PUSH DX	
00С5	В4	00		MOV AH,0	; выделить день недели
00С7	03	СО		ADD AX,AX	
0СС9	BE	0000 R		MOV SI,OFFSET	DTAB
ООСС	03	F0		ADD SI,AX	
ООСЕ	8В	14		MOV DX,[SI]	; адрес строки с названием дня недели
00D0	В4	09		MOV AH,9	; вывести название
00D2	CD	21		INT 21H	
00D4	5А			POP DX	
00D5	52			PUSH DX	
00D6	8А	С6		MOV AL, DH	; выделить месяц
00D8	FE	С8		DEC AL	
00DA	В4	00		MOV AH,0	
00DC	03	СО		ADD AX,AX	
00DE	BE	OGOE R		MOV SI,OFFSET	МТАВ
00Е1	03	F0		ADD SI,AX	
00E3	8В	14		MOV DX,[SI]	; адрес строки с названием месяца
00Е5	В4	09		MOV AH,9	; вывести название
00Е7	CD	21		INT 21H	
00Е9	5А			POP DX	
ООЕА	8А	С2		MOV AL,DL	; выделить день месяца
ООЕС	В4	00		MOV AH,0	
ООЕЕ	D4	ОА		AAM	; преобразовать в BCD
00F0	ОА	Е4		OR AH,AH	
00F2	74	0D		JZ DATES1	; нет десятков?
00F4	80	С4	30	ADD АН,ЗОН	; преобразовать число десятков
				DISP AH	; и вывести их
0101			DATES1:		
0101	04	30		ADD AL,ЗОН	; преобразовать число единиц
				DISP AL	; и вывести их
				DISP ','	; отобразить запятую
				DISP ' '	; и пробел
0121	81	F9	07D0	CMP CX,2000	; сравнить год с 2000
0125	72	19		JB DATES2	; меньше 2000?
0127	83	Е9	64	SUB CX,100	; привести к диапазону 1900-1999
				DISP '2'	; вывести 20
				DISP 'O'	
013Е	ЕВ	14		JMP DATES3	
0140			DATES2:		
DISP ’1’	; вывести 19
DISP '9*
342
Гпава 7
0154	DATES3:
0154 81 Е9	076С SUB СХ,1900	; преобразовать к диапазону 00—99
0158 8В С1	MOV АХ,СХ
015А D4 0А	ААМ	; преобразовать в BCD,
015С 05 3030	ADD АХ,3030Н	; а затем к ASCII-формату	
	DISP АН	; вывести десятки
	DISP AL	; и единицы
0173 СЗ	RET
0174	DATES ENDP
	END	; конец исходного текста
Процедуры в примере 7.34 используют две таблицы адресов для преобразования номеров дня и месяца в строки. Преобразование двоичных данных времени и даты в BCD-формат выполняется инструкциями аам. Для вывода на дисплей используются DOS-функции 09Н (вывод строки) и 06Н (вывод символа).
Программа построена в модели small с двумя сегментами: .data и .code. Сегмент данных содержит строки символов и таблицы адресов. В сегменте кода определены процедуры times и dates для преобразования и вывода времени и даты, а также макрокоманда disp для вывода ASCII-символа. Заметим, что программа корректно обрабатывает даты до 2100 г.
7.4. Дисковые файлы
Как вы знаете, данные на дисках хранятся в виде файлов. Помимо области памяти для хранения файлов, диск содержит три служебные области: загрузочную запись (boot record), таблицу размещения файлов, иначе FAT (File Allocation Table — FAT), и корневой каталог. Загрузочная запись находится в первом секторе диска — в так называемом загрузочном секторе (boot sector). Программа из загрузочного сектора автоматически считывается в память при включении питания компьютера.
В таблице размещения файлов (FAT) хранятся имена файлов и каталогов и данные об их местоположении. Все операции с файлами выполняются с использованием FAT. При доступе к подкаталогу или содержащемуся в нем файлу выполняется поиск информации в FAT, начиная с корневого каталога. Доступ к дисковым файлам выполняется последовательно — байт за байтом, от начала к концу файла.
Структура данных на диске
На рис. 7.2 показано разбиение поверхности гибкого диска на дорожки и сектора. В жестких дисках физическая организация данных, в принципе, такая же7. Внешней дорожке гибкого или жесткого диска присвоен номер 0. Номер крайней внутренней дорожки гибкого диска равен 39 (при двойной плотности записи — double-density) или 79 (при высокой плотности — high-density). Номер крайнего внутреннего цилиндра жесткого диска зависит от емкости диска и может превышать значение 10000.
7 Дорожкам гибкого диска соответствуют цилиндры жесткого диска. — Пер.
Возможности программирования на ассемблере
343
На рис. 7.3 показана логическая организация диска с областями для хранения данных. Размер FAT зависит ог емкости диска, а размер корневого каталога определяется числом файлов и каталогов в нем. Загрузочная запись расположена в нулевом секторе и имеет фиксированную длину 512 байт.
Дорожка О
Сектор О
Рис. 7.3. Области хранения данных на диске
Загрузочный сектор содержит программу начальной загрузки. Эта программа — так называемый начальный загрузчик (bootstrap loader) — считывается в память при включении системы, после чего, если диск системный (содержит системные файлы, например, операционной системы MS-DOS), получив управление, она загружает в память файлы IO.SYS и MSDOS.SYS. Затем начальный загрузчик передает управление командному процессору COMMAND.COM.
344
Гпава Z
В FAT хранится информация о том, какие кластеры диска свободны, какие испорчены, а в каких содержатся данные. Кластером называется элемент размещения данных на диске, в который может входить один или группа соседних секторов. Таблица FAT используется при записи на диск для поиска свободных кластеров, которые помечены в FAT кодом 0000Н. В большинстве винчестеров кластер состоит из четырех секторов, поэтому даже самый короткий файл занимает на диске не менее 512 х 4 = 2048 байт.
На рис. 7.4 показан формат 32-байтной записи элемента каталога. Запись о файле или подкаталоге содержит сведения об имени (8 байт), расширении (3 байта), атрибутах (1 байт), времени (2 байта) и дате создания (2 байта), а также номер начального кластера (2 байта) и размер файла (4 байта), измеряемый в байтах. Длина представляется 32-битным числом, что ограничивает объем файла 4 Гбайт. (При формировании даты создания файла отсчет лет ведется от 1980 г.; например, значение 8 в поле года соответствует 1988 г.)
32-байтная запись элемента каталога
1Е
1С
1А
18
16
15
С
В
А
8
7
О
Длина (младшее слово) ___________(2 байта)__________ Длина (старшее слово) ___________(2 байта)__________ Номер первого кластера файла (подкаталога) (2 байта)
Дата (2 байта)
Время (2 байта)
Резерв (10 байт)
Атрибуты (1 байт)
Расширение (3 байта)
Имя
(8 байт)
Поле даты
8 4 2 1 16 8 4 2 1
Год	Месяц	День
Поле времени
16 84 2 1 32 16 8 421ХХХХХ
Час	Минуты	Не используется
Поле атрибутов
0 0	А	D	V	S	н	R
А = Архив
D = Подкаталог
V = Метка тома
S = Системный файл
Н = Скрытый файл
R = Только для чтения
Рис. 7.4. Формат 32-байтной записи элемента каталога о файле или подкаталоге
В примере 7.35 приведен шестнадцатеричный дамп корневого каталога. В правой части дампа показаны ASCII-символы, соответствующие шестнадцатеричным байтам слева. Попробуйте определить дату, время, начальный кластер и длину для каждой записи о файле или каталоге в примере 7.35.
Пример 7.35. Дамп содержимого корневого каталога
0000 49 4F 20 20 20 20 20 20 53 59 53 07 00 00 00 00 IO SYS
0010 00	00	00	00	00	00	00	00	93	11	02	00	39	82	00	00
0020 4D	53	44	4F	53	20	20	20	53	59	53	07	00	00	00	00	MSDOS SYS
0030 00	00	00	00	00	00	СО	44	93	12	13	00	92	00	00	00
Возможности программирования на ассемблере
345
0040 43		4F 4D 00 00	4D 41 4Е		44 00	20 43		4F 4D 00 00 00 00 00		COMMAND COM
0050	00		00 00	00		00	93	11 26	00 В5 92 00 00	
0060	42	41 52	52 59	20	42	52	45	59 20	28 00 00 00 00	BARRY BREY
0070	00	00 00	00 00	00	Е0	AD	6А	13 00	00 00 00 00 00	
0080	50	43 54	4F 4F	4С	53	20	20	20 20	10 00 00 00 00	PCTOOLS
0090	00	00 00	00 00	00	80	АЕ	6А	13 5С	00 00 00 00 00	
00А0	44	4F 53	20 20	20	20	20	20	20 20	10 00 00 00 00	DOS
оово	00	00 00	00 00	00	Е0	ВО	6А	13 4Е	00 00 00 00 00	
оосо	52	55 4Е	5F 46	57	20	20	42	41 54	00 00 00 00 00	FUN_FW BAT
00D0	00	00 00	00 00	00	40	BD	6А	13 97	OF 4А 00 00 00	
00Е0	46	4F 4Е	54 57	41	52	45	20	20 20	10 00 00 00 00	FONTWARE
00F0	00	00 00	00 00	00	60	BD	6А	13 6Е	00 00 00 00 00	
Для доступа к файлам обычно используются функции DOS прерывания INT21H. Операционная система DOS поддерживает два способа работы с файлами: с помощью блока управления файлом (File Control Block — FCB) и посредством логического номера файла (file handle). Метод FCB заимствован из прототипа DOS — операционной системы СР/М (control program micro) для персональных вычислительных систем на базе микропроцессоров Z80 и Intel 8080.
Имена файлов
Файлы данных и программ, записанные на диске, идентифицируются именами и расширениями. В операционной системе DOS длина имени файла ограничена восьмью символами. В названиях файлов допускаются почти все ASCII-символы, кроме пробела и символов ”\./[]*»:<>|;?=- Имя файла может быть дополнено расширением, длина которого не превышает трех символов. В табл. 7.5 приведены примеры имен файлов с расширениями и без; расширение отделяется от имени точкой. В операционных системах семейства Windows имя файла может содержать пробелы, а его длина практически неограничена — до 255 символов.
Таблица 7.5. Примеры имен и расширений файлов в операционной системе DOS
Имя.расширение
TEST.TXT
READ-ME.DOC
ALWAY12.COM
RUNJT~.EXE
ГЛАВА.02
NOEXTEN1
1.2
346
Гпава 7
Имена каталогов
Файловая система DOS имеет древовидную структуру, которая образуется вложенными каталогами. Имена каталогов составляются по тем же правилам, что и названия файлов: длина имени не превышает 8 символов, а расширение ограничено тремя (чаще всего расширение не задают, хотя оно допустимо.) При форматировании диска всегда создается основной (корневой) каталог. Корневой каталог обозначается логическим именем диска с символами :\ (так, корневой каталог жесткого диска С обозначается С:\). В корневом каталоге могут быть созданы подкаталоги. Например, подкаталог DATA, расположенный в корневом каталоге, который обозначается как C:\DATA. Любой каталог, в свою очередь, может содержать вложенные каталоги. К примеру, каталоги AREA1 и AREA2, вложенные в каталог C:\DATA; обозначаются путями C:\DATA\AREA1 и C:\DATA\AREA2. Еще один пример — подкаталог LIST в подкаталоге AREA каталога DATA диска С:; он обозначается путем C:\DATA \AREA2\LIST.
Хранение длинных имен файлов
В примере 7.36 приведен шестнадцатеричный дамп FAT с длинными именами файлов в системе Windows 95/98. Первое длинное имя файла в примере 7.36 — это Chapterl.doc, а второе — PRENTICEHALLCAREER1.DOC. Обратите внимание, что полное имя файла записано со смещения 0000Н, хотя сведения о файле (включая имя, ограниченное 8 символами) начинаются со смещения 0020Н. Имя, заданное по смещению 0020Н, хранится в укороченном виде — CHAPE~1.DOC, для совместимости с предыдущими версиями DOS8. Длинные имена файлов сохраняются в кодировке Unicode, которая используется во многих приложениях вместо кода ASCII. Код Unicode — 16-битный. Его первые 256 кодов совпадают с кодами ASCII, а остальные предназначены для представления символов национальных алфавитов.
Пример 7.36. Хранение длинных имен файлов вместе с короткими
0000 41	43	00	68	00	61	00	70-00
0010 72	00	20	00	31	00	2Е	00-64
0020 43	48	41	50	54	45	7Е	31-44
0030 9В	20	9В	20	00	00	91	78-91
0040 42	20	00	43	00	41	00	52-00
0050 52	00	20	00	31	00	2Е	00-64
0060 01	50	00	52	00	45	00	4Е-00
0070 43	00	45	00	20	00	48	00-41
0080 50	52	45	4Е	54	49	7Е	31-44
0090 9В	20	9В	20	00	00	58	7А-68
74 00	0F	00	42	65	00	AC.h.a.p.t...Be.
00 00	00	6F	00	63	00	г. .1...d...о.с.
4F 43	20	00	54	4D	70	CHAPTE-1DOC .ТМр
20 48 00 00 F6 03 00	...х. Н....
45 00	0F	00	АО	45	00	В .C.A.R.E....Е.
00 00	00	6F	00	63	00	R. .1...d...о.с.
54 00	0F	00	АО	49	00	.P.R.E.N.T....I.
00 00	00	4С	00	4С	00	С.Е. .H.A...L.L.
4F 43	20	00	7С	СВ	6D	PRENTI-1DOC .|.т
20 02 00 00 8С 00 00	..Xzh
8 Последняя версия DOS, не поддерживающая длинные имена файлов, — это DOS 6.22. — Пер.
Возможности программирования на ассемблере 347
Последовательный доступ к файлам
файлы в DOS являются последовательными, т. е. они допускают чтение и запись от начала к концу. Для чтения и записи файлов в DOS предусмотрен ряд функций, доступных через прерывание INT 21Н (см. Приложение 1)\ их наличие существенно упрощает работу с файлами. В этом разделе рассмотрены следующие операции над последовательными файлами: создание, чтение, запись, удаление и переименование.
Создание файла
Файл создается DOS-функцией ЗСН. Перед вызовом функции в пару регистров DS:DX записывается адрес строки с именем файла, а в регистр СХ — атрибуты файла или каталога.
Имя файла задается строкой ASCII-символов с кодом ООН в конце — так называемой строкой ASCIIZ. Имя файла может быть дополнено именем пути, с указанием диска и подкаталогов, ведущих к файлу. Варианты определения строк ASCIIZ с именами файлов приведены в примере 7.37.
||^ример7.37.Задание имен Файлов
0000 44 4F 47 2Е 54 58 FILE1 DB 'DOG.TXT',0 54 00
0008 43 ЗА 44 41 54 41	FILE2 DB ’С:DATA.DOC’,0
2Е 44 4F 43 00
0013 43 ЗА 5С 44 52 45	FILE3 DB 'С:\DREAD\ERROR.FIL', 0
41 44 5С 45 52 52
4F 52 2Е 46 49 4С 00
Предположим, требуется сохранить на диске массив из 256 байт, создав для этого новый файл DATA.NEW в текущем каталоге. Процедура создания файла приведена в примере 7.38.
JpiHMep 7.38. Создание файла с именем DATA.NEW
.MODEL SMALL
0000	.DATA
0000 44 41 54 41	FILEN DB 'DATA.NEW',0	; имя файла
2Е 4Е 45 57	
00	
0000	.CODE
	.STARTUP
0017 В4 ЗС	MOV АН,ЗСН	; функция создания файла
0019 В9 0000	MOV CX,0	; атрибуты файла
001С ВА 0000 R	MOV DX,OFFSET FILEN ; указатель имени файла
001F CD 21	INT 21H
	.EXIT
	END
348
Гпава 7
При создании файла в регистре СХ указываются атрибуты, или характеристики, файла. Наименования атрибутов файлов и каталогов, а также соответствующие им позиции битов и их назначения показаны в табл. 7.6. Атрибут выбран, если соответствующий разряд установлен в 1.
Таблица 7.6. Атрибуты файлов
Номер бита	Значение бита	Атрибут	Назначение
0	01Н	Read-only (только чтение)	Обозначает файл, доступный только на чтение, или каталог
1	02Н	Hidden (скрытый)	Скрывает имя файла или каталога
2	04Н	System (системный)	Обозначает системный файл
3	08Н	Volume (метка тома)	Задает имя дискового раздела
4	ЮН	Subdirectory (каталог)	Задает имя каталога
5	20Н	Archive (архивный)	Означает, что файл был изменен после выполнения команды backup
Функции DOS для работы с файлами устанавливают флаг С по результатам выполнения. Флаг С = 1 означает ошибку'. Возможные ошибки при создании файла — это, чаще всего, или отсутствие указанного пути, или недостаток свободных логических номеров файла, или неисправность носителя. При С = 0, что означает успешное завершение функции, в регистре АХ записан логический номер файла. Логический номер файла — это уникальное число, которое идентифицирует файл после его создания или открытия. Логический номер обеспечивает доступ к файлу без указания имени файла, что, в частности, повышает производительность файловых операций.
Запись в файл
Теперь, после того как мы создали файл FILE.NEW, мы можем записать в него данные. Перед записью в файл, его следует либо создать заново, либо открыть, если он существует. При создании или открытии файла соответствующая DOS-функция возвращает логический номер файла с помощью регистра АХ. Это значение в дальнейшем используется для идентификации файла при выполнении большинства файловых операций, включая запись. Для записи в файл используется DOS-функция 40Н; перед ее вызовом следует записать в регистр АН число 40Н, в регистр ВХ — логический номер файла, в СХ — число записываемых байт, и в DS:DX — адрес данных для записи.
Предположим, что требуется записать в файл 256 байт из области buffer. Фрагмент программы для решения этой задачи, с использованием функции 40Н, показан в примере 7.39. Ошибка при записи также определяется по значению флага С. Если запись прошла успешно, то флаг С обнулен, а в регистре АХ находится счетчик записанных байтов. Ошибка при записи обычно означает переполнение диска или неисправность носителя.
Возможности программирования на ассемблере
349
”..................................................... .....................................................................................................................
[Шрймер 7.39. Запись 256 байт в файл, логический номер которого задан регистром АХ ............................а.*....;..^.......;...-....(.............................................................................................................................................................
0010 8B D8	MOV	BX,AX	; файловый дескриптор — в BX
0012 B4 40	MOV	АН,40H	; функция записи
0014 B9 0100	MOV	CX,256	; счетчик байт
0017 BA 0009 R	MOV	DX,OFFSET BUFFER	; адрес буфера
001A CD 21	INT	21H	; вызов функции DOS
001C 72 32	JC	ERROR1	; ошибка?
Открытие, чтение и закрытие файла
Для чтения файла его необходимо предварительно открыть. При открытии файла DOS проверяет наличие файла с указанным именем и возвращает в регистре АХ логический номер файла. Полученный логический номер используется в операциях чтения, записи и закрытия файла.
В примере 7.40 приведена последовательность инструкций для открытия файла, чтения из него 256 байт в область памяти buffer и его закрытия. Перед вызовом функции 3DH (открытие файла) в регистре AL указываются типы операций, допустимых с файлом. Если значение регистра AL = ООН, то файл доступен только на чтение; при AL = 01Н разрешена только запись; а при AL = 02Н — и чтение, и запись.
......................................................................................................
?Г1|5имер 7.40. Открытие файла TEMP.ASM и чтение из него 256 байт в массив buf
.MODEL SMALL
0000 0000 54 45 4D 50 2Е 41 53 4D 00 0009 0100 [		.DATA FILEN DB 'TEMP.ASM',0		; имя файла ; буфер чтения
		BUF	DB 256 DUP (?)	
	00			
0000	]	.CODE		
		.STARTUP		
0017	В8 3D02	MOV	AX,3D02H	; функция открытия файла
001А	ВА 0000 R	MOV	DX,OFFSET FILEN	; адрес имени файла
001D	CD 21	INT	21H	
001F	8В D8	MOV	BX, AX	; логический номер файла — в ВХ
0021	В4 3F	MOV	AH,3FH	; функция чтения файла
0023	В9 0100	MOV	CX,256	; счетчик байт
0026	ВА 0009 R	MOV	DX,OFFSET BUF	; адрес буфера
0029	CD 21	INT	21H	
002В	В4 ЗЕ	MOV	АН,3EH	; функция закрытия файла
002D	CD 21	INT	21H	
.EXIT
END
350
Гпава 7
Чтение выполняется функцией 3FH. Перед вызовом функции в регистр ВХ записывается логический номер файла, в регистр СХ — число байт для чтения, а в пару DS:DX — адрес области памяти для сохранения прочитанных данных. Ошибка при чтении фиксируется установкой флага С. Если С = 0, то в регистре АХ находится счетчик байтов, прочитанных из файла.
По окончании работы с файлом его следует закрыть. Если оставить файл открытым, то при сбое системы вероятно нарушение структуры файла или файловой системы в целом. Если сбой произойдет после записи, до закрытия файла, то записанные данные могут быть потеряны.
Указатель файла
При открытии, записи или чтении файла текущий элемент последовательного файла адресуется специальным указателем файла (file pointer). При открытии файла указатель находится в начале файла, в позиции 0. А если из файла длиной 1024 байта после его открытия было прочитано 1023 байта, то указатель адресует последний байт файла (пока что не конец файла).
Указатель файла — это 32-битное число, со значением смещения текущего байта файла от начала файла. После открытия файла позиция указателя может быть изменена функцией 42Н. При вызове этой функции в регистре AL указывается точка отсчета и направление перемещения указателя: от начала файла (AL = ООН), от текущей позиции (AL = 01H) или от конца файла в обратном направлении (AL = 02Н). В регистры СХ и DX записывается 32-битное значение перемещения (в DX — наименее значимая часть, в СХ — наиболее значимая), а в регистр ВХ — логический номер файла.
Предположим, что требуется добавить 256 байт к существующему файлу. Напомним, что при открытии файла его указатель устанавливается на первый байт данных. Если не переместить указатель в конец файла, то будут перезаписаны первые 256 байт существующих данных. В примере 7.41 приведена программа, которая открывает файл, перемещает его указатель в конец файла, записывает 256 байт и закрывает файл. В результате файл пополняется 256 байтами в конце.
Пример 7.41. Открытие файла FILE.NEW и добавление к нему 256 байт из массива виг
.MODEL SMALL
0000	.DATA
0000 46 49 4C 45 FILEN DB 'FILE.NEW, 0 ; имя файла
2E 4E 45 57
00
0009 0100 [	BUF DB 256 DUP (?)	; буфер
00
]
0000	.CODE
.STARTUP
0017 B8	3D02	MOV	AX,3D02H	;	открытие файла	FILE.NEW
001A BA	0000	R	MOV	DX,OFFSET	FILEN
001D CD	21	INT	21H
Возможности программирования на ассемблере
351
001F 8B D8	MOV ВХ,АХ
0021 B8 4202	MOV АХ,4202Н	; перемещение указателя в конец файла
0024 BA 0000	MOV DX,0
0027 В9 0000	MOV CX,0
002А CD 21	INT 21Н
002С В4 40	MOV AH,40H	; запись BUF в конец файла
002Е В9 0100	MOV СХ,256
0031 ВА 0009 R	MOV DX,OFFSET BUF
0034 CD 21	INT 21H
0036 В4 ЗЕ	MOV АН,3EH	; закрыть файл
0038 CD 21	INT 21H
.EXIT
END
Вставка данных в середину файла — задача более сложная. Она решается за счет создания промежуточного файла, как это показано на рис. 7.5. Часть файла до точки вставки копируется в новый файл, затем в конец этого файла записываются вставляемые данные и данные из остатка исходного файла. В завершение исходный файл удаляется, а его имя присваивается новому файлу.
Точка вставки
Исходный файл
Новый файл
Исходный файл
Вставляемые данные
Рис. 7.5. Вставка данных в файл
Вставленные данные
Исходный файл
Программа для решения этой задачи приведена в примере 7.42. Эта программа вставляет 256 байт из файла DATA.NEW в файл DATA.OLD на расстоянии 256 байт от начала файла.
................. ..’..................
р7римвр7.42. Вставка в файл данных другого файла
' Программа включает 256 байт из файла DATA.NEW в файл DATA.OLD,
; после первых 256 байт DATA.OLD
.MODEL SMALL
352
Гпава 7
0000	.DATA
0000 0000	HANI DW ?	; логические номера файлов
0002 0000	HAN 2 DW ?	; для DATA.TMP и DATA.OLD
0004 44 41	54 41 FTLE1 DB 'DATA.TMP',0
2Е 54 4D 50
00
000D 44 41 54 4 FILE2 DB 'DATA.OLD',0
2E 4F 4C 44
00
0016 44 41 54 41 FILE3 DB 'DATA.NEW',0
2E 4E 45 57
00
001F 0100 [		BUF DB	256 DUP (?)	; буфер
	00 1			
0000	J	.CODE		
.STARTUP
0017 B4 ЗС	MOV	АН,3CH ; создать DATA.TMP
0019 B9 0000	MOV	CX,0
001C BA 0004 R	MOV	DX,OFFSET FILE1
001F CD 21	INT	21H
0021 A3 0000 R	MOV	HANI,AX ; сохранить логический номер файла в HANI
0024 B8 3D02	MOV	АХ,3D02H ; открыть DATA.OLD
0027 BA GOOD R	MOV	DX,OFFSET FILE2
002A CD 21	INT	21H
002C 8B D8	MOV	BX,AX
002E A3 0002 R	MOV	HAN2,AX ; сохранить логический номер файла в HAN 2
0031 B4 3F	MOV	AH,3FH ; прочитать 256 байт DATA.OLD в BUF
0033 B9 0100	MOV	СХ,256
0036 BA 001F R	MOV	DX,OFFSET BUF
0039 CD 21	INT	21H
003В B4 40	MOV	AH,40H ; записать из BUF в DATA.TMP
003D 8B IE 0000 R	MOV	BX,HAN1
0041 B9 0100	MOV	CX,256
0044 BA 001F R	MOV	DX,OFFSET BUF
0047 CD 21	INT	21H
0049 B8 3D02	MOV	AX,3D02H ; открыть файл DATA.NEW
004C BA 0016 R	MOV	DX,OFFSET FILE3
004F CD 21	INT	21H
0051 8B D8	MOV	BX,AX
0053 B4 3F	MOV	AH,3FH ; прочитать 256 байт DATA.NEW в BUF
0055 B9 0100	MOV	CX,256
0058 BA 001F R	MOV	DX,OFFSET BUF
005B CD 21	INT	21H
005D B4 3E	MOV	АН,3EH ; закрыть файл DATA.NEW
005F CD 21	INT	21H
Возможности программирования на ассемблере
353
0061 В4	40	r MOV AH,40H ;	: записать из BUF в DATA,	.ТМР
0063 8В	IE 0000 R	MOV BX,HAN1		
0067 В9	0100	MOV CX,256		
00 6А ВА	001F R	MOV DX,OFFSET	BUF	
006D CD	21	INT 21H		
006F	MAIN1:			
006F В4	3F	MOV AH,3FH ;	: прочитать 256 байт DATA.OLD в BUF	
0071 8В	IE 0002 R	MOV BX,HAN2		
0075 В9	0100	MOV CX,256		
0078 ВА	001F R	MOV DX,OFFSET	BUE’	
007В CD	21	INT 21H		
007D 0В	CO	OR AX, AX	;	• прочитано ноль байт?	
007F 74	10	JZ MAIN2	;	: если файл не пустой,	
0081 В4	40	MOV АН,40H	;	• то запись BUF в файл DATA.TMP	
0083 8В	IE 0000 R	MOV BX,HAN1		
0087 В9	0100	MOV CX,256		
008А ВА	001F R	MOV DX,OFFSET	BUF	
008D CD	21	INT 21H		
008F ЕВ	DE	JMP MAIN1		
0091	MAIN2:			
0091 В4	3E	MOV АН,3EH ;	 закрыть файл DATA.OLD	
0093 CD	21	INT 21H		
0095 В4	41	MOV AH,41H ;	• удалить файл DATA.OLD	
0097 ВА	GOOD R	MOV DX,OFFSET	FILE2	
009А CD	21	INT 21H		
009С В4	3E	MOV АН,3EH ;	 закрыть файл DATA.TMP	
009Е 8В	IE 0000 R	MOV BX,HAN1		
00А2 CD	21	INT 21H		
00А4 8С	D8	MOV AX, DS		
00А6 8Е	CO	MOV ES,AX	;	' совместить сегменты DS	и ES
00А8 В4	56	MOV АН,56H	' переименовать DATA.TMP	в DATA.OLD
00AA ВА	0004 R	MOV DX,OFFSET	FILE1	; старое имя	
00AD BF	000D R	MOV DI,OFFSET	FILE2	; новое имя	
00В0 CD	21	INT 21H		
		.EXIT		
		END		
В этой программе использованы две новые DOS-функции, предназначенные для удаления и переименования файлов. Функция удаления стирает исходный файл, а функция переименования назначает временному файлу имя исходного. Обратите внимание, что функция переименования адресует имена файлов с использованием Двух сегментных регистров — DS и ES.
Прямой доступ к файлам
Прямой, или случайный, доступ к последовательным файлам реализуется программным путем, с использованием функции позиционирования указателя. При
!2 Зак. 384
354
Гпава 7
прямом доступе данные файла адресуются номером записи; обращение к записи выполняется без поиска от начала файла.
Создание файла с прямым доступом
При создании файла с прямым доступом следует тщательно разработать структуру записей. Рассмотрим, например, структуру файла для хранения списка покупателей, с данными о фамилии, имени, отчестве, адресе и т. п. Предположим, что фамилия и имя хранятся целиком, занимая по 16 байт, а из отчества хранится только первая буква, для чего достаточно одного байта. Название улицы представлено двумя строками по 32 байта; название города — 16-байтной строкой. Аббревиатура штата занимает еще два байта, а поле zip-кода — девять байт. Основные сведения о покупателе занимают, в итоге, 105 байт; с учетом дополнительной информации запись расширяется до 256 байт. При количестве потенциальных покупателей 5 000 человек размер файла составит 1 280000 байт. (Не слишком много — файл целиком умещается на дискете 3,5".)
В примере 7.43 приведена программа, которая создает файл CUST.FIL и вставляет в него 5 000 пустых (заполненных нулями) записей по 256 байт.
Пример 7.43. Создание файла CUST.FIL и запись в него 5 000 блоков по 256 байт
.MODEL SMALL
0000	.DATA
0000 43 55 53 54 FILE1 DB ’CUST.FIL',0 ; имя файла
2E 46 49 4C
00
0009 0100 [ 00	BUF	DB 256 DUP (0)	; буфер
J 0000	.CODE		
	.STARTUP		
0017 B4 3C	MOV	АН,3CH	; создать CUST.FIL
0019 B9 0000	MOV	CX,0	
001C BA 0000 R	MOV	DX,OFFSET FILE1	
001F CD 21	INT	21H	
0021 8B D8	MOV	BX,AX	; логический номер - в регистр ВХ
0023 BD 1388	MOV	BP,5000	; счетчик блоков
0026	MAIN1:			
0026 B4 40	MOV	AH,40H	; запись блока
0028 B9 0100	MOV	CX,256	
002B BA 0009 R	MOV	DX,OFFSET BUF	
002E CD 21	INT	21H	
0030 4D	DEC	BP	; декремент счетчика блоков
0031 75 F3	JNZ	MAIN1	; повтор 5000 раз
0033 B4 3E	MOV	АН,3EH	; закрыть файл
0035 CD 21	INT	21H	
.EXIT
END
Возможности программирования на ассемблере
355
Чтение и запись
Процедура считывания записи сведений о покупателе приведена в примере 7.44. При ее вызове в регистре ВР указывается номер записи; предполагается, что файл CUST.FIL открыт, и его логический номер файла хранится в памяти по адресу fil.
Смещение указателя от начала файла вычисляется как произведение номера записи в регистр ВР на длину записи в байтах (256). После позиционирования указателя выполняется чтение 256 байт в массив buffer.
Пример 7.44. Процедура считывания записи о покупателе из файла CUST.FIL
; Процедура читает 256--байтный блок из открытого файла CUST.FIL
; в буфер BUFFER
; На входе в слове FIL - логический номер файла CUST.FIL,
; в регистре ВР — номер блока		
0000	READ	PROC FAR
0000 8В 1Е 0200 R		MOV EX,FIL	; логический номер
0004 В8 0100		MOV AX,256	; умножить номер блока на 256
0007 F7 Е5		MUL ВР
0009 8В СА		MOV СХ,DX
000В 8В D0		MOV DX,AX
000D В8 4200		MOV AX,4200H	; переместить указатель файла
0010 CD 21		INT 21H
0012 В4 3F		MOV AH,3FH	; прочитать блок
0014 В9 0100		MOV CX,256
0017 ВА 0000	R	MOV DX,OFFSET BUFFER
001А CD 21		INT 21H
001С СВ		RET
001D	READ	ENDP
7.5. Примеры программ
Теперь, после того как вы ознакомились с методами решения типовых задач, мы рассмотрим более сложные примеры прикладных программ.
Программа-калькулятор
Программа, представленная в примере 7.45, демонстрирует использование форматных преобразований. Программа вводит пару чисел в диапазоне 0—99 и знак арифметической операции (сложение, вычитание, умножение или деление), выполняет операцию и выводит результат. Например, получив на входе строку "12+24=", программа выдаст в ответ строку "36".
Пример 7.45. Калькулятор
.MODEL TINY
ООО0	.CODE
356
Гпава 7
DISP MACRO PARA PUSH AX MOV AH, 6 MOV DL,PARA INT 21H POP AX ENDM
GET MACRO						
			.REPEAT MOV AH, 6 MOV DL,-1 INT 21H .UNTIL AL>='0' DISP AL SUB AL,'O' ENDM		&& AL <= '9'	
0100 0103 010D 0110 ОНА	E8 8A E8 02 E8	001E D8 0011 D8 003F	.STARTUP CALL READN MOV BL,AL DISP '+' CALL READN ADD BL,AL DISP '=' CALL DISPA .EXIT		; ввод первого ; вывод + ; ввод второго ; сформировать ; вывести = ; и сумму	числа числа сумму
0121 013A 013C 013E 0158 015C	B3 F6 8A 02	READN PROC GET 0A	MOV E3	MUL D8	MOV GET C3	ADD RET READN ENDP		NEAR USES BL, 10 BL BL, AL AL, BL	ВХ ; ввод первой цифры ; умножить на 10 ; ввод второй цифры ; сформировать число	
015C 015C 015E 0161 0162 0164 0167 0169 016E	8A BB 53 B4 BA F7 52 58	DISPA PROC	NEAR C3	MOV	AL, BL 000A	MOV	BX,10 PUSH BX 00	MOV	AH,0 .REPEAT 0000	MOV	DX,0 F3	DIV	BX PUSH DX .UNTIL AX == 0 .WHILE 1 POP AX .BREAK .IF AL =			= 10	
Возможности программирования на ассемблере
357
0173 04 30	ADD, AL,'0'	; преобразовать в ASCII
DISP. AL
. ENDW
017 F СЗ	RET
0180	DISPA ENDP
END
В этом примере вновь продемонстрировано применение таких средств ассемблера, как макрокоманды, процедуры и директивы структурного ассемблера. Заметим, что в этом варианте калькулятора, предельно упрощенном, не поддерживается редактирование ввода (например, стирание последнего символа клавишей <Backspace>).
Сортировка числовых данных
Рассмотрим вариант решения задачи сортировки, или иначе упорядочения числовых данных по возрастанию или убыванию значений. Воспользуемся простейшим методом сортировки — методом "пузырька". Процесс сортировки на примере пяти чисел показан на рис. 7.6. Последовательность из пяти значений просматривается четыре раза. На каждом просмотре сопоставляются значения соседних элементов и, по результатам их сравнения, элементы меняются местами. При первом просмотре выполняется четыре сравнения, при втором — три, и т. д.
6 4q 6	6	6 6
9	94-1	1	1 1
1	1 4-*	9 ’4-1	3 3 Проход 1
3	3	34-1	9 4-] 2
2	2	2	2 4-J 9
64-11	1	1
14J 64-i з	з
3	3 4-J	6 4-1	2	п о
2	2	2 4-1	6	ПрОХОд2
9	9	9	9
14-11	1
3 4-* 34-1	2
2	24J	3
6	6	6	Проход 3
9	9	9
Рис. 7.6. Процесс сортировки методом "пузырька"
В примере 7.46 приведена программа, которая вводит десять чисел (в диапазоне 0— 65535) в массив array и выполняет сортировку массива методом "пузырька", в порядке возрастания. Перед каждым просмотром массива подпрограмма sort выясняет, менялись ли местами элементы массива на предыдущем просмотре — эта информация формируется в байте DL. Если изменений не обнаружено, значит, данные Упорядочены, и в этом случае подпрограмма sort завершается. Результаты сортировки выводятся на экран.
Пример 7.46. Сортировка методом "пузырька"
.MODEL SMALL
0000 .DATA
358
Гпава 7
0000 000А (	ARRAY DW 10 DUP (?)	; массив
0000 ]
0014 OD OA 45 6E 74 65 MES1 DB 13,10,'Enter 10 numbers13,10,10,'$' 72 20 31 30 20 6E 75 6D 62 65 72 73 ЗА OD OA OA 24
002B OD OA OA 53 6F 72 MES2 DB 13,10,10,'Sorted Data:',13,10,10,'$' 74 65 64 20 44 61 74 61 ЗА OD OA OA 24
0000 .CODE
DISP MACRO PARA
PUSH	AX
MOV	AH, 6
MOV	DL,PARA
INT	21H
POP	AX
ENDM
GET MACRO
.REPEAT
MOV AH,6
MOV DL,-1
INT 21H
.UNTIL (AL>='0' && AL <='9') || AL==13 || AL==',' DISP AL
.IF AL==13
DISP 10
.ENDIF
.IF AL>='0' && AL<=191 SUB AL,'O'
.ENDIF
ENDM
STRING MACRO WHERE
MOV DX,OFFSET WHERE
MOV AH,9
INT 21H
ENDM
.STARTUP
	STRING	MES1
001E FC	CLD	
001F B9 000A	MOV	CX, 10
0022 BF 0000 R	MOV	DI,OFFSET ARRAY
0025 8C D8	MOV	AX, DS
0027 8E CO	MOV	ES,AX
	.REPEAT	
0029 E8 0026	CALL	। GETN ; ввести 10 чисел
Возможности программирования на ассемблере
359
.UNTILCXZ
STRING MES2
0035 Е8 008В	CALL SORT	; отсортировать их
0038 В9 0009	MOV СХ, 9
003В BE 0000 R	MOV SI,OFFSET ARRAY .REPEAT	; вывести результаты сортировки
003Е Е8 0061	CALL DISPN DISP ',' .UNTILCXZ
004В Е8 0054 0052	CALL DISPN .EXIT GETN PROC NEAR
0052 BD 000А	MOV BP, 10
0055 ВВ 0000	MOV BX,0 .WHILE 1 GET .BREAK .IF AL==13 || AL==','
0094 93	XCHG .AX,BX
0095 F7 Е5	MUL BP
0097 93	XCHG AX, BX
0098 В4 00	MOV AH, 0
009А 03 D8	ADD BX,AX .ENDW
009Е 8В СЗ	MOV AX, BX
00А0 АВ	STOSW
00А1 СЗ 00А2 00А2	RET GETN ENDP DISPN PROC NEAR
00А2 ВВ 000А	MOV BX,10
00А5 53	PUSH BX
00А6 AD	LODSW .REPEAT
00А7 ВА 0000	MOV DX,0
00AA F7 F3	DIV BX
ООАС 52	PUSH DX .UNTIL AX==0 .WHILE 1
00В1 58	POP AX .BREAK .IF AL==10
00В6 04 30	ADD AL,'O' DISP AL . ENDW
00С2 СЗ 00C3 00C3	RET DISPN ENDP SORT PROC NEAR
00C3 ВВ 0009	MOV BX,9
.REPEAT
360
Гпава 7
00C6 8B CB	MOV CX,BX
00C8 BE 0000 R	MOV SI,OFFSET ARRAY
00CB B2 00	MOV DL,0 .REPEAT
00CD AD	LODSW
00CE 3B 04	CMP AX, [SI] .IF !CARRY?
00D2 8B 2C	MOV BP, [SI]
00D4 89 6C FE	MOV [SI-2],BP
00D7 89 04	MOV [SI],AX
00D9 FE C2	INC DL .ENDIF .UNTILCXZ
00DD 4B	DEC BX .UNTIL BX==0 |1 DL==0
00E6 C3 00E7	RET SORT ENDP END
Шестнадцатеричный дамп файла
Следующий пример — вывод содержимого файла в шестнадцатеричном формате — демонстрирует работу с данными на диске, а также разбор параметров командной строки DOS для получения имени файла.
При запуске программ из командной строки DOS параметры, указанные после имени программы, помещаются в префикс программного сегмента (PSP — Program Segment Prefix), структура которого приведена в Приложении 1 (см. рис. П1.6). Байт по смещению 80Н в PSP содержит длину строки параметров; а сама строка хранится в следующих байтах — от смещения 81Н до 0FFH (т. е. до конца PSP). Сегментный адрес PSP известен — при запуске программы он записан в регистр DS.
В примере 7.47 приведена программа, которая извлекает имя файла из командной строки и выводит содержимое этого файла в шестнадцатеричном формате. В программе использованы функции DOS для работы с дисковыми файлами, а также рассмотренные ранее методы форматных преобразований. При разборе строки параметров следует иметь в виду, что первый символ, записанный в PSP по смещению 81Н, — это всегда пробел (20Н); а последний символ — возврат каретки (0DH). Например, если введена командная строка DUMPS FROG, то в PSP по смещению 81Н записывается пробел, а затем — строка FROG и символ возврата каретки; при этом счетчик символов, записанный в байте по смещению 80Н, равен 5.
Пример 7.47. Шестнадцатеричный дамп файла
0000
0000 0000
0002 0100 [
00
]
.MODEL SMALL
.DATA
SECT DW ?
BUFFER DB 256 DUP (?)
Возможности программирования на ассемблере
361
0102 0100 [ 00
FTLE
DB 256 DUP (?)
0202 OD 0А 59 6F 75 20 MES1 DB 13,10,'You must enter a file
6D 75 73 74 20 65
6Е 74 65 72 20 61
20 66 69 6С 65 20
'name',13,10,'$
021А 6Е 61 6D 65 OD OA
24
0221 OD 0A 46 69 6C 65 MES2 DB 13,10,'File not found',13,10,'$'
20 6E 6F 74 20 66
6F 75 6E 64 0D 0A
24
0234 0D 0A 46 69 6C 65 MES3 DB 13,10,'File corrupt13,10,'$'
20 63 6F 72 72 75
70 74 0D 0A 24
0245 OD OA 32 35 36 20 MES4 DB 13,10,'256 byte Section: $'
62 79 74 65 20 53
65 63 74 69 6F 6E
ЗА 20 24
025A OD OA 24	MES5	DB 13,10,'$'
025D OD OA 54 79 70 65 MES6	DB 13,10,'Type a space to continued'
20 61 20 73 70 61 63 65 20 74 6F 20 63 6F 6E 74 69 6E 75 65 ЗА 20 24
0000 .CODE
STRING MACRO WHERE
MOV AH, 9
MOV DX,OFFSET WHERE
INT 21H
ENDM
OPEN MACRO WHERE
MOV AX,3D02H
MOV CX,0
MOV DX,OFFSET WHERE
INT 21H
MOV BX,AX	; сохранить логический номер в регистре ВХ
..MOV SECT,-1	; первый сектор
ENDM
READ MACRO BUF,COUNT
MOV AH,3FH
MOV CX,COUNT
MOV DX,OFFSET BUF
INT 21H
ENDM
362
Гпава 7
CLOSE MACRO
MOV AH,3EH
INT 21H ENDM
DISP MACRO NUM
MOV AH, 6
MOV DL,NUM
INT 21H ENDM
ASCII MACRO
AND AL, 15 ADD AL, 'O' .IF AL>'9'
ADD AL, 7 .ENDIF DISP AL
ENDM
			.STARTUP		
0017	IE		PUSH	DS	; обменять значения сегментов
0018	06		PUSH	ES	
0019	IF		POP	DS	
001A	07		POP	ES	
001B	BE	0082	MOV	SI,82H	; смещение командной строки
001E	8A	4C FE	MOV	CL,[SI-2]	; ее длина
0021	B5	00	MOV	CH, 0	
0023	80	F9 00	CMP	CL, 0	
0026	75	10	JNE	MAIN1	; указано имя файла?
0028	B8		R	MOV	AX,DGROUP	
002B	8E	D8	MOV	DS, AX	
			STRING MES1		; вывод сообщения из MES1
			.EXIT		; выход в DOS
0038			MAIN1:		
0038	49		DEC	ex	
0039	BF	0102 R	MOV	DI,OFFSET	FILE
003C	F3/	' A4	REP	MOVSB	; скопировать имя файла
003E	88	2D	MOV	[DI],CH	; добавить null-символ
0040	8C	CO	MOV	AX, ES	
0042	8E	D8	MOV	DS,AX	; установить сегмент DS ; на группу DGROUP
			OPEN	FILE	
0057	73	OB	JNC	MAIN2	; файл найден?
			STRING MES2		; вывести MES2
			.EXIT		; выход в DOS
0064			MAIN2:		
			.WHILE 1		
0064	FF	06 0000	R	INC SECT		; инкремент номера сектора
READ BUFFER,256
Возможности программирования на ассемблере
363
0072 73 0В				JNC MAIN3 STRING MES3 .EXIT		файл прочитан? вывод MES3 выход в DOS
007F 008В	Е8	000D		MAIN3: .IF AX==0 CLOSE .EXIT .ENDIF CALL DUMP	/ 7 f	конец файла? закрыть файл выход в DOS вывод дампа прочитанного сектора
0095	В4	01		STRING MES6 MOV AH,1	/	ожидать нажатия клавиши
0097 009В 009В	CD 8В	21 С8	DUMP	INT 21H .ENDW PROC NEAR MOV CX,AX	/	сохранить счетчик
00А4 00А8	8В Е8	2Е 0000 R 0028		STRING MES4 MOV BP,SECT CALL	DISPA	/	вывод дампа
00В2	BE	0002 R		STRING MES5 MOV SI,OFFSET	; переход на новую строку BUFFER	
00В5 00В7	8В 2D	С6 0002 R		.REPEAT MOV AX,SI SUB AX,OFFSET		BUFFER
ООВА ООВС ООСА 00CD 00D2 00D3 00D3 00D4 00D7 00D9 00DB 00DD OODF 00FB 00FB 00FB	8В 83 Е8 Е8 СЗ В9 D1 D1 D1 D1 8В АС	Е8 ЕО OF 0006 002В 0004 С5 С5 С5 С5 С5	DUMP DI SPA DI SPA DISPN	MOV BP,AX AND AX, 15 .IF AX==0 STRING MES5 CALL DISPA .ENDIF CALL DISPN .UNTILCXZ RET ENDP PROC NEAR USES CX MOV CX,4 .REPEAT ROL BP,1 ROL BP,1 ROL BP,1 ROL BP,1 MOV AX,BP ASCII .UNTILCXZ DISP ' ' RET ENDP PROC NEAR LODSB		
364
Гпава 7
00FC DO С8	ROR	AL, 1
00FE DO С8	ROR	AL, 1
0100 DO С8	ROR	AL, 1
0102 DO С8	ROR	AL, 1
	ASCII	
0114 8А 44 FF	MOV	AL,[SI-1]
	ASCII	
	DISP	
012D СЗ	RET	
012Е	DISPN	ENDP	
	END	
7.6. Обработка прерываний
Перехват прерываний позволяет контролировать события в системе, внося дополнения в системные процедуры обработки прерываний или полностью заменяя их. Перехват прерывания от клавиатуры, например, позволяет выявлять нажатие так называемой горячей клавиши — специальной комбинации клавиш для активизации резидентной программы. В последующих разделах мы рассмотрим примеры таких "всплывающих" программ, активизируемых горячими клавишами.
Перехват прерываний
Для перехвата прерываний используются DOS-функции чтения (35Н) и записи (25Н) вектора прерывания. Перед вызовом этих функций в регистр АН записывается номер функции, а в регистр AL — номер вектора в диапазоне ООН—FFH.
Функция чтения вектора (35Н) возвращает составляющие вектора в регистрах ES и ВХ; в ES — сегментный адрес процедуры обработки прерывания, а в регистре ВХ — ее смещение. Содержимое регистров ES и ВХ сохраняется, чтобы исходное значение вектора могло быть восстановлено в дальнейшем. Перед записью вектора с помощью функции 25Н адрес новой процедуры обработки прерывания формируется в паре регистров DS:DX.
Установку пользовательской процедуры обработки прерывания продемонстрируем на примере 7.48. Эта программа перехватывает прерывание по ошибке деления. Исходное значение вектора 0 после чтения сохраняется в двойном слове addr. Затем адрес новой процедуры обработки прерывания, сформированный в паре регистров DS:DX, записывается в вектор 0 функцией 25Н.
Пример 7.48. Установка вектора прерывания по ошибке деления
; Фрагмент программы с установкой новой процедуры
; обработки прерывания по вектору О .MODEL TINY
0000	.CODE
.STARTUP
0100 ЕВ 05	JMP MAIN	; обход данных и подпрограммы NEW
0102 00000000 ADDR DD ?	; прежнее значение вектора
Возможности программирования на ассемблере
365
0106	NEW	'PROC FAR	; новая процедура обработки прерываний
0106 CF		I RET	(пустая процедура)
0107	NEW	ENDP	
0107	MAIN:		
0107 8C	C8	MOV AX,CS	; DS := CS
0109 8E	D8	MOV DS,AX	
010В B8	3500	MOV AX,3500H	; прочитать вектор 0
010E CD	21	INT 21H	
0110 89	IE 0102 R	MOV WORD PTR	ADDR,ВХ ; сохранить вектор в ADDR
0114 8C	06 0104 R	MOV WORD PTR	ADDR+2,ES
0118 B8	2500	MOV AX,2500H	; записать новое значение вектора 0
011B BA	0106 R	MOV DX,OFFSET NEW	
011E CD	21	INT 21H	
Пример резидентной программы
Рассмотрим простой пример резидентной программы с перехватом прерываний. Эта программа подает звуковой сигнал через каждые полчаса. В примере 7.49 приведен предварительный, нерезидентный вариант программы — без обработки прерываний, только для генерирования звука. (Резидентный вариант программы, с перехватом прерываний и отсчетом получасовых интервалов, приведен далее в примере 7.50.)
Звук генерируется с использованием второго канала трехканального системного таймера IBM PC. Подключение динамика к системному таймеру показано на рис. 7.7. Сведения о системном таймере см. в главе 12. Частота звука определяется значением делителя опорной частоты 1 193 180 Гц. Например, для получения частоты звука 800 Гц делитель должен быть равен 1 193 180 /800 = 1491. Процедура веер в примере 7.49 программирует второй канал таймера, подключает динамик к выходу таймера и, после задержки на 1/3 сек, отключает динамик. Для организации задержки используются показания счетчика системного времени (находится по адресу 0:46СН), которые увеличиваются на 1 с частотой приблизительно 18,2 Гц (точнее, около 18,206 Гц). Процедура веер используется для генерирования звуков с частотой 1000, 1200 и 1400 Гц.
Пример 7.49, Программа генерирования звуков разной частоты длительностью 1/3 сек
.MODEL TINY
0000	.CODE
	.STARTUP
0100 В8 0000	MOV АХ,0
0103 8Е D8	MOV DS,АХ	; данные - в сегменте 0000Н
0105 В9 0004	MOV СХ,4	; счетчик
0108 Е4 61	IN AL,61Н	; разрешение таймера и динамика
010А ОС 03	OR AL,3	; установка битов PB0 и РВ1
010С Е6 61	OUT 61H,AL
366
Гпава 7
010Е	MAIN1:
010Е	ВВ 03Е8	MOV ВХ,1000	; выбор частоты 1000 Гц
0111	Е8 0018	CALL ВЕЕР
0114	ВВ 04В0	MOV ВХ,1200	; выбор частоты 1200 Гц
0117	Е8 0012	CALL ВЕЕР
ОНА	ВВ 0578	MOV ВХ,1400	; выбор частоты 1400 Гц
011D	Е8 000С	CALL ВЕЕР
0120	Е2 ЕС	LOOP MAIN1	; повторить 4 раза
0122	Е4 61	IN AL,61Н	; выключить динамик
0124	34 03	XOR AL,3	; сброс битов PB0 и РВ1
0126	Е6 61	OUT 61H,AL
	.EXIT
; Процедура для программирования второго канала таймера и выдачи звука ; Частота задана в регистре ВХ.
; Использует процедуру WAITS для задержки на 1/3 сек
012С		ВЕЕР	PROC NEAR	
012С	В8	34DC	MOV АХ,34DCH	;DX:AX := 1193180
012F	ВА	0012	MOV DX,12H	
0132	F7	F3	DIV BX	; получить значение делителя
0134	Е6	42	OUT 42H,AL	; настроить канал 1 системного таймера
0136	8А	С4	MOV AL,AH	
0138	Е6	42	OUT 42H,AL	
013А	Е8	0001	CALL WAITS	; пауза 1/3 сек
013D	СЗ		RET	
013Е		ВЕЕР	ENDP	
; Процедура для задержки на 1/3 сек
; (обращается к счетчику времени по адресу О:46СН)
013Е	WAITS PROC NEAR
013Е ВА	0006	MOV DX,6	; число меток времени
0141 ВВ	0000	MOV BX,0
0144 03	16 046С ADD DX,DS:[46CH] ; вычислить значение счетчика меток
0148 13	IE 046Е ADC BX,DS:[46EH] ; к концу паузы
014С	WAIT1:
014С 8В	2Е 046С MOV BP,DS:[46CH] ; проверка текущего счетчика
0150 А1	046Е	MOV AX,DS:[46ЕН]
0153 2В	ЕА	SUB ВР,DX
0155 1В	СЗ	SBB АХ,ВХ
0157 72	F3	JC WAIT1	; следующий цикл
0159 СЗ	RET
015А	WAITS ENDP
END
Резидентная программа chime (куранты), приведенная в примере 7.50, используя прерывание по вектору 8, подает звуковые сигналы через каждые полчаса; в начале часа генерируется дополнительный сигнал. Программа chime резидентная, сохраняется в памяти до выключения компьютера.
Возможности программирования на ассемблере
367
Рис. 7.7. Схема подключения динамика и таймера в IBM PC (таймер подключен к портам 40—43Н; а порт 61Н посредством битов РВО и РВ1 управляет динамиком)
[ Пример 7.50. Резидентная программа chime
; Резидентная программа перехватывает прерывание 8.
; Раз в	полчаса выдает одиночный звуковой	сигнал
; и раз	в час — двукратный. Транслируется	в COM-файл
	.MODEL TINY	
0000	.CODE	
	.STARTUP	
0100 Е9	OOCE JMP INSTALL	переход к установке
= 03Е8	TONE EQU 1000	частота звука 1 000 Гц
0103 00	COUNT DB 0	счетчик времени
0104 00000000 ADDS DD ?		прежнее значение вектора
0108 00	PASS DB 0	1 или 2 гудка
0109 00	BEEP DB 0	звук включен или выключен
010А 00	FLAG DB 0	флаг ’’занято”
010В	VEC8 PROC FAR	процедура обработки прерывания
010В 2Е:	80 ЗЕ 010A R CMP CS:FLAG,0	занято?
00		
0111 74	05	JE VEC81 ; есл>	1 занято, то передача управления
0113 2Е:	FF 2E 0104 R JMP CS:ADD8 ; системному обработчику прерывания 8	
0118	VEC81:	
0118 9С	PUSHF	подпрограммный вызов
0119 2Е:	FF IE 0104 R CALL CS:ADD8	системного обработчика
368
Гпава 7
011Е 2Е: 01	: С6 06 010А R	MOV CS:FLAG,1	; установить признак "занято"
0124 ЕВ		STI	; разрешить прерывания
0125 2Е:	: 80 ЗЕ 0108 R	СМР CS:PASS,0	
00			
012В 75	2С	JNE VEC83	; счетчик гудков равен 0?
012D 50		PUSH AX	; сохранить регистры
012Е 51		PUSH CX	
012F 52		PUSH DX	
0130 В4	02	MOV AH, 2	прочитать системное время из BIOS
0132 CD	1А	INT 1AH	
0134 80	FE 00	CMP DH,0	; 0 секунд?
0137 75	68	JNE VEC86	
0139 80	F9 00	CMP CL, 0	; 0 минут?
013С 74	10	JE VEC82	; если да, то гудок два раза
013Е 80	F9 30	CMP CL,ЗОН	; 30 минут?
0141 75	5Е	JNE VEC86	
0143 Е8	0065	CALL BEEPS	; гудок
0146 2Е:	: Сб 06 0108 R	MOV CS:PASS,1	; счетчик гудков — 1
01			
014С ЕВ	53	JMP VEC86	; выход
014Е	VEC82:		
014Е Е8	005А	CALL BEEPS	; гудок
0151 2Е:	: С6 06 0108 R	MOV CS:PASS,2	; счетчик гудков — 2
02			
0157 ЕВ	48	JMP VEC86	; выход
0159	VEC83:		
0159 2Е:	80 ЗЕ 0103 R	CMP CS:COUNT,0	; конец задержки?
00			
015F 74	07	JE VEC84	; да
0161 2Е:	FE ОЕ 0103 R	DEC CS:COUNT	
0166 ЕВ	ЗС	JMP VEC88	; выход
0168	VEC84:		
0168 2Е:	80 ЗЕ 0109 R	CMP CS:BEEP,0	; звук включен?
00			
016Е 75	1С	JNE VEC85	; переход, если включен
0170 2Е:	FE ОЕ 0108 R	DEC CS:PASS	; проверка счетчика гудков
0175 74	2D	JZ VEC88	; еще один гудок?
0177 2Е:	Сб 06 0103 R	MOV CS:COUNT,9	; установить счетчик задержки
09			
017D 2Е:	С6 06 0109 R	MOV CS:BEEP,1	; счетчик гудков — 1
01			
0183 50		PUSH AX	
0184 Е4	61	IN AL,61H	; включить динамик
0186 ОС	03	OR AL,3	
0188 Е6	61	OUT 61H,AL	
018А ЕВ	17	JMP VEC87	; выход
018С	VEC85:		
018С 2Е:	Сб 06 0103 R	MOV CS:COUNT,9	; установить счетчик задержки
09			
Возможности программирования на ассемблере
369
0192 2Е:		С6 06 0109 R MOV CS:BEEP,0	; счетчик гудков — 0
	00		
0198	50	PUSH АХ	
0199	Е4	61	IN AL, 61H	; выключить динамик
019В	34	03	XOR AL,3	
019D	Еб	61	OUT 61H,AL	
019F	ЕВ	02	JMP VEC87	; выход
01А1		VEC86:	
01А1	5А	POP DX	; восстановить регистры
01А2	59	POP CX	
01 АЗ		VEC87:	
01 АЗ	58	POP AX	
01А4		VEC88:	
01А4	2Е:	C6 06 010A	MOV CS:FLAG,0	; не ’’занято”
	00		
01АА	CF	I RET	; возврат из прерывания
01 АВ		VEC8 ENDP	
; Процедура программирует канал 1 таймера на частоту,
; заданную константой TONE, и включает звук на полсекунды.
; Использует регистры АХ, СХ и DX
01 АВ	BEEPS PROC NEAR
01АВ 2Е: 8В	0E 03E8	MOV CX,CS:TONE ; частота звука
01В0 В8 34DC	MOV AX,34DCH	; частота таймера (1193180 Гц) -
01ВЗ ВА 0012	MOV DX,12H	; в регистры DX:AX
01В6 F7 F1	DIV CX	; вычислить делитель частоты
01В8 Е6 42	OUT 42H,AL ; запрограммировать канал 1 таймера
01ВА 8А С4	MOV AL,АН
01ВС Е6 42	OUT 42H,AL
01ВЕ Е4 61	IN AL,61H	; включить звук
01С0 ОС 03	OR AL,3
01С2 Е6 61	OUT 61H,AL
01С4 2Е: С6	06 0103 R MOV CS:COUNT,9 ; счетчик для задержки на 1/2 сек
09	
01СА 2Е: С6	06 0109 R MOV CS:BEEP,1 ; звук включен
01	
01D0 СЗ	RET
01D1	BEEPS ENDP
01D1	INSTALL:	; установка резидента
01D1 8С С8	MOV AX,CS	; DS := CS
01D3 8Е D8	MOV DS,AX
01D5 В8 3508	MOV AX,3508H	; прочитать вектор 8
01D8 CD 21	INT 21H	; и сохранить его в памяти
01DA 89 IE 0104 R MOV WORD PTR ADD8,BX	
01DE 8C 06 0106 R MOV WORD PTR ADD8+2,ES	
01E2 B8 2508	MOV АХ,2508Н
01E5 BA 010B	R	MOV DX,OFFSET VEC8	; смещение процедуры VEC8
01E8 CD 21	INT 21Н	; запись вектора 8
01EA BA 01D1	R	MOV DX,OFFSET INSTALL ; граница параграфа
370
Гпава 7
01ED В1 04	MOV CL,4
01EF D3 ЕА	SHR DX,CL
01F1 42	INC DX
01F2 В8 3100	MOV AX,31ООН	; выйти в DOS,
01F5 CD 21	INT 21H	; оставшись в памяти
	END
Программа chime использует несколько ячеек памяти для хранения признаков, управляющих работой процедур обслуживания прерываний. Признак "занятости" flag означает, что процедура обработки прерывания от таймера занята обслуживанием "курантов". Если при входе в прерывание от таймера flag = 1 (задание уже выполняется), то управление сразу передается системной процедуре — командой jmp cs:ADD8. Заметим, что в резидентных программах при доступе к данным следует использовать префикс переназначения сегмента (CS:).
Если при входе в прерывание по вектору 8 признак flag = 0, то выполняется подпрограммный вызов системной процедуры — командами pushf и call cs.-adds. Затем, после установки признака flag - 1, инструкция sti разрешает дальнейшие прерывания.
Дальше по значению признака pass выясняется, включен ли звук. Если pass = О (звук не включен), то выполняется чтение текущего времени из BIOS — функцией прерывания INT 1АН. Не следует вызывать функции DOS из процедур обработки прерываний, поскольку DOS не является повторно входимой. Если прерывание произойдет в момент выполнения какой-либо функции DOS, то повторное обращение к DOS из процедуры обработки прерывания приведет к разрушению системы. Прерывание INT 1АН возвращает секунды (в регистр DH), минуты (в регистр CL) и часы (в регистр СН) в формате BCD. Значение секунд, хранящееся в регистре DH, сравнивается с нулем. Если содержимое регистра DH # 0, то процедура обработки прерывания завершается. Если содержимое регистра DH = 0, то в этом случае проверяется значение регистра CL. Если содержимое регистра CL не равно ни 00 (начало часа), ни 30 (полчаса), то процедура завершается. Если же значение регистра CL равно 00 или 30, то вызывается процедура beeps, которая программирует второй канал таймера на частоту, заданную константой tone, включает динамик и записывает в счетчик паузы count число 9.
Счетчик паузы (count) уменьшается на 1 при каждом прерывании. При завершении счета, когда count = 0, процедура обработки прерывания выясняет, включен ли звук. Если звук включен, то его выключают, а в счетчик count вновь записывают число 9. Если звук выключен, то нужно выяснить, требуется ли повторный сигнал; для этого проверяется признак pass. Задержка между первым и вторым гудком должна быть не менее 1/2 сек (count = 9), иначе сигналы сливаются.
Для загрузки резидентной программы в память достаточно вызвать ее из командной строки — chime. В DOS 5.0 и 6.x резидентная программа может быть загружена в верхнюю память командой loadhigh chime. После завершения программы chime в памяти остается ее резидентная часть, которая подает звуковые сигналы через каждые полчаса — до перезагрузки системы или выключения питания. В следующем разделе мы рассмотрим пример резидентной программы, которая активизируется по нажатию горячей клавиши. (В рассмотренной программе chime горячая клавиша могла бы, например, выключать и выключать "куранты".)
Возможности программирования на ассемблере
371
Пример "всплывающей" программы
Горячая клавиша — это одиночная клавиша или, чаше, комбинация клавиш для активизации резидентной программы. Например, программа chime (см. пример 7.50) может быть дополнена так, чтобы комбинация клавиш <Alt>+<C> запрещала генерирование звука, если оно было разрешено, и, напротив, разрешала бы звук, если он выключен. Чтобы резидентная программа реагировала на горячую клавишу, в ней следует предусмотреть перехват и обработку прерывания по вектору 9, которое генерируется при нажатии и отпускании клавиш.
Программа в примере 7.51 демонстрирует перехват прерывания от клавиатуры и использование горячей клавиши. Эта программа считает нажатия клавиш и выводит счетчик при нажатии комбинации клавиш <Alt>+<K>.
Программа в примере 7.51 может быть модифицирована, например, так, чтобы вести счет среднего числа нажатий за час. В рассматриваемом примере подсчитывается общее число нажатий — до четырех миллиардов. Программа запоминает время ее установки и, при нажатии горячей клавиши выводит его вместе со счетчиком нажатий.
Программа в примере 7.51 использует прерывания по вектору 8 и 9. Процедура обработки прерывания по вектору 9 считает нажатия клавиш и выявляет комбинацию клавиш <Alt>+<K>. После нажатия горячей клавиши в прерывании от таймера активизируется процедура вывода на дисплей. Резидентные программы такого типа называют "всплывающими" (pop-up program). Напомним, что функции DOS в процедурах обработки прерываний не используются. Поэтому опрос клавиатуры в этой программе возложен на одну из функций BIOS, доступных через прерывание INT 16Н. По той же причине вывод на дисплей выполняется прямым отображением в видеопамять с адреса В8000Н. В видеопамяти каждый символ хранится в двух смежных байтах: в первом байте — ASCII-код символа, а во втором — атрибуты цвета символа и фона.
Пример 7.51. Резидентная программа для подсчета нажатий клавиш
; Программа считает нажатия клавиш и, при нажатии комбинации
; клавиш <Alt>+<K>, выводит счетчик нажатий и время установки.
; Для 32-битного процессора.
.MODEL TINY
0000 0100 Е9 0241	.386	
	.CODE .STARTUP JMP INSTALL	; переход к инсталляции
0103 00	HFLAG DB 0	; признак горячей клавиши
0104 00000000	ADD8 DD ?	; прежнее значение вектора 8
0108 00000000	ADD9 DD ?	; прежнее значение вектора 9
010с 00000000	COUNT DD 0	; счетчик нажатий
Olio 00	HOUR DB ?	; время запуска
0111 00	MIN	DB ?	
0112 00	SFLAG DB 0	; флаг запуска
0113 00	FLAG8 DB 0	; прерывание 8 занято
372
Глава 7
0114	25	KEY	DB	25H	значение скан-кода клавиши <К>
0115	08	HMASK	DB	8	маска
0116	08	MKEY	DB	8	клавиши <Alt>
0117	00А0 [	SCRN	DB	160 DUP	(?)	; буфер экрана
	00 1				
01В7	54 69 6D	65 MES1	DB 'Time		_ ।
20 3D 20
01ВЕ 20 20 20 4В MES2 DB Keystrokes =
65 79 53 74
72 6F 6В 65
73 20 3D 20
01СЕ	VEC9	PROC FAR	; обработка прерываний от клавиатуры
01СЕ	FB	STI	; разрешить остальные прерывания
01CF	66| 50	PUSH ЕАХ
01D1	Е4 60	IN AL,60Н	; прочитать скан-код
01D3	2Е: ЗА 06 0114 R	СМР AL,CS:KEY ; клавиша <К>?
01D8	75 16	JNE VEC91	; нет
01DA	В8 0000	MOV АХ,0	; данные - в сегменте 0
01DD	1Е	PUSH DS	; сохранить содержимое регистра DS
01DE	8Е D8	MOV DS,AX
01Е0	АО 0417	MOV AL,DS:[417H] ; байт состояния ; клавиш <Alt>/<Shift>
01ЕЗ	1F	POP DS
01Е4	2Е: 22 06 0115 R	AND AL,CS:HMASK ; выделить <Alt>
01Е9	2Е: ЗА 06 0116 R	CMP AL,CS:MKEY ; проверить, установлен ли <Alt>
01ЕЕ	74 2А	JE VEC93	; не горячая клавиша
01F0	VEC91	
01F0	51	PUSH СХ	; увеличить на 1 счетчик в BCD-формате
01F1	В9 0003	MOV СХ,3
01F4	66| 2Е: Al 010С R	MOV ЕАХ,CS:COUNT
01F9	66| 83 СО 01	ADD ЕАХ, 1
01FD	27	DAA	; преобразовать результат в BCD
01FE	VEC92	
01FE	9С	PUSHF
01FF	66| Cl С8 08	ROR ЕАХ,8
0203	9D	POPF
0204	14 00	ADC AL,0	; прибавить перенос
0206	27	DAA
0207	Е2 F5	LOOP VEC92
0209	66| Cl С8 08	ROR EAX,8
020D	66| 2Е: АЗ 010С R	MOV CS:COUNT,EAX
0212	59	POP CX
0213	66| 58	POP EAX
0215	2Е: FF 2Е 0108 R	JMP CS:ADD9	; переход к системному обработчику
021А	VEC93	:	; не горячая клавиша
021А	FA	CLI	; отключить прерывания
021В	Е4 61	IN AL,61Н	; очистить клавиатуру,
021D	ОС 80	OR AL,80Н	; удалив последнее нажатие
Возможности программирования на ассемблере
373
021F Еб 61	OUT 61H,AL
0221 24 7F 0223 Е6 61 0225 ВО 20 0227 Е6 20 0229 FB	AND AL,7FH OUT 61H,AL MOV AL,20H	; сброс контроллера прерываний OUT 20H,AL STI	; разрешить прерывания
022А 2Е: Сб 06 0103 R 01 0230 66| 58 0232 CF 0233	VEC9 0233	VEC8	MOV CS:HFLAG,1 ; горячая клавиша нажата POP ЕАХ IRET ENDP PROC FAR	; прерывание от таймера
0233 2Е: 80 ЗЕ 0113 R 00 0239 74 05	CMP CS:FLAG8,0 JZ VEC81	; занято?
023В 2Е: FF 2Е 0104 R 0240	VEC81	JMP CS-.ADD8	; да
0240 2Е: 80 ЗЕ 0103 R 00 0246 75 37	CMP CS:HFLAG,0 JNZ VEC83	; горячая клавиша?
0248 2Е: 80 ЗЕ 0112 R 00 024Е 74 05	CMP CS:SFLAG,0 JZ VEC82	; установка?
0250 2Е: FF 2Е 0104 R 0255	VEC82 0255 9С	JMP CS:ADD8	; не горячая клавиша PUSHF	; вызвать системный обработчик
0256 2Е: FF 1Е 0104 R	CALL CS:ADD8
025В 2Е: Сб 06 0113 R 01 0261 FB 0262 50 0263 51 0264 52 0265 В4 02 0267 CD 1А	MOV CS:FLAG8,1 ; "занято” STI	; разрешить прерывания PUSH AX PUSH CX PUSH DX MOV AH,2	; прочитать системное время INT 1AH
0269 2Е: 88 2Е ОНО R	MOV CS:HOUR,CH ; запомнить час
026Е 2Е: 88 ОЕ 0111 R 0273 5А 0274 59 0275 58	MOV CS:MIN,CL ; и минуту POP DX	; восстановить регистры POP CX POP AX
0276 2Е: Сб 06 0112 R 01	MOV CS:SFLAG,1 ; запущено
027С Е9 00А5 027F	VEC83: 027F 9С	JMP VEC89	;	выход :	;	вывод	по нажатию	горячей клавиши PUSHF	;	вызов	системного	обработчика ; прерывания 8
°280 2Е: FF 1Е 0104 R	CALL CS:ADD8
0285 2Е: Сб 06 0113 R 01	MOV CS:FLAG8,1 ; "занято”
374
Гпава 7
028В FB	STI	; разрешить прерывания
028С 50	PUSH AX	; сохранить регистры
028D 53	PUSH BX	
028Е В4 0F	MOV AH,OFH	; выяснить видеорежим
0290 CD 10	INT 10H	
0292 ЗС 03	CMP AL, 3	
0294 76 05	JBE VEC84	; текстовый видеорежим DOS?
0296 5В	POP BX ; ничего не делать в графических режимах	
0297 58	POP АХ	
0298 Е9 0083	JMP VEC88	
029В	VEC84:		; для текстового режима
029В 51	PUSH СХ	
029С 66| 52	PUSH EDX	
029Е 57	PUSH DI	
029F 56	PUSH SI	
02А0 1Е	PUSH DS	
02А1 06	PUSH ES	
02А2 FC	CLD	
02АЗ 8С С8	MOV AX,CS	; адрес сегмента программы
02А5 8Е СО	MOV ES,AX	
02А7 В8 В8С0	MOV AX,0B800H	; адрес видеобуфера
02АА 8Е D8	MOV DS,AX	
02АС В9 ООАО	MOV CX,160	; сохранить верхнюю строку
02AF BF 0117 R	MOV DI,OFFSET	SCRN
02В2 BE 0000	MOV SI,0	
02В5 F3/ А4	REP MOVSB	
02В7 IE	PUSH DS	переставить местами сегменты данных
02В8 06	PUSH ES	
02В9 IF	POP DS	
02ВА 07	POP ES	
02ВВ BF 0050	MOV DI,80	; вывод в середине верхней строки
02BE BE 01B7 R	MOV SI,OFFSET	MES1
02C1 B4 OF	MOV AH,OFH	; цвет — белый на черном фоне
02C3 B9 0007	MOV CX, 7	
02C6	VEC85:		
02C6 AC	LODSB	; вывод строки "Time = "
02C7 AB	STOSW	
02C8 E2 FC	LOOP VEC85	
02CA 2E: 8A 16 0111	R MOV DL,CS:MIN	
02CF 2E: 8A 36 0110	R MOV DH,CS:HOUR	
02D4 66| Cl E2 10	SHL EDX,16	
02D8 B9 0002	MOV CX,2	
02DB B3 30	MOV BL,ЗОН	
02DD E8 004B	CALL DISP	; вывести час
02E0 ВО ЗА	MOV AL,':'	
02E2 AB	STOSW	; вывести двоеточие
02E3 B9 0002	MOV CX,2	
02E6 B3 80	MOV BL,80H	
02E8 E8 0040	CALL DISP	; вывести минуты
02EB BE 01BE R	MOV SI,OFFSET	MES2 ; и строку "Keystrokes ="
02EE B9 0010	MOV CX,16	
Возможности программирования на ассемблере
375
02F1	. VEC86:
02 F1 АС	LODSB
02F2 АВ	STOSW
02F3 Е2 FC	LOOP VEC86
02F5 66| 2Е:	8B	MOV EDX,CS:COUNT	; прочитать счетчик
16 010С	R
02FB В9 0008	MOV CX, 8
02FE ВЗ 30	MOV BL,ЗОН
0300 Е8 0028	CALL DISP	; отобразить счетчик
0303	VEC87:
0303 В4 01	MOV AH,1	; ожидание нажатия клавиши
0305 CD 16	INT 16H	; (прерывание BIOS)
0307 74 FA	JZ VEC87
0309 FC	CLD
030А BE 0117	R	MOV SI,OFFSET SCRN ; восстановить строку
	; видеобуфера
030D BF 0000	MOV DI,0
0310 B9 00A0	MOV CX,160
0313 F3/ A4	REP MOVSB
0315 07	POP ES
0316 IF	POP DS
0317 5E	POP SI
0318 5F	POP DI
0319 66| 5A	POP EDX
031B 59	POP CX
031C 5B	POP BX
031D 58	POP AX
031E	VEC88:
031E 2E: C6 1	06 0103 R MOV CS:HFLAG,0	; снять признак горячей клавиши
00	
0324	VEC89:
0324 2E: C6 i	06 0113 R MOV CS:FLAG8,0 ; снять признак занятости
00
032А CF	IRET
032В	VEC8 ENDP
; Процедура DISP выводит в BCD-формате содержимое регистра EDX
; Входные параметры:
; регистр СХ - число цифр
; регистр BL = ЗОН - вывод пробелов вместо незначащих нулей
; регистр BL = 8ОН - вывод незначащих нулей
; регистры			ES:DI - адрес видеобуфера	в текстовом режиме
032В			DISP PROC NEAR	
032В	661	С1	С2 04	ROL EDX,4	;	' получить очередную BCD-цифру
032F	8А	С2	MOV AL,DL	
0331	24	0F	AND AL, 0FH	
0333	04	30	ADD AL,ЗОН	;	 преобразовать в ASCII
0335	АВ		STOSW	;	: записать в видеобуфер
0336	ЗА	СЗ	CMP AL,BL	;	 результат ноль и разрешен
				 вывод пробелов?
0338	74	04	JE DISP1	;	' да
376
Гпава 7
ОЗЗА ВЗ 80	MOV BL,80H	; выключить режим вывода пробелов
ОЗЗС ЕВ 03	JMP DISP2	
ОЗЗЕ	DISP1:		
ОЗЗЕ 83 EF 02	SUB DI,2	; забой цифры
0341	DISP2:		
0341 Е2 Е8	LOOP DISP	
0343 СЗ	RET	
0344	DISP	ENDP	
0344	INSTALL:		; установка процедур VEC8 и VEC9
0344 8С С8	MOV AX,CS	; DS := CSq
0346 8Е D8	MOV DS,AX	
0348 В8 3508	MOV AX,3508H	; прочитать вектор 8
034В CD 21	INT 21H	; и сохранить его
034D 89 IE 0104 R	MOV WORD PTR	ADD8,ВХ
0351 8С 06 0106 R	MOV WORD PTR	ADD8+2,ES
0355 В8 3509	MOV AX,3509H	; прочитать вектор 9
0358 CD 21	INT 21H	; и сохранить его
035А 89 IE 0108 R	MOV WORD PTR	ADD9,BX
035E 8C 06 010A R'	MOV WORD PTR	ADD9+2,ES
0362 B8 2508	MOV AX,2508H	
0365 BA 0233 R	MOV DX,OFFSET	' VEC8 ; смещение процедуры VEC8
0368 CD 21	INT 21H	; запись вектора 8
036A B8 2509	MOV AX,2509H	
036D BA 01CE R	MOV DX,OFFSET	' VEC9 ; смещение процедуры VEC9
0370 CD 21	INT 21H	; запись вектора 9
0372 BA 0344 R	MOV DX,OFFSET	INSTALL ; найти границу параграфа
0375 Cl EA 04	SHR DX,4	
0378 42	INC DX	
0379 B8 3100	MOV AX,3100H	; установить резидент
037C CD 21	INT 21H	
	END	
Отметим некоторые особенности этой программы. Во-первых, вывод на экран при нажатии горячей клавиши будет работать только в текстовом режиме дисплея. Во-вторых, программа считает нажатия всех клавиш, в том числе служебных — <Shift>, <Alt> и т. д. При этом не делается различия между нажатием и отпусканием клавиш. В результате, например, ввод буквы А увеличит счетчик на 2—4.
Процедура vec9 обработки прерывания 9 начинается чтением скан-кода клавиатуры — по команде in al, бон. Прочитанный код сравнивается со скан-кодом клавиши <К>. Скан-коды клавиатуры приведены в табл. 7.3. Если скан-коды не совпадают, процедура увеличивает число нажатий в счетчике count (в формате BCD) и передает управление системной процедуре обработки клавиатурных прерываний. Если обнаружен скан-код клавиши <К>, то процедура проверяет признак нажатия клавиши
9 Эти две команды лишние, поскольку при запуске com-программы загрузчик всегда устанавливает DS = CS. — Пер.
Возможности программирования на ассемблере
377
<Alt> в байте по адресу 0000:0417. Если клавиша <Alt> нажата, устанавливается признак hflag = 1. Затем в контроллер клавиатуры с помощью бита 7 порта 61Н подается импульс подтверждения, который стирает информацию о нажатии клавиши <К> в буфере клавиатуры. После этого процедура сбрасывает контроллер прерываний, записав число 20Н в порт 20Н, и завершается.
Процедура vec8 обработки таймерного прерывания проверяет ячейку hflag с признаком горячей клавиши и ячейку sflag с признаком первого запуска, sflag = 0 означает, что программа только что установлена; в этом случае процедура vecs считывает системное время и сохраняет его в ячейках hour и min. При hflag = 1, что является признаком нажатия горячей клавиши, процедура vec8 сохраняет содержимое страницы видеопамяти в массиве scrn, а затем выводит сообщение "Time =" вместе с временем установки программы и сообщение "Keystrokes =" со счетчиком нажатий, который хранится в BCD-формате по адресу count.
Итоги
□	Для описания взаимосвязей между модулями в модульной программе используются директивы ассемблера public и extrn. Директива public описывает глобальные имена меток, данных и сегментов текущего модуля, а директива extrn — внешние имена. Компоновщик объединяет модули и библиотеки в исполняемую программу в файле с расширением EXE.
□	Директивы macro и endm позволяют определить для текущей программы новые команды из нескольких инструкций. Макрокоманды подобны процедурам, но без дополнительных инструкций вызова и возврата. При каждом вызове макрокоманды ассемблер подставляет в точку вызова операторы из макроопределения. Параметры макрокоманд позволяют настраивать подстановку операторов.
□	Работу с клавиатурой и дисплеем обеспечивают функции DOS, доступные через прерывание INT21H. Функция 06Н (номер функции записывается в регистр АН) обслуживает оба эти устройства. При значении регистра DL = 0FFH функция 06Н проверяет нажатие клавиши. Если нажатий не было, функция возвращает значение флага Z = 1, а если нажатия зафиксированы, то флаг Z = 0, а в регистре AL сохраняется ASCII-код последней клавиши. Если клавише соответствует расширенный ASCII-код, то функция возвращает ноль в регистре AL и должна быть вызвана повторно — для получения второго байта расширенного кода. Для вывода на дисплей перед вызовом функции 06Н в регистр DL записывается код символа, отличный от OFF.
□	Вывод строки на дисплей выполняется DOS-функцией 09Н. Перед вызовом функции адрес строки записывается в пару регистров DS:DX; вывод продолжается до символа $.
□	Для управления дисплеем и клавиатурой используются функции видео-BIOS, доступные через прерывание INT ЮН. Функции BIOS не зависят от DOS и действуют в любой операционной системе.
О Для взаимодействия с драйвером мыши используется прерывание ЗЗН.
О Преобразование двоичных данных в формат BCD выполняется инструкцией аам (если значение данных не превышает 99) или за счет повторного деления на 10
378
Гпава 7
(для больших чисел). Для вывода на дисплей полученные BCD-данные преобразуются в формат ASCII путем добавления ЗОН к каждой десятичной цифре.
□ Преобразование ASCII-чисел в формат BCD выполняется за счет уменьшения десятичных цифр па ЗОН. Двоичный эквивалент BCD-числа вычисляется последовательностью сложений и умножений на 10.
□ Для преобразования кодов используются таблицы перекодировки; доступ к таблице 8-битных кодов выполняется командой xlat. В таблицах также удобно хранить адреса данных, инструкций или процедур, что позволяет организовать доступ к этим объектам по номерам.
□ Директивы условной трансляции позволяют включать в программу некоторые фрагменты в зависимости от условий, что упрощает поддержку разных версий программы.
□ Поверхность диска состоит из дорожек, поделенных на сектора фиксированного размера; чаще всего используются сектора размером 512 байт. Память диска включает в себя загрузочный сектор, таблицу размещения файлов (FAT), корневой каталог и данные файлов. Загрузочный сектор считывается в память при включении питания. Таблица FAT содержит данные об использовании секторов. В корневом каталоге записаны имена файлов и вложенных каталогов (подкаталогов). Область для хранения данных содержит данные файлов и каталогов.
□ Работа с файлами поддерживается функциями DOS, доступными через прерывание INT 21Н. Перед чтением и/или записью файл следует открыть, а после закрыть. При открытии файла указатель чтения-записи адресует первый байт файла. Возможность управления указателем файла позволяет организовать случайный доступ к его данным.
□ Доступ к последовательному файлу выполняется от начала к концу. Файл с прямым, или случайным, доступом допускает чтение-запись в любой позиции файла. Хотя дисковые файлы являются последовательными, прямой доступ к их данным может быть огранизован за счет дополнительных программных средств.
□ Префикс программного сегмента (PSP) содержит ряд сведений о программе, в том числе параметры командой строки.
□ Перехват прерываний позволяет приложению контролировать события в системе. Чаще всего в приложениях используются прерывания от системного таймера (вектор 8) и от клавиатуры (вектор 9).
□ Резидентная программа — это программа, которая после завершения оставляет в памяти часть себя; обычно используется для перехвата прерываний.
П Горячая клавиша — это комбинация клавиш для активизации "всплывающей” (pop-up program) резидентной программы.
Контрольные вопросы
1.	Какие файлы создает ассемблер при трансляции исходного модуля?
2.	Какие файлы создаст ассемблер MASM при трансляции исходного файла TEST.ASM?
3.	Какие файлы, кроме объектных, использует компоновщик для создания исполняемой программы?
Возможности программирования на ассемблере 379
4.	Для чего предназначена директива PUBLIC?
5.	Что означает директива extrn?
6.	Как объявить тип внешнего имени?
7.	Как происходит обработка библиотечного файла при компоновке?
8.	Какими директивами определяются макрокоманды?
9.	Что такое макрокоманда?
10.	Каким образом передаются параметры в макрокоманду?
11.	Напишите определение макрокоманды ADD32 для 32-битного сложения пар регистров DX:CX и ВХ:АХ, с сохранением суммы в паре ВХ:АХ.
12.	Для чего предназначена директива LOCAL; как она используется в макрокомандах?
13.	Напишите определение макрокоманды addlist PARA1,PARA2 для прибавления PARA1 к PARA2. Параметрам соответствуют данные в памяти; размерность данных (в байтах) перед вызовом макрокоманды записывается в регистр СХ.
14.	Напишите определение макрокоманды addm LIST, LENGTH для суммирования байтовых элементов массива LIST длины LENGTH. По завершении макрокоманды 16-битный результат сложения находится в регистре АХ.
15.	Для чего предназначена директива include?
16.	Напишите процедуру RANDOM, которая возвращает в регистре CL 8-битное псевдослучайное число. Для получения псевдослучайных чисел вызывайте в цикле DOS-функцию 06Н, инкрементируя содержимое регистра CL до обнаружения нажатия клавиши.
17.	Разработайте макрокоманду с оператором REPEAT для генерирования десяти инструкций NOP.
18.	Напишите макрокоманду DISP MACRO PARA с оператором ifb/ifnb для проверки параметра PARA. При пустом параметре PARA макрокоманда выводит символы перевода каретки и возврата строки, а при непустом параметре — выводит его в виде ASCII-символа.
19.	Напишите процедуру для вывода на дисплей строки символов букв, заканчивающейся байтом ООН. Адрес начала строки — в паре регистров DS:DX.
20.	Напишите процедуру, которая вводит символы с клавиатуры и выводит на дисплей шестнадцатеричные значения расширенных кодов. Обычные коды не отображаются.
21.	С использованием прерывания INT ЮН напишите процедуру, которая устанавливает курсор в шестой позиции третьей строки.
22.	Какая инструкция INT обеспечивает взаимодействие с драйвером мыши?
23.	Каким образом определяется наличие мыши в системе DOS?
24.	Как определить тип мыши?
25.	Как обнаружить нажатие правой кнопки мыши?
26.	Почему при выводе данных на дисплей следует выключать курсор мыши?
27.	Какая инструкция преобразует двоичное число в диапазоне 0—99 в формат BCD?
28.	Каким образом выполняется преобразование двоичного числа большего 99 в формат BCD?
29.	Как преобразовать BCD-число в формат ASCII?
30.	Какую величину следует вычесть из каждой цифры числа, заданного в формате ASCII, для преобразования в формат BCD?
31.	Напишите процедуру, которая вводит с клавиатуры ASCII-число, по символам, и сохраняет его в формате BCD в массиве data. Ввод числа завершается, когда введенный символ не цифра.
380
Гпава 7
32.	Как преобразовать трехзначное ASCII-число в двоичное?
33.	Напишите процедуру для преобразования букв нижнего регистра (a—z) в верхний регистр (A—Z). Никакие другие символы, кроме a—z, не должны изменяться.
34.	Составьте таблицу для перекодировки чисел ООН—0FH в ASCII-символы, представляющие шестнадцатеричные цифры. Напишите тестовую программу для проверки таблицы.
35.	Напишите фрагмент программы (с таблицей адресов) для передачи управления на метку ONE при значении регистра AL = 6, или two при значении AL = 7, или three при AL = 8.
36.	Как в инструкции xlat задать обращение к таблице LOOK в сегменте стека?
37.	Напишите последовательность команд с использованием оператора IE для вставки в программу инструкции MOV AL, 6 при условии, что значение имени bed — истина.
38.	Объясните назначение загрузочного сектора, FAT и корневого каталога.
39.	На какие элементы разделена дорожка диска?
40.	Где хранится программа начальной загрузки (bootstrap) и для чего она предназначена?
41.	Что такое кластер?
42.	Какая информация задана в байте атрибутов, входящем в состав записи о каталоге или файле?
43.	Сколько байт в записи о каталоге или файле отводится для хранения данных о размере файла?
44.	Какова максимальная длина файла в операционной системе DOS?
45.	В какой кодировке хранятся длинные имена файлов?
46.	Каков максимальный размер длинного имени файла?
47.	Напишите процедуру, которая открывает файл TEST.LST, считывает из него 512 байт в сегмент данных по смещению ARRAY и затем закрывает файл.
48.	Напишите процедуру, которая переименовывает файл TEST.LST в TEST.LIS.
49.	Напишите программу, которая вводит с клавиатуры десятичное число в диапазоне 0— 65 535 и выводит его на дисплей в двоичном формате.
50.	Напишите программу для вывода на дисплей степеней двойки от 0 до 7 в виде 2п = значение.
51.	Используя метод получения псевдослучайных чисел из вопроса 16, напишите программу, которая отображает псевдослучайные значения в диапазоне от 1 до 47.
52.	Напишите программу, которая выводит на дисплей шестнадцатеричный дамп блока памяти по абсолютным адресам в диапазоне от 00000Н до FFF00H.
53.	Напишите программу, которая перехватывает прерывание по вектору 0 и по ошибке деления выводит сообщение "Ой! Вы пытались делить на ноль" ("Oops, you have attempted to divide by 0").
ГЛАВА 8
Совместное использование языка ассемблер и C/C++
Введение
Сегодня уже редко можно встретить программную систему, полностью разработанную на языке ассемблера. Чаще ассемблер применяется вместе с языком высокого уровня, например, с C/C++. Часть программы, написанная на ассемблере, обычно предназначена для управления периферийными устройствами, поскольку решение подобных задач на языке C/C++ более сложно и не столь эффективно. В этой главе рассмотрена разработка программ на C/C++ с использованием ассемблера MASM, с примерами.
В этой главе ориентир сделан на Microsoft C/C++, хотя, в принципе, удовлетворительным будет любой вариант транслятора C/C++, соответствующий стандарту ANSI (American National Standards Institute). Примеры 16-битных приложений написаны на Microsoft Visual C/C++ версии 1.52 и выше; 32-битные приложения предполагают Microsoft Visual C/C++ версии 4.2 и выше.
Темы главы
Темы этой главы следующие:
□	использование ассемблера в блоках _asm непосредственно в тексте программы на языке С/С+;
□	правила программирования на ассемблере при использовании языка C/C++;
□	доступ к данным языка C/C++ средствами ассемблера;
□	разработка 16- и 32-битных приложений C/C++ с использованием ассемблера;
□	объединение модулей на языках ассемблера и C/C++ при раздельной трансляции.
8.1. Ассемблер и C/C++ в 16-битных приложениях
В этом разделе рассмотрено использование команд ассемблера непосредственно в тексте программ на C/C++. В этом варианте объединения ассемблера с языком C/C++ предполагается, что транслятор с языка C/C++ поддерживает ассемблерные вставки, т. е. имеет в своем составе встроенный ассемблер. Следует подчеркнуть, что в этом разделе рассматривается работа только с 16-битными приложениями для
382
Гпава 8
DOS. Будьте внимательны — если вы создадите 32-битное приложение, то выполнение любой функции DOS (командой int 21н) приведет к разрушению программы — прямые вызовы DOS в 32-битном режиме недопустимы.
Ассемблерные вставки
Правила использования ассемблера в исходном тексте программы на языке C/C++ показаны в листинге программы, приведенном в примере 8.1. Обратите внимание — операторы ассемблера заданы в блоках _asm. Напротив, метка Ыд, на которую ссылается команда условного перехода, задана вне блока _asm — как оператор C/C++.
Программа в примере 8.1 почти не использует операторов C/C++, за исключением описания главной процедуры (main). Следует определить результирующий ЕХЕ-файл как консольное приложение для MS-DOS и, при использовании Microsoft C/C++, отключить в опциях проекта библиотеки классов Windows (MFC — Microsoft Foundation Classes). Программа в примере 8.1 вводит символы с клавиатуры, отбирает символы цифр и выводит их на дисплей; фильтрацию цифр выполняет фрагмент на языке ассемблера.
Пример 8.1. Программа на C/C++ с вставками на языке ассемблера
/* Вводит символы и отображает на экране цифры, игнорируя прочие символы */ void main(void) { _asm { mov ah,8 int 21h cmp al,'O' jb big cmp al,'9' ja big mov dx,ax mov ah,2 int 21h } big: {;} }
В примере 8.1 регистр AX изменяется без сохранения. Заметим, что регистры АХ, ВХ, СХ, DX и ES никогда не используются транслятором Microsoft C/C++*. Назначение регистра АХ при завершении процедуры рассмотрено далее в этой главе. Перечисленные регистры при использовании в ассемблерных вставках сохранять не требуется. Другие регистры, перед изменением их значений, следует сохранять в стеке командой push, а затем восстанавливать командой pop. В противном случае функционирование программы будет нарушено, что может вывести из строя всю систему. При использовании процессоров 80386—Pentium 4 допускается изменение регистров ЕАХ, ЕВХ, ЕСХ, EDX и ES.
1 Точнее, не используются для хранения промежуточных данных между вызовами функций — Пер.
Совместное использование языка ассемблер и C/C++
383
В примере 8.2 показано отображение в отладчике CodeView исполняемой программы, полученной в результате трансляции исходного текста из примера 8.1. Номера справа соответствуют номерам строк исходного текста. Машинные команды, сгенерированные транслятором, отображаются вместе с адресом в формате сегмент: смещение, например, 2932:0000. Программа, как видите, получилась довольно компактной, причем каждому оператору ассемблерной вставки соответствует одна машинная команда. В начале процедуры транслятор сгенерировал команду enter2, а на выходе из процедуры — инструкцию leave.
Г- Пример 8.2. Результат трансляции программы из примера 8.1
1:
2:	/* Вводит символы и отображает на экране цифры,
3:	игнорируя прочие символы */
4:
5:	void main(void)
6:	{
2932:0000 55	PUSH	BP
2932:0001 8ВЕС	MOV	BP, SP
2932:0003 В80200	MOV	AX,0002
2932:0006 9АС2023429 CALL		_aFchkstk (2934:0202)
2932:000В 56	PUSH	SI
2932:000С 57 7:	_asm { 8:	mov	PUSH ah, 8	DI
2932:000D В408 9:	int	MOV 21h	AH, 08
2932:000F CD21	INT	21
10:	cmp	al,’0’	
2932:0011 3C30 11:	jb	CMP big	AL, 30
2932:0013 720A	JB	big (001F)
12:	cmp	al,’9’	
2932:0015 3C39 13:	ja	CMP big	AL, 39
2932:0017 7706	JA	big (001F)
14:	mov	dx, ax	
2932:0019 8BD0	MOV	DX, AX
13:	mov	ah, 2	
2932:001В B402 16:	int	MOV 21h	AH, 02
2932:001D CD21 17:	} 18: 19:	big: {;} 20:	}	INT	21
2 В примере 8.2 сгенерирована пара команд, эквивалентная инструкции ENTER 0,0. Возможно, транслятор был настроен на систему команд процессора 8086. — Пер.
384
Гпава 8
2932:001F 5F	POP	DI
2932:0020 5E	POP	SI
2932:0021 C9	LEAVE	
2932:0022 CB 21:	RETF	
Переменные, определенные в программе на C/C++, доступны из ассемблерных вставок. В примере 8.3 показан вариант записи и чтения байтовых переменных типа char. Программа выполняет вычисление X + Y = Z, где X и Y — числа из одной десятичной цифры (им соответствуют переменные а и ь). Заметим, что для задания комментариев в ассемблерных вставках используется точка с запятой, как в программе на языке ассемблера.
| Пример 8.3. Доступ к переменным, определенным в программе на языке C/C++
void main(void) {
char a,	b;	
_asm {		
mov	ah, 1	
int	21h	; ввод символа
mov	a, al	; сохранить первое число
mov	ah, 1	
int	21h	; ввод символа +
cmp	al,	
jne	endl	
mov	ah, 1	; ввод второго символа
int	21h	
mov	b, al	
mov	ah, 2	
mov	dl,'='	; вывод знака =
int	21h	
mov	al, b	
mov	ah, 0	
add	al, a	; вычислить сумму
aaa		; скорректировать результат
add	ax,3030h	
cmp	ah,•0’	
je	down	
push	. ax	
mov	dl, ah	
mov	ah, 2	
int	21h	; отобразить число десятков
pop	ax	
down:		
mov	dl,al	
mov	ah, 2	
int	21h	; вывести число единиц
endl: }
}
Совместное использование языка ассемблер и C/C++
385
Ограничения при использовании ассемблерных вставок
К сожалению, встроенный ассемблер не поддерживает ни операторы логических блоков MASM (.if, .while, .repeat и т. п.), ни макрокоманды, ни директивы условной трансляции. Директивы определения данных (db, dw, dd и т. п.) также недопустимы — данные могут быть определены только средствами C/C+ + . Забегая вперед, заметим, что раздельная трансляция модулей на языках ассемблер и C/C++, с последующей компоновкой объектных модулей, снимает указанные ограничения.
Работа со строками
В примере 8.4 приведен листинг программы, которая выводит массив символов string по одному слову на строке. Оператор while языка C/C++ организует цикл, в теле которого заданы операторы встроенного ассемблера. Цикл повторяется до чтения null-символа (\0), отмечающего конец строки string. Если очередной символ не null-символ, то он отображается на экране — инструкциями ассемблера. При считывании пробела программа переводит строку, выводя на экран символы возврата каретки (CR — carriage return) и перевода строки (LF — line feed). В результате каждое слово из массива string отображается на отдельной строке экрана.
Пример 8.4. Вывод строки по словам
/* Отображает массив символов по одному слову на строке */ void main(void) {
char stringl[]=”This is my first test program using _asm.\0"; int sc = -1;
while (stringl[c++] !=0) {
_asm {		
push	si	; сохранить указатель
mov	si, sc	; записать индекс sc в указатель si
mov	dl,stringl[si]	; прочитать очередной символ
cmp	dl, ' '	; пробел?
jne	next	; нет
mov	ah, 2	; да
mov	dl, 10	; вывести символы сг и If
int	21h	
mov next:	dl, 13	
mov	ah, 2	
int	21h	
Pop	si	; восстановить указатель si
}
Предположим, требуется вывести несколько массивов символов по одному на строке. Процедура вывода, с использованием встроенного ассемблера, приведена в при-
13 Зак. 384
386
Гпава 8
мере 8.5. Вывод строк, определенных в программе на языке C/C++, выполняется за счет повторного обращения к процедуре string с разными значениями параметра string_addr.
Пример 8.5. Вывод строк
/* Демонстрация процедуры с ассемблерной вставкой для вывода строк C/C++ */
char stringl[]="This is my first test program using _asm.\0"; char string?[]="This is second line in this program.\0"; char string3[]="This is the third.\0"; void main(void) { string (stringl); string (string?); string (string3);
)
string(char *string_addr[]) { _asm {
mov	bx,string_addr	; смещение начала строки
mov	ah, ?	; номер функции DOS — ?
top:
mov dl,[bx]	; вывод строки
inc bx cmp dl, 0 je bot int ?lh jmp top bot:
mov dl,13	; вывод символов CR и LF
int ?lh mov dl,10 int ?lh ) }
Доступ к элементам структур
Структуры данных играют заметную роль в большинстве программ. В этом разделе рассмотрен доступ к структурам языка C/C++ средствами ассемблера. В примере 8.6 приведена программа, в которой определена структура с полями для хранения имени, фамилии, возраста и зарплаты. Значения полей, заданные на языке C/C++, отображаются на экране процедурами, написанными на встроенном ассемблере. Процедура вывода строки несколько отличается от процедуры в примере 8.5 — в конце строки, вместо символов CR и LF, выводится пробел. Отображение чисел выполняется процедурой numb. После отображения всей структуры переход на новую строку осуществляется процедурой crif.
Совместное использование языка ассемблер и C/C++
387
| Пример 8.6. Вывод массива структур
/* Программа демонстрирует применение процедур на языке ассемблера для отображения содержимого структур данных языка C/C++ */
/* Описание структуры данных */
typedef struct records {
char first_name[16];
char last_name [16] ;
int age;
int salary;
) RECORD;
/* Определение массива структур */
RECORD record[4] =
{ {"Bill","Boyd",56,23000},
{"Robert","Walker", 45, 23000},
{"Bull", "Dozer",35,14000},
{"John","Wayne",44,12000}};
void main(void) {
int pnt=-l;
while (pnt++<3) {
string(record[pnt].last_name);
string(record[pnt].first_name);
numb(record[pnt].age);
numb(record[pnt].salary) ;
crlf () ;
string(char *string_addr[]) {
__asm {
mov	bx,string_addr ; указатель строки для вывода
mov	ah,2	; номер DOS-функции — 2
top:
mov dl,[bx]	; вывод строки
inc bx
cmp	dl, 0
je bot
int 21h
jmp top
bot:
mov dl,' '
int 21h
}
)
crlf() {
_asm {
mov ah,2
388
Гпава 8
mov int mov int
dl, 13 21h dl, 10
21h
temp)
ax,temp bx, 10
bx
dx,0
bx
dx ax, 0 11
dx
dl, 10
13
ah, 2 dl,30h
21h
12
dl, ’ ’
21h
numb(int
_asm { mov
mov
pus
11:
mov div push cmp jnz
12:
pop cmp je mov add int jmp
13:
mov int
Пример программы
Продемонстрируем применение рассмотренных правил и возможностей взаимодействия языков ассемблера и C/C++ к произвольной программе. В примере 8.7 представлена программа из примера 7.45, переписанная с использованием языков C/C++ и ассемблера. Программа в примере 8.7, подобно своему прототипу, тоже не проверяет ошибок ввода. В этом примере ассемблер используется для операций ввода-вывода и вычислений; а оформление структуры программы и определение данных выполнено средствами C/C++.
Пример 8.7. Программа из примера 7.45 в среде C/C++
int temp, tempi;
void main(void) {
readn();
_asm { mov ah,1
Совместное использование языка ассемблер и C/C++
389
int 21h
}
tempi = temp; readn();
_asm { mov ah, 1 int 21h
}
numb (templ+temp) ;
)
readn () int a, _asm {
mov int sub
mov mov mov int sub mov mov
} temp =
}
numb(int _asm (
mov mov push 11:
mov div push cmp jnz
12:
Pop cmp je mov add int jmp
13:
mov int
}
}
b;
ah, 1
21h al,30h
ah, 0 a, al ah, 1
21h al,30h
ah, 0 b, ax
a * 10 + b
temp) {
ax, temp bx, 10
bx
dx, 0
bx
dx
ax, 0
11
dx
dl,10
13
ah, 2
dl,30h
21h
12
dl, ' '
21h
390
Глава 8
8.2.	Применение ассемблера и C/C++ в 32-битных приложениях
Разница между 16- и 32-битными приложениями, применительно к программным системам фирмы Microsoft, заключается в следующем: 16-битные приложения предназначены для работы в среде DOS, а 32-битные — в среде Windows. Заметим, что весьма распространенные на сегодня Windows-приложения не допускают прямого обращения к функциям DOS по команде int 21н.
При разработке 32-битных приложений доступны все 32-битные регистры общего назначения и память объемом до 4 Гбайт. Взамен DOS-функций используются функции консольного ввода-вывода _getch/_getche и _putch из библиотеки C/C++. При разработке приложений для встроенных систем использование ассемблера обеспечивает непосредственный доступ к портам ввода-вывода.
Пример консольного приложения
В примере 8.8 приведен возможный вариант программирования консольного ввода-вывода. Вместо обычных в таких случаях вызовов функций ввода-вывода из библиотеки stdio.h здесь используются функции, прототипы которых определены в заголовочном файле conio.h. Программа выводит произвольное число в диапазоне 0—1000 в системах счисления с основанием от 2 до 16.
Пример 8.8. Вывод числа в нескольких системах счисления
#include <como.h>
char *buffer = "Enter a number between 0 and 1000: "; char *bufferl = "Base ";
int a, b = 0;
void disps(int base, int data) { int temp;
_asm {
mov eax,data
mov ebx,base push ebx topi:
mov edx,0 div ebx push edx
cmp eax, 0
jnz topi
top2:
pop edx
cmp edx,ebx
je top4
add edx,30h
cmp edx,39h
Совместное использование языка ассемблер и C/C++
391
jbe top3
add edx,7
top3:
mov temp,edx }
_putch (temp) ;
_asm {jmp top2} top4:;
void main(void) { int i;
_cputs(buffer);
a = _getche();
while ( a >= ’O' && a <= '9' ) {
_asm { sub a,30h}
b = b * 10 + a;
a = _getche() ;
}
jputch(10);
_putch(13) ;
for (i = 2; i <17; i++) {
_cputs(bufferl) ;
disps(10, i) ;
_putch(' ') ; disps(i, b); _putch(10) ;
—putch(13);
} }
Процедура disps (base, data) обеспечивает вывод беззнакового целого числа в системе счисления с основанием от 2 до 36. Предел 36 определяется числом цифр (9) и букв латинского алфавита (27); при основании, равном 36, используются все буквы от А до Z.
Прямой доступ к портам
В языке C/C++ предусмотрены функции для прямого доступа к портам — _inp(port) для ввода байта и _outp(port,byte_data) для вывода. Если при разработке программного обеспечения для IBM PC прямой доступ к портам обычно не требуется, то во встроенных системах эти операции, как правило, весьма многочисленны. Доступ к портам более эффективен при замене С-функций _inp и outp операторами ассемблера.
Программа из примера 8.9 читает содержимое CMOS-памяти, обращаясь к портам 70Н и 71Н. В порт 70Н записывается адрес ячейки CMOS, после чего содержимое ячейки доступно для чтения или записи через порт 71Н. В CMOS-памяти хранится информация о конфигурации вычислительной системы, а также данные часов реального времени.
392
Гпава 8
Программа в примере 8.9 читает ячейки CMOS-памяти, отображая их содержимое на экране в шестнадцатеричном формате.
Пример 8.9. Отображение данных CMOS-памяти
/* Программа выводит содержимое первых 64 байт CMOS-памяти */ #include <conio.h>
char *buffer = "The first 64 bytes of CMOS memory.";
void disph(int data)	
int tempi,	temp2;
_asm {	
mov	eax,data
shr	eax, 4
and	eax,15
add	eax,30h
cmp	eax,39h
jbe	fixl
add	eax, 7
fixl:	
mov	tempi,eax
mov	eax,data
and	eax,15
add	eax,30h
cmp	eax,39h
jbe	fix2
add	eax, 7
fix2:	
mov	temp2,eax
}
_putch(tempi);
jputch(temp2) ;
jputch ( 1 ') ;
}
void main(void) {
int i, a, b;
_cputs(buffer);
_putch(10);
jputch(13);
_asm {
in al,70h
and eax,80h
mov b,eax
}
for (i =0; i < 64; i++) { _asm {
mov eax,i
add eax,b
Совместное использование языка ассемблер и C/C++
393
cut 70h,al' mov еах, О in al,71h mov а,еах } if (i 16 -= 0) { _putch(10); _jDutch (13) ; disph(i);
} disph(a) ;
}
_putch(10); _putch(13);
}
В табл. 8.1 показано содержимое CMOS-памяти для большинства IBM PC. При первом доступе к порту 70Н программа из примера 8.9 выделяет бит 7 (бит маскирования прерываний по входу NMI) и сохраняет его значение в переменной ь. В последующем цикле for при каждой записи в порт 70Н исходное значение бита 7 (из переменной ь) добавляется к выводимым данным.
Таблица 8.1. Содержимое первых 64 байт CMOS-памяти
Адрес	Содержимое	Адрес	Содержимое
ООН	Секунды	I 0DH	Регистр состояния D
01 н	Секунды будильника	ОЕН	Диагностика при отключении питания
02Н	Минуты	0FH	Состояние отключения
ОЗН	Минуты будильника	ЮН	Тип накопителя на гибких магнитных дисках
04Н	Часы	11Н	(Зарезервировано)
05Н	Часы будильника	12Н	Тип жесткого диска
06Н	День недели	13Н	(Зарезервировано)
07Н	День месяца	14Н	Конфигурация оборудования
08Н	Месяц	15Н	Объем основной памяти (младший байт)
09Н	Год	16Н	Объем основной памяти (старший байт)
ОАН	Регистр состояния А	17Н	Объем расширенной памяти (младший байт)
ОВН	Регистр состояния В	18Н	Объем расширенной памяти (старший байт)
ОСН	Регистр состояния С	ЮН	Тип первого жесткого диска (если он больше 15)
394
Гпава 8
Таблица 8.1 (окончание)
Адрес	Содержимое	Адрес	Содержимое
1АН	Тип второго жесткого диска (если он больше 15)	ЗОН—31 н	Объем расширенной памяти3
1ВН—1FH	(Зарезервировано)	32Н	Столетие
20Н—27Н	Параметры первого жесткого диска	ЗЗН—34Н	Данные настройки Setup
28Н—2DH	(Зарезервировано)	35Н—ЗСН	Параметры второго жесткого диска
2ЕН	Контрольная сумма ячеек ЮН—20Н (младший байт)	3DH—3FH	(Зарезервировано)
2FH	Контрольная сумма ячеек ЮН—20Н (старший байт)		
8.3.	Объединение модулей на языках ассемблер и C/C++ при раздельной трансляции
Как уже было отмечено в предыдущем разделе, возможности встроенного ассемблера довольно ограничены — он не поддерживает ни макрокоманд, ни директив условной трансляции, ни логических блоков. Поэтому в некоторых ситуациях проще разработать отдельный модуль на языке ассемблера, который после ассемблирования компонуется с объектными модулями C/C++. Эго решение также наиболее подходящее при разработке приложения несколькими программистами. В этом разделе рассмотрено объединение модулей на языках ассемблер и C/C++ при раздельной трансляции, применительно к Microsoft Visual C/C++ и MASM.
Компоновка модулей на ассемблере и Visual С
В примере 8.Ю приведена процедура, предназначенная для компоновки с программой на языке С в плоской модели памяти — что указано в директиве .model. В плоской модели размер программы может достигать 4 Гбайт. Заметим, что директива .386 предшествует объявлению модели памяти; в этом случае ассемблер генерирует код для 32-битного защищенного режима. Процедура Reverse в примере 8.Ю изменяет порядок символов для программ на языке С; указатель строки передается процедуре в качестве параметра. Обратите внимание, эта программа использует логические блоки ассемблера MASM, что было бы невозможно при использовании встроенного ассемблера. Имя модуля с программой на языке ассемблера может быть любым, число процедур в модуле не ограничено. Имена процедур, доступных извне, перечисляются в операторе, использующем директиву public; этот оператор опреде
3 Дублирует значения ячеек 17Н-18Н. — Пер.
Совместное использование языка ассемблер и C/C++
395
ляет указанные в нем имена как глобальные. Параметры процедуры заданы после директивы proc, заканчивающейся знаком \. Имена формальных параметров произвольны и не связаны с именами конкретных программных объектов — формальные параметры только определяют размерность и порядок следования фактических параметров при вызовах. В этом примере задан один формальный параметр — указатель строки символов. (Процедура в этом примере соответствует void-функции языка C/C++; если тип результата отличается от void, следует сформировать выходное значение в регистре ЕАХ.)
[ Пример 8.10. Процедура реверсирования строки
.386 .MODEL flat, С .stack 1024 .code public Reverse ; Reverse — глобальное имя
Reverse proc uses esi, \ arraychar:ptr	; указатель arraychar — параметр
mov esi,arraychar push 0 .repeat	; записать в стек все символы строки
mov al,[esi] push ax inc esi .until BYTE PTR [esi] == 0 mov esi,arraychar .while 1	; извлечь символы строки из стека, в обратном порядке
pop ах .break .if al==0 mov [esi],al inc esi • endw ret Reverse endp end
В примере 8.11 показана С-программа с вызовом процедуры Reverse. В этом модуле указан прототип процедуры Reverse, с атрибутом extern — поскольку процедура является внешней4. Заметим, что транслятор C/C++ делает различие между строчными и прописными буквами5. Поэтому в обоих модулях — на языке ассемблера и на языке C/C++ — имена процедур должны быть абсолютно идентичными.
4 Ключевое слово extern означает, что объект может быть определен в любом модуле — в другом, а, возможно, и в этом же. Такая трактовка "внешних" имен принята и в C/C++, и в ассемблере. — Пер.
5 В отличие от большинства ассемблеров. — Пер.
396
Гпава 8
? Пример 8.11. Использование процедуры реверсирования строки в С-программе
/* Программа изменяет порядок символов в строке на обратный */ ttinclude <stdio.h>
extern void Reverse(char *);
char chararray[17] = "So what is this?";
void main(void) {
printf ("^s \n", chararray);
Reverse (chararray);
printf ("%s\n", chararray);
}
Объединение модулей на языках C/C++ и ассемблер может быть выполнено непосредственно в среде разработки Visual C/C++. Предположим, что ассемблерный модуль хранится в файле REVERSE.ASM, а модуль на языке С — в файле MAIN.С. Оба файла хранятся в каталоге C:\PROJECT\MINE. После включения указанных файлов в проект программа Programmers Workbench позволяет редактировать исходные модули.
Настройка среды Visual C/C++ для компиляции, ассемблирования и компоновки указанных модулей выполняется следующим образом:
1.	Запустите среду разработки Visual C/C++.
2.	Выберите пункт NEW в меню FILE.
•	Выберите пункт PROJECT WORKSPACE и нажмите кнопку ОК.
•	Выберите тип приложения CONSOLE APPLICATION, введите имя проекта MINE и нажмите кнопку CREATE. В результате будет создан проект по имени MINE.
3.	Чтобы включить модули в проект, выберите пункт FILES INTO PROJECT в меню INSERT. Затем выберите файл MAIN.С из списка и нажмите кнопку ОК.
4.	Повторите шаг 3 для модуля REVERSE.ASM.
5.	Выберите пункт SETTINGS в меню BUILD и раскройте список MINE-Win32 Debug, щелкнув значок +. Выберите из списка модуль REVERSE.ASM.
6.	Выберите в контекстном меню вкладку CUSTOM BUILD.
7.	В поле ввода BUILD COMMAND(S) введите команду, которая будет запускать ассемблер:
C:\MASM611\BIN\ML.EXE /с /Сх /coff $(InputPath)
Предполагается, что ассемблер MASM находится в каталоге C:\MASM611\BIN.
8.	В поле ввода OUTPUT FILE(S) введите REVERSE.OBJ, затем нажмите кнопку ОК для сохранения изменений.
9.	Теперь, чтобы построить приложение, выберите пункт REBUILD ALL в меню BUILD
После вызова полученной исполняемой программы (из меню BUILD) вы увидите отображение двух строк ASCII-текста — исходной и реверсированной.
Совместное использование языка ассемблер и C/C++
397
В примере 8.12 приведена версия программы из примера 8.11 на языке C++. В этом варианте для ввода-вывода используется библиотека iostream.h и, вместо функции printf, поток cout. Имя программы изменено на MAIN.CPP. Важное отличие состоит в том, что в описании прототипа внешней функции поставлен атрибут ”с”. Программы на языке C++ используют соглашения о вызовах функций, отличные от соглашений языка С. Напротив, модуль на языке ассемблера написан в расчете на правила, принятые трансляторами с языка С. Атрибут "С" в прототипе функции изменяет соглашения о вызовах этой функции, и компоновка в этом случае проходит успешно.
| Пример 8.12. Программа реверсирования строки на языке C++
#incluae <iostream.h>
extern ”C" void Reverse(char *);
char chararray[20] = "This is the trick!";
void main(void) {
cout « chararray « '\n';
Reverse(chararray) ;
cout « chararray << '\n' ;
Теперь, когда вы познакомились с возможностями взаимодействия языка C/C++ и ассемблера, рассмотрим более сложный пример, с несколькими ассемблерными процедурами. Модуль, приведенный в примере 8.13, содержит две процедуры. Процедура scan выполняет поиск символа латинской буквы, заданного входным параметром, в таблице с кодами азбуки Морзе, и возвращает индекс символа. Процедура Look возвращает строку символов кода Морзе в соответствии со значением переданного ей индекса. Латинская азбука Морзе приведена в табл. 8.2.
Пример 8.13. Процедуры для преобразования символов букв в коды азбуки Морзе
.386
.MODEL flat, С
• data
table db 2,1,4,3,4,10,3,4 ; ABCD
db 1,0,4,2,3,6,4,0	; EFGH
db	2,0,4,7,3,5,4,4	; IJKL
db	2,3,2,2,3,7,4,6	; MNOP
db	4,13,3,2,3,0,1,1	; QRST
db 3,1,4,1,3,3,4,9	; UVWX
db 4,11,4,12	; YZ
• code public Scan public Look
Scan proc , \ char:dword mov	eax,char
398
Гпава 8
.if al >= 'а' && al <= ’ z* sub al,32
.sndif
sib al, 41h aid eax,eax irov ebx,eax aid ebx, offset table irov ax,WORD PTR [ebx] r?t Szan endp
look proc , \ rnmb:dword, \ ptr:ptr irov ebx,pntr irov eax, numb irov	cl, 8
sib	cl, al
sil	ah, cl
irov	ecx,0
irov	cl, al
.repeat
shl ah,1 .if carry?
mov BYTE PTR [ebx],' . else mov BYTE PTR [ebx],'.' .endif inc ebx . inti lexz
irov BYTE PTR [ebx],0 nt Uok endp eid
Таблица 8.2. Азбука Морзе
Буква	Код	Буква	Код	Буква	Код
А	 —	J	•		S	
В		 • • •	К		 • 		Т	
С	_ • _ •	L	• 	 • •	и	• • —
D	_ • •	М			V	• • • —
Е		N		 •	W	•	
F	• • 	 •	О			X	_ • • —
G		•	Р	•	•	Y	_ 	
Н		Q		• 		Z		• •
1		R	• — •		
Совместное использование языка ассемблер и C/C++ 399
Таблица table в примере 8.13 содержит по два байта для каждого символа латинской буквы в диапазоне A—Z. Например, код символа А равен 2 (две тире или точки), а 1 — это код буквы А Таблица table используется процедурой scan; полученный код возвращается вызывающей программе в регистре АХ.
В примере 8.14 приведен модуль на языке C++, с вызовом ассемблерных процедур из примера 8.13.
Пример 8.14. Преобразование символов строки в коды азбуки Морзе
#include <iostream.h>
extern "С" int Scan(int);
extern "C" void Look(int, char *);
char chararray[21] = "This, is the trick!\n";
char chararrayl[10];
int a = 0x44, b = 0, c;
void main(void) {
while (chararray[b] != '\n') {
if (chararray[b] <= 'A' || chararray[b] >= 'z') { cout « chararray[b] « '\n';
} else {
c = chararray[b];
c = Scan(c);
Look(c,chararrayl);
cout « chararray [b] « " = " << chararrayl « '\n'; }
b++;
}
Включение новых машинных команд в программы на языке C/C++
В ходе развития микропроцессоров Intel появляются новые инструкции, не поддерживаемые встроенным ассемблером. Чтобы в этой ситуации воспользоваться новой инструкцией, следует описать ее код макросредствами языка C/C++. Рассмотрим, например, инструкцию cpuid. Эта команда не поддерживается встроенным ассемблером — в блоках asm она недопустима. Еще одна группа команд, неизвестных встроенному ассемблеру, — это инструкции MMX (multimedia extension). Коды машинных инструкций приведены в Приложении 2. Например, код команды cpuid — OF А2. Макроопределение этой инструкции на языке C/C++ выглядит следующим образом.
ttdefine CPUID _asm _emit OxOf _asm _emit 0xa2
При наличии такого макроопределения оператор cpuid вставляет в программу на языке C/C++ код команды cpuid.
400
Гпава 8
Итоги
□ Встроенный ассемблер используется для вставки коротких последовательностей операторов ассемблера в программы на языке C/C++. Макрокоманды, средства условной трансляции, операторы логических блоков в ассемблерных вставках недопустимы.
□ Среда разработки Microsoft Visual C/C++ обеспечивает создание двух типов приложений: 16-битных DOS-приложений и 32-битных, для Windows. Тип приложения выбирается при настройке среды разработки.
□ Если 16-битные приложения могут обращаться к DOS-функциям (командой int 21н), то 32-битным приложениям эти функции недоступны.
□ Наиболее гибкий и часто используемый метод объединения ассемблера с языком C/C++ подразумевает разделение программы на модули по языкам. Отдельный модуль на языке ассемблера требует указания атрибута "с" в директиве .model.
□ Оператор ассемблера, использующий директиву public, описывает имя процедуры как глобальное, что делает эту процедуру доступной для вызовов из других модулей. Формальные параметры процедуры перечисляются после директивы proc; результат возвращается в регистре ЕАХ.
□ Процедуры, собранные в отдельном ассемблерном модуле, описываются в программе на языке C/C++ как внешние — директивой extern. В программах на языке С не требуется, но при описании ассемблерных процедур в C++ необходимо — после ключевого слова extern указывать атрибут "с”.
Контрольные вопросы
1.	Поддерживает ли встроенный ассемблер макрокоманды?
2.	Поддерживает ли встроенный ассемблер определение байтов директивой DB?
3.	Как определяются метки при использовании встроенного ассемблера?
4.	Какие регистры могут быть использованы в ассемблерных модулях и вставках без сохранения их значений?
5.	В каком регистре процедура возвращает результат вызвавшей ее программе на языке C/C++?
6.	Какие операторы ассемблера предписывают компоновку модуля с программой на языке C/C++9
7.	Каков объем дополнительного кода, добавляемого С-компилятором к модулю в примере 8.2?
8.	Объясните, каким образом инструкция mov dl,stringl[si] в примере 8.4 выполняет доступ к данным stringl.
9.	Почему в примере 8.4 содержимое регистра SI сохраняется в стеке?
10.	Обратите внимание — в примере 8.6 не используются библиотеки C/C++. Будет ли исполняемая программа из примера 8.6 меньше аналогичной программы, написанной целиком на C/C++? Почему?
11.	Выполните трансляцию программ в примерах 8.7 и 7.45. Сравните размеры исполняемых модулей.
Совместное использование языка ассемблер и C/C++
401
12.	В чем состоит основное различие между 16- и 32-битными версиями языка C/C++ в отношении встроенного ассемблера?
13.	Допустимо ли использование инструкции int 21Н для вызова функций DOS при программировании в 32-битной версии компилятора C/C++? Почему?
14.	Для какой цели предназначена С-библиотека, подключаемая к программе оператором ^include <conio.h>?
15.	Напишите короткую программу на языке C/C++ с использованием функций _getche (ввод символа с клавиатуры) и _putch (вывод символа на дисплей).
16.	Нужна ли библиотека conio.h при разработке встроенных приложений?
17.	Для чего в примере 8.8 предназначена последовательность операторов _jDunch(10) и _punch(13;?
18.	Каким образом программа в примере 8.8 отображает число в произвольной системе счисления?
19.	Что такое CMOS-память?
20.	В каком формате хранится информация о времени в CMOS-памяти?
21.	В каком варианте ассемблер обладает большими возможностями — при вставке в текст С-программы или при разделении на модули с последующей компоновкой?
22.	Для чего предназначена директива ассемблера PUBLIC?
23.	Каким образом в модуле на языке ассемблера указывается, что этот модуль предназначен для компоновки с программой на языке С?
24.	Что вы можете сказать о функции Get It, прототип которой в программе на языке С определен как extern void Getlt(int)?
25.	Какой тип имеет параметр arraychar в примере 8.10?
26.	Допустимо ли использовать редактор среды C/C++ для ввода и исправления модулей на языке ассемблера?
27.	Каким образом в программе на языке C/C++ описываются внешние процедуры, разработанные на языке ассемблера?
28.	Параметры каких типов использует процедура Scan из примера 8.13?
29.	Напишите на языке ассемблера модуль с процедурой для очистки экрана в 16-битных приложениях DOS. Информация по программированию дисплея приведена в главе 7.
30.	Напишите модуль на ассемблере с процедурой, которая возвращает байт, в результате преобразования входного параметра — типа char. Ваша процедура должна брать этот байт и преобразовывать его в символ верхнего регистра, причем если встречается символ нижнего регистра, то байт нс должен изменяться.
ГЛАВА 9
Спецификации аппаратных средств микропроцессоров 8086/8088
Введение
В данной главе описаны функции выводов обоих микропроцессоров — 8086 и 8088, и детализированы следующие темы аппаратного оборудования: генерация тактовых импульсов, буферизация тины, применение регистров-защелок, синхронизация, циклы шины, такты ожидания и минимальный режим работы в сравнении с максимальным режимом работы. Вначале, в качестве введения к серии микропроцессоров фирмы Intel, объясняются элементарные микропроцессоры на основе их простой структуры.
Необходимо понять функции выводов и временные соотношения сигналов микропроцессора прежде, чем можно будет подсоединить или подключить к нему что-либо. Таким образом, информация данной главы важна для полного понимания совместной работы процессора с памятью и устройствами ввода-вывода, которые рассмотрены в последующих главах.
Темы главы
По окончании ознакомления с данной главой вы сможете:
□	описать функцию каждого вывода микропроцессоров 8086 и 8088;
□	понять статические характеристики микропроцессора и назвать его нагрузочную способность по выходу для обшей серии логических схем;
□	разобраться в работе генератора синхроимпульсов (8284А), предназначенного для синхронизации микропроцессора;
□	подключать буферы и регистры-защелки к шинам;
□	интерпретировать временные диаграммы;
□	охарактеризовать такты ожидания процессора и создать необходимую схему, формирующую разное количество тактов ожидания;
□	объяснить разницу между минимальным и максимальным режимом работы.
9.1. Расположение и назначение выводов процессора
В данном разделе приведены функции выводов каждого из микропроцессоров. Кроме того, рассмотрены статистические характеристики процессоров, для того чтобы
Спецификации аппаратных средств микропроцессоров 8086/8088	403
обеспечить базу для понимания дальнейших разделов по буферизации и защелкивании данных.
Схема расположения выводов
Рис. 9.1 иллюстрирует расположение выводов микропроцессоров 8086 и 80881. Подробное сравнение показывает, что, по существу, нет большой разницы между двумя микропроцессорами. Они оба находятся в DIP-корпусах, имеющих по 40 выводов. Корпуса типа DIP (Dual In-Line Package) — это корпуса с двухрядным расположением выводов.
	МАХ { MIN |	MIN MODE		f MAX I |MODE J
	MODE (MODE]			
GND С 1	40 □ VCC	GND C	1	40 □ VCC	
AD14 С 2	39 □ AD15	A14 C	2	39 □ A15	
AD13 С 3	38 □ A16/S3	A13 C	3	38 □ A16/S3	
AD12 С 4	37 J A17/S4	A12 C	4	37 J A17/S4	
AD11 С 5	36 J A18/S5	A11 C	5	36 □ A18/S5	
AD10 С 6	35 □ A19/S6	A10 E	6	35 J A19/S6	
AD9 С 7	34 □ BHE/S7	A9 E	7	34 □ SS0	(HIGH)
AD8 С 8	8086	33 □ MN/MX	A8 E	8	8088	33 □ MN/MX	
АО7С9 CPU	32 □ RD	AD7 E	9 CPU 32 □ RD	(RQ/GT0)
AD6 С 10	31 J RQ/GT0 (HOLD)	AD6 E	10	31 J HOLD	
AD5 С 11	30 □ RQ/GT1 (HLDA)	AD5 E	11	30 □ HLDA	(RQ/GT1)
AD4 С 12	29 □ LOCK (WR)	AD4 E	12	29 □ WR	(LOCK)
AD3 С 13	28 □ S2	(M/i0)	AD3 E	13	28 □ Ю/M	(S2)
AD2 С 14	27 □ SI	(DT/R)	AD2 C	14	27 □ DT/R	(S1)
AD1 С 15	26 □ SO	(DEN)	AD1 C	15	26 □ DEN	(SO)
ADO С 16	25 □ QS0 (ALE)	ADO C	16	25 □ ALE	(QS0)
NMI С 17	24 □ QS1 (INTA)	NMI E	17	24 □ INTA	(QS1)
INTR С 18	23 □ TEST	INTR E	18	23 □ TEST	
CLK С 19	22 □ READY	CLK E	19	22 J READY	
GND С 20	21 □ RESET	GND C	20	21 □ RESET	
б)
а)
Рис. 9.1. Схема расположения выводов микропроцессоров 8086 (а) и 8088 (6)
Микропроцессор 8086, как упоминалось в главе /, является 16-разрядным с шиной Данных на 16 бит, а микропроцессор 8088 — 16-разрядным с шиной данных на 8 бит. Из схемы расположения выводов (см. рис. 9.1) видно, что микропроцессор 8086 имеет выводы ADO—AD15, а микропроцессор 8088 — выводы аналогичного типа: ADO—AD7. Следовательно, единственной основной разницей между этими микропроцессорами является разрядность информационной шины данных.
Имеется, однако, и небольшое различие в одном из управляющих сигналов. У мик-ропроцессора 8086 — вывод М/Ю, а у микропроцессора 8088 — вывод IO/М. Единственным отличием в обоих кристаллах является различие в выводе 34: микропроцессор 8088 имеет вывод SS0, тогда как микропроцессор 8086 — BHE/S7.
1 Обозначение CPU (Central Processor Unit) соответствует русскому наименованию ЦП (Центральный Процессор). — Ред.
404
Глава 9
В зависимости от уровня сигнала на входе MN/MX процессоры могут работать как в минимальном, так и в максимальном режимах. В минимальном режиме (M1N MODE) микропроцессор сам вырабатывает управляющие сигналы для внешней шины. Такой режим предназначен для построения небольших систем на базе микропроцессоров, без применения сопроцессоров. В максимальном режиме (MAX MODE) управляющие сигналы системной шины вырабатываются специализированным шинным контроллером 8288 из сигналов состояния процессора SO—S2. Подобный режим работы предназначен для построения PC.
Требования к источнику электропитания
Для питания микропроцессоров 8086 и 8088 необходим источник питания с напряжением +5,0 В и допустимым отклонением ±10%. Максимально потребляемый ток для микропроцессора 8086 — 360 мА, а для микропроцессора 8088 — 340 мА. Оба микропроцессора могуч работать при температуре окружающей среды в пределах 0— 82,2 °C. Данный температурный диапазон недостаточен для работы вне помещения, но имеются версии микропроцессоров 8086 и 8088 с расширенным температурным диапазоном. В частности, модификации микропроцессоров 8086 и 8088 — микропроцессоры 80С86 и 80С88 с КМОП-структурой потребляют ток только в 10 мА и работают при температуре от -40 до 107,2 °C.
Характеристики процессора по постоянному току
Нельзя подключаться к выводам микропроцессора, не зная требований к входному и выходному токам на соответствующих его выводах. Знание этих параметров позволяет разработчику выбрать интерфейсные компоненты для использования с микропроцессором без боязни повредить чего-либо.
Входные характеристики
Входные характеристики этих микропроцессоров совместимы со всеми имеющимися сегодня стандартными логическими элементами. Требования к уровням входного напряжения и входному току для любого входного логического сигнала на выводах обоих микропроцессоров показаны в табл. 9.1.
Таблица 9.1. Входные характеристики микропроцессоров 8086 и 8088
Логический уровень сигнала Напряжение	Ток
0	0,8 В, максимально	±10 мкА, максимально
1	2,0 В, минимально	±10 мкА, максимально
Уровни входного тока являются очень малыми, поскольку входные устройства имеют вентильную схему соединений канальных полевых униполярных МОП-транзисторов (MOSFET — Metal-Oxide-Semiconductor Field-Effect Transistor) и отображают только токи утечки.
Выходные характеристики
Табл. 9.2 отображает выходные характеристики всех выходных сигналов на выводах этих микропроцессоров. Напряжение уровня логической единицы микропроцессо
Спецификации аппаратных средств микропроцессоров 8086/8088
405
ров 8086/8088 совместимо с большинством стандартных логических серий, но уровень логического нуля — не совместим. Стандартные логические цепи имеют максимальное напряжение уровня логического нуля — 0,4 В, а для микропроцессоров 8086/8088 оно составляет — 0,45 В. Следовательно, разница составляет 0,05 В. Эта разница снижает помехоустойчивость от стандартного уровня с 400 мВ (0,8 В — 0,4 В) до 350 мВ (0,8 В - 0,45 В). Помехоустойчивость — это разница между выходным и входным напряжением уровней логического нуля. Данная пониженная помехоустойчивость может создавать проблемы при использовании длинной шины или слишком больших нагрузок. Следовательно, без буферизации к выходному выводу рекомендуется подсоединять не более 10 нагрузок любого типа. При превышении коэффициента нагрузки помехи начнут создавать проблемы, связанные с временным согласованием сигналов.
Таблица 9.2. Выходные характеристики микропроцессоров 8086 и 8088
Логический уровень сигнала	Напряжение	Ток
0	0,45 В, максимально	2,0 мА, максимально
1	2,4 В, минимально	—400 мкА, максимально
В табл. 9.3 перечисляются некоторые наиболее распространенные логические серии микросхем и рекомендуемая нагрузочная способность по выходу для микропроцессоров 8086/8088. Наилучшими элементами для подсоединения к выходному выводу микропроцессоров 8086/8088 является логический элемент LS, 74ALS или 74НС. Учтите, что токи нагрузочной способности по выходу рассчитаны не более чем на 10 удельных нагрузок. Поэтому если необходимо иметь нагрузочную способность на выходе более 10 удельных нагрузок, то в системе следует применить буферизацию.
Таблица 9.3. Рекомендуемая нагрузочная способность по выходу для выводов микропроцессоров 8086/8088
Серия	Нагрузка по току	Источник тока	Нагрузочная способность по выходу
TTL (74)	-1,6 мА	40 мкА	1
TTL (74LS)	-0,4 мА	20 мкА	5
TTL (74S)	-2.0 мА	50 мкА	1
TTL (74ALS)	-0,1 мА	20 мкА	10
TTL (74AS)	-0,5 мА	25 мкА	10
TTL (74F)	-0,5 мА	25 мкА	10
CMOS (74НС)	-10 мкА	10 мкА	10
CMOS (CD4)	-10 мкА	10 мкА	10
NMOS	-10 мкА	10 мкА	10
406
Гпава 9
Назначение выводов и сигналов
□	AD7-ADO
Линии мультиплексированной шины адреса/данных (AD — address/data) микропроцессора 8088 формируют адресно-информационную шину 8088 и содержат младшие 8 битов адреса памяти или порта ввода-вывода при активизации сигнала на выводе процессора ALE (логическая 1) либо 8 битов данных, если сигнал ALE пассивен (логический 0). Эти выводы, при подтверждении фиксации сигналов, переводятся в состояние высокого импеданса.
□	А15-А8
Адресная шина (А — address) микропроцессора 8088 обеспечивает систему памяти старшими адресными битами, которые присутствуют во всех циклах шины. При подтверждении фиксации эти адресные выводы переходят в состояние высокого импеданса.
□	AD15-AD8
Линии шины адреса/данных (AD — address/data) микропроцессора 8086 формируют мультиплексированную адресно-информационную шину микропроцессора 8086. Эти линии содержат адресные биты А15—А8, каждый раз, когда сигнал на выводе процессора ALE имеет уровень логической 1, или сигналы D15—D8 шины данных, если сигнал на выводе ALE имеет низкий уровень. Эти выводы переходят в состояние высокого импеданса при подтверждении фиксации сигналов.
□	A19/S6-A16/S3
Биты адреса/индикации состояния процессора мильтиплексируются, для того чтобы формировать адресные сигналы А19—А16 (address) или биты индикации состояния процессора S6—S3 (status). Эти выводы также переходят в состояние с высоким импедансом при подтверждении фиксации сигналов.
Бит индикации состояния процессора S6 всегда сохраняет уровень логического 0, бит S5 показывает состояние бита управления прерываниями IF (interruptenable flag) регистра флагов, a S4 и S3 обозначают, к какому из сегментов памяти имеется доступ во время текущего цикла шины (табл. 9.4).
Эти два бита индикации состояния процессора можно использовать для адресации четырех отдельных банков памяти емкостью по 1 Мбайту, декодируя их как А21 и А20.
Таблица 9.4. Функция битов индикации состояния процессора S3 и S4
S4	S3	Функция
0	0	Дополнительный сегмент
0	1	Сегмент стека
1	0	Сегмент кода или никакого сегмента
1	1	Сегмент данных
Спецификации аппаратных средств микропроцессоров 8086/8088
407
□	RD
Каждый раз, когда сигнал считывания (RD — read) на этом выводе активен, т. е. имеет уровень логического 0, информационная шина восприимчива к данным, поступающим из памяти или устройств ввода-вывода, подключенных к системе. Этот вывод переходит в состояние высокого импеданса при подтверждении фиксации сигнала.
□	READY
Сигналом на этом выводе управляется вставка тактов ожидания (wait states) в цикл синхронизации микропроцессора. Если сигнал на выводе READY пассивен, т. е. имеет уровень логического нуля, то микропроцессор переходит в состояние ожидания и не занят. Если же сигнал активен, т. е. имеет уровень логической единицы, то это не оказывает никакого действия на выполняемую микропроцессором операцию.
□	INTR
Сигнал запроса прерывания на выводе INTR (interrupt request) используется для запроса аппаратного прерывания у процессора. Если сигнал активен, т. е. имеет значение логической 1, и при этом установлен бит управления прерыванием регистра флагов (IF = 1), то микропроцессоры 8086/8088 после завершения исполнения текущей команды переходят в цикл подтверждения прерывания, при котором активизируется соответствующий сигнал подтверждения прерывания INTA на одноименном выводе процессора.
□	TEST
Входной сигнал, поступающий на вывод TEST , проверяется командой процессора watt. Если сигнал на выводе TEST имеет значение логического 0, то команда wait функционирует так же, как команда nop. Если же сигнал на этом выводе имеет значение логической 1, то команда wait ожидает, пока сигнал на выводе TEST не станет низкого уровня. Этот вывод наиболее часто соединяется с цифровым сопроцессором 8087.
□	NMI
Сигнал запроса немаскируемого прерывания, поступающий на вывод NMI (nonmaskable interrupt), аналогичен сигналу запроса прерывания INTR, за исключением того, что немаскируемое прерывание выполняется всегда и не зависит от установки бита управления прерыванием IF в регистре флагов. При активизации сигнала на входе NMI вызывается прерывание по вектору 2.
□	RESET
Активный сигнал на выводе RESET возвращает микропроцессор в исходное состояние, если этот сигнал удерживается в течение не менее четырех периодов синхронизации процессора. Каждый раз при возврате микропроцессора 8086 или 8088 в исходное состояние начинается исполнение команд с ячейки памяти FFFF0H и последующие маскируемые прерывания становятся невозможными из-за очистки бита управления прерываниями IF в регистре флагов.
О CLK
Вывод CLK (clock) предназначен для подачи на микропроцессор основного сигнала синхронизации. Для обеспечения соответствующей внутренней синхрониза
408
Гпава 9
ции микропроцессоров 8086/8088 синхронизирующий сигнал должен иметь коэффициент заполнения 33%2, при котором сигнал имеет высокий уровень в течение одной трети периода синхронизации, а низкий уровень в течение двух третьих периода.
□	Vcc
На этот вывод от источника постоянного тока подается питание на микропроцессор напряжением +5,0 В ±10%.
□	GND
Вывод GND (ground) предназначен для подачи на микропроцессор общего провода питания ("Земля") от источника постоянного тока. Имейте в виду, что микропроцессоры 8086/8088 содержат два вывода GND, которые оба должны быть подключены к источнику питания.
□	MN/MX
Вывод MN/MX (minimum/maximum) предназначен для выбора минимального или максимального режима работы микропроцессора. При выборе минимального режима работы вывод MN/MX подсоединяется напрямую к +5,0 В источника постоянного тока.
□	BHE/S7
Сигнал разрешения доступа к старшему байту ВНЕ (byte high enable), выдаваемый процессором на вывод BHE/S7, используется только в микропроцессоре 8086, для того чтобы разрешить доступ к самым старшим двоичным разрядам шины данных (D15—D8) во время операций считывания или записи. Бит состояния процессора S7 (status) всегда имеет высокий уровень.
Выводы процессора для минимального режима работы
Минимальный режим работы микропроцессоров 8086/8088 достигается за счет подсоединения вывода MN/MX непосредственно к +5,0 В источника постоянного тока. Не подсоединяйте этот вывод на +5,0 В через нагрузочный регистр, иначе микропроцессор будет функционировать неправильно.
□	Ю/М или М/Ю
Вывод Ю/М (8088) или М/Ю (8086) выбирает память или порты ввода-вывода. Этот вывод показывает, что на адресной шине микропроцессора выставлен адрес или ячейки памяти, или порта ввода-вывода. Данный вывод находится в состоянии высокого импеданса в случае подтверждения фиксации выставленного адреса.
□	WR
Сигнал записи на одноименном выводе WR (write) представляет собой строб-импульс, который указывает на то, что микропроцессор 8086/8088 выводит дан
2 Отношение длительности импульса к его периоду называется коэффициентом заполнения. Это обратная величина скважности импульса, т. е. отношения периода импульса к его длительности. — Ред.
Спецификации аппаратных средств микропроцессоров 8086/8088
409
ные в память или на устройство ввода-выхода. В то время когда сигнал WR активен (имеет низкий уровень), шина данных содержит достоверные данные для памяти или ввода-выхода. Этот вывод переходит в состояние с высоким импедансом при подтверждении фиксации данных.
□	INTA
Выходной сигнал подтверждения прерывания INTA (interrupt acknowledge) на одноименном выводе является ответным сигналом на входной сигнал запроса прерывания INTR. Сигнал INTA используется, обычно, для стробирования кода вектора прерывания на шине данных в ответ на запрос о прерывании.
□	ALE
Выходной стробирующий сигнал разрешения адресной защелки ALE (address latch enable) показывает, что мультиплексированная шина адреса/данных микропроцессоров 8086/8088 содержит адресную информацию. Этот адрес может быть адресом памяти или порта ввода-вывода. Следует отметить, что вывод не переходит в третье состояние (с высоким импедансом) во время подтверждения фиксации адреса.
DT/R
Сигнал передачи/приема данных на одноименном выводе DT/R (data transmit/receive) показывает, что микропроцессор с помощью шины данных производит передачу (DT/R = 1) или прием (DT/R = 0) данных. Этот сигнал используется для управления работой буферных устройств внешней шины данных.
□	DEN
Сигнал разрешения шины данных DEN (data bus enable) на одноименном выводе разрешает работу буферных устройств внешней шины данных.
□	HOLD
Входной сигнал запроса на захват управления локальной шиной системы HOLD (захват), поступающий от внешнего устройства и требующий прямого доступа к памяти (DMA — Direct Memory Access). Если сигнал HOLD имеет высокий логический уровень, то микропроцессор прекращает выполнение программы и переводит шину адреса, данных и управления в состояние высокого импеданса. Если сигнал HOLD имеет низкий логический уровень, то микропроцессор нормально выполняет программу и является "хозяином" локальной шины.
□	HLDA
Выходной сигнал подтверждения запроса на захват локальной шины (Hold acknowledge) указывает внешним устройствам на то, что микропроцессор 8086/8088 перешел в режим предоставления управления шиной.
□	SS0
Линия состояния SS0 эквивалентна выводу S0 при максимальном режиме работы микропроцессора. Этот сигнал совместно с Ю/М и DT/R служит для задания текущего цикла шины (табл. 9.5).
410
Гпава 9
Таблица 9.5. Задание состояния цикла шины (8088) для минимального режима работы микропроцессора			
Ю/М	DT/R	SS0	Функция
0	0	0	Подтверждение прерывания
0	0	1	Чтение из памяти
0	1	0	Запись в память
0	1	1	Останов
1	0	0	Операция выборки кода из памяти
1	0	1	Чтение из порта ввода-вывода
1	1	0	Запись в порт ввода-вывода
1	1	1	Пассивное состояние
Выводы процессора для максимального режима работы
Чтобы достичь максимального режима работы с использованием внешних сопроцессоров, подсоедините вывод MN/MX к земле источника питания.
□	S2, si, so
Биты состояния процессора (status) указывают на функцию текущего цикла шины. Эти сигналы, обычно, декодируются шинным контроллером 8288, описанным далее в этой главе. Табл. 9.6 показывает назначение этих трех битов состояния в максимальном режиме работы.
Таблица 9.6. Функции шины управления, генерируемые шинным контроллером (8288) с использованием битов состояния микропроцессора S2 , S1 и SO
S2	S1	so	Функция
0	0	0	Подтверждение прерывания
0	0	1	Чтение из порта ввода-вывода
0	1	0	Запись в порт ввода-вывода
0	1	1	Останов
1	0	0	Выборка кода операции
1	0	1	Чтение из памяти
1	1	0	Запись в память
1	1	1	Пассивное состояние
□	RQ/GT1 и RQ/GT0
Сигналы запроса и предоставления управления локальной шиной на соответствующих выводах RQ/GT1 и RQ/GTO (request/grant) требуют прямого доступа
Спецификации аппаратных средств микропроцессоров 8086/8088
411
к памяти во время максимального режима работы. Эти линии являются двунаправленными й используются как для запроса, так и для получения разрешения на прямой доступ к памяти.
П LOCK
Выходной сигнал монополизации процессором управления шиной. Используется, чтобы блокировать (lock) внешние устройства системы. Вырабатывается на время выполнения команды по префиксу инструкции lock.
П QS1, QS0
Выходные сигналы состояния очереди команд на одноименных выводах QS1 и QSO (queue status) показывают на очередность внутренней команды. Эти выходные сигналы микропроцессора обеспечивают доступ к математическому сопроцессору (8087) и поступают на его одноименные выводы. Функции сигналов состояния очереди команд представлены в табл. 9.7.
Таблица 9.7. Назначение сигналов состояния очереди команд
QS1	QS0	Функция
0	0	Ожидание в очереди
0	1	Первый байт кода операции
1	0	Нет очереди
1	1	Последующий байт кода операции
9.2. Генератор синхронизирующих импульсов 8284А
Данный раздел описывает генератор синхронизирующих импульсов 8284А, или иначе синхрогенератор, назначение и формирование сигнала сброса RESET, а также знакомит с сигналом готовности READY для микропроцессоров 8086/8088. Сигнал готовности READY и схема с его использованием подробно рассматриваются в разд. 9.5.
Генератор 8284А является дополнительным компонентом к микропроцессорам 8086/8088. В системе на базе микропроцессоров 8086/8088 без использования генератора синхронизирующих импульсов необходимо множество дополнительных схем, для того чтобы генерировать синхронизирующие импульсы (CLK). Генератор 8284А обеспечивает следующие основные функции или сигналы: формирование синхронизирующих импульсов, синхронизацию сигналов сброса RESET, готовности READY и периферийного сигнала синхронизации уровня TTL. На рис. 9.2 представлена схема расположения выводов генератора синхронизирующих импульсов 8284А.
Назначение выводов
Генератор 8284А представляет собой интегральную схему с 18 выводами и специально разработан для использования с микропроцессорами 8086/8088. Далее следует перечень всех выводов и их назначение.
412
Гпава 9
CSYNC С	1	18	□	Vcc
PCLK С	2	17	□	Х1
AEN1 С	3	16	□	Х2
RDY1 С	4	15	□	ASYNC
		8284А		
READY С	5	14	□	EFI
RDY2 □	6	13	□	F/C
AEN2 С	7	12	□	OSC
CLK С	8	11	□ RES	
GND Е	9	10	□	RESET
Рис. 9.2. Схема расположения выводов генератора синхронизирующих импульсов 8284А
П AEN1 и AEN2
Выводы AEN1 и AEN2 (address enable) с помощью одноименных входных сигналов разрешения адреса обеспечивают управление сигналами готовности шины RDY1 и RDY2 соответственно, участвующих в формировании сигнала готовности READY. В разд. 9.5 показано применение этих двух выводов, которые совместно с выводами RDY1 и RDY2, посредством сигнала READY, используются для формирования состояния ожидания процессора.
П RDY1 и RDY2
Для генерирования состояний ожидания в системе на базе микропроцессоров 8086/8088 предусмотрены два вывода готовности шины: RDY1 и RDY2 (ready), использующиеся совместно с выводами AEN1 и AEN2.
□	ASYNC
Сигнал готовности к синхронизации (ready synchronization) выбирает одно- или двухступенчатую синхронизацию сигналов, поступающих на выводы RDY1 и RDY2.
□	READY
Выходной сигнал готовности READY подсоединяется к одноименному выводу микропроцессоров 8086/8088 и предназначен для формирования состояний ожидания процессора. Этот сигнал синхронизирован с сигналами, поступающими на выводы RDY1 и RDY2.
□	XI и Х2
Выводы кварцевого генератора, иначе осциллятора (crystal oscillator), подсоединяются к внешнему кварцевому резонатору, используемому как временной источник для синхрогенератора и всех его функций.
□	F/C
Входной сигнал селекции внешнего источника частоты или кварца, поступающий на одноименный вывод F/C (frequency/crystal), выбирает источник синхронизации для генератора 8284А. При высоком логическом уровне сигнала на этом выводе внешняя синхронизация осуществляется с вывода EFI, при низком — синхронизирующий сигнал подается с внутреннего кварцевого генератора XTAL OSCILLATOR3.
3 XTAL — это сокращение от crystal (кристалл). — Ред.
Спецификации аппаратных средств микропроцессоров 8086/8088 413
□	EFI
Вывод внешней частоты синхронизации EFI (external frequency input) используется для осуществления синхронизации от этого внешнего источника при условии, что сигнал, поступающий на вывод F/C , имеет высокий логический уровень.
□	CLK
Выходной сигнал синхронизации CLK (clock) с одноименного вывода подается на микропроцессор 8086/8088 и другие компоненты вычислительной системы для осуществления синхронизации их работы. Частота сигнала на выводе CLK составляет одну третью часть кварцевой частоты или частоты внешнего тактового генератора, поступающего на вывод EF1, и имеет коэффициент заполнения 33%, при котором сигнал имеет высокий уровень в течение одной трети периода синхронизации, а низкий уровень в течение двух третьих периода, что необходимо для нормальной работы микропроцессоров 8086/8088.
□	PCLK
Выходной сигнал синхроимпульсов для синхронизации работы периферийных устройств PCLK (peripheral clock) составляет одну шестую часть кварцевой частоты или частоты импульсов внешнего генератора, поступающих на вход EFI, и имеет коэффициент заполнения 50%.
a osc
Уровень выходного сигнала осциллятора OSC (oscillator) равен уровню сигнала TTL и имеет такую же частоту, как и у кварца или у внешнего генератора на выводе EFI. В некоторых мультипроцессорных системах выходной сигнал осциллятора OSC может подаваться на вывод EFl других генераторов синхроимпульсов.
□	RES
Входной сигнал сброса (reset) — это входной сигнал низкого уровня для генератора 8284А. Вывод RES часто подсоединяется к RC-цепи, подключенной к питающему напряжению +5 В источника постоянного тока, что обеспечивает формирование сигнала сброса RESET по включении питания.
□	RESET
Выходной сигнал сброса RESET (reset) подсоединяется к одноименному выводу микропроцессора 8086/8088. Предназначен для перевода в исходное состояние процессора, а также системы в целом.
□	CSYNC
Входной сигнал тактовой синхронизации, поступающий на одноименный вывод CSYNC (clock synchronization), используется в том случае, когда вывод EFI обеспечивает синхронизацию в системах с мультипроцессорами. Этот вывод должен быть заземлен при использовании кварцевого осциллятора.
О GND
Вывод GND (ground) предназначен для подачи на микросхему 8284А общего провода питания ("Земля") от источника постоянного тока.
414
Глава 9
□ Vcc
На этот вывод от источника постоянного тока подается питание напряжением +5,0 В с допуском ±10%.
Работа генератора 8284А
Генератор 8284А представляет собой относительно простой для понимания компонент.
Блок-схема генератора синхроимпульсов представлена на рис. 9.3.
RES
Х1
Х2
F/C
EFI
CSYNC
RDY1
AEN1
RDY2
AEN2
ASYNC
Рис. 9.3. Блок-схема генератора синхронизирующих импульсов 8284А
Работа узла синхронизации
Верхняя часть логической схемы генератора синхроимпульсов 8284А отображает узел синхрогенератора и узел формирования сигнала сброса RESET. На схеме показано, что кварцевый генератор (XTAL OSCILLATOR) имеет два вывода микросхемы 8284А: XI и Х2. Если кварц подключен к XI и Х2, то осциллятор вырабатывает сигнал прямоугольный формы той же частоты, как и у кварца. Этот сигнал далее подается на логическую схему "И" и инвертирующий буфер, после прохождения которого формируется выходной сигнал OSC. Сигнал OSC иногда подключают к выводу EFI других, применяемых в системе, микросхем 8284А.
Исследование упомянутой логической схемы "И" показывает, что в случае, когда сигнал на выводе F/C имеет низкий логический уровень, то выходной сигнал осциллятора поступает на схему делителя частоты (счетчик) на 3. Если же сигнал на выводе F/C будет иметь высокий логический уровень, то на эту схему делителя на 3 проходит сигнал с вывода EFI.
Спецификации аппаратных средств микропроцессоров 8086/8088 4/5
Выходной сигнал схемы делителя частоты на 3 формирует импульсы для синхронизации узла готовности, сигнала для другого счетного устройства (делителя на 2) и сигнала синхронизации CLK для микропроцессоров 8086/8088. Сигнал CLK буферизуется, перед тем как покинуть генератор синхроимпульсов. Имейте в виду, что выход первого счетчика питает второй. Эти двухкаскадные счетные устройства с общим коэффициентом пересчета на 6 формируют выходной сигнал синхронизации периферийных устройств PCLK.
На рис. 9.4 показана схема подключения генератора синхронизирующих импульсов 8284А к процессору 8086/8088.
Рис. 9.4. Схема подключения генератора синхронизирующих импульсов 8284А к микропроцессору 8086/8088. Кварц на 15 МГц обеспечивает подачу на микропроцессор синхронизирующего сигнала CLK с частотой в 5 МГц
Следует отметить, что для того чтобы выбрать работу генератора импульсов 8284А от кварцевого генератора, выводы F/С и CSYNC нужно заземлить. Если при этом применить кварц на 15 МГц, то синхронизирующий сигнал CLK, подаваемый на микропроцессор 8086/8088, составит 5 МГц, а периферийный синхронизирующий сигнал PCLK — 2,5 МГц.
Работа узла формирователя сигнала сброса RESET
Узел формирователя сигнала сброса в генераторе 8284А имеет очень простую схему реализации. Он состоит из буферной схемы триггера Шмитта и одного D-триггера (см. рис. 9.3). D-триггер обеспечивает выполнение требований по синхронизации входного для микропроцессора 8086/8088 сигнала RESET. Этот триггер на выходе Q (вывод RESET) формирует сигнал инверсный входу D при каждом отрицатель
416
Глава 9
ном перепаде (переход от I к 0) тактового сигнала CLK. Микропроцессор 8086/8088 стробирует (получает) сигнал RESET при положительном перепаде (переход от 0 к 1) тактового сигнала. Следовательно, эта цепь соответствует требованиям к синхронизации микропроцессоров 8086/8088. Следует отметить, что в самом начале поступления питания в систему, когда напряжение источника постоянного тока еще не достигло своего номинального значения, с RC-цепи на вывод RES микросхемы 8284А (см. рис. 9.4) подается сигнал низкого уровня. В это время как раз и формируется сигнал сброса RESET.
Через некоторый короткий промежуток времени вывод RES будет иметь высокий логический уровень, поскольку зарядка конденсатора осуществляется через резистор RC-цепи от источника постоянного тока напряжением +5,0 В. Кнопочный переключатель схемы позволяет оператору возвращать микропроцессор в исходное состояние. Для правильной синхронизации перехода процессора в исходное состояние необходимо, чтобы сигнал RESET на его одноименном входе имел высокий логический уровень не позднее четырех тактов после подачи в систему питания и удерживался на высоком уровне не менее 50 мкс. Триггер обеспечивает формирование сигнала RESET на высоком уровне в течение четырех тактов, а постоянная времени RC-цепи сохраняет его на высоком уровне не менее 50 мкс.
9.3.	Буферизация шины
и применение регистров-защелок
Перед использованием памятью или интерфейсами ввода-выхода мультиплексированных шин микропроцессоров они должны быть предварительно разделены, иначе говоря, демульпитлексированы. В данном разделе подробно рассмотрено демультиплексирование шин и иллюстрируется буферизация шин, применяемая в очень больших системах. Система должна быть буферизирована, если она имеет более 10 компонентов ввиду того, что максимальная нагрузочная способность микропроцессоров по выходу равняется 10.
Демультиплексирование шин
Для того чтобы уменьшить количество выводов, требуемых для интегральной схемы микропроцессоров 8086/8088, используется мультиплексированная (общая) шина адреса/данных. К сожалению, это усложняет задачу разработчика аппаратного оборудования по извлечению информации из этих мультиплексных шин.
Почему нельзя сохранить мультиплексные шины? Память и устройства ввода-вывода требуют, чтобы адрес в циклах считывания или записи оставался действенным и стабильным. Если шины мультиплексированы, то адрес памяти и устройств ввода-вывода на шине не стабилен, что может привести к считыванию или записи неправильных данных.
Все компьютерные системы имеют три шины:
□	адреса;
□	данных;
□	управления.
Спецификации аппаратных средств микропроцессоров 8036/8088
417
Шина адреса предназначена для обращения к памяти или портам ввода-вывода, шина данных — для .обмена информацией между микропроцессором, памятью и устройствами ввода-вывода в системе, а управляющая шина — для передачи сигналов управления системой. Эти шины должны присутствовать для того, чтобы обеспечить связь с памятью и устройствами ввода-вывода.
Демультиплексирование для микропроцессора 8088
На рис. 9.5 отображены микропроцессор 8088 и компоненты, требующие демультиплексирования шин. В данном случае для разделения выводов шины адреса/данных
Шина данных
Шина управления
Рис. 9.5. Микропроцессор 8088 с демультиплексированной (разделенной) адресной шиной. Эта схема используется для создания многих систем на базе микропроцессора 8088
14 Зак 384
418
Гпава 9
AD7—ADO и объединенных выводов адреса/состояния процессора A19/S6—A16/S3 используются две защелки 74LS373.
Эти защелки работают подобно проводникам, пропуская свои входные сигналы на выход без изменения, в том случае, когда выходной стробирующий сигнал разрешения адресной защелки на одноименном выводе процессора (ALE) имеет высокий логический уровень. Через некоторое время сигнал ALE переходит в состояние логического 0, что вынуждает защелки запомнить входные сигналы. В этом случае младшие разряды адреса А7—АО запоминаются в нижней по схеме защелке, а старшие разряды А19—А16 запоминаются в верхней защелке. Такая схема в результате приводит к организации отдельной 20-разрядной адресной шины А19—АО. Такая адресная шина позволяет микропроцессору 8088 адресоваться к области памяти в 1 Мбайт. Факт наличия отдельной шины данных позволяет подключать ее к 8-раз-рядному периферийному устройству или к элементу памяти.
Демультиплексирование для микропроцессора 8086
Для системы, построенной на базе микропроцессора 8086, подобно системе на процессоре 8088, требуются отдельные шины: адреса, данных и управления. Однако эти системы отличаются, главным образом, количеством мультиплексных выводов. В системе на базе 8088 мультиплексными выводами являются AD7—AD0 и A19/S6— A16/S3. В системе, построенной на базе микропроцессора 8086, имеются следующие мультиплексные выводы: AD15—ADO, A19/S6—A16/S3 и BHE/S7. Все эти сигналы должны быть разделены. На рис. 9.6 показана схема демультиплексирования шин микропроцессора 8086 со всеми тремя полученными отдельными шинами: адреса (А19—АО и плюс сигнал ВНЕ), данных (D15—D0) и управления (M/IO, RD и WR).
Схема, приведенная на рис. 9.6, почти идентична схеме на рис. 9.5, за исключением: дополнительного регистра-защелки, добавленного для разделения выводов шины адреса/данных AD15—AD8 и вывода BHE/S7, добавленного на верхней защелке 74LS373 для формирования буферизированного сигнала ВНЕ , который совместно с младшим битом адреса АО определяет использование байт шины данных системы на базе микропроцессора 8086 (табл. 9.8). Здесь память и система ввода-вывода воспринимают микропроцессор 8086 как устройство с 20-разрядной адресной шиной (А19—АО), 16-разрядной шиной данных (D15—D0) и управляющей шиной с тремя линиями (M/IO, RD и WR).
Таблица 9.8. Кодирование передачи по шине данных микропроцессора 8086
ВНЕ	АО	Передача
0	0	Целое слово (16 разрядов)
0	1	Байт с нечетным адресом (старший)
1	0	Байт с четным адресом (младший)
1	1	Недопустимая операция
Спецификации аппаратных средств микропроцессоров 8086/8088
419
+5 В
Шина данных
Шина управления
Рис. 9.6. Микропроцессор 8086 с демультиплексированной адресной шиной. Многие системы на базе микропроцессора 8086 создаются с использованием этой схемы
Буферизированная система
Система на базе микропроцессора 8086 или 8088 должна содержать буферы, если хотя бы к одному из выводов шины подключается более Ю удельных нагрузок. Де
420
Гпава 9
мультиплексированные выводы уже буферизированы регистрами-защелками 74LS373, которые были разработаны для высокоемкостных шин, встречающихся в микрокомпьютерных системах.
Выходные токи буфера увеличены настолько, что к ним можно подключать большее количество удельных нагрузок TTL-уровня: выходной сигнал с логическим уровнем 0 обеспечивает нагрузку по току до 32 мА, а выходной сигнал с логическим уровнем 1 обеспечивает до 5,2 мА от источника тока.
Полностью буферизированный сигнал привносит в систему временную задержку. Это никоим образом не создает трудности, если только буферизация не используется для памяти и устройств ввода-вывода, которые функционируют на скорости шины, близкой к максимальной. Эта проблема и временные задержки более подробно рассмотрены в разд. 9.4.
Полностью буферизированная система на базе микропроцессора 8088
Рис. 9.7 отображает полностью буферизированную систему, построенную на базе микропроцессора 8088. Легко заметить, что по сравнению со схемой, приведенной на рис. 9.5, здесь дополнительно используется 8-разрядный буфер 74LS244 для буферизации 8 адресных выводов (А15—А8), 8-разрядный двунаправленный буфер 74LS245 для буферизации выводов шины данных (D7—D0), и еще один буфер 74LS244 для буферизации сигналов шины управления (10/М, RD и WR). Таким образом, для реализации полностью буферизированной системы на базе процессора 8088 требуются два элемента 74LS244, один 74LS245 и два 74LS373. Направление передачи данных в элементе 74LS245 управляется сигналом DT/R (низкий уровень сигнала подразумевает передачу данных с выводов элемента Во—В7 на Ао—А7, а высокий в обратном порядке с выводов Ао—А7 на Во—В7, т. е. соответственно в процессор или из процессора), а разрешение и запрещение работы элемента — сигналом DEN , причем разрешение осуществляется при низком логическом уровне этого сигнала.
Полностью буферизированная система на базе микропроцессора 8086
Рис. 9.8 отображает полностью буферизированную систему, построенную на базе микропроцессора 8086. В отличие от схемы, приведенной на рис. 9.6, на этой схеме к уже буферизированной шине адреса, с помощью трех адресных регистров-защелок 74LS373, добавлена буферизированная шина данных, использующая два элемента 74LS245, и буферизированные сигналы (М/Ю, RD и WR) шины управления, использующие буфер 74LS244. Таким образом, для полностью буферизированной системы на базе микропроцессора 8086 требуются: один элемент 74LS244, два 74LS245 и три 74LS373.
Для реализации системы на микропроцессоре 8086, в отличие от системы на микропроцессоре 8088, требуется на один буфер больше из-за расширенной с 8 до 16 разрядов шины данных (D15—D8). Система, кроме того, имеет также буферизированный сигнал ВНЕ, который совместно с младшим битом адреса АО определяет использование байт шины данных процессора 8086 (см. табл. 9.8).
Спецификации аппаратных средств микропроцессоров 8086/8088
421
Буферизированная шина управления
Буферизированная шина данных
Буферизированная шина адреса
Рис. 9.7. Полностью буферизированная система на базе микропроцессора 8088
422
Гпава 9
м/ю5]
RD >
WR J
ВНЕ\ А19 Aia A17 A16 A15 A14 A13 A12 A11
A10	>
>4
A8
A7 Afi A5
A4
A3
A2 A1 Ao /
D15 X Dl4 D13 d12 D11 Dio O9 d8
d7
°6
d5
°4
□з
o2
°o J
Буферизированная шина управления
Буферизированная шина адреса
Буферизированная шина данных
Рис. 9.8. Полностью буферизированная система на базе микропроцессора 8086
9.4.	Циклы шины
Для того чтобы правильно выбрать оптимальные для системы элементы памяти или устройства ввода-вывода, взаимодействующие с процессорами 8086/8088, важно понять о процессах, происходящих в шинах.
Спецификации аппаратных средств микропроцессоров 8086/8088
423
Этот раздел дает представление о функционировании сигналов шины и временных диаграммах при операциях считывания и записи для микропроцессоров 8086/8088. Важно отметить, что здесь рассмотрены только временные соотношения, связанные с памятью и системой ввода-вывода.
Основные операции шины
Три шины микропроцессоров 8086 и 8088 — адреса, данных и управления функционируют точно так, как и в любом другом микропроцессоре. При записи данных в память (см. упрощенную временную диаграмму при записи на рис. 9.9) микропроцессор выставляет адрес памяти на шину адреса, данные, предназначенные для записи в память, и затем формирует сигнал записи WR и сигнал Ю/М = 0 для микропроцессора 8088 или M/IO = 1 для микропроцессора 8086, указывающий на операцию с памятью.
Адрес
Записываемые в память данные
Шина адреса/данных
WR
Рис. 9.9. Упрощенная временная диаграмма цикла шины записи для микропроцессоров 8086/8088
При считывании данных из памяти (см. упрощенную временную диаграмму при считывании на рис. 9.10) микропроцессор выставляет адрес памяти на шину адреса, передает сигнал чтения RD на считывание из памяти и получает данные, выставленные памятью на шину данных.
Понятие о циклах шины
Микропроцессоры 8086/8088 взаимодействуют с памятью и устройствами ввода-вывода в течение промежутков времени, называемых циклами шины (bus cycles). Каждый цикл шины равен четырем периодам, или иначе тактам Т, сигнала синхронизации CLK. В некоторых микропроцессорах цикл шины составляет лишь два такта (периода сигнала синхронизации). Если задающий генератор работает с частотой
424
Гпава 9
..............Цикл ШИНЫ ——---------------- 	 I
L--------1-------Ь--------1-------т3-------1------т4--------1
Рис. 9.10. Упрощенная диаграмма цикла шины чтения для микропроцессоров 8086/8088
5 МГц (основная рабочая частота для этих двух микропроцессоров), то один цикл шины микропроцессоров 8086/8088 заканчивается через 800 нс. Это означает, что микропроцессор производит операции считывания или записи данных между собой и памятью или устройствами ввода-вывода с максимальной производительностью до 1,25 млн операций в секунду. Из-за организации внутренней очереди команд микропроцессоры 8086/8088 могут выполнять 2,5 млн команд в секунду (MIPS — million instructions per second, миллион команд в секунду) в пакете. Другие существующие версии этих микропроцессоров работают с намного большей производительностью, вследствие их более высокой частоты синхронизации.
Многое происходит уже в первом периоде синхронизации цикла шины, называемом тактом Тг Адрес памяти или устройства ввода-вывода выставляется на выводы адреса и адреса/данных процессора. Шина адреса/данных мультиплексирована и содержит, иногда, информацию об адресе, иногда — данные. В течение такта Т[ передаются также сигналы управления ALE, DT/R и Ю/М (для микропроцессора 8088) или M/IO (для 8086). Сигнал Ю/М или M/IO указывает на то, содержит ли информационная шина адрес памяти или устройства ввода-вывода.
В течение такта Т2 микропроцессоры 8086/8088 передают сигналы чтения RD или записи WR , сигнал DEN , и в случае операции записи информация для записи появляется на шине данных. По этим командам память или устройство ввода-вывода начинают выполнять соответствующую операцию чтения или записи. Сигнал разрешения данных DEN разрешает работу буферных устройств внешней шины данных, если они, конечно, прису]ствуюг в системе, поэтому память или устройство ввода-вывода могут получать данные при операции записи или же микропроцессор может принимать данные, считанные из памяти или устройства ввода-вывода при операции чтения. В случае когда это происходит с циклом шины записи, то данные отправляются в память или устройство ввода-вывода по шине данных.
Спецификации аппаратных средств микропроцессоров 8086/8088 425
Получение сигнала подтверждения завершения обмена данными с памятью или портом ввода-вывода, или иначе сигнала готовности READY, производится в конце такта Т2, как показано на рис. 9.11. Если сигнал READY имеет низкий уровень, т. е. нет подтверждения завершения обмена данными, то во время такта прие-ма/передачи данных Т3 добавляются пшкты ожидания (wait state) Tw. Более подробное описание этого процесса приведено далее в разд. 9.5. Этот такт предусмотрен для того, чтобы память могла получить доступ к данным. В случае когда выполняется цикл шины чтения, то выборка данных процессором с шины данных производится в конце такта Т3.
В такте Т4 все сигналы дезактивируются в целях подготовки к следующему циклу шины. В это же время, в случае выполнения операции чтения, микропроцессор 8086/8088 по заднему фронту сигнала RD (во время перехода от 0 к 1) выполняет чтение данных, которые были получены из памяти или устройства ввода-вывода.
Кроме того, во время такта Т4, по заднему фронту сигнала WR (во время перехода от 0 к 1), в случае выполнения операции записи, выставленные процессором данные записываются памятью или устройством ввода-вывода.
Временная диаграмма чтения
Рис. 9.11 отображает подробную временную диаграмму при операции чтения для микропроцессора 8088. Временная диаграмма чтения для микропроцессора 8086 идентична приведенной, за исключением того, что этот процессор имеет 16-раз-рядную, а не 8-разрядную шину данных. Тщательное рассмотрение этой временной диаграммы позволит вам определить все основные события, описываемые для каждого такта Т.
Наиболее важной характеристикой, содержащейся во временной диаграмме чтения, является количество времени, предоставляемого памяти или устройству ввода-вывода для считывания данных. Элементы памяти выбирают по времени доступа, которое является фиксированным отрезком времени, в течение которого микропроцессор позволяет этим элементам иметь доступ к данным при операции чтения. Следовательно, крайне важно, чтобы выбранные элементы памяти соответствовали параметрам системы.
Временная диаграмма микропроцессора не предоставляет определенной отдельной записи о времени доступа к памяти. Вместо этого, для того чтобы установить время Доступа потребуется объединить несколько отрезков времени. Для определения времени доступа к памяти по этой времен ной диаграмме определите сначала точку выборки данных во время такта Т3. При тщательном рассмотрении временной диаграммы вы увидите линию, которая тянется от момента окончания такта Т3 вниз к шине данных. В конце такта Т3 микропроцессор производит выборку с шины данных.
Время доступа к памяти начинается с момента появления адреса на адресной шине запоминающего устройства и продолжается до тех пор, пока микропроцессор не сделает выборку данных в конце такта Т3. За этот отрезок времени проходят, примерно, три такта. Для уточнения упоминаемых отрезков времени можно обратиться к табл. 9.9.
426
Гпава 9
А15 - Ад (*) — Шинн в состоянии высокого импеданса в течение цикла подтверждения аппаратного прерывания FLOAT(“) — Шина в состоянии высокого импеданса
Примечание:
1.	Если не определено иначе, то все сигналы переключаются между уровнями напряжений V0H и Vol
2.	Сигнал RDY выбран в момент времени около окончания тактов Т2, Т3, Tw для того, чтобы определить время вставки такта ожидания Tw.
3.	Два сигнала подтверждения аппаратного прерывания INTA формируются дважды. Локальная шина адреса/данных процессора 8088 находится в состоянии высокого импеданса в течение обоих циклов подтверждения аппаратного прерывания. Управляющие сигналы показаны для второго цикла INTA.
4.	Сигналы синхрогенератора 8284 показаны для справки.
5.	Все временные измерения выполнены на уровне 1,5 В, если условия не оговорены особо.
Рис. 9.11. Временная диаграмма операции чтения
для минимального режима работы микропроцессора 8088
Спецификации аппаратных средств микропроцессоров 8086/8088
427
Таблица 9.9. Временные параметры микропроцессора 8088.
Требования к синхронизации системы минимальной сложности
Условия проведения измерений для микропроцессора 8088: t = 0 до 70 °C, Vcc = 5 В ± 10%
8088-2: t = 0 до 70 °C, Vcc = 5 В ± 5%
Обозначение	Характеристика	8088		8088-2		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
TCLCL	Период сигнала CLK	200	500	125	500	
TCLCH	Длительность сигнала CLK низкого уровня	118		68		
TCHCL	Длительность сигнала CLK высокого уровня	69		44		
ТСН1СН2	Длительность переднего фронта сигнала CLK		10		10	От 1,0 до 3,5 В
TCL2CL1	Длительность заднего фронта сигнала CLK		10		10	От 3,5 до 1,0 В
TDVCL	Время установки данных на шине	30		20		
TCLDX	Время фиксации данных	10		10		
TR1VCL	Время установки сигнала RDY в 8284 (см. примечание 1, 2)	35		35		
TCLR1X	Время фиксации сигнала RDY в 8284 (см. примечание 1, 2)	0		0	0	
TRYHCH	Время установки сигнала READY в 8088	118		68		
TCHRYX	Время фиксации сигнала READY в 8088	30		20		
TRYLCL	Время пассивности по отношению к сигналу CLK (см. примечание 3)	—8		-8		
THVCH	Время установки сигнала HOLD	35		20		
TINVCH	Время установки сигналов INTR, NMI, TEST (см. примечание 2)	30		15		
TILIH	Время возрастающего фронта входа (кроме CLK)		20		20	От 0,8 до 2,0 В
TIHIL	Время ниспадающего фронта входа (кроме CLK)		12		12	От 0,8 до 2,0 В
428
Гпава 9
Таблица 9.9 (продолжение)
Обозначение	Характеристика	8088		8088-2		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
TCLAV	Допустимая задержка адреса	10	110	10	60	CL = 20 -100 пф для всех выводов 8088 в дополнение к внутренним нагрузкам
TCLAX	Время фиксации адреса	10		10		
TCLAZ	Задержка перевода шины адреса в состояние высокого импеданса	TCLAX	80	TCLAX	50	
TLHLL	Длительность сигнала ALE	TCLCH - 20		TCLCH - 10		
TCLLH	Задержка активизации сигнала ALE		80		50	
TCHLL	Задержка до деактйвиза-ции сигнала ALE		85		55	
TLLAX	Время фиксации адреса при пассивном сигнале ALE	TCHCL- 10		TCHCL-10		
TCLDV	Допустимая задержка данных	10	110	10	60	
TCHDX	Время фиксации данных	10		10		
TWHDX	Время на фиксацию данных после снятия сигнала WR	TCLCH - 30		TCLCH - 30		
TCVCTV	Задержка 1 управления до активизации сигнала	10	110	10	70	
TCHCTV	Задержка 2 управления до активизации сигнала	10	110	10	60	
TCVCTX	Задержка управления до деактивизации сигнала	10	110	10	70	
TAZRL	Задержка активизации сигнала READ после перевода шины адреса в состояние высокого импеданса	0		0		
TCLRL	Задержка активизации сигнала RD	10	165	10	100	
TCLRH	Задержка деактивизации сигнала RD	10	150	10	80	
TRHAV	Время до следующей активизации шины адреса после деактивизации сигнала RD	TCLCL - 45		TCLCL - 40		
Спецификации аппаратных средств микропроцессоров 8086/8088
429
Таблица 9.9 (окончание)
Обозначение	Характеристика	8088		8088-2		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
TCLHAV	Допустимая задержка сигнала HLDA	10	160	10	100	
TRLRH	Длительность сигнала RD	2TCLCL-75		2TCLCL - 50		
TWLWH	Длительность сигнала WR	2TCLC - 60		2TCLCL - 40		
TAVAL	Время до перевода сигнала ALE в низкое состояние с момента, когда установлен действительный адрес	TCLCH - 80		TCLCH - 40		
TOLOH	Время возрастающего фронта входа		20		20	От 0,8 до 2,0 В
TOHOL	Время ниспадающего фронта входа		12		12	От 0,8 до 2,0 В
Адрес после начала такта Т| не появляется пока отрезок времени TCLAV (110 нс, если задающий генератор имеет частоту 5 МГц)- Это означает, что время ТС LAV нужно вычесть из трех состояний синхронизации (600 нс), что разделит по времени: появление адреса (Т|) и выборку данных (Т3). Также должно быть вычтено еще одно время: время установки данных (TDVCL) что происходит до такта Т3. Поэтому время доступа к памяти равняется трем состояниям синхронизации за вычетом суммы TCLAV и TDVCL. Поскольку TDVCL составляет 30 нс для задающего генератора с частотой в 5 МГц, то разрешенное время доступа к памяти составляет только 460 нс (время доступа равно 600 нс - 110 нс - 30 нс).
Выбранные элементы памяти для подсоединения к микропроцессорам 8086/8088, работающих с частотой 5 МГц, должны быть способны получить доступ к памяти менее чем за 460 нс вследствие временной задержки, вызываемой дешифраторами адреса и буферными устройствами в системе. Поэтому, чтобы микропроцессоры 8086/8088 работали исправно, скорость работы элементов памяти должна быть выше 420 нс.
Единственно другим фактором в синхронизации, который может повлиять на работу памяти, является длительность сигнала-строба чтения RD. На временной диаграмме этот сигнал при операции чтения представлен как TRLRH. Время для этого строба составляет 325 нс (синхронизирующая частота 5 МГц), которое является очень большим почти для всех производимых элементов памяти со временем доступа 400 нс или менее.
430
Гпава 9
Временная диаграмма записи
На рис. 9.12 показана временная диаграмма при записи для микропроцессора 8088. Следует снова отметить, что микропроцессор 8086 почти идентичен приведенному, поэтому нет необходимости представлять его работу на отдельной временной диаграмме.
Цикл записи (Примечание 1) '
Цикл подтверждения аппаратного прерывания (Примечание 1, 3) (RD, WR = V0H)
Останов программы -DEN,RD,WR,INTA = Va DT/R неолределен
CLK (выход 8284)
AD7-AD
AD7-ADc
TCVCTV*
TCLDV-
TCLAX-
DEN
WR
AD7-AD,
DT/R
ГБГТа
DEN
AD7-ADC
TCHCTV
TCLAV
TCHDX-
X
Выходные данные
TWHDX-
-TWLWF
TCVCTX
*-TCLAZ
FLOAT(’)
TCVCTV
TDVCL-
TCHCTV
TCVCTV
TCVCTX-H
TCVCTV-*
Неверный адрес
Останов программы
TCVCTX
FLOAT(’)
X
FLOAT(*) - Шина в состоянии высокого импеданса
Примечание:
1.	Если не определено иначе, то все сигналы переключаются между уровнями напряжений V0H и Vol-
2.	Сигнал RDY выбран в момент времени около окончания тактов Т2, Т3, Tw для того, чтобы определить время вставки такта ожидания Tw.
3.	Два сигнала подтверждения аппаратного прерывания INTA формируются дважды. Локальная шина адреса/данных процессора 8088 находится в состоянии высокого импеданса в течение обоих циклов подтверждения аппаратного прерывания. Управляющие сигналы показаны для второго цикла INTA.
4.	Сигналы синхрогенератора 8284 показаны для справки.
5.	Все временные измерения выполнены на уровне 1.5 В, если условия не оговорены особо.
Рис. 9.12. Временная диаграмма записи в минимальном режиме работы микропроцессора 8088
Спецификации аппаратных средств микропроцессоров 8086/8088
431
Отличия между временными диаграммами чтения и записи минимальны. Стробирующий сигнал чтения RD сменяется на строб WR , на шине данных содержатся данные, предназначенные для памяти, а не для процессора и сигнал DT/R имеет высокий, а не низкий уровень на протяжении всего цикла шины.
При использовании в системе нескольких запоминающих устройств временные соотношения могут быть особенно критическими в точке перехода сигнала WR на высокий уровень и отрезке времени, когда данные удаляются с информационной шины.
Дело обстоит именно так, потому что, как вы помните, данные записываются в память именно по заднему фронту сигнала строба WR. В соответствии с временной диаграммой, данный критический период времени равен TWHDX или 88 нс при работе микропроцессора 8088 с задающим генератором на частоте 5 МГц. На самом деле истинное время фиксации данных часто намного меньше этого времени, фактически для запоминающего устройства оно составляет 0 нс. Длительность сигнала строба WR равняется TWLWH или 340 нс при тактовой частоте синхрогенератора 5 МГц. Это значение удовлетворяет большинству запоминающих устройств, имеющих время доступа 400 нс или меньше.
9.5. Состояние готовности и ожидания
Ранее в этой главе уже упоминалось, что сигнал READY предназначен для формирования состояния ожидания для медленно работающих запоминающего устройства и компонентов системы ввода-вывода. Состояние ожидания или, точнее, такт ожидания Tw представляет собой дополнительный период сигнала CLK, вводимый между тактом Т2 и Т3 для увеличения продолжительности цикла шины. При вводе одного такта ожидания время доступа к памяти, обычно составляющее 460 нс с задающим генератором в 5 МГц, увеличивается на один период сигнала синхронизации CLK (200 нс) до 660 нс.
В данном разделе рассматривается схема синхронизации сигнала готовности READY в генераторе синхроимпульсов 8284А, показано, каким образом осуществляется ввод одного или более тактов ожидания в цикл шины, и исследуем вывод READY микропроцессора.
Вывод READY микропроцессора 8086/8088
Выборка входного сигнала на выводе READY производится в конце такта Т2 и снова, в середине такта ожидания Tw, если он, конечно, используется. Если же в конце такта Т2 сигнал на выводе READY имеет низкий логический уровень, тогда такт ожидания Tw вводится между двумя тактами Т2 и Т3. Затем выборка сигнала на выводе READY делается в середине такта Tw независимо от того, является ли следующий такт Tw или Т3. Он проверяется на низкий логический уровень в момент перехода сигнала генератора CLK от 1 к 0 в конце такта Т2 и на высокий логический Уровень по переходу сигнала генератора CLK от 0 к 1 в середине такта Tw.
К временным параметрам входного сигнала READY микропроцессоров 8086/8088 предъявляются достаточно жесткие требования.
Временная диаграмма (рис. 9.13) показывает сигнал READY в цикле шины с применением одного такта ожидания Tw относительно импульсов CLK тактового генератора. Требование к синхронизации сигнала READY для данной операции выпол-
432
Гпава 9
няется внутренней схемой генератора синхронизирующих импульсов 8284А. При использовании синхрогенератора 8284А для формирования сигнала READY проверка хходных сигналов на выводах RDY1—RDY2 этого генератора происходит в конце кажюго такта Т.
Рис. 9.13. Временная диаграмма входного сигнала READY для микропроцессоров 8086/8088
RDY и 8284А
Сигнал RDY — это синхронизируемый входной сигнал готовности для генератора синхроимпульсов 8284А. Временная диаграмма для этого сигнала представлена на рис9.14. Хотя она и отличается от временной диаграммы для сигнала READY, тем не менее, внутренняя схема 8284А гарантирует точность синхронизации, предусмотренной для микропроцессоров 8086/8088.
CLK
READY
Рис. 9.14. Временная диаграмма синхронизации входного сигнала RDY генератора 8284А
Наэис. 9.15 вновь показана внутренняя структура синхрогенератора 8284А. Нижняя ее вдеть представляет схему синхронизации входных сигналов готовности RDY1 — RDY2 и формирования сигнала READY. В левой части схемы сигналы RDY1 и AEN1, так же как и сигналы RDY2 и AEN2, подключены к соответствующим логическим элементам “И". Выходные сигналы с этих элементов объединяются по схеме ’’ИЛИ” для возможности выполнения синхронизации по двум входам: RDY1 и RDY2. Для получения сигнала логической I на D-входе триггера FF1 активными долкны быть сигналы RDY1 и AEN1 или RDY2 и AEN2.
Входной сигнал на выводе ASYNC синхрогенератора 8284А управляет выбором типа синхронизации: при высоком логическом уровне сигнала осуществляется одноступенчатая синхронизация, а при низком — двухступенчатая синхронизация. Если выбрана одноступенчатая синхронизация, то сигнал RDY удерживается до следующего отрицательного фронта сигнала CLK задающего генератора, по которому триггер FF2 пропускает этот сигнал на вывод READY.
Спецификации аппаратных средств микропроцессоров 8086/8088
433
RES
Х1
Х2
F/C
EFI
CSYNC
RDY1
AEN1
RDY2
AEN2
ASYNC
Рис. 9.15. Внутренняя структура синхрогенератора 8284А
RDY1
AEN1
Сигнал CS от элементов памяти
8284А RDY2
Генератор синхронизирующих импульсов
CLK
READY
READY
CLK
Микропроцессор 8088 или 8086
RD > WR > INTA >
Ow 3W 4W 5W 6W 7W
Qa Qb Qc Qq Qe Qf Qg Qh
CLK
CLR
Регистр сдвига ‘164	SI
Направление сдвига (увеличение времени задержки)
Рис. 9.16. Схема для формирования от 0 до 7 тактов ожидания
434
Глава 9
При двухступенчатой синхронизации первый положительный фронт сигнала задающего генератора (перепад с 0 на 1) захватывает сигнал RDY в первом триггере FF1. Затем выходной сигнал этого триггера поступает на D-вход другого триггера FF2, который при следующем, но уже отрицательном фронте сигнала генератора CLK (перепаде с 1 на 0) фиксирует этот сигнал RDY, пропуская его на вывод READY.
Рис. 9.16 иллюстрирует принцип построения схемы, формирующей практически любое число тактов ожидания для микропроцессоров 8086/8088.
В данном случае здесь показан 8-разрядный сдвиговый регистр (74LS164), который смещает сигнал логической 1 на один или более тактов (периодов сигнала CLK) в зависимости от его выходных сигналов QA—QH. Далее эти сигналы, пройдя через переключатель, инвертор и логический элемент "ИЛИ", при условии, что сигнал выбора кристалла CS от элементов памяти имеет низкий логический уровень, поступают на вывод RDY1 генератора 8284А.
При соответствующей коммутации эта схема может обеспечить разное количество состояний ожидания. Обратите внимание на то, как осуществляется сброс сдвигового регистра по входу CLR. При сбросе регистра сдвига на его выводах QA—Qh появляется низкий уровень напряжения, в том случае если все три вывода RD, WR и INTA имеют высокий логический уровень.
Эти три сигнала сохраняют высокий уровень напряжения до такта Т2, поэтому первый сдвиговый импульс появляется на выводе QA, при первом же положительном фронте сигнала CLK такта Т2. Поэтому если требуется сдвиг, равный одному периоду тактового сигнала CLK, то с помощью переключателя выход QB подсоединяется
Рис. 9.17. Временная диаграмма генерации тактов ожидания для схемы, показанной на рис. 9.16
Спецификации аппаратных средств микропроцессоров 8086/8088
435
к инвертору и элементу "ИЛИ". Для задержки, равной двум периодам, подсоединяется выход Qc и т. д.
Следует заметить, что приведенная на рис. 9.16 схема не всегда генерирует состояния ожиданий. Фактически она происходит только в том случае, если сигнал выборки кристалла CS , поступающий от элементов памяти, требующих ввода тактов ожидания, имеет низкий логический уровень.
На рис. 9.17 показана временная диаграмма для генератора тактов ожидания со сдвиговым регистром 74LS164 для случая генерации лишь одного такта Tw, которое выбрано с помощью соответствующей коммутации. Временная диаграмма показывает также и некоторые другие выводы триггеров сдвигового регистра с тем, чтобы более детально представить его работу.
9.6. Сопоставление
минимального и максимального режимов работы микропроцессоров 8086/8088
Как уже ранее было сказано, микропроцессоры 80(86/8088 имеют два режима работы: минимальный и максимальный. Минимальный режим работы достигается за счет подсоединения вывода селекции режима MN/MX к источнику постоянного тока напряжением +5,0 В, а максимальный — за счет заземления этого вывода. Оба режима позволяют создавать разные управляющие структуры для микропроцессоров 8086/8088. Принцип работы при минимальном режиме аналогичен работе самого последнего 8-разрядного микропроцессора Intel 8085А. Максимальный режим работы является уникальным и используется при наличии в системе математического сопроцессора.
Следует отметить, что максимальный режим работы был изъят из семейства Intel, начиная с микропроцессора 80286.
Минимальный режим работы
Минимальный режим работы является самым дешевым при использовании микропроцессоров 8086/8088 (рис. 9.18). Он стоит меньше, поскольку все управляющие сигналы для памяти и устройств ввода-вывода генерируются микропроцессором. Эти сигналы управления идентичны сигналам предыдущего 8-разрядного микропроцессора Intel 8085А. Минимальный режим работы без особых затрат позволяет микропроцессорам 8086/8088 использовать 8-разрядные периферийные устройства 8085А.
Максимальный режим работы
Максимальный режим работы отличается от минимального режима тем, что управляющие сигналы должны генерироваться вне процессора. Для этого необходим дополнительный внешний шинный контроллер 8288 (рис. 9.19). Микропроцессоры 8086/8088 не имеют достаточного количества выводов для шины управления при работе в максимальном режиме. Максимальный режим работы используется только в том случае, когда в системе имеются внешние сопроцессоры, такие как арифметический сопроцессор 8087.
Рис. 9.18. Минимальный режим работы системы на микропроцессоре 8088
436	____________________________Гпава 9
GND
8284A Синхрогенератор
RES
RDY
CLK
READY
MN/MX s; s;
GND
S„ s;
□____
CLK MRDC
MWfC
AMWX — NC
RESET
S,
S,
DEN
8088 ЦП
DT/R
--- ALE
INTA
8288 inpc Контроллер шины iqwc
AIOWC
INT
STB
GND.
AD0 - AD, A-------------------1
л _ д , Шина адреса/данных
CE
8282 Защелка (1,2 или 3)
Шина адреса
Рис. 9.19. Максимальный режим работы системы на процессоре 8088
Шина данных
IRO - IR7
Спецификации аппаратных средств микропроцессоров 8086/8088________________437
438
Гпава 9
Шинный контроллер 8288
Для функционирования системы на базе 8086/8088 в максимальном режиме необходим шинный контроллер 8288 (рис. 9.20), который предназначен для формирования управляющих сигналов, отсутствующих в микропроцессоре 8086/8088 для этого режима.
Следует отметить, что шина управления, разработанная на основе шинного контроллера 8288, содержит отдельные сигналы для устройств ввода-вывода (IORC и IOWC) и памяти ( MRDC и MWTC). Она содержит стробы записи для усовершенствованного запоминающего устройства (AMWC) и устройств ввода-вывода (AIOWC), а также сигнал подтверждения аппаратного прерывания (INTA). Эти сигналы заменяют сигналы минимального режима работы: ALE, WR, 10/М, DT/R, DEN и INTA, которые не сохранены в системе при функционировании микропроцессоров 8086/8088 в максимальном режиме работы.
Биты состояния процессора 8086
{CLK AEN SEN JOB
Vcc (+5 В)	GND
a)
iob C 1
CLK E 2 siC з
DT/R C
ALE c
AEN C MRDC C AMWC C
GND C
20
□ Vcc
19
18
17
8288
16
15
14
13
12
□ S2
□ MCE/PDEN
□	DEN
□	CEN
□	Inta
□	IORC
□	AIOWC
10
6)
5
6
8
9
Рис. 9.20. Шинный контроллер 8288: а) блок-схема и б) схема расположения выводов
Назначение выводов и сигналов
В перечне ниже дается описание каждого вывода шинного контроллера.
□	S2, S1 и S0
Выводы SO—S2 (Status) подсоединяются к одноименным выходным выводам состояния микропроцессора 8086/8088. Эти три входные сигнала дешифрируются, чтобы генерировать синхронизированные основные управляющие сигналы для системы.
□	CLK
Сигнал на выводе CLK (clock) обеспечивает внутреннюю синхронизацию и должен подсоединяться к одноименному выходному выводу CLK генератора синхронизирующих импульсов 8284А.
Спецификации аппаратных средств микропроцессоров 8086/8088
439
□	ALE
Сигнал разрешения адресной защелки ALE (address latch enable) используется для демультиплексирования шины адреса/данных. Подается защелки адреса.
□	DEN
Сигнал с вывода разрешения шины данных DEN (data bus enable) управляет буферными схемами двунаправленной шины данных в системе. Следует заметить, что этот выходной активный сигнал (с высоким уровнем) имеет противоположную полярность относительно сигнала DEN , который имеется в микропроцессоре при работе в минимальном режиме.
□	DT/R
Выходной сигнал DT/R (data transmit/receive) предназначен для управления направлением буферных схем двунаправленной шины адреса.
□	AEN
Входной сигнал разрешения адреса AEN (address enable) позволяет разблокировать сигналы управления запоминающего устройства.
□	CEN
Входной сигнал CEN (control enable) отпирает выходные управляющие выводы шинного контроллера 8288.
□	ЮВ
Входной сигнал ЮВ (I/O bus mode) выбирает режим работы между шиной входа-вывода I/O и шиной системы.
□	AIOWC
Выходной управляющий сигнал AIOWC (advanced I/O write control) предназначен для подачи его в устройства ввода-вывода для управления записью.
□	IOWC
Выходной управляющий сигнал 10WC (I/O write control) выдает на устройства ввода-вывода основной сигнал записи. Следует заметить, что в компьютерной системе этот сигнал часто называется как IOW .
□	IORC
Выходной управляющий сигнал IORC (I/O read control) подает на устройства ввода-вывода основной управляющий сигнал чтения. Следует заметить, что в компьютерной системе этот сигнал часто называется как IOR .
a amwc
Выходной управляющий сигнал AMWC (advanced memory write control) снабжает память сигналом записи.
о MWTC
Выходной управляющий сигнал MWTC (memory write control) подает в память стандартный основной управляющий сигнал записи. Следует заметить, что в компьютерной системе этот сигнал часто называется как MEMW .
440
Гпава 9
□	MRDC
Выходной управляющий сигнал MRDC (memory read control) подает в память основной управляющий сигнал записи. Следует заметить, что в компьютерной системе этот сигнал часто называется как MEMR .
□	INTA
Выходной управляющий сигнал INTA (interrupt acknowledge), указывающий на начало цикла подтверждения запроса аппаратного прерывания. Ответный сигнал на сигнал запроса прерывания, поступающего на соответствующий вывод INTR микропроцессора 8086/8088.
□	MCE/PDEN
Выходной сигнал MCE/PDEN (master cascade enable/peripheral data enable) выбирает каскадный режим работы контроллеров прерывания, если вывод ЮВ заземлен, и разрешает работу приемопередатчиков шины ввода-вывода, если сигнал на выводе ЮВ имеет высокий уровень.
Итоги
□	Основными отличиями микропроцессоров 8086 и 8088 являются:
а)	восьмиразрядная шина данных в процессоре 8088 и шестнадцатиразрядная шина данных в 8086;
б)	вывод SSO в процессоре 8088 вместо BHE/S7 в 8086;
в)	вывод Ю/М процессора 8088 соответствует М/Ю для 8086.
□	Оба микропроцессора 8086 и 8088 нуждаются в питании от источника постоянного тока напряжением +5,0 В с допуском ±10%.
□	Микропроцессоры 8086/8088 совместимы со схемами TTL, при условии, что величина помехоустойчивости снижается до уровня 350 мВ, когда обычно используется — 400 мВ.
□	К микропроцессорам 8086/8088 могут подключаться следующие нагрузки: один элемент 74ХХ, пять 74LSXX, один 74SXX, десять 74ALXX или 74НСХХ удельных нагрузок.
□	Генератор синхронизирующих импульсов обеспечивает системную синхронизацию (CLK), синхронизацию сигналов готовности READY и начального сброса RESET.
□	Стандартная рабочая частота микропроцессоров 8086/8088 в 5 МГц достигается за счет подключения кварцевого резонатора в 15 МГц к генератору синхронизирующих импульсов 8284А.
□	При возврате микропроцессоров 8086/8088 в исходное состояние при запрещении вывода запроса на прерывание программы выполнение программы начинается с ячейки памяти FFFFOH (FFFF: 0000).
Спецификации аппаратных средств микропроцессоров 8086/8088
441
П Поскольку шины микропроцессоров 8086/8088 мультепликсированы, а большая часть памяти и устройств ввода-вывода нет, то для взаимодействия с памятью или устройствами I/O, шины должны быть демультиплексированы 8-разрядной защелкой, синхронизирующий импульс которой формируется от сигнала ALE.
П В большой системе шины должны быть буферизированы, поскольку микропроцессоры 8086/8088 способны функционировать только с десятью удельными нагрузками, а большие системы часто имеют больше.
□	Процессы синхронизации шины очень важны для остальных глав по тексту. Цикл шины, состоящий из четырех периодов синхронизирующих импульсов CLK, является основным. Каждый цикл шины способен производить операции чтения или записи данных между микропроцессором и памятью или системой ввода-вывода.
□	Цикл шины разбивается на 4 периода сигнала CLK или, иначе, такта Т: такт Т| используется микропроцессором для передачи адреса в память или устройство ввода-вывода и сигнала ALE в регистры-защелки адреса, предназначенные для демультиплексирования шины адреса/данных; такт Т2 применяется для передачи данных в память для записи, проверки вывода готовности READY и активизирования сигналов управления RD (чтение) или WR (запись); такт Т3 предоставляет элементам памяти время для доступа к данным и разрешает передачу данных между микропроцессором и памятью или устройством ввода-вывода; такт Т4 предназначен собственно для фиксации данных.
□	Микропроцессоры 8086/8088 предоставляют памяти и устройствам ввода-вывода время в течение 460 нс для доступа к данным при работе с синхронизирующей частотой в 5 МГц.
□	Такты ожидания Tw растягивают цикл шины на один или более периодов сигнала синхронизации CLK, для того чтобы предоставить памяти и устройству ввода-вывода дополнительное время доступа к данным. Состояния ожидания организуют для микропроцессоров 8086/8088 с помощью управляющего входного сигнала READY. Выборка сигнала READY производится в конце такта Т2 или в течение периода Tw.
□	Минимальный режим работы аналогичен режиму работы микропроцессора Intel 8О85А, тогда как максимальный режим работы является дополнительным и специально разработан для работы с арифметическим сопроцессором 8087.
О Шинный контроллер 8288 используется в максимальном режиме работы, чтобы снабдить память и устройства ввода-вывода сигналами управления шины. Это сделано потому, что максимальный режим работы микропроцессоров 8086/8088 устраняет некоторые линии управляющих сигналов системы в пользу управляющих сигналов, предназначенных для сопроцессоров. Шинный контроллер 8288 как раз и формирует эти отсутствующие сигналы управления.
Контрольные вопросы и задания
L Составьте перечень отличии между микропроцессорами 8086/8088.
2.	Совместимы ли микропроцессоры 8086/8088 с TTL-схемами? Объясните свой ответ.
442
Гпава 9
3.	Какую нагрузочную способность по выходу имеют микропроцессоры 8086/8088 со следующими устройствами:
а)	74ХХ TTL
б)	74ALSXXX TTL
в)	74НСХХХ CMOS
4.	Какая информация появляется на мультиплексированной шине адреса/данных микропроцессора 8088 при активном сигнале ALE?
5.	Какое назначение битов состояний процессора S3 и S4?
6.	Какое состояние процессора обозначает низкий логический уровень сигнала на выводе RD микропроцессоров 8086/8088?
7.	Объясните назначение вывода TEST микропроцессоров 8086/8088 и команды WAIT.
8.	Охарактеризуйте сигнал, подаваемый на входной вывод CLK микропроцессоров 8086/8088.
9.	Какой устанавливается режим работы микропроцессоров 8086/8088 при заземлении их вывода MN/ MX ?
10.	Что обозначает выходной строб-сигнал WR микропроцессоров 8086/8088 в отношении их функционирования?
11.	Когда вывод ALE переходит в состояние высокого импеданса?
12.	В каком состоянии находятся микропроцессоры 8086/8088, если сигнал на выводе DT/R имеет высокий логический уровень?
13.	Что происходит в тот момент, когда входной сигнал на выводе HOLD микропроцессоров 8086/8088 устанавливается в высокий логический уровень?
14.	Какие три сигнала на соответствующих выводах микропроцессоров 8086/8088 дешифрируются для минимального режима работы, чтобы узнать, находится ли процессор в состоянии останова?
15.	Объясните назначение вывода LOCK микропроцессора.
16.	Какие состояния микропроцессоров 8086/8088 обозначают выводы QS1 и QS0?
17.	Какие три основные служебные сигналы формирует генератор синхронизирующих импульсов?
18.	Каков коэффициент деления генератора синхронизирующих импульсов, с которым он делит выходную частоту кварцевого резонатора?
19.	При подаче сигнала высокого уровня на вывод F/C 8284А кварцевый генератор блокируется. Куда в этом случае подается входной тактирующий сигнал?
20.	Если кварцевый генератор синхрогенератора 8284А работает на частоте 14 МГц, то выходной сигнал PCLK при этом имеет частоту_____МГц.
21.	Для того чтобы вернуть микропроцессоры 8086/8088 в исходное состояние, входной сигнал на выводе RES синхрогенератора 8284А должен иметь логический уровень.
22.	Какие мультиплексированные шины микропроцессора 8086 обычно разделяются?
23.	Какие мультиплексированные шины микропроцессора 8088 обычно разделяются?
24.	Какая интегральная TTL-схема часто используется для демультиплексирования шин на микропроцессорах 8086/8088?
25.	Какое назначение имеет сигнал ВНЕ на микропроцессоре 8086 после демультиплексирования шины?
26.	Почему часто необходимо применение буферных схем в системах на базе микропроцессоров 8086/8088?
Спецификации аппаратных средств микропроцессоров 8086/8088 443
27.	Какой сигнал микропроцессоров 8086/8088 используется для выбора направления потока данных в двунаправленном шинном буфере 74LS245?
28.	Цикл шины равен_____периодам сигнала синхронизации CLK.
29.	Какую продолжительность составляет один цикл шины, если частота сигнала на выводе CLK микропроцессоров 8086/8088 составляет 4 МГц?
30.	Какие две основные операции микропроцессоров 8086/8088 выполняются в течение цикла шины?
31.	Какое количество команд (MIPS) способны выполнить микропроцессоры 8086/8088 при работе с частотой синхронизации 10 МГц?
32.	Кратко охарактеризуйте назначение каждого перечисленного такта Т цикла шины процессора:
а)	Т,
б)	Т2
в)	Т3
г)	Т4
33.	Сколько времени предоставляется для доступа к памяти при работе микропроцессоров 8086/8088 с частотой синхронизации 5 МГц?
34.	Какая длительность импульса сигнала DEN при работе микропроцессора 8088 с частотой синхронизации 5 МГц?
35.	При заземленном выводе READY в шину цикла микропроцессоров 8086/8088 вводятся такты.
36.	Каково назначение вывода ASYNC синхрогенератора 8284А?
37.	Какие уровни должны иметь сигналы, подаваемые на выводы AEN1 и RDY, чтобы на выводе READY получить сигнал высокого уровня? В этом случае следует предположить, что сигнал на выводе AEN2 синхрогенератора 8284А имеет высокий логический уровень.
38.	Сравните минимальный и максимальный режимы работы микропроцессоров 8086/8088.
39.	Какую функцию выполняет шинный контроллер 8288 при работе микропроцессоров 8086/8088 в максимальном режиме?
ГЛАВА 1 О
Интерфейс памяти
Введение
Каждая система на базе микропроцессора (простая или сложная) имеет запоминающую систему. Семейство микропроцессоров Intel не отличается от какого-либо другого семейства в этом плане.
Почти все системы содержат два основных типа памяти: постоянное запоминающее устройство (ПЗУ) и оперативное запоминающее устройство (ОЗУ). ПЗУ содержит системное программное обеспечение и постоянные системные данные, а ОЗУ предназначено для хранения временных данных и прикладного программного обеспечения. В этой главе проанализирован интерфейс обоих типов памяти для микропроцессоров семейства Intel. В этой главе рассмотрено взаимодействие памяти с 8-, 16-и 32-разрядной шиной данных с использованием различных шин адреса. Все это, практически, позволяет соединять любой микропроцессор с любой системой памяти.
Темы главы
После завершения ознакомления с этой главой вы сможете:
П дешифрировать адрес памяти и использовать выходы дешифратора для выбора различных элементов памяти;
П использовать программируемые логические устройства (ПЛУ) для дешифрирования адресов памяти;
П объяснить, каким образом подключать ПЗУ и ОЗУ к микропроцессору;
П уяснить каким образом с помощью контроля по четности определять ошибки памяти;
П понять взаимодействие памяти с 8-, 16-, 32- и 64-разрядной шиной данных;
П объяснить функционирование контроллера динамической памяти;
П осуществить подключение динамической памяти к микропроцессору.
10.1.	Запоминающие устройства
Прежде чем пытаться осуществить подключение памяти к микропроцессору, важно до конца понять функционирование элементов памяти. В этой главе рассмотрены функции четырех общих типов памяти:
Интерфейс памяти
445
П постоянного запоминающего устройства (ПЗУ) или по-английски ROM (readonly memory);
□	флэш-памяти (электрически стираемой программируемой ПЗУ — EEPROM;
□	статического ОЗУ (SRAM — Static Random Access Memory);
□	динамического ОЗУ (DRAM — Dynamic Random Access Memory).
Выводы элементов памяти
Общими выводами всех элементов запоминающих устройств являются: выводы входных линий адреса, выводы ввода-вывода данных, некоторый селекционный вывод и не менее одного управляющего вывода, используемого для операций считывания или записи (рис. 10.1).
Выводы адреса
An
CS
l/O0 1/О1 1/О2
WE
ОЕ
Линии вывода (О) или ввода-вывода (I/O) данных
Сигнал записи
Сигнал	Сигнал
выбора	чтения
кристалла
Рис. 10.1. Некий обобщенный элемент псевдопамяти, соответствующий как ПЗУ, так и ОЗУ с соединениями адреса, данных и управления
Выводы адреса
Все элементы запоминающих устройств (ЗУ) имеют выводы, на которые поступает идрес и которые предназначены для выбора определенной ячейки памяти в ЗУ. Выводы адреса почти всегда обозначаются от АО (наименьшего значащего входа адреса) Д° Ап, где индекс п может иметь любое числовое значение, но всегда обозначает на одно число меньше, чем общее количество выводов адреса. Например, ЗУ с Ю вы
446
Глава 10
водами адреса имеет обозначения выводов адреса от АО до А9. Количество выводов адреса на элементе ЗУ определяется количеством его ячеек памяти.
Большинство современных элементов ЗУ имеет емкость памяти от I Кбита (1024) до 64 Мбит (67 108 864), а в перспективе — до 256 Мбайт1. ЗУ на 1 Кбит имеют 10 выводов адреса (АО—А9), поскольку для выбора одной ячейки памяти из 1024 требуется 10 разрядов адреса (210 = 1024). Если же элемент ЗУ имеет 11 выводов адреса (АО—А10), то в нем имеется 2048 ячеек памяти (2 Кбит). Следовательно, количество ячеек памяти можно экстраполировать из числа выводов адреса. Например, ЗУ на 4 Кбита имеет 12 выводов адреса, ЗУ на 8 Кбит — 13 и т. д. Для ЗУ емкостью в 1 Мбит требуется 20-разрядный адрес (АО—А19).
Шестнадцатеричный адрес 400Н может представлять секцию системы памяти в 1 Кбайт. Если ЗУ емкостью в 1К2 дешифрируется, начиная с адреса 10000Н, то его последняя ячейка будет находиться по адресу 103FFH, т. е. адресу, равному начальному адресу плюс 400Н без единицы. Другим важным для запоминания шестнадцатеричным числом является 1000Н, поскольку 1000Н соответствует 4К. ЗУ с начальным адресом 14000Н и емкостью в 4 Кбайта заканчивается адресом ячейки 14FFFH, т. е. начальный адрес плюс 1000Н минус единица. Третьим часто используемым числом является 64К или, иначе, 10000Н. Память, начинающаяся с адреса 30000Н и заканчивающаяся адресом 3FFFFH это память на 64 Кбайт. Наконец, поскольку память в 1 Мбайт является общедоступной в реальном режиме работы микропроцессора, то такая память содержит 100000Н ячеек, с последним адресом 9FFFFH.
Выводы данных
Все элементы ЗУ имеют набор выводов, предназначенный для вывода (О) или ввода-вывода (I/O) данных. Устройство памяти, представленное на рис. 10.1, так же располагает общим набором выводов для ввода-вывода данных. В настоящее время многие ЗУ имеют двунаправленные выводы данных: для ввода данных при операциях записи и вывода при чтении. Выводы данных элементов ЗУ на графических схемах обозначаются как DO—D7 для 8-разрядной организации памяти.
В приведенном здесь в качестве примера ЗУ имеется N выводов ввода-вывода данных. Это означает, что ЗУ хранит N разрядов данных в каждой ячейке памяти. ЗУ с 8-разрядной организацией памяти часто называют элементами с байтовой организацией. Несмотря на то, что большинство существующих сейчас элементов обладают 8-разрядной организацией, некоторые ЗУ имеют 16-, 4-, или даже одноразрядную организацию памяти.
В прайс-листах на элементы ЗУ часто приводится такой параметр, как общее количество ячеек памяти на объем одной ячейки.
Например, элементы ЗУ емкостью в 1К и 8 битами в каждой ячейке часто обозначается производителем как 1К х 8. Элементы ЗУ 16К х 1 имеют 16К 1-разрядных ячеек памяти. ЗУ часто классифицируются в соответствии с общей емкостью в битах или байтах. Например, ЗУ в 1К х 8 иногда обозначается как ЗУ на 8 Кбит либо
1 Современные микросхемы памяти имеют емкость до 1 Гбит. — Ред.
2 Приставка К в вычислительной технике приблизительно соответствует обычному представлению
для десятичной системы счисления I03 = 1000, а именно 1024 = 210. — Ред.
Интерфейс памяти
447
1 Кбайт, а ЗУ в 64К х 4 - как ЗУ на 256 Кбит. Такие отклонения случаются у разных производителей,
Выводы выбора
Каждый отдельный элемент ЗУ имеет вывод (иногда даже более одного) для входного сигнала, с помощью которого этот элемент выбирается или разрешается его работа. Такой тип вывода очень часто называется выбором кристалла CS (chip select), разрешением выборки кристалла СЕ (chip enable) или просто выводом выборки S (select). Элементы ОЗУ обычно имеют не менее одного входа CS или S , а ПЗУ — не менее одного СЕ . При активном сигнале на выводе СЕ , CS или S (или иначе низком логическом уровне сигнала) элемент ЗУ выполняет операцию считывания или записи, в зависимости от управляющих сигналов. При пассивном сигнале на этом выводе выбора (иначе при высоком уровне сигнала) элемент не может производить считывание или запись, поскольку он отключается или запрещается его работа. Если же имеется более одного подобного вывода, то все они должны быть активизированы для возможности выполнения операций чтения или записи данных.
Управляющие выводы
Все элементы ЗУ имеют несколько видов управляющих выводов. Элемент ПЗУ обычно имеет только один управляющий вход, тогда как элемент ОЗУ — один или два управляющих входа. Очень часто управляющий вывод ПЗУ разрешения выходов ОЕ (output enable) или разрешения работы схемы G (gate) позволяет данным появляться на информационных выводах элемента памяти. В том случае, если сигналы на выводах ОЕ и CS активны, выходы данных разрешены. Если же сигнал на выводе ОЕ пассивен, то выходы данных выключены и находятся в состоянии высокого импеданса. Сигнал ОЕ разрешает и запрещает ряд встроенных буферных схем состояния, находящихся в элементе ЗУ, и должен быть активным для считывания данных.
Элемент памяти ОЗУ имеет один или два управляющих входа. Если имеется только один управляющий вход, то он часто обозначается R/W (чтение/запись). С помощью сигнала, поступающего на этот вывод, осуществляется выбор операции чтения или записи, но только в том случае, если активен сигнал CS . Если же элемент ОЗУ имеет два управляющих вывода, то они обычно обозначаются WE (или W ) и ОЕ (или G ). Для данного примера (см. рис. 10,1) вход WE (write enable — разре-шение записи) должен быть активным при записи в память, а сигнал на выводе ОЕ должен быть активным при выполнении операции чтения. При наличии двух управляющих выводов (WE и ОЕ) они ни в коем случае не должны быть активными одновременно. Если же оба сигнала на этих управляющих выводах, напротив, неактивны, то данные не записываются и не считываются, а линии выводов данных элемента памяти находятся в состоянии высокого импеданса.
ПЗУ
ПЗУ (постоянное запоминающее устройство) или, иначе, по-английски ROM (readonly memory) постоянно хранит программы и данные, которые являются резидент-
448
Глава 10
ними для системы и не должны изменяться при отключении питания. ПЗУ программируется раз и навсегда, так, чтобы всегда имелись данные даже при отключении питания. Данный тип памяти часто называют энергонезависимой памятью (nonvolatile memory). В настоящее время имеется много разновидностей ПЗУ. Устройство, которое названо как ПЗУ или, иначе, как масочное ЗУ, закупается в массовых количествах у производителя и программируется при его изготовлении на заводе с помощью шаблона (маски). ПЗУ типа EPROM (erasable programmable read-only memory — репрограммируемое постоянное запоминающее устройство с ультрафиолетовым стиранием (РПЗУ-УФ)) используется при необходимости достаточно частого изменения программного обеспечения. Чтобы применение новых ПЗУ было экономически выгодным, необходимо заказывать их в количестве не менее 10000 устройств в целях компенсации заводских затрат по программированию. РПЗУ-УФ же программируются самим пользователем на сравнительно недорогом устройстве, называемом программатором. Записанную информацию при необходимости можно стиреть при воздействии высокоинтенсивного ультрафиолетового излучения (УФ-излучения) в течение 20 или менее минут в зависимости от типа РПЗУ.
Кроме ПЗУ и РПЗУ имеются также и однократно программируемые постоянно запоминающие устройства (ППЗУ), иначе PROM (programmable read-only memory). ППЗУ так же, как и РПЗУ, могут программироваться пользователем на программаторе, но за счет пережигания специальных очень маленьких плавких перемычек из нихрома или диоксида кремния. Однако после одного программирования таких элементов памяти, информацию уже невозможно удалить или перезаписать.
Еще один новый тип RMM (read-mostly memory — полупостоянное ЗУ) называется флэш-памятью (flash memory). Элементы флэш-памяти3 часто называют репрограм-мируемыми ПЗУ с электрическим стиранием (РПЗУ-ЭС) или EEPROM (electrically erasable programmable ROM) либо иначе энергонезависимыми ПЗУ (nonvolatile ROM). Информация в этих ЗУ стирается электрически, но им для стирания данных требуется больше времени, чем для обычных элементов ОЗУ. Флэш-память, например, используется для хранения настраиваемой информации видео-плат. В настоящее время во многих компьютерных системах элементы флэш-памяти полностью заменили ПЗУ и РПЗУ-УФ, используемые для хранения базовой системы ввода-вывода — BIOS (Basic Input/Output System).
Рис. 10.2 иллюстрирует EPROM типа 2716, представляющее наиболее характерное репрограммируемое устройство. Данное ЗУ имеет 11 адресных выводов и восемь выводов данных (табл. 10.1). EPROM типа 2716 является ПЗУ емкостью в 16 Кбит с организацией 2К х 8. Серия 27ХХХ РПЗУ-УФ (EPROM) включает следующие разновидности микросхем: 2704 (512 х 8), 2708 (1К х 8), 2716 (2К х 8), 2732 (4К х 8), 2764 (8К х 8), 27128 (16К х 8), 27256 (32К х 8), 27512 (64К х 8) и 271024 (128К х 8). Каждый компонент имеет выводы адреса, 8 выводов данных, один или более выводов разрешения выбора кристалла (СЕ ) и вывод разрешения выходов данных (ОЕ). На рис. 10.3 представлена временная диаграмма для режима чтения микросхемы РПЗУ-УФ (EPROM) типа 2716. Все режимы работы микросхемы представлены в табл. 10.2. Данные поступают на линии выводов данных только после того, как на обоих управляющих выводах СЕ и ОЕ имеется логический уровень 0. Если на этих
3 Флэш-память является зарегистрированным торговым знаком корпорации Intel.
Интерфейс памяти
449
выводах нет нулевого логического уровня, то информационные выводы О0—О7 находятся в состоянии высокого импеданса или отключены.
А7Е 1
А6Е 2
А5Е 3
Аз С 5
А2С 6
Ao С ОоС 9
Oi Е 10
02С 11
GND С 12
24 ZJVcc
23 0А8
22 DAg
21 ZJVpp
20 ОбЁ
19 ZJAiO
18 □ СЕ/PGM
17 JO/
16 ЗОб
15 2)05
14 ZJO4
13 ЗОз
а)
Линии данных
VCC°------”	О0-О7
8
б)
Рис. 10.2. Расположение выводов микросхемы РПЗУ-УФ (EPROM) типа 2716 емкостью 2К х 8 (а) и ее блок-схема (б)
Таблица 10.1. Выводы РПЗУ-УФ (EPROM) типа 2716
Вывод	Назначение
Ао—Аю	Линии адреса (addresses)
СЕ /PGM Разрешение выбора кристалла/программирование (chip enable/program)
ОЕ	Разрешение выводов данных (output enable)
Оо—О?	Линии вывода данных (outputs)
Следует заметить, что на вывод VPP от источника постоянного тока должно быть подано напряжение +5 В при считывании данных из памяти. В некоторых микросхемах EPROM вывод VPP аналогичен выводу разрешения записи WE для элемента статической памяти SRAM. Примером могут быть EPROM типа 27256 и элемент статической памяти SRAM типа 62256. Оба ЗУ с организацией 32К х 8 имеют оди-наковые выходные выводы, за исключением вывода VPP на EPROM и вывода WEhb Микросхеме статической памяти.
Важной информацией, представленной на временной диаграмме (рис. 10.3) и справочном материале (см. табл. 10.3), является время доступа к памяти — время, необходимое для считывания информации из памяти. На временной диаграмме показано, что время доступа к памяти (tACC) измеряется от появления адреса на адресных входах элемента EPROM до появления данных на выходных выводах. Это основано на предположении, что в то время как адрес поступит на адресные выводы и станет
15 Зак 384
450
Глава 10
стабильным, сигнал на выводе СЕ будет иметь низкий логический уровень. Кроме того, сигнал ОЕ также должен иметь низкий логический уровень, для того чтобы активизировать выводы данных. Время доступа к данным для микросхемы РПЗУ-УФ (EPROM) типа 2716 составляет 450 нс. Следует напомнить, что для микропроцессоров 8086/8088 с частотой синхронизации в 5 МГц доступ к данным при работе с памятью осуществляется в течение 460 нс. При работе микропроцессоров 8086/8088 с данным типом запоминающего устройства необходимы дополнительные такты ожиданий, чтобы надежно функционировать из-за его достаточно продолжительного времени доступа. Если же состояния ожиданий не желательны, то необходимы более высокоскоростные версии микросхем EPROM. Сегодня имеются EPROM со временем доступа менее чем 100 нс.
Рис. 10.3. Временная диаграмма для режима чтения РПЗУ-УФ (EPROM) типа 2716
Таблица 10.2. Выбор режима работы РПЗУ-УФ (EPROM) типа 2716
Режим	Состояние выводов				
	СЕ /PGM	ОЕ	Vpp	Vcc	Oo—O?
Чтение	V|L	Vii	+5	+5	Выходные данные
Запрет вывода данных	Безразлично	Vih	+5	+5	Высокое сопротивление
Выключение	Vih	Безразлично	+5	+5	Высокое сопротивление
Программирование	Импульс с V|L на Vih	Vih	+25	+5	Входные данные
Проверка программирования	VIL	VlL	+25	+5	Выходные данные
Запрет программирования	V|L	Vih	+25	+5	Высокое сопротивление
Интерфейс памяти
451
Таблица 10.3. Временные характеристики микросхемы РПЗУ-УФ (EPROM) типа 2716
Условия теста:
ТА = 0—70 °C, Vcc = +5 В ±5%, Vpp = Vcc ±0,6 В
Выходная нагрузка: 1 TTL микросхема и CL = 100 пф
фронты сигналов: < 20 нс
уровни сигналов: от 0,8 до 2,2 В
Обозначение	Характеристика	Установленные пределы (нс)		Условия теста
		Мин.	Макс.	
tACC	Задержка от момента установки действительного адреса до получения данных (время доступа к данным)		450	СЁ = ОЁ = V|L
tCE	Задержка от активизации сигнала СЕ до получения данных		450	ОЁ = Х/ц
t0E	Задержка от активизации сигнала ОЕ до получения данных		120	ce = v!L
tDF	Задержка от момента сброса сигнала ОЕ до перевода выводов данных в состояние высокого импеданса	0	100	СЁ = Vil
ton	Задержка от момента снятия адреса до перевода выводов данных в состояние высокого импеданса	0		СЁ = ОЁ = Vil
Статическая память
Статические элементы памяти сохраняют данные в течение всего периода времени подачи питания от источника постоянного тока. Так как для сохранения данных в этих устройствах ничего, кроме наличия питания не требуется, они называются статическими, а память, построенная на них — статической памятью (static memory). Такая память также называется энергозависимой памятью (volatile memory), поскольку она не сохраняет данные при отсутствии питания. Основное отличие между элементами ПЗУ и элементами с произвольной выборкой (RAM) состоит в том, что ПЗУ программируется вне компьютера и обычно осуществляется только их считывание, в то время как элементы RAM предназначены именно для оперативной записи и чтения информации. Статические элементы памяти (SRAM) предназначены для чтения и записи в основном временно сохраняемых в системе данных. Наряду с их более высоким быстродействием в сравнении с элементами динамической памяти, они существенно дороже. Поэтому-то элементы SRAM используются только при построении памяти относительно малой емкости. Сегодня малый объем памяти считается менее 1 Мбайта.
На рис. 10.4 и табл. 10.4 показаны выводы микросхемы SRAM типа 4016 со структурой 2К х 8. Данное ЗУ имеет 11 адресных выводов и восемь выводов данных, предназначенных для ввода-вывода. Оно представляет собой устройство, характерное для
452
Глава 10
всех типов статических элементов памяти, за исключением отличия в количестве адресных и информационных выводов.
A7dl ^24^ V(
A6[
A5[
A4C АЗ Г
A2C
АО С DQ1 £ DQ2[ DQ3E vssC
23
22
21
20
19
18
17
16
15
14
сс l ]А8 : JA9 I ]w
Зё ]аю
Js ]DQ8 JdQ7 ]DQ6 ]DQ5
5
6
8
9
10
11
12 13ПОО4
2 з
Рис. 10.4. Выводы микросхемы SRAM типа TMS4016 емкостью 2Кбайт производства Texas Instruments Incorporated
	Таблица 10.4. Назначение выводов микросхемы 8ЦАМ типа 4016
Вывод	Назначение
АО—А10	Адресные линии
DQ1—DQ8	Ввод-вывод данных
G	Разрешение выходов данных (output enable)
S	Выбор кристалла (chip select)
Vcc	Напряжение питания +5 В от источника постоянного тока
Vss	Земляной вывод (ground) от источника постоянного тока
W	Вывод разрешения записи (write enable)
Обозначение управляющих выводов данного элемента SRAM несколько отличается от выводов, представленных ранее. Вывод ОЕ обозначен как G , CS — как S , а вывод WE — как W . Несмотря на измененные обозначения, управляющие выводы функционируют точно так же, как и в рассмотренных прежде схемах. Другие производители представляют этот же популярный элемент SRAM под иными обозначениями типов: 2016 и 6116.
Рис. 10.5 отображает временные диаграммы, а табл. 10.5—10.7 — электрические и временные характеристики для элемента SRAM типа 4016. Временная диаграмма цикла чтения показывает, что время доступа составляет ta (А). Для самой медленной версии микросхемы SRAM типа 4016 это время составляет 250 нс. Несмотря на это, микросхема является довольно быстродействующей и позволяет использовать ее вместе с микропроцессорами 8086/8088, функционирующими с частотой 5 МГц, без добавления в цикл шины тактов ожидания. Еще раз следует напомнить, что для определения совместимости запоминающих элементов с микропроцессором следует знать время доступа к данным для этих элементов.
Интерфейс памяти
453
Адрес
G
S
DQ (вых)
а)
Примечание:
1.	CL = 100 пф для всех измерений за исключением tdls(W) и ten(W). Для параметров tdis(w) и ten(W) CL = 5 пф.
2.	Параметры tdis и ten приведены для примера и не проверены на все 100%. — ♦
3.	Сигнал W имеет высокий уровень при выполнении цикла чтения.
4.	Сигнал W должен быть высокого уровня на протяжении всех переключений адреса.
5.	Запись происходит на протяжении времени совпадения низких уровней для сигналов выбора кристаллов S и разрешения записи W .
6.	Параметр th(A) измерен начиная с момента сброса сигнала S или W до момента завершения цикла записи.
7.	В течение этого периода времени контакты ввода-вывода данных находятся в состоянии вывода данных, так что при этом входные сигналы не должны оказывать на них никакого влияния.
8.	Если переход сигнала S с высокого логического уровня в низкий происходит синхронно с аналогичным переходом сигнала W или после него, то выходы данных остаются в состоянии высокого импеданса.
9.	Сигнал разрешения выходов данных G постоянно находится в установленном состоянии, т. е. низком логическом уровне (G = V|L).
Рис. 10.5. Временные диаграммы для микросхемы статической памяти типа TSM4016: цикла чтения (см. примечание 3) (а), цикла записи номер 1 (см. примечание 4) (6)
454
Глава 10
lc(wr)

Адрес
S
W
DQ (вых)
DQ (вх)

(см	//////
---^N^i}-J	[ (см. Примечание 5) |
^и(О)Г-------J	]<-h(P)»|(CM. Примечание 10)
Примечание:
10.	Если сигнал S имеет низкий логический уровень на протяжении этого периода времени, то контакты ввода-вывода данных находятся в состоянии вывода, а входные сигналы при этом не должны оказывать на них никакого влияния.
11.	Измерения переходов сигналов выполнены на уровне ±200 мВ от установившихся напряжений.
12.	Если переход сигнала S с высокого логического уровня на низкий происходит после аналогичного перехода сигнала W , тогда входные сигналы не будут оказывать никакого влияния на длительность параметра tdis<w) после перехода сигнала W в низкий уровень.
Рис. 10.5. Временные диаграммы для микросхемы статической памяти типа TSM4016: цикла записи номер 2 (см. примечание 4 и 9) (в)
Таблица 10.5. Электрические характеристики SRAM типа TSM4016 при работе в рекомендуемом температурном режиме работы
Параметр	Обозначение	Условия проверки	Установленные пределы			Единицы
			Мин.	Тип.4	Макс.	
Voh	Высокий уровень напряжения	1он = — 1 мА; Vcc = 4,5 В	2,4			В
Vol	Низкий уровень напряжения	Iol = 2,1 мА; Vcc = 4,5 В			0,4	В
Ii	Входной ток	Vi = 0—5,5 В			10	мкА
loz	Ток при отключенных выводах данных	На S или G 2 В или на W 0,8 В; Vo = 0—5,5 В			10	мкА
Icc	Питающий ток при Vcc	Io = 0 мА; Vcc = 5,5 В; ТА = 0°С (в худшем случае)		40	70	мА
c.	Входная емкость	Vi = 0B f = 1 МГц			8	пф
4 Все типичные значения измерены при Vcc = 5 В, ТА = 25 °C.
Интерфейс памяти
455
Таблица 10.5 (окончание)
Параметр	Обозначение	Условия проверки	Установленные пределы			Единицы
			Мин.	Тип.5	Макс.	
Со	Выходная емкость	Vo = 0 В f= 1 МГц			12	пф
Таблица 10.6. Требования к временным параметрам в наносекундах для некоторых версий микросхемы TMS4016 при рекомендуемом питании и температурном режиме
Параметр	Обозначение	TMS4016-12		TMS4016-20		TMS4016-25	
		Мин.	Макс.	Мин.	Макс.	Мин.	Макс.
tc(rd)	Время цикла чтения	120		200		250	
tc(wr)	Время цикла записи	120		200		250	
U(W)	Длительность импульса сигнала записи	60		100		120	
tsu'A)	Время установки адреса	20		20		20	
tsu(S)	Длительность установленного сигнала выбора кристалла	60		100		120	
tsu(D)	Время установки данных	50		80		100	
th(A)	Время фиксации адреса	0		0		0	
th(D)	Время фиксации данных	5		10		10	
Таблица 10.7. Временные характеристики переключения в наносекундах для некоторых версий микросхемы TMS4016 при рекомендуемом питании и Та = 0—70 °C
Параметр	Обозначение	TMS4016-12		TMS4016-20		TMS4016-25	
		Мин.	Макс.	Мин.	Макс.	Мин.	Макс.
ta(A)	Время до момента доступа к данным от момента установки адреса		120		200		250
ta(S)	Время до момента доступа к данным от момента активизации сигнала выбора кристалла		60		100		120
U(G)	Время до момента доступа к данным от момента активизации сигнала разрешения выходов данных		50		80		100
*v(A)	Время действительных данных после снятия адреса	10		15		15	
Все типичные значения измерены при Vcc = 5 В, ТА = 25 °C.
456
Глава Ю
Таблица 10.7 (окончание)
Параметр	Обозначение	TMS4016-12		TMS4016-20		TMS4016-25	
		Мин.	Макс.	Мин.	Макс.	Мин.	Макс.
tdis(S)	Время до запрещения данных после снятия сигнала выбора кристалла		40		60		80
tdis(G)	Время до запрещения данных после снятия сигнала разрешения выходов данных		40		60		80
tdis(W)	Время до запрещения данных после установки сигнала разрешения записи		50		60		80
ten(S)	Время до разрешения данных после установки сигнала выбора кристалла	5		10		10	
ten(G)	Время до разрешения данных после установки сигнала разрешения выходов данных	5		10		10	
ten(W)	Время до разрешения данных после снятия сигнала разрешения записи	5		10		10	
На рис. I0.6 показано расположение, а в табл. I0.8 приведено назначение выводов для микросхемы SRAM типа 62256 с организацией памяти 32К х 8. Данное ЗУ находится в корпусе с 28 выводами и имеет значение времени доступа к данным 120 или I50 нс. Другие статические элементы памяти с организацией 8 К х 8, 128К х 8 и 256К х 8 имеют время доступа до Ю нс и предназначены в основном для использования в компьютерных системах в качестве кэш-памяти.
А14 С	1	\	У 28	Z) Усс
А,2 С	2	27	□ WE
а? С	3	26	□ А,3
As Z	4	25	Z А8
а5 С	5	24	Z Ад
А4 С	6	23	Z А„
а3 с	7	22	Z ОЕ
а2 С	8	21	Z Ajo
А, С	9	20	□ CS
Ao С	10	19	ZI ю7
юо С	11	18	ZI Ю6
IO, EZ	12	17	Z ю5
1О2 С	13	16	Z Ю4
GND С	14	15	Z IO3
Рис. 10.6. Схема расположения выводов статического элемента памяти типа 62256 с организацией 32К х 8
Интерфейс памяти		457
Таблица 10.8. Назначение выводов микросхемы SRAM типа 62256		
Вывод	Назначение	
До—А14	Адресные линии	
Юо—Ю?	Ввод-вывод данных	
ОЁ	Разрешение выходов данных (output enable)	
CS	Выбор кристалла (chip select)	
WE	Вывод разрешения записи (write enable)	
Vcc	'ч	Напряжение питания +5 В от источника постоянного тока	
GND	Земляной вывод (ground) от источника постоянного тока	
Динамическая память
Самая большая по емкости микросхема SRAM в настоящее время составляет 128 Кбайт6 с организацией 128К х 8. Существующие микросхемы динамической памяти (DRAM) (dynamic memory) имеют емкость памяти до 64 Мбит7. Во многих отношениях динамические элементы памяти схожи со статическими, за исключением принципа организации запоминающей ячейки. Запоминающими элементами для статической памяти являются триггеры, а для динамической памяти емкость. Поскольку конденсатор со временем, из-за токов утечки, неизбежно теряет свой заряд, то данные на интегральном конденсаторе удерживаются только в течение 2 или 4 мс. Для того чтобы устранить потерю информации по истечении этого времени, содержимое динамического элемента памяти должно быть полностью перезаписано, обновлено или, иначе, регенерировано (refresh). Производитель микросхемы DRAM вместо требуемой и почти невозможной задачи считывания содержимого каждой ячейки памяти и ее перезаписи, сконструировал отличную от SRAM внутреннюю структуру. Все содержимое памяти в DRAM обновляется построчно с интервалом 2 или 4 мс. Обновление содержимого происходит также при записи, считывании и во время специального цикла регенерации. Более подробно информация по регенерации DRAM представлена в разд. 10.7.
Другой недостаток элементов DRAM состоит в том, что для них требуется большое количество адресных выводов, поэтому производители микросхем решили мультиплексировать адресные входы. На рис. 10.7 показано расположение, а в табл. 10.9 — назначение выводов микросхемы DRAM типа TMS4464 с организацией 64К х 4 и емкостью 256 Кбит данных.
Следует отметить, что эта микросхема имеет только восемь адресных входов, вместо 16, необходимых для адресации 64К ячеек памяти. Единственный способ для получения 16-разрядного адреса с помощью только лишь 8-разрядных адресных выводов
6 В настоящее время емкость современных микросхем SRAM составляет до 36 Мбит, а время доступа менее 5 нс. — Ред.
7 Емкость современных микросхем DRAM составляет 256 Мбит при времени доступа до 25 нс. — Ред.
458
Гпава Ю
состоит в двух этапах приращения адреса. Для выполнения этой операции в микросхеме используются два специальных вывода: CAS (column address strobe) строб адреса столбца и RAS (row address strobe) строб адреса строки. Вначале, восемь младших разрядов АО—А7 шестнадцатиразрядного адреса размещаются на адресных выводах микросхемы и по стробу RAS записываются во внутреннюю защелку строки в качестве адреса. Затем, восемь старших разрядов А8—А15 шестнадцатиразрядного адреса размешаются на тех же самых адресных выводах и по стробу CAS записываются во внутреннюю защелку столбца матрицы памяти в качестве адреса (рис. 10.8). В результате этого полученный 16-разрядный адрес, удерживаемый во внутренних защелках, адресует содержимое одной 4-разрядной ячейки памяти. Следует отметить, что строб CAS также выполняет функцию выборки данных из ячейки матрицы памяти микросхемы DRAM.
GE DQ1 Е DQ2 Е W Е RAS Е Аб Е а5е а4е Vdd Е
1	18
2	17
3	16
4	15
5	14
6	13
7	12
8	11
9	10
vss
DQ4 CAS DQ3 Aq Ai A2 Аз
A7
Рис. 10.7. Выходы микросхемы DRAM типа TMS4464 с организацией 64К х 4
Таблица 10.9. Назначение выводов микросхемы DRAM типа TMS4464
Вывод	Назначение
Ао—А?	Адресные линии (address)
DQi—DQ4	Ввод-вывод данных
CAS	Строб адреса столбца (column address strobe)
G	Разрешение выходов данных (output enable)
RAS	Строб адреса строки (row address strobe)
W	Вывод разрешения записи (write enable)
Vdd	Напряжение питания +5 В от источника постоянного тока
Vss	Земляной вывод (ground) от источника постоянного тока
На рис. 10.9 представлена схема, состоящая из двух мультиплексоров (multiplexer), обозначенных на схеме как MUX и использующихся для подачи 16-разрядного адреса на восемь адресных выводов Ао—А7 микросхемы DRAM типа TMS4464. Здесь сигнал RAS используется не только для стробирования адреса строки в микросхеме
^Г2рф_ейс памяти
459
pRAM, но также для выбора части 16-разрядного адреса и подачи ее на восемь ад-есных выводов микросхемы динамической памяти. Это возможно вследствие большого времени задержки на распространение сигнала в мультиплексорах. Когда сцгнал RAS имеет высокий логический уровень, входы В (адрес АО—А7) соединя-
ются с выходами У мультиплексоров; когда сигнал RAS переходит на низкий уровень, входы А (адрес А8—А15) соединяются с выходами Y. Поскольку внутренняя зашелка адреса строки микросхемы DRAM запускается фронтом сигнала, то она
захватывает адрес строки до того, как адрес на ее входах изменяется на адрес колонки.
RAS
*c(W)
CAS
А0-А7
Рис. 10.8. Временная диаграмма формирования 16-разрядного адреса в микросхеме TMS4464
А8 		 АО 		 А9 		 А1 		 А10 		 А2 		 А11 .	 АЗ 			1А MUX 1Y 1В гл	2у 2В ЗА	зу ЗВ 4А	4Y 4В S G			• Aq • А1 • А2 • А3
				
Г\Ао •				±
А12 		 А4 		 А13 •	 А5 .	 А14 .	 А6 		 А15 .	 А7 			4 Д	S G 1А	4у 1В мих 2А	2у 2В ЗА	зу ЗВ 4А	4Y 4В			а4 * А5  — Аб 		 а7
Рис. 10.9. Схема подключения 16-разрядной шины адреса к микросхеме DRAM типа TMS4464
460
Глава 10
Описание и сопряжение динамического ОЗУ более подробно приводятся в разд. 10.7.
По аналогии с микросхемой SRAM, вывод W в микросхеме DRAM используется для записи данных при его низком логическом уровне, но в нем, как правило, нет вывода разрешения выходов с обозначением G или ОЕ. Также отсутствует вывод выбора кристалла S (select) или CS (chip select). Ранее уже упоминалось, что функцию выборки данных из ячейки матрицы памяти микросхемы DRAM выполняет вывод CAS. Если же выбор уже осуществлен, то запись происходит при низком, а считывание при высоком уровне сигнала W
На рис. 10.10 показана схема расположения выводов, а в табл. 10.10 приведено их назначение для микросхемы DRAM типа 41256. Данное устройство с организацией памяти 256К х 1 имеет значение доступа к данным менее 70 нс.
Aj С	1	16	□ GND
Din С	2	15	□ CAS
WR С	3	14	□ Dout
RAS С	4	13	□ Ав
Ao С	5	12	□ А3
Aj С	6	11	□ А4
А, С	7	10	□ Ав
vcc С	8	9	□ а7
Рис. 10.10. Схема расположения выводов микросхемы DRAM типа 41256 с организацией 256К х 1
	Таблица 10.10. Назначение выводов микросхемы DRAM типа 41256
Вывод	Назначение
Ао—Ав	Адресные линии (address)
Din	Ввод данных (data in)
Dout	Вывод данных (data out)
CAS	Строб адреса столбца (column address strobe)
RAS	Строб адреса строки (row address strobe)
WR	Вывод разрешения записи (write enable)
Vcc	Напряжение питания +5 В от источника постоянного тока
GND	Земляной вывод (ground) от источника постоянного тока
В последнее время появились большие динамические ОЗУ с организацией памяти на 1М х 1, 4М х 1, 16М х 1 и 64М х 1. На стадии планирования (в перспективе) предусматривается память с организацией 1Г х 1.
Часто микросхемы DRAM размещаются на монтажных платах, называемых модулями SIMM (Single in-line Memory Modules, модули памяти с однорядным расположением
Интерфейс памяти 461
выводов). На рис. lO.ll показаны схемы расположения выводов для двух различных модулей SIMM. Модули на 30 выводов, как правило, имеют общую организацию ]М х 8 или 1М х 9 и 4М х 8 или 4М х 9 (на рис. 10.11, а показана память с организацией 4М х 9). Девятый бит является контрольным разрядом четности. Кроме того, также показан и более современный модуль SIMM на 72 вывода (рис. 10.11, б). Такие модули памяти часто имеют организацию 1М х 32 или 1М х 36 (с битами четности). Имеются также и другие модули: 2М х 32, 4М х 32, 8М х 32, 16 М х 32 и аналогичные, но в которых применяется разряд четности. На данном рисунке показан модуль SIMM с организацией 4М х 36, емкость памяти которого составляет 16 Мбайт.
В последнее время многие современные системы используют микропроцессоры Pentium—Pentium 4. Эти микропроцессоры имеют 64-разрядную шину данных, которая исключает использование приведенного здесь 8-разрядного 30-контактного модуля SIMM. Применение в них даже более современных 32-разрядных 72-контактных модулей SIMM является обременительным, поскольку для получения 64-разрядной шины данных они должны использоваться попарно.
В настоящее время стандартными для большинства систем являются 64-разрядные модули DIMM (Dual in-line Memory Modules, модули памяти с двухрядным расположением выводов). Имеются следующие распространенные модули DIMM с емкостью: 16 Мбайт (2М х 64), 32 Мбайта (4М х 64), 64 Мбайта (8М х 64) и 128 Мбайт (16М х 64)8.
Схема расположения выводов модуля DIMM приведена на рис. 10.12. Все размеры указаны в дюймах, а в скобках приведены размеры в миллиметрах. Модули DIMM изготовляли на различных элементах памяти: на обычных DRAM, EDO DRAM (extended data out DRAM, т. e. динамическое ЗУ с расширенным выводом данных) и наиболее современных SDRAM (synchronous dynamic RAM, синхронных динамических ЗУ) с применением или без микросхем EPROM. Микросхемы EPROM обеспечивали вычислительную систему информацией о емкости и быстродействии ЗУ для упрощения подключения модуля памяти к компьютеру (plug-and-play).
Новым пополнением на рынке ЗУ является модуль памяти RIMM корпорации RAMBUS. Модуль R1MM, как и модуль SDRAM, имеет двусторонний сигнальный интерфейс с общим числом 184 или 168 выводов. Внешне модуль R1MM напоминает модуль DIMM. Отличаются же они различной схемой расположения механических ключей и контактов. Кроме того, модули R1MM с двух сторон закрыты металлическим экраном, защищающим их от наводок и взаимного влияния соседних модулей, которые работают на достаточно больших частотах. Шина данных подсистемы Rambus составляет 16 или 32 разряда. Самым высокопроизводительным модулем в настоящее время является модуль SDRAM РС2400, который имеет пропускную способность 2,4 Гбайта/с9. Для сравнения, модуль RIMM на 400/800 МГц имеет пропускную способность 1,6/3,2 Гбайта/с. Представители корпорации Intel Утверждают, что система Pentium 4 с модулями RIMM на 300% быстрее, чем
8 В настоящее время в продаже имеются модули DIMM с емкостью 256, 512 Мбайт и даже 1 Гбайт. — Ред.
9 В настоящее время имеются модули DDR SDRAM, работающие на тактовой частоте 533 МГц и обладающие пропускной способностью 4,2 Гбайт/с. — Ред.
462
Глава 10
vcc	1
CAS	2
DQ1	3
АО	4
А1	5
DQ2	6
А2	7
АЗ	8
VSS	9
DQ3	10
А4	11
А5	12
DQ4	13
А6	14
А7	15
DQ5	16
А8	17
А9	18
А10	19
DQ6	20
W	21
VSs	22
DQ7	23
NC	24
DQ8	25
Q9	26
RAS	27
CAS9	28
D9	29
VCC	30
а)
VSS
DQO DQ16
DQ1
DQ17
DQ2
DQ18
DQ3 DQ19 VCC
NC AO
A1
A2
A3
A4
A5
A6
A1O
DQ4 DQ20 DQ5
DQ21
DQ6 DQ22
DQ7
DQ23
A7
NC
VCC
A8
A9
NC
RAS2 NC NC
NC NC
VSS CASO (?AS2 CAS3 CAS1 RASO
NC NC
W
NC
DQ8 DQ24
DQ9 DQ25 DQ10 DQ26 DQ11 DQ27 DQ12 DQ28
VCC DQ29 DQ13 DQ30 DQ14 DQ31 DQ15
NC PD1 PD2 PD3 PD4
NC VSS
6)
Рис. 10.11. Внешний вид 30-контактного модуля SIMM с организацией 4М > 9 (а) и 72-контактного модуля SIMM с организацией 4М х 36 (6). Модули показаны со стороны микросхем памяти
Интерфейс памяти
463
Вид со стороны микросхем
5.256(133.50)
5.244 (133.20)
4.550(115.57)
Рис. 10.12. Схема расположения выводов 168-контактного модуля DIMM
Вид сбоку
.157 (4.00) Макс.
Вывод 84 (168 на обратной стороне)
Pentium III с использованием памяти PC 100. Согласно заявлениям корпорации RAMBUS, скорость модуля RIMM с 800 МГц возрастет в будущем до 1200 МГц.
10.2. Дешифрирование адреса
Для того чтобы подключить ЗУ к микропроцессору, необходимо выполнить дешифрирование адреса, поступающего от микропроцессора. Процесс дешифрирования предусматривает функционирование памяти в однозначно определяемом сегменте памяти или разделение карты памяти для размещения информации в ЗУ. Без дешифратора адреса к микропроцессору может быть подключено только одно ЗУ, что, фактически, делает его бесполезным. В данном разделе описаны несколько из часто встречаемых способов дешифрирования адреса и дешифраторов, применяющихся во многих системах.
Зачем нужен дешифратор?
При сравнении микропроцессора 8088 с EPROM типа 2716 становится очевидной разница в количестве адресных выводов: EPROM имеет 11 адресных выводов, а микропроцессор — 20. Это означает, что микропроцессор посылает 20-разрядный адрес памяти при считывании или записи данных. Поскольку в данном EPROM имеется только 11 адресных выводов, то существует несоответствие, которое должно быть скорректировано. Если к ЗУ подключить только 11 адресных выводов микропроцессора 8088, то микропроцессору 8088 будет доступно только 2 Кбайта памяти вместо 1 Мбайта, т. е. той памяти, которая ему доступна в нормальном режиме работы. Дешифратор корректирует несоответствие адресных выводов, которые не подключены к элементу памяти.
Простой дешифратор на логическом элементе И-НЕ
При использовании EPROM с организацией 2К х 8 адресные выводы А10—АО микропроцессора 8088 подсоединяются к соответствующим адресным входам А|0—Ао микросхемы EPROM типа 2716. Оставшиеся 9 адресных выводов А19—АН подсое
464 Глава 1q
диняются к логическому элементу И-НЕ, выполняющему роль дешифратора адреса (рис. 10.13). Дешифратор определяет одну из многих микросхем EPROM типа 2716 емкостью 2 Кбайт секции ПЗУ, которой отведен определенный объем памяти в области 1 Мбайта, доступной микропроцессору 8088 в реальном режиме его работы.
Шина данных микропроцессора 8088
Рис. 10.13. Простой дешифратор адреса на логическом элементе И-НЕ для микросхем EPROM типа 2716, используемый при выборке ячеек памяти, имеющих адрес FF800H—FFFFFH
В этой схеме единственный логический элемент И-НЕ дешифрирует адрес памяти. На выходе схемы И-НЕ будет низкий логический уровень только тогда, когда все адресные выводы микропроцессора 8088, подключенные к его входам (А19—АП), а также и сигнал Ю/М будут иметь низкий логический уровень. Сигнал (логический 0) с выхода элемента И-НЕ поступает на вывод СЕ микросхемы EPROM, который разрешает ее работу. Следует напомнить, что данные из EPROM считываются только в том случае, когда сигналы на выводах СЕ и ОЕ имеют низкий логический уровень. Вывод ОЕ активизируется сигналом чтения RD микропроцессора 8088 или соответствующим управляющим сигналом считывания из памяти MRDC (memory read control) шинного контроллера 8288. Если 20-разрядный двоичный адрес, дешифрируемый логическим элементом И-НЕ, записывается так, чтобы старшие девять битов имели высокий логический уровень, а оставшиеся 11 младших битов адреса были в безразличном состоянии (обозначают символом X), то можно определить действующий диапазон адресов. Безразличное состояние, обозначаемое как X — это состояние, при котором сигнал в данной конкретной ситуации может иметь любой логический уровень (0 или 1).
Пример 10.1 показывает, каким образом определяется диапазон адресов для микросхемы EPROM при подачи на нее дешифрируемых старших битов адреса (А19—All) и младших битов адреса (А10—АО), находящихся в безразличном состоянии. В примере 10.1 также показан диапазон возможных адресов в шестнадцатеричном пред-
у^терфей0 памяти 465
тавлении. Здесь микросхема EPROM объемом памяти на 2 Кбайт определяется для диапазона адресов FF800H—FFFFFH.
СдедУет отметить, что в этой секции памяти объемом 2 Кбайт размещаются ячейки, начиная с адреса FFFF0H, в которых записана подпрограмма возврата микропроцессоров 8086/8088 в исходное состояние, таким образом, это наиболее подходящая область памяти для применения микросхемы EPROM.
Пример 10.1. Задание диапазона адресов при использовании безразличного состояния
1111 1111 1ХХХ хххх хххх
или
1111 1111 1000 0000 0000 = FF800H
1111 1111 1111 1111 1111 = FFFFFH
Хотя этот пример и демонстрирует процесс дешифрирования адреса, но в действительности логические элементы И-НЕ редко используются для этого, поскольку каждая микросхема EPROM должна иметь свой элемент И-НЕ. Из-за чрезмерных затрат на дешифратор, построенный на логических элементах И-НЕ, и особенно большого количества требуемых для этого дополнительных инверторов, необходимо какое-то иное альтернативное решение.
Линейный дешифратор "3-8" (74LS138)
Одним из наиболее общих дешифраторов (но не, единственный), выполненных на интегральной схеме (ИС) и используемых во многих системах на базе микропроцессора, является линейный или, иначе, одноступенчатый дешифратор "3—8" типа 74LS138. На рис. 10.14 изображена схема расположения выводов данного дешифратора, а в табл. 10.11 приведена его таблица истинности.
Входы выбора выхода
Входы разрешения работы
А		0
В		1
С		2
	74LS138	3
		4
G2A		5
G2B		6
G1		7
Рис. 10.14. Графическое изображение линейного дешифратора строк ’'З-в" типа 74LS138
468
Глава 10
ИЛИ
ЦП 0000 0000 0000 0000 = F0000H
1111 1111 nil nil nil = FFFFFH
Как же можно определить диапазон адресов каждой микросхемы EPROM, подключенной к выходам дешифратора? Снова записываем битовую комбинацию. На этот раз адресные входы выбора выхода А, В и С дешифратора не находятся в безразличном состоянии. Пример 10.3 показывает, как сигнал с выхода 0 дешифратора переходит на низкий уровень, чтобы определить подключенную к этому выводу микросхему EPROM. Для данного случая на выводы А, В и С будут поданы сигналы низкого логического уровня.
Пример 10.3. Определение диапазона адресов для первой микросхемы EPROM, подключенной к выводу 0 дешифратора
СВА
1111 ооОХ ХХХХ хххх хххх
или
1111 0000 0000 0000 0000 = F0000H
1111 0001 1111 1111 1111 = F1FFFH
Если необходимо установить диапазон адресов для микросхемы EPROM, подключенной к выходу 1 дешифратора, то он определяется точно так же, как и диапазон по выходу 0. Единственным отличием на этот раз будет то, что на входы С, В и А вместо 000 будет подана комбинация 001 (С = 0, В = 0, А = 1), как это показано в примере 10.4. Диапазоны адресов остальных выходов определяются аналогичным образом.
Пример 10.4. Определение диапазона адресов для второй микросхемы EPROM, подключенной к выводу 1 дешифратора
СВА
1111 001Х ХХХХ ХХХХ ХХ£Х
или
1111 0010 0000 0000 0000 = F2000H
1111 ООН 1111 1111 1111 = F3FFFH
Сдвоенный линейный дешифратор "2-4" (74LS139)
Другим применяемым дешифратором является сдвоенный линейный дешифратор "2~4" (74LS139). На рис. 10.16 изображена схема расположения выводов данного
Интерфейс памяти
469
дешифратора, а в табл. 10.12 приведена его таблица истинности. Дешифратор 74LS139 содержит в себе два отдельных линейных дешифратора ”2—4”. Каждый имеет свои адресные выводы выбора выхода (А и В), вывод разрешения работы дешифратора ( Е ) и 4 выходных вывода ( Yo — Y3).
Входы выбора выхода
Вход разрешения
Входы выбора выхода
Вход разрешения
Выходы
Выходы
Рис. 10.16. Схема расположения выходов сдвоенного линейного дешифратора "2-4" типа 74LS139
Таблица 10.12. Таблица истинности для сдвоенного дешифратора "2-4" типа 74LS139
Входы			Выходы			
Ё	А	в	Yo	Y>	Y2	Y3
0	0	0	0	1	1	1
0	0	1	1	0	1	1
0	1	0	1	1	0	1
0	1	1	1	1’	1	0
1	X	X	1	1	1	1
Адресный дешифратор на ППЗУ
Другим типом адресного дешифратора является дешифратор, выполненный на микросхеме ППЗУ (PROM), которое используется из-за ее большого числа входных выводов и в целях уменьшения общего количества цепей. Дешифратор на ППЗУ может иметь намного больше входов для дешифрирования адреса.
Например, микросхема ППЗУ типа TBP28L42 с организацией 512x8, используемая в качестве адресного дешифратора, имеет 10 входных и 8 выходных выводов. Это ППЗУ может заменить схему, представленную на рис. 10.15, но уже без дополнительного трехвходового элемента И-НЕ. Такое решение естественно экономит место на печатной плате и снижает стоимость системы. На рис. 10.17 показан адресный Дешифратор на ППЗУ типа TBP28L42. В данном случае ППЗУ (PROM) — это постоянное запоминающее устройство, которое должно быть предварительно запро
470
Глава 10
граммировано определенной комбинацией двоичных разрядов для выбора восьми микросхем EPROM. Само ППЗУ имеет 9 адресных входов Aq—А8, с помощью которых выбирается одна 8-разрядная ячейка памяти из 512 возможных. Оставшийся вход G заземляется, поскольку при переходе выходов ППЗУ в состояние высокого импеданса импульсный шум в схеме может выбрать одну или более микросхем EPROM.
Рис. 10.17. Система памяти, использующая в качестве дешифратора адреса ППЗУ
с организацией 512x8
Таблица 10.13. Комбинация кодов для программирования ППЗУ типа TBP28L42 для схемы, представленной на рис. 10.17
Входы										Выходы							
G	Ав	А?	Ав	As	а4	Аз	а2	Ai	Ао	Оо	01	02	Оз	04	05	Об	07
0	0	0	1	1	1	1	0	0	0	0	1	1	1	1	1	1	1
0	0	0	1	1	1	1	0	0	1	1	0	1	1	1	1	1	1
0	0	0	1	1	1	1	0	1	0	1	1	0	1	1	1	1	1
0	0	0	1	1	1	1	0	1	1	1	1	1	0	1	1	1	1
0	0	0	1	1	1	1	1	0	0	1	1	1	1	0	1	1	1
0	0	0	1	1	1	1	1	0	1	1	1	1	1	1	0	1	1
0	0	0	1	1	1	1	1	1	0	1	1	1	1	1	1	0	1
0	0	0	1	1	1	1	1	1	1	1	1	1	’1	1	1	1	0
Все остальные комбинации										1	1	1	1	1	1	1	1
Интерфейс памяти 471
В табл. 10.13 приведена комбинация двоичных кодов, предназначенных для программирования каждой ячейки ППЗУ и превращения его в адресный дешифратор для выбора восьми микросхем EPROM. Основным преимуществом использования ППЗУ для этих целей является легкость определения карты его программирования. Поскольку изначально выходы ППЗУ всех ячеек памяти запрограммированы, так что они имеют высокий логический уровень, то из 512 ячеек должны программироваться только 8. Это экономит для производителя полезное время.
Программируемые дешифраторы на ПЛУ
Данный раздел объясняет порядок использования программируемого логического устройства или, иначе, ПЛУ (PLD — programmable logic device) в качестве дешифратора. Имеется три типа ПЛУ. которые работают по одному принципу, но имеют разные названия:
□	программируемая логическая матрица, иначе ПЛМ (PLA — programmable logic array);
□	программируемая матричная логика, иначе ПМЛ (PAL — programmable array logic);
□	вентильная матричная логика, иначе ВМЛ (GAL — gated array logic).
Несмотря на то, что эти устройства существуют с середины 1970-х годов, они стали применяться в запоминающей системе и цифровых схемах только начиная с 1990-х годов. В последних интерфейсах памяти элементы ПМЛ (PAL) заменили адресные дешифраторы, реализованные на микросхемах ППЗУ. ПМЛ и ПЛМ программируются пережиганием плавких перемычек как у ППЗУ, а некоторые ПЛУ являются сшраемыми устройствами, так же как и EPROM. По существу, все три типа устройств являются программируемыми матричными логическими массивами.
Комбинаторные программируемые логические матрицы
Одним из двух типов ПМЛ является комбинаторная программируемая логическая матрица. Это устройство сконструировано внутри > как программируемая матрица комбинационных логических схем. На рис. 10.18 показана внутренняя структура ПМЛ (PAL16L8), сконструированная на логических элементах И/ИЛИ. Это устройство, очень дешевое, имеет 10 фиксированных входов, два фиксированных выхода и шесть выводов, которые программируются как входы или выходы. Каждый выходной сигнал генерируется логическим элементом ИЛИ на 7 входов, к каждому из которых, в свою очередь, подключается логический элемент И. Выходные сигналы вентиля ИЛИ проходят через инвертор с тремя состояниями, который определяет каждый выходной сигнал как функцию И/ИЛИ-НЕ. Первоначально все плавкие перемычки соединят все вертикальные/горизонтальные соединения, показанные на рис. 10.18. Программирование осуществляется пережиганием плавких перемычек, чтобы соединить разные входы к матрице элементов ИЛИ. Функция монтажного И выполняется на каждом входном соединении, что позволяет иметь терм произведения до 16 входов. Логическое выражение, использующее PAL16L8, может иметь до семи термов произведения с 16 входами ИЛИ-HE, чтобы генерировать выходное выражение. Это устройство, благодаря своей структуре, является идеальным для реализации на его основе адресного дешифратора памяти. Оно идеальное еще и потому, что выходы возбуждаются низким уровнем сигнала.
472
Глава 10
Рис. 10.18. Внутренняя структура ПМЛ типа PAL16L8
К счастью, теперь не нужно выбирать плавкие перемычки по номерам для программирования, как это было принято делать, при его первоначальном внедрении. Сегодня ПМЛ программируется с использованием пакета программ, таких как PALASM (PAL assembler program). Программа PALASM и ее синтаксическая структура имеют промышленный стандарт для программирования ПМЛ-устройств. Пример 10.5 де
Интерфейс памяти
473
монстрирует программу, которая дешифрирует те же участки памяти, которые дешифрировались на рис. 10.17.
Пример 10.5. Программа, дешифрирующая участки памяти, аналогичные показанным на рис. 10.17
TITLE pattern	Address Decoder Test 1
revision	A
autor	Barry B. Brey
COMPANY	BrayCo
data	6/6/99
CHIP	DECODER1 PAL16L8
; pins 1	23456789	10
A19	A18 A17 A16 A15 A14 A13 NC NC GND
pins	11 12	13	14 15	16	17 18 19	20
	NC 08	07	06 05	04	03 02 01	VCC
EQUATIONS
/01	=	А19	*	А18	*	А17	*	А16	*	/А15	*	/А14 * /А13
/02	=	А19	*	А18	*	А17	*	А16	*	/А15	*	/А14 * А13
/03	=	А19	*	А18	*	А17	*	А16	*	/А15	*	А14 * /А13
/04	=	А19	*	А18	*	А17	*	А16	*	/А15	*	А14 * А13
/05	=	А19	*	А18	*	А17	*	А16	*	А15	*	/А14 * /А13
/Об	=	А19	*	А18	*	А17	*	А1б	*	А15	*	/А14 * А13
/07	=	А19	*	А18	*	А17	*	А16	*	А15	*	А14 * /А13
/08	=	А19	*	А18	*	А17	*	А16	*	А15	*	А14 * А13
Эта программа разработана с использованием текстового редактора EDIT, который имеется в программах MS-DOS или Notepad в> Windows 98/Windows ХР. Также программу можно разработать с использованием редактора, который поступает с пакетом программы PALASM или другой программой для программирования микросхем ПМЛ (PAL) на языке ассемблера. Разные программы редактирования пытаются облегчить задачу определения выводов, но следует посоветовать, что легче использовать редактор EDIT и листинг, как это показано ранее.
Первые семь строк программы, представленной в примере 10.5, идентифицируют заголовок программы (title), схему (pattern), редакцию (revision), автора (autor), компанию (company), дату (data), наименование программы и тип кристалла (chip). Единственно важной записью из всех перечисленных является запись о кристалле. В данном примере указан тип кристалла PAL16L8, и программа именуется DECODER1. После идентификации программы приведен оператор комментария (; pins), с помощью которого указывается перечень номеров выводов.
Ниже комментария перечисляются соответствующие выводы схемы, определенные Для данного программного приложения. После определения выводов приводится оператор уравнений (equations), для указания уравнений для этой прикладной задачи. В данном примере уравнения определяют значения восьми выходных сигналов,
474
Глава 10
поступающих на соответствующие выводы разрешения работы кристалла СЕ восьми микросхем EPROM (рис. 10.19).
Следует отметить, что каждое уравнение определяет один выходной сигнал на соответствующем выводе микросхемы PAL16L8, имеющий низкий логический уровень в активном состоянии, при указании этого перед названием вывода. Например,
Интерфейс памяти 475
обозначение /01 используется для указания инверсии сигнала 01. Хотя при обыч-ной записи, для обозначения сигнала, имеющего в активном состоянии низкий логический уровень, ставят черточку сверху над наименованием сигнала, но это сделать невозможно при наборе на клавиатуре в относительно простом редакторе. Поэтому для обозначения таких сигналов добавляют косую черту перед названием вывода. В этом примере все выходные сигналы низкого логического уровня, поскольку все выводы микросхемы PAL16L8 могут иметь только низкий логический уровень. Существуют также и другие микросхемы ПМЛ (PAL) с выходами, возбуждаемыми, если это необходимо, сигналами высокого уровня.
Используемые в уравнениях PAL логические символы включают: * для логической операции "И”, а также + для операции ’’ИЛИ”. В данном примере показаны только операции ”И”. При инвертировании входного сигнала, поступающего на соответствующий вывод, косая черта (/) ставится перед названием вывода. При инвертировании группы входов косая черта проставляется перед группой, взятой в скобки, например, обозначение /(А+в) эквивалентно А + В , т. е. функции ИЛИ-HE. Функция И-НЕ следовательно будет обозначена, как /(А*в), что аналогично выражению А~*В.
Рассмотрим самое первое уравнение в примере 10.5. В данном случае оно означает, что на выводе 19 (/01) выходной сигнал будет иметь низкий логический уровень, который разрешает работу микросхемы U2 EPROM типа 2764 (см. рис. 10.19), если приведенное уравнение верно. В этом примере выходной сигнал на выводе 19 микросхемы U1 (PAL16L8) будет низкого логического уровня, только если сигналы А19, А18, А17 и А16 будут иметь высокий, а сигналы А15, А14 и А13 низкий логический уровень. Данное двоичное число соответствует ячейкам памяти в диапазоне адресов F0000H-F1FFFH.
10.3.	Интерфейс памяти 8-разрядных микропроцессоров 8088 и 80188
Далее приводится текст нескольких отдельных разделов, посвященных интерфейсам памяти микропроцессоров различной разрядности. В этом разделе рассматривается интерфейс 8-разрядных микропроцессоров 8088 и 80188. Последующие три раздела посвящены интерфейсам памяти 16-; 32- и 64-разрядных микропроцессоров. Отдельные разделы приводятся ввиду того, что имеются незначительные различия методов, использующихся для адресации памяти в системах на микропроцессорах с различной шириной шины данных. Инженерам и специалистам аппаратного оборудования, желающим расширить свои профессиональные знания по сопряжению 16-, 32- и 64-разрядных микропроцессоров с памятью, следует ознакомиться со всеми последующими разделами.
Этот же раздел наиболее полный, поскольку содержит материал, которой не приводится в других разделах, ввиду аналогичной организации интерфейсов. Здесь, в частности, рассмотрен интерфейс для двух видов памяти, т. е. ПЗУ и ОЗУ, а также объясняется контроль по четности, который применяется во многих компьютерных системах, построенных на базе микропроцессоров. Кроме того, вкратце приводится описание нескольких схем исправления ошибок, которые тоже имеются в распоряжении разработчиков запоминающих систем.
476
Глава 10
Базовый интерфейс памяти микропроцессоров 8088/80188
Микропроцессоры 8088 и 80188 имеют 8-разрядную шину данных, которая идеально подходит для соединения с широко распространенными 8-разрядныму ЗУ. Такие ЗУ делают микропроцессор 8088, и особенно 80188, идеальным в качестве элементарного контроллера. Тем не менее для правильного функционирования микропроцессоров 8088/80188 с памятью запоминающая система должна дешифрировать адрес, чтобы выбрать тот или иной компонент памяти. Кроме того, она также должна использовать управляющие сигналы RD, WR и 10/М микропроцессоров 8088/80188, передаваемые для управления запоминающей системой.
В этом разделе использована конфигурация интерфейса памяти для минимального режима работы процессора, которая по существу является одинаковой с конфигурацией для максимального режима. Основное различие состоит в том, что при максимальном режиме вместо двух сигналов Ю/М и RD в системе генерируется сигнал MRDC, а вместо сигналов Ю/М и WR сигнал MWTC. Эти управляющие сигналы (MRDC и MWTC) при максимальном режиме работы микропроцессора формируются контроллером шины 8288. В минимальном режиме работы ЗУ рассматривает микропроцессор 8088 или 80188 как устройство с 20-адресными выводами (А19—АО), восемью выводами шины данных (AD7—ADO) и тремя управляющими сигналами 10/M , RD и WR.
Сопряжение ПЗУ с микропроцессором 8088
Этот подраздел подобен разд. 10.2 по дешифраторам. Единственное отличие, которое рассмотрено в этом подразделе, относится к состояниям ожидания и использованию сигнала Ю/М для разрешения работы дешифратора. На рис. 10.20 показана схема подключения микропроцессора 8088/80188 с 8 микросхемами EPROM типа 2732 с организацией 4К х 8. У этих микросхем имеется-на один адресный вход (Al 1) больше, чем у EPROM типа 2716, и их емкость памяти в два раза больше.
Дешифратор (74LS138) соединен немного иначе, чем предполагалось, поскольку в данном случае применяется более медленная версия микросхемы EPROM, которая имеет значение времени доступа 450 нс. Микропроцессор 8088, работающий с тактовой частотой 5 МГц, предоставляет памяти 460 нс на время доступа. Из-за дополнительно вводимого дешифратором времени задержки, составляющего 12 нс, это ЗУ не в состоянии работать в отведенных микропроцессором пределах времени. Для исправления этой проблемы дополнительный логический элемент И-НЕ, предназначенный для формирования сигнала разрешения работы дешифратора, кроме того, вырабатывает сигнал WAIT для генератора, формирующего такты ожидания, о которых упоминалось в главе 9. Следует заметить, что микропроцессор 80188 сам может вырабатывать внутри себя от 0 до 15 тактов ожидания без дополнительного внешнего аппаратного оборудования, поэтому при его использовании элемент И-НЕ для этой цели не нужен.
Каждый раз при обращении микропроцессора 8088 к памяти с одним вставленным тактом ожидания микросхемам EPROM предоставляется 660 нс для доступа к памяти. Следует напомнить, что при указанной тактовой частоте каждый дополнитель-
Интерфейс памяти
477
ный такт ожидания добавляет к времени доступа 200 нс. Таким образом предоставленные 660 нс — это вполне достаточное время для доступа к данным для элемента памяти со временем доступа 450 нс, даже при возникающих дополнительных временных задержках, связанных с дешифратором и буферными схемами шины данных.
WAIT
ю/м
А12
А13
А14
А	0
В	1
С 2
G2A
G2B
G1
1 кОм
+ 5В
‘138
Шина адреса А0-А11
Шина данных DQ-D7
RD -F8000 - F8FFF
F9000 - F9FFF
FA000 - FAFFF
FB000 - FBFFF
FC000 - FCFFF
FD000 - FDFFF
FE000 - FEFFF
FF000 - FFFFF
°7
ОЕ
СЕ____
-с| СЕ
—^СЁ
3
4
Рис. 10.20. Сопряжение восьми микросхем EPROM типа 2732 с микропроцессором 8088
Обратите внимание на то, что дешифратор предназначен для диапазона адресов от F8000H до FFFFFH, т. е. верхнего участка памяти на 32 Кбайта. Этот участок памяти относится к области ПЗУ, поскольку в ней расположена ячейка FFFF0H, начиная с которой микропроцессор 8088 приступает к выполнению команд после возврата аппаратного оборудования в исходное состояние. Часто ячейку FFFF0H называют ячейкой холодного запуска или, иначе, холодного старта^ (cold-start), т. е. старта после включения питания вычислительной системы. Программа, содержащаяся в этом участке памяти в ячейке FFFF0H, должна содержать команду безусловного перехода JMP, которая осуществляет переход к ячейке F8000H для выполнения остальной части программы.
Сопряжение ОЗУ с микропроцессором 8088
Интерфейс памяти, предназначенный для ОЗУ, более простой, чем для ПЗУ, поскольку элементам динамической и тем более статической памяти не требуются дополнительные такты ожидания. Идеальным участком памяти для ОЗУ является область, начиная с младшего адреса. Следует напомнить, что область памяти с адреса
10 в противоположность этому понятию существует понятие горячего старта, обозначающее запуск системы при включенном питании после нажатия кнопки RESET на системном блоке. — Ред.
478
Глава 10
Рис. 10.21. Схема ОЗУ емкостью 512 Кбайт на микросхемах статической памяти типа 62256
Интерфейс памяти 479
ОООООН по 00400Н предназначена для хранения векторов прерывания. Векторы прерывания очень часто модифицируются пакетами программ, поэтому чрезвычайно важно для этого участок памяти использовать именно ОЗУ. Более подробно векторы прерывания рассмотрены в главе 12.
На рис. 10.21 показано сопряжение 16 микросхем статических ОЗУ типа 62256, имеющих организацию 32К х 8, с микропроцессором 8088, начиная с ячейки памяти ОООООН. На схеме используется два дешифратора непосредственно для выбора 16 микросхем памяти ОЗУ, а третий — для разрешения работы одного из этих двух дешифраторов. Шестнадцать микросхем памяти типа 62256 по 32 Кбайта каждая заполняют память от ячейки ОООООН вплоть до ячейки 7FFFFH, организуя тем самым ОЗУ с общим объемом 512 Кбайт.
Первый дешифратор (U4) на этой схеме выбирает оцин из двух других дешифраторов (U3 и U9). Если на его адресные входы А и В подана логическая комбинация 00 (А19 = А18 = 0), то микросхема U4 выбирает дешифратор U3, а если комбинация 01 (А 19 = 0, А18 = 1), то дешифратор U9. Следует отметить, что остальные дополнительные выводы на выходе дешифратора U4 могут быть использованы для будущего расширения. Эти выводы позволят построить ОЗУ большой емкости из блоков памяти с организацией 256К х 8 (и соответственно с общей организацией 1М х 8) за счет добавления микросхем памяти и дополнительных второстепенных дешифраторов.
Из схемы на рис. 10.21 видно, что в данном случае применена буферизация линий адреса, шины данных и управляющих сигналов WR и RD. Буферизация очень важна, когда на одной плате или в одной системе применяется много отдельных элементов. Допустим, что три других платы, подобно этой, подключены в систему. Без буферных схем на каждой плате будет присутствовать существенная нагрузка на линии адреса, данных и управления, такая, что может помешать правильному их функционированию. Следует напомнить, что чрезмерная нагрузка увеличивает уровень выходного сигнала низкого логического уровня сверх максимально допустимой в системе величины, а именно 0,8 В. Буферные схемы обычно применяются для возможного будущего расширения ОЗУ. Если память никогда не будет увеличиваться, то буферные схемы могут и не потребоваться.
Интерфейс флэш-памяти
Использование флэш-памяти (EEPROM) для хранения Video-BIOS видеокарт и системы BIOS персональных компьютеров становится повседневным делом. Флэш-память также используется в других прикладных целях для хранения информации, которая изменяется, но достаточно редко.
Единственным отличием между микросхемами флэш-памяти и статическим ЗУ (SRAM) является то, что для стирания и записи новых данных на устройство флэш-памяти требуется повышенное напряжение программирования равное 12 В. Напряжение в 12 В можно получить или непосредственно от источника питания, или от преобразователя напряжения 5 В в 12 В, предназначенного для использования с флэш-памятью.
На рис. 10.22 представлена схема интерфейса флэш-памяти на микросхеме типа 28F400, производимой корпорацией Intel, с микропроцессором 8088. Микросхема
480
Глава 10
28F400 может быть использована как любое другое запоминающее устройство с организацией 512К х 8 или 256К х 16. Поскольку в данном случае она подключена к микропроцессору 8088, то имеет 8-разрядную организацию (512К х 8). Обратите внимание на то, что выводы управляющих сигналов на этой микросхеме флэш-памяти в основном идентичны таким же выводам статических ЗУ: ОЕ, СЕ и WE. Единственно новыми выводами являются: VPP, подключаемый к источнику напряжения 12 В для стирания и программирования микросхемы; PWD , который выбирает режим пониженного потребления энергии; и BYTE , который выбирает режим работы микросхемы с байтами (BYTE = 0) или со словами (BYTE = 1).
Рис. 10.22. Интерфейс флэш-памяти на микросхеме типа 28F400 с микропроцессором 8088
Обратите внимание, что вывод DQ15 в режиме работы с байтами функционирует как наименее значимый адресный вход АО.
Другое отличие микросхемы флэш-памяти от статического элемента состоит в количестве необходимого времени для операции записи. Статическое ЗУ может выполнить операцию записи менее чем за 10 нс, а для флэш-памяти требуется примерно 400 мс для стирания одного байта. Тема программирования флэш-памяти рассмотрена в главе 11 вместе с устройствами ввода-вывода. Микросхема флэш-памяти имеет внутренние регистры, которые программируются с использованием еще не объясненных методов ввода-вывода. Данная глава концентрирует внимание только на интерфейсе флэш-памяти с микропроцессором.
Интерфейс памяти
481
Следует отметить, что в качестве дешифратора выбрана микросхема 74LS139 только потому, что для микросхемы фЛэш-памяти такого размера требуется только простой дешифратор. Дешифратор использует сигналы А19 и Ю/М как входные. Сигнал д19 предназначен для выбора флэш-памяти по адресам 80000Н—FFFFFH, а управляющий сигнал Ю/М разрешает работу дешифратора.
Проверка на четность для обнаружения ошибок памяти
Поскольку в существующих сегодня системах имеется такое большое количество микросхем памяти и поскольку стоимость этих схем относительно мала, то многие производители плат памяти добавили проверку четности на платах памяти, хотя общая тенденция такова, что наблюдается отход от применения четности. Проверка четности осуществляется подсчетом числа бит данных, имеющих значение логической единицы, и дальнейшего указания: является ли это число четным или нечетным. Если все данные сохраняются с проверкой на четность, т. е. в памяти данные будут сохранены только с четным числом единичных битов, то при чтении возможно обнаружение одинарной ошибки. Таким образом, для реализации этого метода контроля применяется один дополнительный разряд на каждый байт данных для дополнения на четность. Следовательно память, которая предназначена для проверки на четность, является 9- или 36-разрядной для модулей SIMM на 30 или соответственно 72 вывода.
На рис. 10.23 показана схема расположения выводов ИС генератора/детектора четности типа 74AS280 и таблица ее функционирования (табл. 10.14). Эта схема имеет 9 входов и генерирует проверку на четность или нечетность для 9-разрядного числа, подаваемого на ее входы. Она также проверяет 9-разрядное число, соединенное к ее входам, на четность.
G Е 1
H Е 2
NO Е 3
I Е 4
EEVEN Е 5
EODD С 6
GND Е 7
14 □ V(
13 □ ?
12 □ Е
11 □ D
10 □ С
9 □ В
8 □ А
Рис. 10.23. Схема расположения выводов 9-разрядного генератора/детектора четности типа 74AS280
Таблица 10.14. Таблица функционирования микросхемы типа 74AS280
Число входов от А до I, имеющих высокий логический уровень
Выходы
SEVEN
SODD
0, 2, 4, 6, 8
1,3, 5, 7, 9
16 Зак 384
482
Глава 10
На рис. 10.24 показана схема памяти с организацией 64К х 8, использующая два статических ЗУ типа 62256 32К х 8 для хранения данных, которая содержит элементы для контроля четности.
Рис. 10.24. Система памяти на 64 Кбайт со схемой детектирования ошибки четности
Интерфейс памяти
483
Следует обратить ваше внимание, что микросхема типа 74AS280 формирует сигнал четности для 8 разрядов данных (DO—D7) и сохраняет его в статическом ЗУ типа 6287 (U5) с организацией 64К х 1. Эта схема с использованием дешифратора 74LS138 (U3) дешифрирует память, имеющую адрес 80000Н—8FFFFH. Здесь восемь выводов шины данных подключены к входам А—Н генератора/детектора типа 74LS280 (U6), формирующего сигнал четности. Вход I заземляется, чтобы при появлении четного числа бит шины данных, имеющих значение логической единицы, в ЗУ четности (U5) сохранялась 1 (вывод EVEN = 1 для U6), а при появлении нечетного числа сохранялся 0. Проверка на нечетность осуществляется для каждого байта данных с записью битов четности в память.
При считывании данных из памяти каждая линия данных соединяется с другим ге-нератором/детектором четности типа 74AS280 (U7) для проверки их на четность. В этом случае используются все входы микросхемы. Входы А—Н соединены с выходами данных ОЗУ, а вход I соединен с выходом DO микросхемы ЗУ четности (U5).
Следует заметить, что управляющие выводы ЗУ четности различаются от выводов основных элементов памяти (U1 и U2). Это статическое ЗУ считывает данные в случае выбора микросхемы и выдает их на вывод DO, а также записывает данные, поступающие на вывод DI, если оно выбрано и сигнал WE= 0. В нем отсутствует, как в микросхемах ЗУ типа 62256, вывод разрешения выходов ОЕ , предназначенный для подачи на него в этих элементах памяти сигнала чтения RD от микропроцессора. При нечетном результате проверки, который бывает при выполнении операции чтения без ошибки, выход проверки на четность EVEN микросхемы 74AS280 (U7) имеет низкий логический уровень. Если же любой разряд данных, считанных из памяти, по какой-либо причине изменяется, т. е. операция чтения выполняется с одинарной ошибкой (ошибкой в одном разряде), тогда сигнал на выводе EVEN этой микросхемы (U7) становится высокого логического уровня.
Выходной сигнал схемы проверки четности подсоединяется к специальному входу микропроцессора 8088, называемому входом немаскируемого прерывания NMI (nonmaskable interrupt). Он называется так потому, что сигнал на нем нельзя замаскировать. Поэтому если сигнал на входе NM1 становится высокого уровня, то выполнение программы в любом случае прерывается, и специальная подпрограмма определяет. что запоминающая система обнаружила ошибку четности. (Более подробно о прерывании изложено в главе 12.)
Запрос на прерывание по ошибке четности осуществляется таким образом, чтобы до возникновения сигнала NMI данные из памяти уже были считаны. Выходной сигнал на выводе EVEN схемы проверки четности (U7) защелкивается в D-триггере (U8A) в конце цикла чтения по сбросу (перепаду из 0 в 1) сигнала RD. В этом случае ЗУ имеет достаточно времени для считывания и передачи данных на генератор проверки четности (U7) до того, как его выходной сигнал защелкивается в D-триггерс.
Исправление ошибок
Схемы исправления ошибок были известны и применялись уже достаточно давно, но производители ИС начали производить схемы исправления ошибок сравнительно недавно. Одной из таких схем является 8-разрядная схема исправления и обнаруже
484
Глава 10
ния ошибок (74LS636), которая исправляет любую одинарную ошибку считывания из памяти и фиксирует любую двойную ошибку (ошибки сразу в двух разрядах). Это устройство предназначено для мощных компьютерных систем ввиду существенных затрат на реализацию системы исправляющей ошибки. В настоящее время некоторые компьютерные системы используют статическую память SDRAM с применением встроенных схем исправления ошибок или, иначе, ЕСС-память (error correction code). Схема исправления ошибок, которая используется в таких ЗУ, идентична рассматриваемой здесь схеме. ИС 74LS636 исправляет ошибки за счет формирования пяти контрольных разрядов для каждого байта данных памяти. Это, разумеется, увеличивает сложность памяти, но также и обеспечивает автоматическое исправление одинарных ошибок. Эта схема не может обнаруживать ошибки, которые происходят более чем в двух разрядах. К счастью, это случается достаточно редко, а большие дополнительные затраты, необходимые на реализацию схем по исправлению таких ошибок, не стоят этого. Если же элементы памяти совсем выходят из строя, и при этом все ее биты постоянно имеют высокий или низкий логический уровень, то в этом случае схема сигнализирует процессору о многоразрядной ошибке.
На рис. 10.25 показана блок-схема внутренней структуры, а в табл. Ю. 15 представлены наименования выводов микросхемы типа 74LS636. Обратите внимание, что она имеет восемь выводов ввода-вывода данных (DBO—DB7), пять выводов ввода-вывода контрольных разрядов (СВО—СВ4), два управляющих входа (SO и S1) и два выхода для ошибок: признак одинарной ошибки (SEF — single error flag) и признак двойной ошибки (DEF — double error flag). Управляющие входы определяют тип выполняемой операции, которые представлены в табл. 10.16.
Когда обнаруживается одинарная ошибка ИС 74LS636, проходит через цикл исправления ошибки: при этом на управляющие входы SO и SI подается комбинация 01, что приводит к ожиданию и затем чтению после исправления ошибки.
На рис. 10.26 показана блок-схема, в которой микросхема 74LS636 используется для исправления одинарных ошибок и прерывания работы процессора с помощью сигнала NM1 при ошибках в двух разрядах. Для упрощения иллюстрации на рисунке показано только одно ЗУ типа 4016 с организацией 2К х 8 для хранения данных, а другое аналогичное ЗУ для хранения 5-разрядного контрольного кода. Выводы данного элемента памяти несколько отличаются от приведенного в предыдущем примере ЗУ. Обратите внимание на то, что вывод S , или иначе CS , заземлен, а управление потоком данных между внутренней и системной шиной осуществляется с помощью буферной схемы. Это необходимо для доступа к данным памяти до того, как строб RD сменится на низкий логический уровень.
На следующем отрицательном перепаде тактового сигнала после установления сигнала RD в низкий логический уровень микросхема 74LS636 проверяет признак одинарной ошибки (SEF), чтобы определить, произошла ли ошибка. Если же это случилось, то микросхемой выполняется цикл коррекции, в ходе которого эта одинарная ошибка устраняется. При появлении двойной ошибки генерируется сигнал запроса на немаскируемое прерывание процессора с помощью вывода признака двойной ошибки (DEF), соединенного с выводом NM1 микропроцессора.
Интерфейс памяти
485
Рис. 10.25. Блок-схема внутренней структуры микросхемы типа 74LS636
Таблица 10.15. Наименование выводов микросхемы типа 74LS636
Вывод	Наименование	Вывод	Наименование
1	DEF	411	СВ4
2	DB0	12	NC
3	DB1	13	СВЗ
4	DB2	14	СВ2
5	DB3	15	СВ1
6	DB4	16	СВО
7	DB5	17	S0
8	DB6	18	S1
9	DB7	19	SEF
10	GND	20	Vcc
486
Глава 10
Таблица 10.16. Назначение управляющих битов S0 и S1 микросхемы 74LS636
Управляющие входы		Функция	Выходы	
SO	S1		SEF	DEF
0	0	Запись контрольного слова	0	0
0	1	Исправление слова данных	А	А
1	0	Чтение данных	0	0
1	1	Фиксация данных	А	*
* — эти уровни сигналов определяются типом ошибки.
Шина данных
Рис. 10.26. Блок-схема обнаружения и исправления ошибки с использованием микросхемы 74LS636
1/1нтерфейс памяти 487
10.4.	Интерфейс памяти 16-разрядных микропроцессоров 8086, 80186, 80286 и 80386SX
МикР0Г,Р011ССС0РЬ1 8086, 80186, 80286 и 80386SX отличаются от 8088/80188 по трем аспектам: 1) шина данных имеет 16 разрядов вместо 8 разрядов как на 8088; 2) вывод Ю/М заменен выводом М/Ю; и 3) имеется новый управляющий сигнал, именуемый сигналом разрешения старшей шины ВНЕ (bus high enable) или, иначе, разрешения старшего байта (byte high enable). По-другому используется и адресный бит АО или, иначе, вывод BLE (bus low enable). Поскольку этот раздел базируется на информации разд. 10.3, то вначале следует внимательно с ним ознакомиться. Существует также и еще несколько других отличий между 8086/80186 и 80286/80386SX. Микропроцессоры 80286/80386SX обладают 24-разрядной адресной шиной (А23—АО) вместо 20-разрядной шины (А 19—АО) процессоров 8086/80186. Кроме того, микропроцессоры 8086/80186 имеют сигнал М/Ю, а в системах, построенных на микропроцессорах 80286 и 80386SX, используются управляющие сигналы MRDC и MWTC вместо сигналов RD и WR.
16-разрядная шина управления
Шина данных микропроцессоров 8086, 80186, 80286 и 80386SX в два раза шире, чем шина микропроцессоров 8088/80188. Более широкая шина преподносит уникальный набор проблем, которые ранее не рассматривались. Микропроцессоры 8086, 80186, 80286 и 80386SX должны быть способны записывать данные в любую 16- или 8-разрядную ячейку. Это означает, что 16-разрядная шина данных должна быть разделена на две отдельные секции (банка") по 8 разрядов так, чтобы микропроцессор мог обращаться либо к одной из двух половин (8 разрядам), либо сразу к двум половинам (16 разрядам). На рис. 10.27 показаны два банка памяти. Один банк (младший банк) сохраняет все четные ячейки памяти, а другой банк (старший банка) удерживает все нечетные ячейки памяти. •*
Следует заметить, что вывод младшего адресного бита АО для микропроцессора 80386SX обозначен как BLE (bus low enable), или иначе (byte high enable).
Микропроцессоры 8086, 80186, 80286 и 80386SX используют сигнал ВНЕ и АО или BLE для выбора одного или обоих банков памяти, используемых для передачи данных. В табл. 10.17 показаны различные логические уровни сигналов на этих двух выводах и соответствующий выбранный банк/банки.
Выбор банка производится двумя способами:
для выбора банка памяти при записи формируется отдельный сигнал записи;
Для каждого банка используются отдельные дешифраторы.
Понятие банк памяти имеет несколько значений: 1. Группа модулей памяти одинаковой емкости, Которые должны быть установлены одновременно для обеспечения работоспособности системы. Количество модулей определяется путем деления ширины системной шины данных на ширину Данных модуля. 2. Логическая единица внутри модуля памяти. 3. Часть чипа памяти, доступ к которой возможен независимо от другой части. — Ред.
488	Глава Ю
----------------------------------------------------------------------------
Тщательное сравнение этих способов показывает, что первый способ менее дорогостоящий для интерфейса памяти микропроцессоров 8086, 80186, 80286 и 80386SX.
Рис. 10.27. Старший (нечетный) и младший (четный) 8-разрядные банки памяти микропроцессоров 8086, 80286 и 80386SX
FFFFE
FFFFC
FFFFA
00004
00002
00000
Младший банк (четный)
Таблица 10.17. Выбор банка памяти с использованием сигналов ВНЕ и BLE (АО)
ВНЕ	BLE(AO)	Функция
0	0	Разрешение передачи данных для обоих банков
0	1	Разрешение передачи старшего 8-разрядного банка
1	0	Разрешение передачи младшего 8-разрядного банка
1	1	Нет передачи данных
Дешифраторы банков
Часто использование отдельных дешифраторов банков является менее эффективным способом дешифрирования адресов памяти для микропроцессоров 8086, 80186, 80286 и 8O386SX. Иногда этот метод используется, но в большинстве случаев трудно понять почему. Одной из причин может быть сохранение энергии, поскольку сигнал разрешения идет только на один или два выбранных банка. Это не всегда относится к сигналам чтения и записи в отдельных банках, которые рассмотрены далее.
На рис. 10.28 представлены два дешифратора типа 74LS138 (U2 и U3), используемые для выбора элементов ЗУ с организацией 64К х 8 в системе на микропроцессоре 80386SX (24-разрядный адрес).
Здесь сигнал BLE (АО) соединен с выводом G2A дешифратора U3, а сигнал ВНЕ — со своим входом G2A дешифратора U2. Поскольку дешифратор не активизируется до тех пор, пока все его разрешающие входы не будут активными, то дешифратор U3 активизируется только для 16- или 8-разрядной операции младшего
1/]нтерфейс памяти
489
банка. Дешифратор U2 активизируется для 16-разрядной или 8-разрядной операции старшего банка. Два этих дешифратора и 16 ЗУ емкостью по 64 Кбайта, которыми ()1ш управляют, представляют запоминающую систему для микропроцессора 303S6SX общей емкостью в 1 Мбайт. Дешифратор U1 разрешает работать обоим дешифраторам U2 и U3 для диапазона адресов 000000Н—0FFFFFH.
74LS138
Рис. 10.28. Отдельные дешифраторы банка
Следует обратить внимание, что на рис. 10.28 адресный вывод АО не соединен с ОЗУ, поскольку на микропроцессоре 80386SX его нет. Кроме того, двоичный разряд Al адресной шины микропроцессора соединяется с входом АО каждого ЗУ, разряд А2 — с Al и т. д. Причина состоит в том, что вывод BLE от микропроцессора 80286/80386SX (или АО от 8086/80186) уже соединен с дешифратором U3 и нет не
490
Глава Ю
обходимости снова подключаться к памяти. При подключении вывода BLE или ДО (того или иного микропроцессора) к адресному выводу АО каждого ЗУ будет использоваться каждая вторая ячейка в каждом банке данных и в этом случае половина емкости памяти пропадает.
Отдельные стробы записи банков
Наиболее эффективным способом выбора банка является формирование отдельного строба записи для каждого банка памяти. Для данного метода требуется только один дешифратор для выбора 16-разрядной памяти, часто экономит деньги и снижает количество компонентов в системе.
Почему же аналогичным образом не генерируют и отдельные стробы чтения для каждого банка?
Обычно в этом нет необходимости, поскольку микропроцессоры 8086, 80186, 80286 и 80386SX считывают с половины шины только байт данных, который им требуется в то или иное время. Если 16-разрядные секции данных постоянно присутствуют на шине данных в процессе их считывания, то микропроцессор игнорирует ненужную 8-разрядную секцию без конфликтных ситуаций и особых проблем.
На рис. 10.29 показано генерирование микропроцессором 8086 отдельных стробов записи в память для двух банков.
Рис. 10.29. Схема, формирующая два отдельных сигнала строба записи для старшего и младшего банков
Здесь один из двух логических элементов ИЛИ типа 74LS32 объединяет сигнал АО с WR и формирует сигнал строба записи LWR (low bank write) для выбора нижнего банка, а второй элемент объединяет сигнал ВНЕ с WR и формирует второй сигнал строба записи HWR (high bank write) для выбора верхнего банка. Стробы записи для микропроцессоров 80286/80386SX формируются так же, но с использованием сигнала MWTC вместо WR.
Запоминающая система, использующая отдельные стробы записи, конструктивно отличается от 8-разрядной системы, построенной на базе микропроцессора 8088, и от системы с отдельными банками памяти. ЗУ в системе, которая использует отдельные стробы записи, дешифрируются как 16-разрядная память.
Например, предположим, что запоминающая система будет оснащена статическим ОЗУ с общей емкостью в 64 Кбайта. Чтобы сконструировать 16-разрядную память, для этой запоминающей системы потребуются два 8-разрядных ЗУ типа 62256 по 32 Кбайта (рис. 10.30). Поскольку такое ОЗУ имеет 16 разрядов и другая схема формирует сигналы записи в банк, то адресный бит АО становится не нужен. На самом деле, в микропроцессоре 80386SX вывод адресного бита АО отсутствует.
йс памяти
491
PAL16L8	Примечание:
В микропроцессоре 80386SX вместо вывода АО используется вывод BLE
Рис. 10.30. Применение дешифратора на ПМЛ PAL16L8 для формирования отдельных стробов записи
Пример 10.6 показывает, как определить запись для диапазона адресов с использованием обозначения безразличного состояния разрядов для 16-разрядной памяти, имеющей адреса 060000Н—06FFFFH и предназначенной для микропроцессоров 80286/80386. Двоичные разряды Al—А15 микропроцессора соединяются с адресными выводами АО—А14 двух элементов памяти (U3 и U4). Дешифратор (U1), на микросхеме типа PAL16L8, используя входные сигналы адреса А23—А16, выдает на оба ЗУ разрешающий сигнал на выбор микросхем памяти каждый раз, когда на адресной шине появляется адрес 06ХХХХН. Кроме того, этот дешифратор, используя сигналы АО, ВНЕ и MWTC, формирует два отдельных сигнала строба записи для каждой из микросхем памяти.
Программа для программирования микросхемы ПМЛ типа PAL16L8 представлена в примере 10.7.
492
Глава 10
Пример 10.6. Определение записи, использующей безразличные состояния разрядов, для диапазона адресов 06000Н—06FFFH
0000	ОНО 0000	0000 0000	0000	= 06000Н
0000	ОНО 1111	НИ 1111	ни	- 06FFFII
0060	оно хххх	хххх хххх	хххх	= 06XXXXH
Пример 10.7. Программа для программирования микросхемы PAL16L8 (рис. 10.30)
TITLE Address Decoder
PATTERN Test 2
REVISION A
AUTHOR Barry B. Brey
COMPANY BreyCo
DATE	6/7/99
CHIP	DECODERS PAL16L8
pins 1 2 3 4 5 6 7 8 910
A23 A22 A21 A20 A19 A18 A17 A16 A0 GND
pins 11 12 13 14 15 16 17	18 19 20
ВНЕ SEL LWR HWR NC NC MWTC NC NC VCC
EQUATIONS
/SEL - /А23 * /А22 * /А21 * /А20 * /А19 * A18 * A17 * /А16 /LWR - /MWTC * /АО
/HWR =- /MWTC * /ВНЕ
Следует еще раз отметить, что микросхема PAL16L8 в данной схеме выполняет не только функцию выбора ЗУ, но также формирует оба отдельных строба записи для младшего и старшего банков памяти.
На рис. 10.31 показана небольшая запоминающая система для микропроцессора 8086 с микросхемами EPROM и SRAM. На этой схеме четыре микросхемы EPROM типа 27128 (16К х 8) составляют ЗУ с организацией 32К х 16 для диапазона адресов F0000—FFFFFH, а четыре микросхемы SRAM типа 62256 (32К х 8) скомпонованы в ЗУ с организацией 64К х 16 для адресов ОООООН—1 FFFFH.
Следует напомнить, что даже при 16-разрядной организации памяти ее объем по-прежнему вычисляется в байтах.
Эта схема использует сдвоенный линейный дешифратор "2-4" (74LS139), который выбирает микросхемы EPROM для одной части и SRAM — для другой части памяти. Здесь он дешифрирует 16-разрядную, а не 8-разрядную память.
Следует отметить, что сигнал строба чтения RD соединен со всеми входами разрешения выходов ОЕ микросхем EPROM и со всеми однотипными выводами G микросхем SRAM. Это сделано для того, чтобы даже при считывании микропроцессором 8086 только одной части шины данных, состоящей из восьми битов, оставшаяся часть из 8 бит данных никоим образом не влияла на его работу.
Рис. 10.31. ОЗУ на микросхемах EPROM (64 Кбайта) и SRAM (128 Кбайта) для микропроцессора 8086
Интерфейс памяти__________________________________493
D7-D0
D15 - D8
62256
62256
62256
62256
Рис. 10.32. Запоминающая система для микропроцессора 80386SX, использующая микросхему PAL16L8 в качестве дешифратора банков и формирователя отдельных стробов записи
-U
Интерфейс памяти
495
Стробы записи LWR и HWR соединяются с разными банками статической памяти. В данном случае имеет значение, как микропроцессор производит запись: выбирает ли он 16 или 8 битов. Если микропроцессор записывает в память все 16 битов, то оба сигнала LWR и HWR имеют низкий уровень, и активизируют выводы разрешения записи WE в обоих банках памяти. Однако если микропроцессор 8086 записывает лишь 8 битов, то только один из двух сигналов строба записи становится низкого уровня, и запись при этом производится только в один банк памяти. Кроме того, различие между банками может заключаться лишь во времени, необходимом для операции записи в память для каждого из банков.
Следует отметить, что при выборе дешифратора банков памяти (U7B) на микросхемах EPROM формируется сигнал WAIT, который посылается на генератор тактов ожидания микропроцессора 8086, поскольку для работы с такими микросхемами обычно требуется состояние ожидания. Этот сигнал поступает с логического элемента И-НЕ (U12), используемого для выбора дешифратора банков EPROM.
На рис. 10.32 показана схема запоминающей системы для микропроцессора 80385SX с использованием микросхемы PAL16L8 в качестве дешифратора.
Этот интерфейс содержит 256 Кбайт постоянной памяти, выполненной на четырех микросхемах EPROM типа 27512 (64К х 8), и 128 Кбайт оперативной памяти, построенной на четырех микросхемах SRAM типа 62256 (32К х 8).
Следует заметить, что микросхема PAL16L8 в этой запоминающей системе формирует также сигналы стробов записи LWR и HWR для двух банков памяти. Из этой схемы видно, что в большинстве случаев при использовании ПМЛ количество микросхем требуемых для интерфейса памяти сокращается до одной. Листинг программы для программирования микросхемы ПМЛ типа PAL16L8 приведен в примере 10.8. Эта микросхема дешифрирует 16-разрядный адрес памяти для диапазона адресов 000000Н—01 FFFFH, который предназначен для статических ЗУ, и для диапазона FC0000H—FFFFFFH, определенного для элементов EPROM.
Пример 10.8. Программа для программирования микросхемы PAL16L8, применяемой в качестве дешифратора адреса и формирователя стробов для записи запоминающей системы (рис. 10.32)
TITLES Address Decoder
PATTERN Test 3
REVISION A
AUTHOR Barry B. Brey
COMPANY BreyCo
DATE	6/8/99
CHIP	DECODERS PAL16L8
' Pins 123456789 10
MWTC АО A16 A17 A18 A19 A20 A21 A22 GND
' pins 11 12 13 14 15 16 17 18 19 20
NC HWR A23 ВНЕ LWR RB0 RBI EB0 EB1 VCC
496
Глава 10
EQUATIONS
/LWR - /MWTC * /АО
/HWR = /MWTC + /ВНЕ
/RBO	=	/А23 * /А22	+ /А21 " /А20 *	/А19 * /А18	*	/А17	*	/А16
/RBI	/А23 * /А22	* /А21 * /А20 *	/А19 + /А18	*	/А17	*	A16
/ЕВО	=	A23 + A22 *	A21 * A20 * A19	* A18 * /А17
/ЕВ1	-	A23 + A22 *	A21 * A20 * A19	+ A18 * A17
10.5.	Интерфейс памяти 32-разрядных микропроцессоров 80386DX и 80486
Интерфейс памяти для 32-разрядных микропроцессоров практически такой же, как и для 8- и 16-разрядных систем. Единственным отличием для 32-разрядной запоминающей системы является то, что в данном случае микропроцессор имеет 32-разрядную шину данных и память разделяется на четыре банка вместо одного или двух. Другое отличие заключается в том, что оба микропроцессора 80386DX и 80486 (SX и DX) имеют 32-разрядную шину данных, для которых требуются дешифраторы на микросхемах ПДУ (ПМЛ или ПЛМ) вместо интегральных дешифраторов из-за большого числа адресных битов.
Банки памяти
Организация памяти с разделением на банки для микропроцессоров 80386DX и 80486 показана на рис. 10.33.
Рис. 10.33. Организация памяти для микропроцессоров 80386 DX и 80486
Обратите внимание, что такие большие запоминающие системы имеют четыре 8-разрядных банка, каждый из которых может содержать до I Гбайта памяти. Выбор банка производится соответствующими сигналами ВЕЗ, ВЕ2, ВЕ1 и ВЕО, вырабатываемыми микропроцессорами 80386DX и 80486. Все четыре банка выбираются в момент передачи всего 32-разрядного слова данных. При передаче 16-разрядных
Интерфейс памяти 497
данных выбираются два банка (обычно ВЕЗ и ВЕ2 или ВЕ1 и ВЕО), а при передаче 8-разрядных данных выбирается лишь один банк.
Для систем памяти для микропроцессоров 80386DX и 80486, как и для микропроцессоров 8086/80286/80386SX, требуются отдельные сигналы записи для каждого банка памяти. Отдельные стробы записи, как это показано на рис. 10.34 формируются с помощью микросхемы 74LS32, состоящей из четырех двухвходовых логических элементов ИЛИ.
Рис. 10.34. Схема, формирующая отдельные сигналы записи для банков памяти 32-разрядных микропроцессоров 80386DX и 80486
Интерфейс 32-разрядной памяти
Из предыдущей дискуссии можно сделать вывод, что для интерфейса памяти микропроцессоров 80386DX и 80486 требуются: формирование четырех стробов записи в банк и дешифрирование 32-разрядного адреса. Интегральных дешифраторов, таких как 74LS138, которые могут легко согласовать интерфейс памяти для микропроцессоров 80386DX и 80486, не существует.
На рис. 10.35 показана запоминающая система с организацией 256К х 8 для микропроцессора 80486.
Следует отметить, что при дешифрировании 32-разрядной памяти адресные биты АО и Al не используются. Эти адресные биты применяются внутри микропроцессора Для формирования сигналов разблокирования банков. Обратите внимание на то, что адресная линия А2 микропроцессора соединяется с выводами АО всех микросхем памяти (U3-UI0).
Для реализации такой системы памяти используются 8 статических ЗУ (32К х 8) и Две микросхемы ПМЛ типа PAL16L8. Необходимость применения этих двух микросхем связана с тем, что 32-разрядный микропроцессор имеет много адресных выво-Д°в. Для этой системы памяти, построенной на статических ЗУ типа 62256, устанавливается диапазон адресов 02000000Н—0203FFFFH. Программа для программирования двух микросхем ПМЛ типа PAL16L8 показана в примере Ю.9.
D7 - DO
D15-D8
D23 - D16
D31 - D24.
A16 - A2
62256
62256
62256
62256
Примечание:
Символ # указывает на то, что активный сигнал имеет низкий логический уровень
си оо си
Рис. 10.35. Небольшая запоминающая система статического ОЗУ емкостью 256 Кбайт для микропроцессора 80486
Интерфейс памяти
499
: Пример 10.9. Программа для программирования двух микросхем PAL16L8 : 32-разрядной системы памяти (рис. 10.35)
TITEE	Address Decoder
PATTERN	Test 4 (PAL Ul)
REVISION	A
AUTHOR	Barry B. Brey
COMPANY	BreyCo
DATE	6/9/99
CHIP	DECODER! PAL16L8
pins 1	23	4	S6789 10
MWTC	ВЕС BE1 BE2 ВЕЗ A17 A28 A29 АЗО GND
; pins 11	1	2 13 14 15 16 17 18 19 20
A31 RBI U2 NC WRO WR1 WR2 WR3 RBO VCC	
EQUATIONS	
/WRO /MWTC	- /ВЕ0
/WR1 = /MWTC	* /ВЕ1
/WR2 = /MWTC	* /ВЕ2
/WR3 = /MWTC	+ /ВЕЗ
/RBO --- /А31	* /АЗО * /А29 * /А28 - /А17 * /U2
/RBI - /А31	* /АЗО * /А29 * /А28 * A17 * /U2
TITLE	Address Decoder
PATTERN	Test 5 (PAL U2)
REVISION	A
AUTHOR	Barry B. Brey
COMPANY	BreyCo
DATE	6/10/99
CHIP	DECODERS PAL16L8
; pins 1	2	3456789	10
AIS	Al 9	A2C A21 A22	A23 A24 A25 A26 GND
pins 11	12	13 14 15 16	17 18 19 20
A27	U2	NC NC NC NC	NC NC NC VCC
EQUATIONS
/U2 = /А27 * /А26 * А25 * /А24 * /А23 * /А22 * /А21 * /А20 * /А19 * /А18
10.6.	Интерфейс памяти 64-разрядных микропроцессоров Pentium—Pentium 4
Микропроцессоры Pentium—Pentium 4 (кроме Pentium версии Р24Т) имеют 64-раз-Рядную шину данных, для которой необходимо восемь дешифраторов (один на банк) или восемь отдельных сигналов строба записи. В большинстве систем при
500
Глава 10
интерфейсе памяти используются отдельные сигналы записи. На рис. 10.36 показана организация памяти для микропроцессора Pentium, состоящая из восьми банков.
Рис. 10.36. Организация памяти для микропроцессоров Pentium—Pentium 4
Следует отметить, что организация памяти для микропроцессора Pentium почти идентична памяти для микропроцессора 80486, за исключением наличия восьми банков, вместо четырех.
Отдельные сигналы строба записи формируются за счет объединения по схеме ИЛИ сигналов разрешения банков ВЕО —ВЕ7 и сигнала MWTC, который в свою очередь формируется из сигналов М/Ю с W/R микропроцессора. Схема, формирующая отдельные сигналы записи для банков памяти для 64-разрядного микропроцессора, показана на рис. 10.37.
Следует заметить, что, как правило, для формирования отдельных сигналов записи в банки памяти используется микросхема ПМЛ.
Интерфейс памяти
501
Рис. 10.37. Схема формирования отдельных стробов записи для системы памяти, предназначенной для микропроцессоров Pentium—Pentium 4
Интерфейс 64-разрядной памяти
На рис. 10.38 показана небольшая запоминающая система Pentium—Pentium 4. Эта система использует одну микросхему PAL16L8 для дешифрирования адреса памяти и другую для формирования отдельных сигналов записи в банки. Система памяти состоит из восьми микросхем EPROM типа 27512 (64К х 8), которая предназначена ДДя микропроцессоров Pentium—Pentium 4 и имеет следующий диапазон адресов FFF80000H —FFFFFFFH. Общая емкость памяти емкостью 512 Кбайт организована так, что каждый банк содержит одну микросхему памяти.
Следует отметить, что микропроцессор Pentium обладает 32-разрядной шиной адреса и может иметь память емкостью до 4 Гбайт, а вот микропроцессоры Pentium Pro—Pentium 4 с 36-разрядной шиной адреса могут иметь память емкостью Уже до 64 Гбайт. Поэтому при использовании представленной схемы для микропроцессоров с 36-разрядной шиной адреса Pentium Pro—Pentium 4 необходимо добавить
502
Глава 10
соответственно четыре линии адреса А32—А36 и изменить программу для программирования микросхемы ПМЛ типа PAL16L8 (Ul), применяемой в качестве дешифратора.
Дешифрирование представленной на схеме системы памяти аналогично предыдущим примерам, за исключением того, что в данной схеме пренебрегаются три
D24 - D31
для микропроцессоров Pentium—Pentium 4

Интерфейс памяти 503
младшие бита адреса (А2—АО) микропроцессоров Pentium—Pentium 4. Эти три разряда используются внутри микропроцессоров для формирования сигналов разрешения банков памяти ВЕО —ВЕ7, с помощью которых и выполняется обращение к конкретному банку при операции записи.
Поэтому адресный вход АО каждого ЗУ соединяется с адресным выводом АЗ микропроцессора Pentium—Pentium 4, адресный вход А1 каждого ЗУ соединяется с адресным выходом А4 микропроцессора и т. д. Такие смещенные адресные соединения продолжаются до адресного входа А15 памяти с адресным выводом А18 микропроцессора. Линии адреса А19—А28 микропроцессора дешифрируются микросхемой U2, а линии А29—А31 микросхемой U1. Программа для программирования обеих микросхем ПМЛ типа PAL16L8 (U1 и U2) приведена в примере 10.10 для диапазона адресов FFF80000H—FFFFFFFFH.
Пример 10.10. Программа для программирования двух микросхем ПМЛ типа PAL16L8, предназначенных для дешифрирования адреса системы памяти 64-разрядного микропроцессора
TITLE PATTERN	Address Decoder Test 6 (PAL U1)
REVISION	A
AUTHOR	Barry B. Brey
COMPANY	BreyCo
DATE	6/11/99
CHIP	DECODERS PAL16L8
; plns 1	2	3456789	10
A29	АЗО A31 NC NC NC NC NC NC GND
; pins 11	12	13 14 15 16 17 18 19 20
U?	CE NC NC NC NC NC NC NC VCC
EQUATIONS	
/СЕ = /U2 *	A29 * АЗО * A31
TITLE	Address Decoder
PATTERN-	Test 7 (PAL U2)
REVISION	A
author	Barry B. Brey
COMPANY	BreyCo
DATE	6/12/99
CHIP	DECODER7 PAL16L8
/’ pins 1	23456789	10
Al 9	A20 A21 A22 A23 A24 A25 A26 A27 GND
' pins 11	12	13 14	15 16 17 18 19 20
A28	NC NC NC NC NC NC NC U2 VCC
equations
/U2 = А12
А20 * А21 * А22 * А23 * А24 * А25 * А26 * А27 * А28
504
Глава 10
10.7.	Динамические запоминающие устройства
Поскольку ОЗУ часто бывает большой емкости, то для его реализации требуется много микросхем SRAM (статических ЗУ) по большой цене или DRAM (динамических ЗУ) по гораздо меньшей стоимости. Динамическое ЗУ, кратко охарактеризованное в разд. 10.1, представляет собой в некоторой степени довольно сложную систему, поскольку ему требуются мультиплексирование адреса и регенерация. К счастью, производители ИС предусмотрели контроллер динамической памяти, включающий адресные мультиплексоры и необходимые для ршенерации схемы.
Динамические ЗУ в этом разделе рассматриваются более подробно, чем в разд. 10.1, и в нем дается информация об использовании в системах памяти специального контроллера.
Повторное рассмотрение динамического ЗУ
В разд. 10.1 упоминалось, что динамическое ЗУ сохраняет данные в течение 2—4 мс и требуез мультиплексирования адресных входов. Хотя мультиплексирование адреса уже рассмотрено в разд. 10.1, здесь более подробно разобрано функционирование динамического ЗУ в период регенерации. Ранее говорилось, что информация в динамическом ЗУ, должна периодически восстанавливаться, поскольку в этих устройствах данные сохраняются с помощью конденсаторов небольшой емкости, которые через короткий промежуток времени разряжаются. Чтобы восстановить информацию динамического ЗУ, его содержимое должно периодически считываться или записываться. Каждое считывание или запись восстанавливает всю секцию динамического ЗУ. Количество восстанавливаемых битов зависит от объема участка памяти и ее внутренней организации. Циклы регенерации производятся во время считыва-ния/записи данных или специальными восстанавливающими циклами без считыва-ния/записи данных. Цикл регенерации свойственен для динамической памяти и производится внутри нее независимо и во время функционирования других компонентов системы. Такой вид регенерации памяти называется скрытой регенерацией (hidden refresh), "прозрачной" регенерацией (transparent refresh) или, иногда, захватом цикла (cycle stealing).
При скрытой регенерации (в период функционирования других элементов памяти) необходим только один цикл сигнала RAS , который стробирует адрес строки в динамическое ЗУ, чтобы выбрать строку данных для регенерации. Сигнал RAS производит также внутреннее считывание/запись выбранной строки. За счет этого перезаряжаются внутренние конденсаторы, которые хранят данные. Этот вид регенерации скрыт от системы, поскольку он происходит в то время, когда микропроцессор производит считывание или запись других участков памяти.
Внутренняя структура микросхемы DRAM содержит ряд строк и колонок. Например, динамическое ЗУ с организацией 256К х 1 (рис. 10.39) имеет матрицу памяти, состоящую из 256 строк и 1024 разрядов в каждой (256 внутренних 1024-разрядных слов) или, иначе, из четырех матриц по 64 Кбита в каждой. При адресации ячейки памяти адрес столбца выбирает один из 1024 столбцов.
АО А1 А2 АЗ А4 А5 А6 А7 А8
RAS
CAS
WE
2. Мультиплексор “256 - Г.
3. Мультиплексор “4 - Г.
Рис. 10.39. Внутренняя структура динамического ЗУ с организацией 256К х 1
Интерфейс памяти__________________________________________505
506
Глава 10
Обратите внимание на то, чю ЗУ большого объема сконструированы подобно рассмотренному устройству с организацией 256К х I. Разница, обычно, состоит лишь в емкости матрицы или их количестве.
На рис. 10.40 показана временная диаграмма цикла регенерации, выполняемого с помощью только сигнала RAS .
Рис. 10.40. Временная диаграмма цикла регенерации для микросхемы DRAM типа TMS4464
Разница между циклом регенерации, выполняемого с помощью только сигнала RAS , и цикла чтения или записи состоит только в применении адреса регенерации, который обычно получают от 7- или 8-разрядного двоичного счетчика. Размер счетчика определяется типом динамического ЗУ. Значение счетчика регенерации наращивается в конце каждого цикла регенерации, таким образом в зависимости от типа микросхемы DRAM все строки регенерируются за 2 или 4 мс.
Для регенерации 256 строк в течение 4 мс (как это выполняется в случае микросхемы DRAM с организацией 256К х 1) восстанавливающий цикл должен активизироваться один раз каждые 15,6 мкс, чтобы соответствовать требованиям регенерации. Например, для микропроцессоров 8086/8088, работающих на частоте 5 МГц, требуется 800 нс, чтобы осуществить операцию чтения или записи. Поскольку для микросхемы DRAM цикл регенерации должен активизироваться каждые 15,6 мкс, то для каждых 19 операций чтения или записи в память микросхема должна выполнить цикл регенерации, иначе данные будут потеряны. Это выражается в потере 5% компьютерного времени — небольшой платы за экономию от использования для оперативной памяти микросхем DRAM вместо микросхем SRAM.
Память EDO
Незначительная модификация конструкции динамического ЗУ превращает его в устройство с расширенным выходом данных или, иначе, устройство DRAM типа EDO (extended data output). Доступ к памяти в EDO DRAM (включая регенерацию) осуществляется к 256 битам, фиксируемым в соответствующей защелке по сигналу RAS. Таким образом, эти защелки удерживают не только требуемые данные, как правило, — байт, два или четыре байта, но и следующие информационные биты. Поэтому для большинства последовательно выполняемых программ данные уже будут доступны и не потребуют дополнительного времени для их получения. Такая
Интерфейс памяти	507
небольшая модификация внутренней структуры микросхем DRAM повышает эффективность системы при их использовании на 15—25%.
Синхронное динамическое ЗУ (SDRAM)
Синхронное динамическое ЗУ, или иначе SDRAM (synchronous DRAM), используется в большинстве современных систем из-за их высокой скорости работы. Имеются версии с временами доступа: 10 нс для использования с системной шиной, работающей на частоте 66 МГц, и 8 нс для использования с системной шиной на 100 МГц. Такие малые значения времени доступа могут навести на мысль, что эти ЗУ функционируют без состояний ожидания, но это не так. Следует учитывать, что время доступа микросхемы DRAM, как правило, составляет 60 нс, а микросхемы SDRAM — 10 нс. Указанное в характеристиках для микросхем SDRAM время доступа, равное 10 нс, вводит в заблуждение, поскольку на самом деле оно применительно только ко второму, третьему и четвертому считываниям из 32-разрядного ЗУ. Например, обозначение 5-1-1-1 означает, что для считывания первого байта данных необходимо пять тактов микропроцессора, а для считывания каждого из трех последующих байтов — один такт. Первое же считывание данных требует такого же количества времени, как и для стандартной микросхемы DRAM.
В настоящее время, когда микропроцессором выполняется пакетный цикл чтения данных из микросхемы SDRAM, требуется, как правило, 3—4 тактов шины, чтобы выполнить считывание первого байта данных. Считывание каждого последующего байта производится без состояний ожидания и за один цикл шины. Поскольку пакеты синхронного динамического ЗУ считывают четыре байта (для 32-разрядной памяти), а со второго по четвертый не требуется никакого состояния ожидания, и каждое считывание может производиться за один цикл шины, то микросхемы SDRAM превосходят по своим характеристикам микросхемы DRAM или EDO DRAM. Это означает, что если для считывания первого байта требуются три цикла шины и еще три для последующих трех, то всего для считывания четырех байт нужно шесть тактов шины. Если сравнивать с динамического ЗУ, которому требуется по три такта на байт или 12 тактов, то можно видеть увеличение скорости. Эффективность микросхем SDRAM, по большинству оценок, выше на 10%, чем EDO DRAM.
Контроллеры динамического ЗУ
в большинстве систем интегральные схемы контроллеров динамического ЗУ выполняют функцию мультиплексирования адреса и формирования управляющих сигналов для микросхем DRAM. Некоторые версии микропроцессоров, например, такие как 80186/80188, включают схемы регенерации как часть микропроцессора. Ввиду большой сложности некоторых современных контроллеров динамического ЗУ в этом тексте подробно рассматривается только контроллер типа 82С08 корпорации Intel, который способен управлять до двух банков памяти DRAM (256К х 16). Для Микропроцессора 8086 или микропроцессоров 80286/80386SX емкость памяти может быть увеличена до 1 Мбайта. Контроллер 82С08 имеет мультиплексор адреса, который передает 18-разрядный адрес на 9-разрядные выводы микросхем памяти емкостью 256К. На рис. 10.41 показано расположение выводов контроллера динамического ЗУ типа 82С08.
508
Глава 10
82С08
I7
2!
7
42
41
_5 4
27
28
6
32
AL0	AGO
AL1	AO1
AL2	AO2
AL3	AO3
AL4	AO4
AL5	AO5
AL6 AL7	AO6 AO7
AL8 АНО	AO8
АН1	RASO
АН2	RAS1
АНЗ	CASO
АН4 АН5	CAS1
АН6	AA/XA
АН7 АН8 RD WR RESET >CLK PCTL PE BS RFRQ PDI	WE/PCK
21
2I
12
7.
8
15
16
Рис. 10.41. Расположение выводов контроллера динамического ЗУ типа 82С08, который может управлять двумя банками памяти
Адресные входы для младших девяти разрядов обозначены как ALO—AL8, а для девяти старших разрядов АНО—АН8. Девять адресных выходов, подаваемых на динамические ЗУ, обозначены АОО—АО8. Контроллер 82С08 имеет схему, которая для двух банков памяти динамических ЗУ генерирует свою пару сигналов CAS и RAS. Эти сигналы формируются внешними системными сигналами SI, S2 и CLK.
Следует отметить, что сигналы SI и S2, вырабатываемые системой, подаются, соответственно, на вводы RD и WR контроллера динамического ЗУ типа 82С08. Сигнал с вывода АА / ХА является сигналом подтверждения, используемого для подтверждения состояния готовности устройства и передаваемого в микропроцессор. Этот вывод обычно соединяется с входом READY микропроцессора или входом RDYl (RDY2) генератора синхронизирующих импульсов.
На рис. 10.42 показана схема соединения контроллера динамического ЗУ типа 82С08 к группе из четырех модулей SIMM с организацией 256К х 8 (41256А8), которые составляют запоминающую систему микропроцессора 80286 емкостью в I Мбайт.
Модули ЗУ U3 и U4 формируют верхний банк памяти, a U5 и U6 — нижний банк. Дешифратор на микросхеме ПМЛ типа PAL16L8, используя сигнал WE контроллера 82С08 и сигнал АО, вырабатывает сигнал записи в младшую часть банка памяти (U4 и U6), а используя тот же сигнал WE и сигнал ВНЕ, формирует сигнал записи в старшую часть банка памяти (U3 и U5). Кроме того, этот дешифратор, объединяя сигнал М/Ю с адресными линиями А20—А23, формирует также сигнал РЕ выбора микросхемы контроллера динамического ЗУ, чтобы дешифрировать область памяти
Рис. 10.42. Запоминающая система на 1 Мбайт с использованием четырех модулей SIMM
и контроллера динамического ЗУ типа 82С08. Данная область памяти дешифрируется микросхемой ПМЛ типа PAL16L8 для диапазона адресов 000000Н—OFFFFFH
<—I
510
Глава 10
Пример 10.11. Программа для программирования микросхемы типа PAL16L8 для схемы запоминающей системы емкостью 1 Мбайт (рис. 10.42)
TITLE pattern	Address Decoder Test 7
revision	a AUTHOR	Barry B.	Brey COMPANY	BreyCo DATE	6/14/99 CHIP	DECODER?	PAL16L8	
; pins	123456789	10 WE ВНЕ АО A20 A21	A22 A23 NC NC GND
; pins	11	12	13	14	15	16	17	18	19	20 MIO	NC	NC	NC	NC	NC	HWR	LWR	PE	VCC
EQUATIONS
/HWR = /ВНЕ		* /WE	
/LWR	= /А0 *	' /WE	
/РЕ -	 /А20 *	r /А21 * /А22	* /А23 * MIO
Итоги
□	Все ЗУ имеют адресные входы, входы и выходы или просто выходы данных; один вывод для выбора микросхемы и один или более выводов для управления операциями с памятью.
□	Адресные выводы в элементах памяти используются для выбора одной из множества ячеек памяти в ЗУ. Десять сигналов на адресных выводах ЗУ составляют 1024 возможных комбинаций и, следовательно, способны адресовать 1024 разных ячеек памяти.
□	Выводы данных в ЗУ используются для ввода сохраняемых в ячейке памяти данных и для извлечения информации, считываемой из ячейки памяти. Производители описывают свои ЗУ в зависимости от их организации, например, как 4К х 4. Это означает, что ЗУ имеет 4К (4096) 4-разрядных ячеек памяти.
□	Выбор ЗУ осуществляется с помощью вывода выбора кристалла (CS), имеющегося на многих микросхемах RAM, или разрешения кристалла (СЕ) — на микросхемах EPROM или ROM.
□	Функции чтения и записи для микросхем ЗУ задаются соответствующими управляющими сигналами. Данные считываются из памяти по активному сигналу на одноименном выводе разрешения выходов (ОЕ), на который обычно подается системный сигнал считывания (RD или MRDC). Вывод разрешения записи (WE), предназначенный для управления записью данных, обычно подключается к системному сигналу записи ( WR или MWTC).
Интерфейс памяти	511
д Микросхемы EPROM программируются программатором и могут стираться УФ-излучением. В настоящее время имеются микросхемы EPROM различной емкости от I до 128 Кбайт и большей.
0 Флэш-память (EEPROM) программируется в системе с использованием программирующего импульса напряжением 12 В.
Статическое ЗУ (SRAM) сохраняет данные в течение всего времени подачи на него электропитания. Имеются микросхемы ЗУ такого типа емкостью до 128 Кбайт.
О Динамическое ЗУ (DRAM) удерживает данные только на короткий промежуток времени, обычно 2—4 мс. Это создает проблемы для разработчика запоминающей системы, поскольку для микросхем DRAM необходимо периодически обновлять информацию. Динамические ЗУ также имеют мультиплексированные адресные входы, для которых требуется внешний мультиплексор, подающий на них адрес за два раза (каждая часть адреса поступает в определенное время).
О Дешифраторы адреса памяти предназначены для выбора микросхем постоянной или оперативной памяти для конкретного участка памяти. Имеющиеся сегодня дешифраторы адреса в интегральном исполнении включают: линейный дешифратор "3—8" (74LS138), линейный дешифратор "2—4 (74LS139) и программируемую логику в виде микросхем ППЗУ (PROM) или ПДУ (PLD).
О Дешифраторы адреса на микросхемах ППЗУ и ПЛУ для таких микропроцессоров, как 8088 и вплоть до Pentium 4, снижают общее количество ИС, необходимых для реализации запоминающей системы.
О Интерфейс памяти для минимального режима работы микропроцессора 8088 содержит 20 адресных линий, восемь линий данных и три управляющих линии: RD, WR и Ю/М . Система памяти для микропроцессора 8088 функционирует исправно только при использовании всех этих линий.
□	Время доступа к данным для микросхем EPROM должно быть согласовано с микропроцессором, к которому они подключены. Многие существующие сегодня микросхемы EPROM имеют значение времени доступа 450 нс, которое слишком велико для микропроцессора 808$, работающего с частотой 5 МГц. Чтобы обойти эту проблему, добавляется такт ожидания (200 нс) для увеличения времени доступа к памяти до 660 нс.
О Во многих современных микрокомпьютерных системах на базе микропроцессора зачастую применяются устройства контроля по четности. При этом для каждого байта данных памяти добавляется дополнительный бит контроля, который приводит к тому, что микросхемы ЗУ становятся 9-разрядными вместо обычных 8-разрядных.
Кроме того, для существующих запоминающих систем применяются специальные схемы исправления ошибок памяти, но для таких систем требуется хранение еще большего количества битов. Например, при хранении 8-разрядных данных в схемах с исправлением ошибок требуется обычно 13 битов памяти: пять битов Для кода проверки ошибок и восемь для данных. Большинство ИС для систем памяти с исправлением ошибок способны исправлять только ошибку в одном разряде.
О Интерфейс памяти для микропроцессоров 8086/80286/80386SX имеет 16-разряд-ную шину данных и содержит управляющий сигнал М/Ю, тогда как интерфейс
512	Гпава ю
для микропроцессора 8088 имеет 8-разрядную шину данных и содержит сигнал Ю/М . Кроме этих изменений, имеется и дополнительный управляющий сигнал ВНЕ (bus high enable) разрешения старшего байта шины данных.
О Организация памяти микропроцессоров 8086/80286/80386SX включает два 8-разрядных банка: старший и младший банки. Доступ к старшему банку памяти разрешается управляющим сигналом ВНЕ , а к младшему банку данных — адресным сигналом АО или управляющим сигналом BLE.
□	Существуют две основные схемы выбора банков в системе на базе микропроцессоров 8086/80286/80386SX, которые содержат: I) отдельный дешифратор для выбора каждого банка и 2) отдельные стробы записи WR для каждого банка.
□	Интерфейс памяти для микропроцессоров 80386DX и 80486 имеет 32-разрядную шину данных и адреса. Вследствие этого система памяти для этих микропроцессоров состоит из четырех банков памяти по 8 бит в каждом. Сигналы выбора банков (ВЕЗ, ВЕ2, ВЕ1 и ВЕО) формируются микропроцессором.
О Интерфейс памяти для микропроцессоров Pentium—Pentium 4 имеет 64-раз-рядную шину данных и 32-разрядную шину адреса для Pentium и 36-разрядную шину адреса для Pentium Pro—Pentium 4. Вследствие этого система памяти для этих микропроцессоров состоит из восьми банков памяти по восемь бит в каждом. Восемь сигналов выбора банков (ВЕ7 —ВЕО) формируются микропроцессором.
□	Контроллеры динамического ЗУ предназначены для управления элементами памяти динамического ОЗУ. Сегодня многие контроллеры динамического ЗУ содержат адресные мультиплексоры, счетчики и схемы для осуществления регенерации памяти.
Контрольные вопросы и задания
1.	Какие типы выводов являются общими для всех микросхем памяти?
2.	Назовите количество ячеек памяти для ЗУ, имеющего следующее количество адресных выводов: а) 8 б) 11 в) 12 г) 13
3.	Назовите количество ячеек памяти, число битов в каждой ячейке и общий объем для ЗУ, имеющих следующую организацию: а) 2К х 8
б)	1К х 8
в)	4К х 8
г)	16К х 8
д)	64К х 8
^терфейс памяти 513
4	Какое назначение имеют выводы CS или СЕ в микросхеме памяти?
5	Какое назначение имеет вывод ОЕ в микросхеме памяти?
5	Какое назначение имеет вывод WE в микросхеме памяти?
7	Сколько байтов могут хранить следующие типы микросхем EPROM?
а)	2708
б)	2716
в)	2732
г)	2764
д)	27128
8.	Почему микросхема EPROM со значением времени доступа 450 нс не работает напрямую с микропроцессором 8088 с тактовой частотой 5 МГц?
9.	Что можно сказать относительно времени стирания и записи ячейки в ЗУ флэш-памяти?
10.	К какому типу ЗУ относится акроним SRAM?
11.	Микросхема памяти SRAM типа 4016 имеет выводы G , S и W . Для чего в этом ЗУ используются эти выводы?
12.	Какое время доступа к памяти имеет самое медленное ЗУ типа 4016 среди микросхем SRAM?
13.	К какому типу ЗУ относится акроним DRAM?
14.	Микросхема типа TMS4464 имеет восемь адресных выводов, однако он является динамическим ЗУ на 64К ячеек. Объясните, каким образом 16-разрядный адрес поступает на восемь адресных входов.
15.	Какое назначение имеют выводы CAS и RAS в микросхеме DRAM?
16.	Сколько требуется времени для регенерации типовой микросхемы DRAM?
17.	Почему важны дешифраторы адреса памяти?
18.	Модифицируйте схему дешифратора на логическом элементе И-НЕ, показанную на рис. 10.13, так, чтобы она выбирала область памяти для диапазона адресов DF800H— DFFFFH.
19.	Модифицируйте схему дешифратора на логическом элементе И-НЕ, показанную на рис. 10.13, так, чтобы она выбирала область памяти для диапазона адресов 40000Н— 404FFH.
20.	Что происходит с выходами линейного дешифратора "3-8" (74LS138), когда на выводе G1 присутствует сигнал высокого уровня, а на G2A и G2B — сигналы низкого уровня?
21.	Измените схему на рис. 10.15 так, чтобы адресовать область памяти в диапазоне адресов 70000H-7FFFFH.
22.	Измените схему на рис. 10.15 так, чтобы адресовать область памяти в диапазоне адресов 40000H-4FFFFH.
23.	Опишите дешифратор типа 74LS139.
24.	Почему часто в системах памяти используется адресный дешифратор на микросхемах ППЗУ?
25.	Измените габл. 10.13 для программирования микросхемы ППЗУ так, чтобы она дешифрировала область памяти в диапазоне адресов 80000Н—8FFFFH.
26.	Измените табл. 10.13 для программирования микросхемы ППЗУ так, чтобы она дешифрировала область памяти в диапазоне адресов 30000Н—3FFFFH.
17 '*ак 384
514 Глава 1р
27.	Измените схему на рис. 10.19 посредством перезаписывания программы для микросхемы ПМЛ, так чтобы система памяти работала в диапазоне адресов 40000Н—4FFFFH.
28.	Измените схему на рис. 10.19 посредством перезаписывания программы для микросхемы ПМЛ, так чтобы система памяти работала в диапазоне адресов B0000H —BFFFFH.
29.	Какими управляющими сигналами максимального режима работы микропроцессора 8086 заменяются управляющие сигналы RD и WR его минимального режима работы?
30.	Видоизмените схему на рис. 10.20 так, чтобы система памяти работала в диапазоне адресов 68000H-6FFFFH.
31.	Видоизмените схему на рис. 10.20, чтобы выбрать восемь микросхем EPROM типа 2764 имеющих организацию 8К х 8, работающих в диапазоне адресов 10000Н—1 FFFFH.
32.	Добавьте другой дешифратор к схеме на рис. 10.21 так, чтобы добавить 8 микросхем SRAM типа 62256, работающих в диапазоне адресов C0000H—FFFFFH.
33.	Объясните, каким образом осуществляется сохранение битов проверки на нечетность и как они проверяются.
34.	Схема 74LS636 исправления и обнаружения ошибок памяти содержит проверочный (контрольный) код для каждого байта. Сколько разрядов необходимо для контрольного кода?
35.	Какое назначение имеет вывод SEF микросхемы 74LS636?
36.	Схема 74LS636 исправляет___неправильных разрядов.
37.	Какое основное отличие шин микропроцессоров 8086 и 8088?
38.	Какое назначение выводов ВНЕ и АО на микропроцессоре 8086?
39.	Каково назначение вывода BLE и какой вывод он заменил?
40.	Какие два метода используются для выбора памяти в системе на микропроцессоре 8086?
41.	Если сигнал ВНЕ имеет низкий логический уровень, то выбирается_банк памяти.
42.	Если сигнал АО имеет низкий логический уровень, то выбирается_банк памяти.
43.	Почему нет необходимости в формировании отдельных стробов чтения ( RD ) для банков интерфейса памяти микропроцессора 8086?
44.	Видоизмените схему на рис. 10.31 так, чтобы микросхемы EPROM были определены в диапазоне адресов C0000H—CFFFFH, а микросхемы SRAM — в диапазоне адресов 30000H-4FFFFH.
45.	Разработайте интерфейс 16-разрядной памяти для микропроцессора 80386SX на микросхемах SRAM, работающий в диапазоне адресов 200000Н—21 FFFFH.
46.	Разработайте интерфейс 32-разрядной памяти на микросхемах EPROM, работающих в диапазоне адресов FFFF0000H—FFFFFFFFH.
47.	Разработайте 64-разрядную систему памяти для микропроцессоров Pentium—Pentium 4 с микросхемами EPROM для диапазона адресов FFF00000H—FFFFFFFFH и микросхемами SRAM для диапазона адресов 00000000Н—003FFFFFH.
48.	Что такое цикл регенерации только с единственным сигналом RAS ?
49.	Может ли производиться регенерация микросхем DRAM при одновременном функционировании других участков памяти?
50.	Если микросхеме DRAM с организацией IM х 1 требуется 4 мс для регенерации и обновления данных в 256 строках, то до следующего цикла регенерации строки проходит не более ______.
51.	Каким образом контроллер динамического ЗУ типа 82С08 применяет адрес памяти?
52.	Какое назначение имеет вывод BS контроллера динамического ЗУ типа 82С08?
53.	Какой сигнал обычно подается на вывод WR контроллера динамического ЗУ типа 82С08?
ГЛАВА 1 1
Базовый интерфейс ввода-вывода
Введение
Микропроцессор великолепен при решении задач, но без общения с внешним миром он мало чего стоит. Эта глава, в общем, посвящена базовым методам обмена информацией (последовательному и параллельному) между человеком или машиной и микропроцессором. Вначале в этой главе мы знакомим с основами интерфейса ввода-вывода и обсуждаем дешифрирование устройств ввода-вывода. Затем подробно рассматривается параллельный и последовательный интерфейс, которые оба имеют множество применений. Кроме того, в качестве примеров в этой главе представлены схемы подключения аналого-цифрового преобразователя (АЦП) и цифро-аналогового преобразователя (ЦАП), а также двух видов двигателей (постоянного тока и шагового) к микропроцессору.
Темы главы
После ознакомления с данной главой вы сможете:
□	объяснить функционирование базовых интерфейсов ввода-вывода;
□	дешифрировать 8-, 16- и 32-разрядные устройства ввода-вывода, так что их можно будет использовать с любым адресом порта ввода-вывода;
□	объяснить квитирование при передаче данных и объяснить его использование с устройствами ввода-вывода;
□	подключать и программировать микросхему программируемого параллельного интерфейса типа 82С55;
О подключить жидкокристаллические и светодиодные индикаторы, клавиатуры, АЦП, ЦАП и другие устройства к микросхеме 82С55;
□	подключать и программировать микросхему контроллера клавиатуры/дисплея типа 8279;
□	подключать и программировать микросхему адаптера последовательной передачи Данных типа 16550;
□	подключать и программировать микросхему интервального таймера типа 8254;
□	подключить АЦП и ЦАП к микропроцессору;
подключать шаговые двигатели и двигатели постоянного тока к микропроцессору.
516 Гпава 11
11.1. Введение в интерфейс ввода-вывода
В этом разделе текста объясняются операции, выполняемые командами ввода-вывода (in, ins, out и outs). Кроме того, объясняется концепция изолированного иногда называемого прямым вводом-выводом, и ввода-вывода, отображаемого в памяти, а также основы интерфейсов ввода-вывода и квитирование. Практическое знание этих тем облегчит понимание подключения и функционирования программируемых элементов интерфейса, а также методов ввода-вывода, представленных в разных разделах этой главы и книги.
Команды ввода-вывода
Набор команд содержит один тип указаний по передаче информации на устройство ввода-вывода (оит), а другой — для считывания информации из устройства ввода-вывода (in). Команды ins и outs во всех их возможных модификациях используются всеми процессорами корпорации Intel, кроме микропроцессоров 8086/8088, предназначены также для передачи строк данных между памятью и устройством ввода-вывода. В табл. II.I перечислены все имеющиеся возможные варианты для этих двух команд ввода-вывода.
Таблица 11.1. Команды ввода-вывода
Команда	Разрядность данных	Описание
IN AL,p8	8	Байт вводится из порта р8 в регистр AL
IN АХ,р8	16	Слово вводится из 2 портов р8 и р8 + 1 в регистр АХ
IN ЕАХ,р8	32	Двойное слово вводится из 4 портов с р8 по р8 + 3 в регистр ЕАХ
IN AL,DX	8	Вводится байт из порта, адресуемого регистром DX, в регистр AL
IN AX, DX	16	Вводится слово из 2 портов, адресуемых регистром DX и DX + 1, в регистр АХ
IN EAX,DX	32	Вводится двойное слово из 4 портов, адресуемых начиная с регистра DX по регистр DX + 3, в регистр ЕАХ
INSB	8	Вводится байт из порта, адресуемого регистром DX, в ячейку памяти сегмента дополнительных данных, адресуемую регистром DI, после чего Dl = DI ± 1
INSW	16	Вводится слово из 2 портов, адресуемых регистром DX и DX + 1. в ячейку памяти сегмента дополнительных данных, адресуемую регистром DI, после чего Dl = DI ± 2
INSD	32	Вводится двойное слово из 4 портов, адресуемых начиная с регистра DX по DX + 3, в ячейку памяти сегмента дополнительных данных, адресуемую регистром DI, после чего Dl = DI ± 4
OUT p8,AL	8	Вывод байта из регистра AL в порт р8
OUT p8,AX	16	Вывод слова из регистра АХ в 2 порта р8 и р8 + 1	
базовый интерфейс ввода-вывода	517
—-—'	Таблица 11.1 (окончание)	
		 Команда	Разрядность данных	Описание
-— OUT pS,EAX	32	Вывод двойного слова из регистра ЕАХ в 4 порта, начиная с р8 по р8 + 3
OUT DX,AL	8	Вывод байта из регистра AL в порт, адресуемый регистром DX
OUT DX,AX	16	Вывод слова из регистра АХ в 2 порта, адресуемых регистрами DX и DX + 1
OUT DX, EAX	32	Вывод двойного слова из регистра ЕАХ в 4 порта, адресуемых начиная с регистра DX по регистр DX + 3
CUT SB	8	Вывод байта из ячейки памяти сегмента данных, адресуемый регистром SI в порт, адресуемый регистром DX, после чего SI = SI±1
OUTSW	16	Вывод слова из ячейки памяти сегмента данных, адресуемый регистром SI в 2 порта, адресуемых регистром DX и DX + 1, после чего SI = SI ± 2
OUTSD	32	Вывод двойного слова из ячейки памяти сегмента данных, адресуемый регистром SI в 4 порта, адресуемых начиная с регистра DX по DX + 3, после чего SI = SI ± 4
Обе команды in и out передают данные между устройством ввода-вывода и аккумулятором микропроцессора — регистрами al, ах и еах. Адрес команды ввода-вывода хранится в регистре DX как 16-разрядный адрес или в байте (р8) сразу после кода операции как 8-разрядный адрес порта или, иначе, номер порта. Корпорация Intel называет 8-разрядную форму (р8) фиксированным адресом, поскольку он хранится с командой, обычно в ПЗУ. 16-разрядный адрес в регистре DX называется переменным адресом, поскольку он хранится в DX и затем используется для адресации устройства ввода-вывода. Другими командами, используемыми регистр DX для адресации устройства ввода-вывода, являются команды ins и outs. Команды системы ввода-вывода, использующие для адресации регистр DX, являются командами с косвенной адресацией, а команды, использующие фиксированный адрес, являются командами с прямой адресацией.
Адрес ввода-вывода при передаче данных с использованием команды in или out, часто называемый номером порта (или просто портом), появляется на адресной шине. Внешний интерфейс ввода-вывода декодирует номер порта тем же способом, как он декодирует адреса памяти. Фиксированный 8-разрядный номер порта (р8) появляется на линиях адресной шины А7—АО, а старшие разряды А15—А8 при этом равны нулю. Адресные линии свыше А!5 для команд ввода-вывода неопределенны. Адрес устройства ввода-вывода, задаваемый регистром DX, является 16-разрядным и использует все адресные линии А15—АО, предназначенные для этих устройств. Это означает, что первые 256 адресов устройств ввода-вывода (ООН—FFH) доступны для обоих типов команд ввода-вывода, использующих фиксированный и переменный аДрес. При этом адреса в диапазоне от 01 ООН и до FFFFH доступны только для переменного адреса системы ввода-вывода. Во многих специализированных системах Дешифрируются только крайние правые восемь разрядов адреса, что уменьшает количество требуемых для этого схем. В персональном компьютере дешифрируются
518
Глава 1 у
все 16 разрядов адресной шины для диапазона адресов 0000Н—ОЗХХН. Они являются адресами ввода-вывода, используемыми для ввода-вывода внутри персонального компьютера (ПК) для шины ISA.
Команды ins и outs адресуют устройство ввода-вывода с использованием регистра DX, но не передают данные между аккумулятором и устройством ввода-вывода как команды in и оит. Вместо этого, они передают данные между памятью и устройством ввода-вывода. Адрес памяти расположен в регистровой паре ES:DI для команды ins и DS:SI для команды outs. Что касается других строковых команд, то содержимое указателей увеличивается или уменьшается, на что указывает флаг направления (DF — direction flag). Обе команды ins и outs могут использоваться вместе с префиксом повтора rep, допускающим передачу блоков данных между системой ввода-вывода и памятью, составляющих более одного байта, слова или двойного слова.
Изолированный и отображаемый в памяти ввод-вывод
Существует два разных способа взаимодействия системы ввода-вывода и микропроцессора: изолированный ввод-вывод (isolated I/O) и отображаемый в памяти ввод-вывод (memory mapped I/O). При изолированном вводе-выводе команды in, ins, out и outs передают данные между аккумулятором микропроцессора или памятью и устройством ввода-вывода. При отображаемом в памяти вводе-выводе любая команда со ссылкой на ячейку памяти может осуществлять передачу. Используются оба метода: изолированный и отображаемый в памяти ввод-вывод, и поэтому они оба обсуждаются далее в этом тексте.
Изолированный ввод-вывод
Наиболее общим методом передачи информации от устройства ввода-вывода, используемым в системе на базе микропроцессора Intel, является изолированный ввод-вывод. Термин изолированный характеризует, каким образом ячейки ввода-вывода в адресном пространстве системы ввода-вывода изолируются от запоминающей системы. На рис. 11.1 показаны оба адресных пространства (изолированное и отображаемое в памяти) для любого микропроцессора Intel 80x86 или Pentium-Pentium 4. Адреса изолированных устройств ввода-вывода, называемые портами, размещены отдельно от памяти. Поскольку порты являются отдельными, то пользователь может расширить память до ее полного объема без использования некоторого пространства для устройств ввода-вывода. Недостатком изолированного ввода-вывода является то, что доступ к передаваемым данным между устройствами ввода-вывода и микропроцессором должны иметь команды: in, ins, out и outs. Управляющие сигналы для пространства ввода-вывода формируются с использованием сигналов микропроцессора М/Ю и W/R, которые обозначают операции системы ввода-вывода: считывания (IORC) или запись (IOWC). Эти сигналы указывают, что появляющийся на шине данных адрес порта ввода-вывода используется для выбора устройства ввода-вывода. Изолированные порты ввода-вывода в персональных компьютерах используются для управления периферийными устройствами. Как правило, 8-разрядный адрес порта используется для доступа к устройствам, расположенным на материнской плате, таким как: таймер и интерфейс клавиатуры, тогда как 16-разрядный порт используется для доступа к последовательным параллельным портам, а также к видеосистеме и дисководу.
базовый интерфейс ввода-вывода
519
Память
FFFFF
Адресное пространство системы ввода-вывода I/O
00000
1Мх8
FFFF
0000
64Кх8
а)
Рис. 11.1. Карты размещения информации в памяти и отображения устройств ввода-вывода для микропроцессоров 8086/8088: а) изолированный ввод-вывод;
б) отображаемый в памяти ввод-вывод
Отображаемый в памяти ввод-вывод
В отличие от изолированного ввода-вывода, при отображаемом в памяти вводе-выводе не используются команды: in, ins, out и outs. Вместо этого, применяется любая команда, которая переносит данные между микропроцессором и памятью. Отображаемое в памяти устройство ввода-вывода рассматривается на карте размещения информации в памяти как ячейка или ряд ячеек памяти. Основным преимуществом отображаемого в карте устройства ввода-вы вода является то, что для доступа к устройству ввода-вывода может использоваться любая команда обращения к памяти. Основной недостаток состоит в том, что часть памяти используется как кар
520
Гпава J1
та отображения устройства ввода-вывода. Это уменьшает емкость памяти для воз-можных приложений.
Другое преимущество — это то, что сигналы IORC и IOWC не работают в отобра-жаемой в памяти системе ввода-вывода и могут уменьшить количество необходимых для дешифрирования схем.
Карта распределения устройств ввода-вывода персонального компьютера
Персональный компьютер (ПК) использует часть карты распределения устройств ввода-вывода для специализированных функций. На рис. Н.2 приведена карта распределения устройств ввода-вывода для персонального компьютера.
Рис. 11.2. Карта распределения системы ввода-вывода персонального компьютера с иллюстрацией многих фиксированных областей для стандартных устройств
521
разовый интерфейс ввода-вывода
СпеДУеТ отмстить, что пространство 0000Н—03FFH обычно резервируется для уст-ойств системы ввода-вывода персонального компьютера и шины ISA. Порты ввода-вывода 0400Н—FFFFH, как правило, предназначены для пользователей, некото-1Х функций системной платы и шины PCI. Обратите внимание на то, что арифметический сопроцессор использует для связи с процессором адрес ввода-вывода: OOFSH^OOFFH. Для этой цели корпорация Intel зарезервировала порты 00F0H— 00FFH. Микропроцессоры 80386—Pentium 4 используют для связи со своими сопроцессорами адрес: 800000F8H—800000FFH, при котором при обращении к пространству системы ввода-вывода линия А31 имеет единичное значение. Этим упрощается дешифрация адреса для сопроцессора, но обмен в этом случае инициируется не явно программными инструкциями, а внутренним протоколом обмена с сопроцессором. В стандартном распределении адреса 0000Н—00FFH отведены для устройств ввода-вывода системной платы, а выше 00FFH для устройств плат расширения. При наличии периферийных устройств на системной плате и разрешении их работы чтение по адресам 0000Н—00FFH не распространяется на шины расширения. Для системных плат со встроенной (некогда внешней периферией) и несколькими системными шинами распределением адресов управляют с помощью опций BIOS Setup.
Элементарные интерфейсы ввода-вывода
Базовым устройством для интерфейса ввода является совокупность буферных схем с тремя состояниями. Базовым устройством для интерфейса вывода является совокупность регистров-защелок. Команда in относится к перемещению данных от устройства ввода-вывода в микропроцессор, а команда оит — к перемещению данных из микропроцессора на устройство ввода-вывода.
Элементарный интерфейс ввода данных
Чтобы создать 8-разрядную логическую структуру входного порта, показанного на рис. 11.3, используются буферные схемы с тремя состояниями. Внешние ТТЛ-данные, формируемые в этом примере с помощью простых переключателей, подаются на входные выводы буферного устройства. Выходы буферов соединяются с шиной данных. Необходимое количество линий шины данных зависит от версии микропроцессора. Например, микропроцессор 8088 имеет 8-разрядную D7—D0, 80486 — 32-разрядную D31—DO, a Pentium—Pentium 4 — 64-разрядную D63—DO шину данных. Схема на рис. 11.3 позволяет микропроцессору считывать содержимое 8 переключателей, которые подключаются к любому 8-разрядному участку шины Данных при активизации сигнала SEL, подаваемого на микросхему буфера типа 74ALS244. Таким образом, когда выполняется команда in, сигналы, формируемые с помощью переключателей, копируются в регистр аккумулятора AL микропроцессора.
При выполнении команды in выполняется дешифрирование адреса порта ввода-вывода так, чтобы сформировать сигнал SEL низкого логического уровня. Этот сигнал низкого уровня, поступая на два управляющих вывода (1G и 2G) микросхемы буферного устройства типа 74ALS244, способствует тому, чтобы данные с его входных выводов (А) были подключены к выходным выводам (Y). Если же на
522
Глава 11
управляющих выводах буферного устройства 74ALS244 будет присутствовать логическая единица, то устройство переходит в третье состояние с высоким импедансом, которое эффективно разъединяет сигналы, формируемые с помощью переключателей, от шины данных.

Шина данных
SEL
Рис. 11.3. Элементарный интерфейс ввода данных с использованием восьми переключателей
Подобная элементарная схема не является вспомогательной и должна фигурировать всегда при необходимости ручного ввода данных в микропроцессор. Иногда она фигурирует в виде отдельной части схемы, как показано на рис. 11.3, а иногда она встроена в программируемое устройство ввода-вывода.
Также можно организовать подключение 16- или 32-разрядных данных к различным версиям микропроцессора. Для сопряжения 16-разрядных данных схема на рис. 11.3 удваивается так, чтобы имелось два буфера типа 74ALS244 для подключения 16-разрядных входных данных к 16-разрядной шине данных. Для подключения 32-разрядных данных схема должна быть увеличена в четыре раза.
Элементарный интерфейс вывода данных
Простейший интерфейс вывода данных получает данные от микропроцессора и обычно должен удерживать их для какого-то внешнего устройства. Его защелки или триггерные схемы, аналогично буферам, находящимся в устройстве ввода, часто встроены в устройство ввода-вывода. На рис. 11.4 показано соединение восьми простых светодиодов (LED) к микропроцессору посредством 8-разрядного регистра-защелки.
базовый интерфейс ввода-вывода
523
Рис. 11.4. Элементарный интерфейс вывода данных с использованием светодиодов
Защелка сохраняет выводимую микропроцессором информацию, получая ее с шины данных, в результате чего светодиоды высвечивают ее в виде соответствующего 8-разрядного двоичного числа. Защелки недбходимы для удержания данных, поскольку при исполнении микропроцессором команды оит данные на шине данных находятся менее 100 нс. При отсутствии регистра-защелки наблюдатель не заметит момента загорания светодиодов.
При выполнении команды оит данные из регистров AL, АХ или ЕАХ передаются на защелку по шине данных. На представленной схеме входы DO—D7 8-разрядного регистра-защелки типа 74ALS374 соединяются с шиной данных, а ее выходы Q0—Q7 подключаются к светодиодам. Когда сигнал на каком-либо выходе Q имеет низкий логический уровень, то соответствующий светодиод загорается. При каждом выполнении команды оит активизируется поступающий на защелку сигнал SEL, фиксируя тем самым выходные данные микропроцессора в защелке, сохраняя их до следующей команды. Таким образом, при выполнении команды оит для этой схемы информация, находящаяся в регистре AL микропроцессора, появляется на светодиодах в виде соответствующего светового кода.
Квитирование
Многие устройства ввода-вывода принимают или выдают информацию намного Медленнее, чем это делает микропроцессор. Существует метод управления процес
524
Гпава 11
сом ввода-вывода информации, называемый квитированием (handshaking) или опросом (polling), который синхронизирует работу устройства ввода-вывода с микропроцессором. Например, устройством, требующим квитирования, является параллельный принтер со скоростью печати 100 знаков в секунду (cps). Очевидно, что микропроцессор способен послать на принтер более 100 знаков в секунду. Следовательно, должен быть разработан способ замедления работы микропроцессора, таким образом, чтобы согласовать его скорость передачи данных со скоростью вывода данных принтером. На рис. 11.5 показан типовой выходной 25-контактный разъем типа DB-25S (розетка) параллельного интерфейса компьютера и входной 36-контактный разъем принтера, а в табл. 11.2 приведено соответствие сигналов и выводов разъемов.
Здесь представлены восемь разрядов данных Data 7—Data 0, причем Data 0 это младший бит данных. Сигнал Busy указывает на то, что принтер занят, a Strobe — это сигнал стробирования данных, используемый для отсылки данных на принтер для печати. Чтобы передать ASCII-данные на принтер для последующей их печати, необходимо подать эти данные на линии Data 7—Data 0, а затем выдать стробирующий импульс данных Strobe . С помощью этого импульса происходит фиксация данных в буфере принтера. После получения данных принтер устанавливает на соответствующем выводе сигнал BUSY, т. е. изменяет уровень сигнала с низкого логического уровня на высокий, обозначая, что принтер занят распечаткой данных. Микропроцессор с помощью программы обслуживания принтера опрашивает или, иначе, проверяет сигнал BUSY, для того чтобы определить, занят ли принтер. Если принтер занят, то микропроцессор ожидает, если же нет, то он посылает на принтер следующий символ ASCII. Такой процесс опрашивания принтера называется опросом (polling), а процедура передачи данных на принтер — передачей с квитированием (handshaking). Пример 11.1 показывает простую процедуру, которая тестирует флаг принтера BUSY и затем отправляет данные на принтер, если он не занят. Процедура PRINT печатает кодируемое кодом ASCII содержимое регистра BL, если флаг BUSY имеет низкий логический уровень, который указывает на то, что принтер не занят. Этот процесс запроса выполняется каждый раз при печати каждого знака.
Пример 11.1. Процедура печати ASCII-символов из регистра BL
	; Процедура печати ASCII-содержимого регистра BL
0000 0000	PRINT PROC NEAR Е4 4В	IN	AL,BUSY	; получение флага BUSY
0002	A8 04	TEST AL, BUSY_BIT ; проверка бита BUSY
0004	75 FA	JNE PRINT	; если принтер занят,
0006	8A СЗ	MOV AL,BL	; получение данных из BL
0008	E6 4A	OUT PRINTER,AL	; передача данных на принтер
000А	СВ	RET	; возврат из процедуры
ооов
PRINT ENDP
Базовый интерфейс в вода-вы вода
525
Разъем DB25
Разъем интерфейса Centronics
Рис. 11.5. Разъем DB-25S компьютера и 36-разрядный разъем интерфейса Centronics
Таблица 11.2. Соответствие сигналов и выводов выходного разъема параллельного интерфейса компьютера и входного разъема принтера
DB-25S	Centronics	Сигнал	DB-25S	Centronics	Сигнал
1	1	Strobe	12	12	Paper End
2	2	Data 0 (DO)	13	13	Select
3	3	Data 1 (D1)	14	14	AutoFeed
4	4	Data 2 (D2)	15	32	Error
5	5	Data 3 (D3)	16	31	Init
6	6	Data 4 (D4)	17	36	Selectin
7	7	Data 5 (D5)	18—25	19—30	GND
8	8	Data 6 (D6)		17	GND
9	9	Data 7 (D7)		16	GND
10	10	Ack		33	GND
11 —		11	Busy			
Немного о схемах сопряжения
понятия схем сопряжения требуются определенные знания в области электро-В этом подразделе, посвященном начальным сведениям сопряжения уст
526
Гпава 11
ройств, рассматриваются некоторые моменты, связанные с электроникой. Прежде чем подсоединять к микропроцессору ту или иную схему или устройство, необходимо знать входные и выходные характеристики микропроцессора и связующих его компонентов. Представление об этом было дано в начале главы 9.
Устройства ввода
Устройствами ввода являются сами элементы ТТЛ и совместимые с ними схемы следовательно, они могут подключаться к микропроцессору либо его компонентам непосредственно, или же такие устройства могут быть выполнены с использованием переключателей. Устройства с использованием переключателей не являются устройствами с сигналами уровня ТТЛ, в то время как сигналы уровня ТТЛ имеют значения 0,0—0,8 В для логического нуля и 2,0—5,0 В для логической единицы.
Устройство на базе переключателя, используемое как ТТЛ-совместимое устройство ввода, должно соответствовать определенным техническим требованиям. На рис. И.6 показан подключенный надлежащим образом простой однополюсный переключатель, функционирующий в качестве устройства ввода.
Vcc
52,2 кОм
--- ТТЛ выход
Рис. 11.6. Подключение переключателя для использования его совместно с ТТЛ-устройствами
Обратите внимание на то, что нагрузочный резистор применен для того, чтобы при размыкании переключателя на выходе схемы присутствовал сигнал уровня логической единицы, а в замкнутом состоянии переключателя он, подсоединяясь на землю, формировал сигнал нулевого логического уровня. Значение нагрузочного резистора не является особо критичным, поскольку он необходим только для обеспечения выходному сигналу напряжения высокого логического уровня. Стандартный диапазон значений нагрузочных резисторов находится, обычно, в пределах 1— 10 кОм.
Механические контакты переключателя при замыкании дребезжат, т. е. многократно замыкаются и размыкаются, пока не примут в конце концов замкнутое состояние, что может явиться проблемой, если переключатель использовать в цифровой схеме в качестве формирователя одиночного импульса. Это явление называется дребезгом контактов. Для устранения его можно применить одну из двух схем, отображенных на рис. 11.7.
Первая схема устранения дребезга контактов (рис. i 1.7, я) является классическом; другая схема (рис. 11.7, б) — это более практичная версия той же схемы. Поскольку первая версия схемы стоит дороже при реализации, то на практике больше используется другая схема, поскольку ей не нужны нагрузочные резисторы и используются только два инвертора вместо двух логических элементов И-НЕ. Вы можете заметить, что обе схемы устранения дребезга контактов построены с использованием асин-
базовый интерфейс ввода-вывода 527
кронных триггеров и имеют аналогичный принцип работы. Например, вторая схема функционирует следующим образом. Предположим, что переключатель вначале находится в положении Q. Если движок переключателя перемещается по направлению к положению Q, но еще не коснулся контакта, то на выходе схемы Q будет логический 0. Это происходит потому, что триггер, построенный на двух инверторах А и Б помнит начальное состояние. Выход инвертора А соединяется с входом инвертора Б. Поскольку на выходе инвертора А вначале имелся сигнал логической 1, то на выходе инвертора Б будет логический 0. Логическая 1 на выходе инвертора А удерживается логическим 0 на выходе инвертора Б. Триггер остается в этом состоянии, пока движок переключателя не коснется контакта Q. При первом же касании этого контакта триггер изменит свое состояние на противоположное. Теперь на выходе Q схемы устранения дребезга контактов будет логическая 1, а на выходе Q — логический 0. Даже в том случае, если движок переключателя отскочит назад от контакта Q и опять коснется его, никаких изменений не произойдет, поскольку триггер помнит зафиксированное состояние. Таким образом, представленная схема устраняет дребезг контактов переключателя.
Рис. 11.7. Схемы противодребезговой защиты: а) традиционная и 6) практичная
526
Гпава 11
ройств, рассматриваются некоторые моменты, связанные с электроникой. Прежде чем подсоединять к микропроцессору ту или иную схему или устройство, необходимо знать входные и выходные характеристики микропроцессора и связующих его компонентов. Представление об этом было дано в начале главы 9.
Устройства ввода
Устройствами ввода являются сами элементы ТТЛ и совместимые с ними схемы следовательно, они могут подключаться к микропроцессору либо его компонентам непосредственно, или же такие устройства могут быть выполнены с использованием переключателей. Устройства с использованием переключателей не являются устройствами с сигналами уровня ТТЛ, в то время как сигналы уровня ТТЛ имеют значения 0,0—0,8 В для логического нуля и 2,0—5,0 В для логической единицы.
Устройство на базе переключателя, используемое как ТТЛ-совместимое устройство ввода, должно соответствовать определенным техническим требованиям. На рис. 11.6 показан подключенный надлежащим образом простой однополюсный переключатель, функционирующий в качестве устройства ввода.
Vcc
52,2 кОм
---ТТЛ выход
Рис. 11.6. Подключение переключателя для использования его совместно с ТТЛ-устройствами
Обратите внимание на то, что нагрузочный резистор применен для того, чтобы при размыкании переключателя на выходе схемы присутствовал сигнал уровня логической единицы, а в замкнутом состоянии переключателя он, подсоединяясь на землю, формировал сигнал нулевого логического уровня. Значение нагрузочного резистора не является особо критичным, поскольку он необходим только для обеспечения выходному сигналу напряжения высокого логического уровня. Стандартный диапазон значений нагрузочных резисторов находится, обычно, в пределах 1— 10 кОм.
Механические контакты переключателя при замыкании дребезжат, т. е. многократно замыкаются и размыкаются, пока не примут в конце концов замкнутое состояние, что может явиться проблемой, если переключатель использовать в цифровой схеме в качестве формирователя одиночного импульса. Это явление называется дребезгом контактов. Для устранения его можно применить одну из двух схем, отображенных на рис. 11.7.
Первая схема устранения дребезга контактов (рис. i 1.7, а) является классической; другая схема (рис. 11.7, б) — это более практичная версия той же схемы. Поскольку первая версия схемы стоит дороже при реализации, то на практике больше используется другая схема, поскольку ей не нужны нагрузочные резисторы и используются только два инвертора вместо двух логических элементов И-НЕ. Вы можете заметить, что обе схемы устранения дребезга контактов построены с использованием асин-
разовый интерфейс ввода-вывода	527
—,---------------------------
хронных триггеров и имеют аналогичный принцип работы. Например, вторая схема функционирует следующим образом. Предположим, что переключатель вначале находится в положении Q. Если движок переключателя перемещается по направлению к положению Q, но еще не коснулся контакта, то на выходе схемы Q будет логический 0. Это происходит потому, что триггер, построенный на двух инверторах А и Б помнит начальное состояние. Выход инвертора А соединяется с входом инвертора Б. Поскольку на выходе инвертора А вначале имелся сигнал логической 1, то на выходе инвертора Б будет логический 0. Логическая 1 на выходе инвертора А удерживается логическим 0 на выходе инвертора Б. Триггер остается в этом состоянии, пока движок переключателя не коснется контакта Q. При первом же касании этого контакта триггер изменит свое состояние на Противоположное. Теперь на выходе Q схемы устранения дребезга контактов будет логическая 1, а на выходе Q — логический 0. Даже в том случае, если движок переключателя отскочит назад от контакта Q и опять коснется его, никаких изменений не произойдет, поскольку триггер помнит зафиксированное состояние. Таким образом, представленная схема устраняет дребезг контактов переключателя.
Рис. 11.7. Схемы противодребезговой защиты: а) традиционная и 6) практичная
528
Глава 11
Устройства вывода
Устройства вывода более разнообразны, чем устройства ввода, но подключение многих из них одинаково. Перед подключением устройства вывода необходимо узнать параметры напряжения и тока для микропроцессора или элемента ТТЛ. Уровни напряжения выходных сигналов микропроцессора ТТЛ-совместимы. Логическому О соответствует сигнал напряжения 0,0—0,4 В, а логической 1 сигнал напряжения 2,4—5,0 В. Выходные токи для микропроцессора и многих подключенных к микропроцессору компонентов меньше, чем для стандартных ТТЛ компонентов. Выходной ток при значении выходного сигнала низкого логического уровня составляет 0,0—2,0 мА и 0,0—400 мкА при значении сигнала высокого уровня.
Теперь, когда величина выходного тока известна, можно выполнить подключение устройства вывода к одному из выходов микропроцессора. На рис. 11.8 показано, как выполняется подключение простого светодиодного индикатора к выводу микропроцессора.
б)
Рис. 11.8. Схема подключения светодиода: а) с использованием транзистора и б) с использованием инвертора
Обратите внимание, что на рис. II.8, а применен транзисторный усилитель, а на рис. И.8, б используется ТТЛ-инвертор. ТТЛ-инвертор стандартной версии обеспечивает ток до 16 мА при нулевом логическом уровне на выходе схемы, что более чем достаточно для управления светодиодом. Чтобы загорелся стандартный светодиод, требуется ток около 10 мА. Допустим, что падение напряжения на светодиоде для обеих схем составляет 2,0 В. Хотя справочные данные по светодиодным индикаторам утверждают, что номинальное падение составляет 1,65 В, из опыта известно, что падение колеблется от 1,5 до 2,0 В. Это означает, что величина токоограничивающего резистора составит 3,0 В/10 мА или 300 Ом. Поскольку номинал 300 Ом не является стандартным для резистора, то следует выбрать ближайший номинал резистора, т. е. 330 Ом.
На схеме рис. 11.8, а применен транзистор вместо ТТЛ-буфера. Например, транзистор 2N2222 общего назначения имеет минимальный коэффициент усиления 100. Поскольку коллекторный ток в этой схеме должен составлять 10 мА, то, следовательно, базовый ток будет 1/100 от коллекторного тока, т. е. 0,1 мА. Для определения величины токоограничивающего базового резистора нужно взять ток, проходя
Базовый интерфейс ввода-вывода
529
щий через резистор и равный базовому току транзистора 0,1 мА, а также падение напряжения на резисторе 1,7 В. Поскольку входной сигнал для этой схемы имеет ТТЛ-уровень и поэтому имеет минимальное значение 2,4 В, а падение напряжения на переходе база-эмиттер составляет 0,7 В, то разница между ними в 1,7 В и есть величина падения напряжения на базовом резисторе. Таким образом, величина сопротивления резистора составит 1,7 В/0,1 мА или 17 кОм. Поскольку номинал 17 кОм не является стандартной величиной, то следует выбрать резистор на 18 кОм.
Допустим, что нам нужно выполнить подключение к микропроцессору двигателя постоянного тока с рабочим напряжением 12 В. Ток двигателя составляет 1 А. Очевидно, что для этой цели не следует использовать ТТЛ-инвертор по двум причинам: сигнал в 12 В выведет из строя инвертор, а величина необходимого тока нагрузки (двигателя) намного превосходит максимальный выходной ток инвертора равный 16 мА. Также нельзя использовать и транзистор 2N2222, поскольку максимальная величина его коллекторного тока составляет от 250 до 500 мА в зависимости от разновидности транзистора. Решение вопроса — это применение транзисторной пары Дарлингтона.
На рис. 11.9 показано подключение двигателя постоянного тока с помощью транзисторной пары Дарлингтона. Пара Дарлингтона имеет минимальный коэффициент усиления по току, равный 7000, и максимальный коллекторный ток 4 А. Величина базового резистора смещения вычисляется так же, как и для транзисторной схемы подключения светодиода. Ток, проходящий через резистор, будет равен 1 А/7000 или около 0,143 мА. Падение напряжения на концах резистора составит 0,9 В, поскольку в данной схеме имеет место падение на двух переходах база-эмиттер вместо одного (2,4 В — 2 х 0,75 В = 0,9 В). Следовательно, величина базового резистора смещения будет равна 0,9 В/0,143 мА или 6,29 кОм. Для схемы выбран стандартный номинал резистора 6,2 кОм. В данной схеме транзисторная пара Дарлингтона должна иметь теплоотвод (радиатор) из-за большого тока, проходящего через эту пару, а также в схеме должен присутствовать диод, включенный между эмиттером и коллектором транзисторной пары в обратном направлении, для того чтобы индуктивный обратный выброс тока двигателя не вывел ее из строя. Такая схема может также использоваться для подключения электромеханических реле и любого другого устройства с большим значением тока или напряжением, отличным от +5 В.
Рис. 11.9. Подключение двигателя постоянного тока к системе с использованием пары Дарлингтона
530
Глава 11
11.2. Дешифрирование адреса порта ввода-вывода
Дешифрирование адреса порта ввода-вывода точно такое же, как и дешифрирование адреса памяти, за исключением устройств ввода-вывода, отображаемых в памяти. По существу, дешифрирование отображаемого в памяти устройства ввода-вывода здесь не рассматривается, поскольку оно выполняется так же, как и для памяти (за исключением того, что не используются сигналы IORC и IOWC, поскольку в данном случае отсутствует команда in или out). Решение по использованию отображаемых в памяти устройств ввода-вывода часто определяется емкостью запоминающей системы и расположением в системе устройств ввода-вывода. Основное отличие между дешифрированием памяти и дешифрированием изолированного устройства ввода-вывода состоит в количестве адресных выводов, подключаемых к дешифратору. Действительно, для ЗУ необходимо дешифрировать следующие адреса: А31—АО, А23—АО и А19—АО, а для изолированного устройства ввода-вывода А15—АО. Иногда, если устройства ввода-вывода используют только закрепленные адреса, дешифрируют только восемь разрядов адреса А7—АО. В персональных компьютерных системах всегда декодируются все 16 адресных разрядов порта ввода-вывода. Другое отличие состоит в использовании сигналов IORC и IOWC, чтобы активизировать устройства ввода-вывода для операции считывания или записи. В прежних версиях микропроцессора использовались сигналы Ю/М= 1 и RD или WR для активизирования устройств ввода-вывода.
Дешифрирование
8-разрядных адресов устройств ввода-вывода
Как уже упоминалось, команды для фиксированных устройств ввода-вывода используют 8-разрядный адрес порта ввода-вывода, который появляется на линиях адреса А15—АО как 0000Н—00FFH. Если в системе не больше 256 устройств ввода-вывода, то дешифрируются только адресные линии А7—АО. Таким образом, игнорируются адресные линии А15—А8. Встроенные системы часто используют 8-раз-рядные адреса портов. Обратите внимание на то, что регистр DX также может адресовать порты ввода-вывода: ООН—FFH. Если адрес дешифрируется как 8-разрядный, то при этом нельзя применять устройства ввода-вывода, которые используют 16-разрядный адрес ввода-вывода.
На рис. 11.10 показана схема дешифратора для 8-разрядных портов ввода-вывода FOH—F7H, построенная с использованием микросхемы двоичного трехразрядного декодера/демультиплексора типа 74ALS138. Следует предположить, что для данного примера дешифратора система будет использовать только порты ввода-вывода ООН— FFH. Этот дешифратор идентичен дешифратору адреса памяти, за исключением того, что в данном случае адресные разряды А7—АО соединяются на входы декодера. На рис. 10.11 показана версия программируемого логического устройства (ПЛУ), использующая для этого дешифратора микросхему ПМЛ типа PAL16L8. Применение микросхемы ПМЛ является лучшим решением построения схемы дешифратора, поскольку в данном случае число ИС уменьшено до одного устройства.
Вазовый интерфейс ввода-вывода
531
Рис. 11.10. Дешифратор 8-разрядных портов ввода-вывода.
Этот дешифратор формирует сигналы низкого уровня для выбора портов F0H—F7H
Рис. 11.11. Дешифратор, выполненный на микросхеме ПМЛ типа PAL16L8, для формирования сигналов портов ввода-вывода F0H—F7H
Программа для ПМЛ представлена в примере И.2.
Пример 11.2. Программа для программирования микросхемы ПМЛ типа PAL16L8, выполняющей функции дешифратора портов F0H—F7H
AUTHOR	Barry В.	Brey
COMPANY	BreyCo
DATE	7/1/99
CHIP	DECODERS	PAL16L8
• pins 1 AO	2 Al	3 A2	4 A3	5 A4	6 A5	7 A6	8 A7	9 NC	10 GND
' pins 11	12	13	14	15	16	17	18	19	20
NC	F7	F6	F5	F4	F3	F2	Fl	F0	VCC
equations									
/F0 = A7 *	A6 *	A5	* A4	* A3	*	/А2	* /А1	*	/А0
/Fl = A7 *	A6 *	A5	* A4	* A3		/А2	* /А1	★	AO
532
Глава 11
/Е2 = А7 * Аб * А5 * А4 * АЗ * /А2 * А1 * /АО /F3 = А7 * Аб * А5 * А4 * АЗ * /А2 * А1 * АО /F4	=	А7	*	Аб	*	А5	*	А4	*	АЗ	*	А2	*	/А1 * /АО
/Г5	=	Д7	*	Аб	*	А5	*	А4	*	АЗ	*	А2	*	/А1 * АО
/F6	=	А7	*	Аб	*	А5	*	А4	*	АЗ	*	А2	*	Al * /АО
/F7	=	Д7	*	Аб	*	А5	*	А4	*	АЗ	*	А2	*	Al * АО
Дешифрирование 16-разрядных адресов устройств ввода-вывода
Мы также дешифрируем 16-разрядные адреса устройств вводов-выводов, особенно в персональных компьютерных системах. Основное отличие между дешифрированием 8- и 16-разрядного адреса устройств ввода-вывода состоит в том, что во втором случае должны дешифрироваться 8 дополнительных линий адреса А15—А8. На рис. 11.12 показана схема дешифратора портов ввода-вывода EFF8H—EFFFH с использованием микросхемы ПМЛ типа PAL16L8, логического элемента И-НЕ и одного инвертора.
АО А1 А2 АЗ А4 А5 Аб А7
1
2
3
4
5
6
7
8
9
Я
из
И	01
I2	02
I3	03
I4	04
I5	05
I6	06
I7	07
I8	08
I9 110
PAL16L8
19 Л
17 Л 15 14 13 12
EFF8 EFF9 EFFA EFFB EFFC EFFD EFFE EFFF
Рис. 11.12. Дешифратор с использованием микросхемы ПМЛ типа PAL16L8 для дешифрирования 16-разрядного адреса EFF8H—EFFFH
Логическая схема И-НЕ дешифрирует первые 8 разрядов адреса портов ввода-вывода А15—А8. На выходе этой схемы формируется сигнал разрешения работы микросхемы ПМЛ типа PAL16L8 для любого адреса системы ввода-вывода в диапазоне EFOOH—EFFFH. Затем микросхема PAL16L8 дешифрирует младшие восемь разрядов адреса устройств ввода-вывода, для того чтобы сформировать восемь выходных стробов с низким уровнем сигнала: EFF8H — EFFFH . Соответствующая программа для программирования микросхемы ПМЛ типа PAL16L8 приведена в примере 11.3.
Пример 11.3. Программа для программирования микросхемы ПМЛ типа PAL16L8 дешифратора 16-разрядного адреса EFF8H—EFFFH
EXAMPLE 11-3
AUTHOR Barry В. Brey
разовый интерфейс ввода-вывода
533
COMPANY ВгеуСо										
DATE CHIP	7/2/99 DECODER9 PAL16L8									
; pins	1	2	3	4	5	6	7	8	9	10		
	AO	Al A2	A3	A4	A5	A6 A7	NAND	। GND		
; pins	11	12	13		14	15	16	17	18	19	20
	NC	EFFFH	EFFEH		EFFDH	EFFCH	EFFBH EFFAH EFF9H		EFF8H	VCC
equations										
/EFF8H	= A7	* A6 *	A5 *	A4	* A3	* /А2	* /А1	* /А0 * /NAND		
/EFF9H	= A7	* A6 *	A5 *	A4	* A3	* /А2	* /А1	* AO * /NAND		
/EFFAH	= A7	* A6 *	A5 *	A4	* A3	* /А2	* Al *	/А0 * /NAND		
/EFFBH	= A7	* A6 *	A5 *	A4	* A3	* /А2	* Al *	AO * /NAND		
/EFFCH	= A7	* A6 *	A5 *	A4	* A3	* A2 *	/А1 *	/А0 * /NAND		
/EFFDH	= A7	* A6 *	A5 *	A4	* A3	* A2 *	/А1 *	AO * /NAND		
/EFFEH	= A7	* A6 *	A5 *	A4	* A3	* A2 *	Al *	/А0 * /NAND		
/EFFF7	= A7	* A6 *	A5 *	A4	* A3	* A2 *	Al *	AO * /NAND		
8- и 16-разрядные порты ввода-вывода
Теперь, когда понятно, что выполнение дешифрирования адреса портов ввода-вывода является, скорее всего, проще дешифрирования адреса памяти из-за меньшего числа разрядов, следует разобраться, как происходит передача данных между микропроцессором и 8- или 16-разрядными устройствами ввода-вывода. Данные, переданные на 8-разрядное устройство ввода-вывода, находятся в одном из банков ввода-вывода 16-разрядного микропроцессора, такого как 80386SX. Система ввода-вывода имеет два 8-разрядных банка памяти, как и ЗУ. Это приведено на рис. 11.13, который показывает два отдельных банка ввода^-вывода для 16-разрядной системы.
(BLE)
	ВНЕ		АО	
FFFF				FFFE
FFFD				FFFC
FFFB				FFFA
	Старший банк		Младший банк	
0005				0004
0003				0002
0001				0000
	D15	► D8		D7 	>- D0	
Рис. 11.13. Банки системы ввода-вывода микропроцессоров 8086, 80186, 80286 и 80386SX
534
Глава 11
Поскольку имеется два банка системы ввода-вывода, то для любого 8-разрядного устройства ввода-вывода для правильного функционирования требуется отдельный строб записи. Для чтения устройств ввода-вывода отдельные стробы считывания не требуются. Как и для памяти, микропроцессор считывает только ожидаемый байт и игнорирует другой байт. Проблема в считывании может возникнуть только в том случае, когда устройство ввода-вывода на операцию чтения реагирует неправильно. В случае, когда устройство ввода-вывода реагирует на считывание из ложного банка, отдельные сигналы считывания могут не понадобиться. Это рассматривается при возникновении конкретного случая, далее в этой главе.
На рис. 11.14 показана система с двумя разными 8-разрядными устройствами вывода данных, имеющих 8-разрядные адреса 40Н и 41Н.
Поскольку это 8-разрядные устройства, и они фигурируют в разных банках ввода-вывода, то следует сформировать отдельные сигналы записи ввода-вывода.
D15-D8
U2
74ALS374
Порт 41Н
ВНЕ IOWC
АО
А1
А2
АЗ
А4
А5
А6
А7
1
2
3
4
5
6
7
8
9
11
PAL16L8
из
3
DO
D1
D2
D3
D4
D5
D6
D7
ОС
frCLK
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
2
5
6
9
12
15
16
19
Порт 40Н
D7-D0
74ALS374
Рис. 11.14. Дешифратор порта ввода-вывода, производящий выборку портов 40Н и 41Н для выхода данных
Базовый интерфейс ввода-вы вода
535
Обратите внимание, что все порты ввода-вывода используют 8-разрядные адреса. Таким образом, порты 40Н и 4JH могут адресоваться отдельно, как 8-разрядные порты, или вместе, как один 16-разрядный порт. Программа для дешифратора на микросхеме ПМЛ типа PAL16L8, приведенного на рис. 11.14, дана в примере 11.4.
Пример 11.4. Программа для программирования микросхемы ПМЛ типа PAL16L8, предназначенной для дешифрирования двух портов, 40Н и 41Н
AUTHOR Barry В. Вгеу
COMPANY ВгеуСо
DATE	7/3/99
CHIP	DECODERA PAL16L8
pins	1	2	3	4	5	6	7	8	9	10
	ВНЕ	IOWC	AO	Al	A2	A3	A4	A5	Аб GND
pins	11	12 13	14	15	16	17	18	19	20
	A7	NC NC	NC	NC	NC	NC	40	41	VCC
EQUATIONS
/40 = /BLE *	/IOWC *	/А7 * A6 * /А5 * /А4 *	/АЗ * /А2	* /А1
/41 = /ВНЕ *	/IOWC *	/А7 * A6 * /А5 * /А4 *	/АЗ * /А2	* /А1
При выборе 16-разрядных устройств ввода-вывода выводы BLE (АО) и ВНЕ не функционируют, поскольку оба банка выбираются вместе. Хотя 16-разрядные устройства ввода-вывода встречаются относительно редко, существует несколько типов АЦП и ЦАП, такие, которые встречаются в интерфейсах видео- и дисковой памяти.
На рис. 11.15 показано 16-разрядное устройство ввода данных, адресуемое двумя 8-разрядными адресами устройств ввода-вывода: 64Н и 65Н.
Обратите внимание, что дешифратор, выполненный на микросхеме ПЛМ типа PAL16L8, не имеет выводов для сигналов BLE (АО) и ВНЕ, поскольку такие сигналы не применяются в 16-разрядных устройствах ввода-вывода.
Программа для программирования микросхемы PAL16L8, приведенная в примере 11.5, показывает формирование разрешающего сигнала для буферных устройств 74ALS244 с тремя состояниями, которые используются в качестве устройств ввода данных.
Пример 11.5. Программа для программирования микросхемы ПМЛ типа PAL16L8,. предназначенной для дешифрирования 16-разрядного устройства ввода
AUTHOR Barry В. Вгеу
COMPANY ВгеуСо
DATE	7/5/99
CHIP	DECODERB PAL16L8
;pins 1	23456789	10
IORC Al A2 A3 A4 A5 Аб A7 NC GND
536
Глава 11
; pins 11	12	13	14	15	16	17	18	19	20
NC	NC	NC	NC	NC	NC	NC	NC	064	VCC
EQUATIONS
/064 = /IORC * /А7 * A6 * A5 * /А4
D15-D8
/АЗ * A2 * /А1
U2
12
9
1Y1 1Y2 1Y3 1Y4 2Y1 2Y2 2Y3 2Y4
1A1 1A2 1A3 1A4
2A1 2A2 2A3 2A4
2
4
6
8
11
13
15
17
Порт 65H
1G °T 2G O—
74ALS244
IORC A1 A2 A3 A4 A5 A6 A7
1
2
3
4
5
6
7
8
9
11
PAL16L8
U3
18
1Y1 1Y2
1Y3 1Y4 2Y1 2Y2 2Y3 2Y4
1A1 1A2 1A3 1A4 2A1 2A2 2A3 2A4
2
4
6
8
11
13
15
17
Порт 64H
1G O—-2G
D7-D0
74ALS244
Рис. 11.15. Дешифрирование 16-разрядного порта ввода с адресами 64Н и 65Н
32-разрядные порты ввода-вывода
Несмотря на то, что 32-разрядные порты ввода-вывода не являются типовыми, со временем они могут стать обычными по причине применения в компьютерных системах новых шин. Некогда многообещающая системная шина EISA, так же как и локальная шина VESA, и распространенная в настоящее время шина РС1 поддерживают 32-разрядный ввод-вывод, однако все эти шины крайне редко используются для 32-разрядных устройств ввода-вывода.
Базовый интерфейс ввода-вывода
537
IORC А7 А6 А5 А4 АЗ А2
PAL16L8
U2
74LS244
Шина данных D31 - D24 (73Н)
Шина данных D23-D16 (72Н)
Шина данных D15-D8 (71Н)
Шина данных D7-D0 (70Н)
Рис. 11.16. Дешифрирование 32-разрядного порта ввода данных с адресами 70Н—73Н для микропроцессоров от 80386DX до Pentium 4
На рис. 11.16 показана схема 32-разрядного порта ввода данных, предназначенная Для микропроцессоров 80386DX или 80486. Как и в предыдущих интерфейсах, в схеме используется одна микросхема ПМЛ типа PAL16L8, предназначенная для дешифрирования 32-разрядного порта ввода данных, и четыре микросхемы буферов типа 74LS244 для соединения вводимых данных к информационной шине. Порты
538
Глава 11
ввода данных, которые применены в этом интерфейсе, являются 8-разрядными портами с адресами 70Н—73Н. Программа для микросхемы ПМЛ приведена в примере 11.6. Здесь вновь дешифрируется только 8-разрядный адрес портов ввода-вывода.
Пример 11.6. Программа для программирования микросхемы ПМЛ типа PAL16L8, примененной в схеме рис. 11.16 в качестве дешифратора 32-разрядного порта ввода
AUTHOR Barry В. Brey
COMPANY BreyCo
DATE	7/6/99
CHIP	DECODERC PAL16L8
pins	1	2	3	4	5	6	7	8	9	10
	IORC А7	A6	A5	A4	A3	A2	NC	NC	GND
pins	11 12 13	14	15	16	17	18	19	20	
	NC NC NC	NC	NC	NC	NC	NC	SEL	VCC	
EQUATIONS
/SEL = /IORC * /А7 * A6 * A5 * A4 * /АЗ * /А2
В микропроцессорах Pentium—Pentium 4 с их 64-разрядными шинами данных порты ввода-вывода оказываются в разных банках, что определяется адресом порта ввода-вывода. Например, 8-разрядный порт ввода-вывода 0034Н находится в 5 банке ввода-вывода микропроцессора Pentium, тогда как 16-разрядный порт ввода-вывода 0034Н—0035Н присутствует в 5 и 6 банках микропроцессора Pentium. 32-разрядный доступ к устройствам ввода-вывода для Pentium может находиться в четырех последовательных банках ввода-вывода. Например, 32-разрядный порт ввода-вывода 0100Н—0103Н имеется в банках с нулевого по третий.
Как же осуществить подключение 64-разрядного устройства ввода-вывода? Самые многоразрядные передачи данных для устройств ввода-вывода имеют 32 разряда, и в настоящее время нет команд для 64-разрядного ввода-вывода, чтобы обеспечить 64-разрядную передачу данных.
11.3. Программируемый периферийный интерфейс 8255А/8255А-5/82С55
Программируемый периферийный интерфейс (ППИ) (programmable peripheral interface — PPI) 8255A/8255A-5/82C55 является очень популярным и недорогим элементом интерфейса, который используется во многих системах.
Микросхема ППИ имеет 24 вывода, предназначенных для ввода-вывода данных, которые могут быть запрограммированы в отдельные группы, работающие в трех режимах. При помощи микросхемы ППИ можно осуществить подключение любого ТТЛ-совместимого устройства ввода-вывода к микропроцессору. При использовании ППИ 82С55 (версия КМОП) вместе с микропроцессором, работающем на тактовой частоте более 8 МГц, необходимо введение дополнительных тактов ожидания. Микросхема ППИ 82С55 обеспечивает ток в нагрузке не менее 2,5 мА на каждом
Базовый интерфейс ввода-вы вода 539
выходе при низком логическом уровне сигнала, а максимальное значение тока при этом составляет 4 мА. Используемые такты ожидания во время обмена микропроцессора с устройством ввода-вывода, ввиду присущей им медлительности, не оказывают значительного влияния на скорость работы системы. Программируемый периферийный интерфейс, аналогичный микросхеме 82С55, все еще находит применение даже в последней компьютерной системе на базе Pentium 4, хотя, разумеется, и не используется в виде отдельной микросхемы. В персональных компьютерах, ППИ 82С55 может использоваться, например, для подключения клавиатуры, принтера и управления звуком совместно с системным таймером.
Описание ППИ 82С55
На рис. 11.17 приведена схема расположения выводов микросхемы ППИ 82С55. Три порта ввода-вывода (обозначенные А, В и С) программируются группами. К выводам группы А относятся выводы порта А (РА7—РАО) и старшей части порта С (РС7—С4), а к выводам группы В — выводы порта В (РВ7—РВО) и младшей части порта С (РСЗ—РСО). Выбор микросхемы ППИ 82С55 для операций программирования, считывания или записи осуществляется с помощью его вывода CS. Выбор того или иного порта (регистра) выполняется посредством сигналов, подаваемых на выводы А1 и АО, которые определяют конкретный внутренний регистр ППИ для программирования или выполнения операций.
В табл. 11.3 показано, каким образом осуществляется выбор порта ввода-вывода с помощью выводов А1 и АО.
82С55
34
33
32
27
35
Vcc - вывод 26
GND - вывод 7
DO D1
D2
D3 D4
D5 D6
D7
RD WR АО А1 RESET CS
РАО РА1 РА2 РАЗ РА4 РА5
РА6 РА7
4 3
2 1
37
18
РВО РВ1 РВ2 РВЗ
РВ4 Нт-
21
22
РВ7
РСО
РС2 РСЗ
17
5
Рис. 11.17. Схема расположения выводов микросхемы программируемого периферийного интерфейса 82С55
540
Глава 11
Таблица 11.3. Выбор порта ввода-вывода микросхемы 82С55
А1	АО	Функция
0	0	Порт А
0	1	Порт В
1	0	Порт С
1	1	Регистр команд
В персональных компьютерах для микросхемы ППИ 82С55 или ее аналога отведены следующие порты ввода-вывода 60Н—63Н. ППИ 82С55 является достаточно простым устройством для сопряжения его с микропроцессором и программирования. При выполнении операции записи или считывания с использованием ППИ 82С55 на вывод CS должен быть подан сигнал логического 0, а на выводы AI—АО правильный адрес ввода-вывода. Операция же чтения или записи определяется в зависимости от сигналов на соответствующих выводах RD и WR.
На рис. 11.18 приведена схема подключения ППИ 82С55 к микропроцессору 80386SX для функционирования с 8-разрядными адресами портов ввода-вывода: СОН (портА), С2Н (порт В), С4Н (порт С) и С6Н (регистр команд).
Рис. 11.18. Подключение ППИ 82С55 к младшему банку микропроцессора 80386SX
Базовый интерфейс ввода-вывода 541
Этот интерфейс использует младший банк карты ввода-вывода микропроцессора 80386SX. Обратите внимание, что все выводы микросхемы 82С55 соединены с микропроцессором напрямую, за исключением вывода CS. Сигнал на вывод CS поступает после дешифрирования адреса ППИ с помощью микросхемы трехразрядного двоичного декодера/демультиплексора типа 74ALS138.
Сигнал сброса, поступающий на соответствующий вывод RESET ППИ 82С55, инициализирует устройство при возврате микропроцессора в исходное состояние. Сигнал RESET настраивает все порты ППИ 82С55, используя нулевой режим работы (0). Поскольку программирование портов производится после возврата ППИ в исходное состояние, то устраняются вероятные ошибки при первой подаче электропитания в систему. После возврата в исходное состояние по сигналу RESET микросхеме ППИ 82С55 не требуется какая-либо команда для программирования до тех пор, пока ППИ используется как устройство ввода для всех трех портов.
Следует отметить, что ППИ 82С55 имеет в персональном компьютере адреса портов 60Н—63Н и служит для управления клавиатурой, громкоговорителем, таймером и идентификации источников NMI. Это относится к любому PC/AT1 или более раннему типу персональной компьютерной системы.
Программирование ППИ 82С55
ППИ 82С55 программируется с помощью двух внутренних регистров команд, показанных на рис. 11.19.
Обратите внимание на то, что 7 двоичный разряд регистра команд выбирает либо командный байт А, либо командный байт В. Командный байт А программирует функции групп А и В, тогда как командный байт В предназначен для установки разрядов порта С в состояние логической 1 или сбрасывает их в 0, но только в случае, если интерфейс программируется в режиме 1 или 2.
Выводы группы В, порт В (РВ7—РВО) и младшая часть порта С (РСЗ—РСО) программируются на ввод или вывод. Группа В функционирует в режиме 0 или в режиме 1. Режим 0 является основным режимом ввода-вывода, который позволяет осуществлять программирование выводов группы В как обычный вход и захват выходных соединений. Работа в режиме 1 предполагает выполнение операций со стробированием для выводов группы В, причем при этом данные передаются через порт В, а для сигналов квитирования предусмотрен порт С.
Выводы группы А, порт А (РА7—РАО) и старшая часть порта С (РС7—РС4), так же как и группа В, программируются на ввод или вывод. Разница состоит в том, что группа А может функционировать в режимах 0, 1 и 2. Функционирование в режиме 2 является двунаправленным режимом работы для порта А. Если в 7 разряд командного байта поместить логический 0, то выбирается командный байт В. Этот командный байт дает возможность устанавливать (1) или сбрасывать (0) любой разряд порта С, при работе ППИ 82С55 в режиме 1 или 2. В противном случае, командный байт не используется для программирования. В системе управления часто
1 В персональном компьютере класса АТ обслуживание клавиатуры выполняет не ППИ, как это было в PC/XT, а контроллер клавиатуры 8042. — Ред.
542
Глава 11
Командный байт А
7	6	5	4	3	2	1	0
а)
Командный байт В
Рис. 11.19. Командный байт регистра команд в ППИ 82С55: а) программные порты А, В и С; б) установка или сброс разряда в исходное положение в выбранном битовом поле
Базовый интерфейс ввода-вывода	543
используется функция установки/сброса битов для установки или очистки управляющего бита порта С. Функция установки/сброса битов свободна от сбоя, поскольку в течение выполнения команды установки/сброса другие, не участвующие в операции выводы порта С, не будут изменяться.
Функционирование в режиме О
ППИ 82С55 функционирует в режиме 0 как буферизованное устройство ввода или как устройство вывода с защелкой. Эти устройства работают аналогично устройствам ввода и вывода, которые рассматривались в первом разделе данной главы.
На рис. 11.20 показана схема подключения набора из восьми 7-сегментных светодиодных индикаторов DO—D7 к микропроцессору 8088 посредством микросхемы ППИ 82С55. В этой схеме оба порта А и В программируются (режим 0) как обычные порты вывода с защелкой. Порт А обеспечивает сегментные данные для индикаторов, а порт В — выбор одного из восьми индикаторов во время их мультиплексирования. Микросхема ППИ 82С55 подключается к микропроцессору 8088 посредством ПМЛ типа PAL16L8 с тем, чтобы она работала с номерами порта ввода-вывода 0700Н— 0703Н. Программа для программирования PAL16L8 приведена в примере 11.7. ПМЛ типа PAL16L8 дешифрирует адрес устройств ввода-вывода и формирует сигнал строба записи на выводе WR микросхемы ППИ 82С55.
Пример 11.7. Программа для программирования микросхемы ПМЛ типа PAL16L8, выполняющей функции дешифратора адреса светодиодного индикатора
AUTHOR	Barry В.	Вгеу
COMPANY	ВгеуСо
DATE	7/6/99
CHIP	DECODERD	PAL16L8
pins	1 А2	2 АЗ	3 А4	4 А5 .	5	6 Аб А7	7 А8	8 А9	9 А10	> 10 GND
pins	11	12	13	14	15	16	17	18	19 20
	All	CS	ЮМ	А12	А13	А14	А15	NC	NC VCC
EQUATIONS
/CS = /А15 * /А14 * /А13 * /А12 * /All * A10 * A9 * A8 * /Аб * /А5 * /А4 * /A3 * /А2 * /1ОМ
Величины резисторов для схемы выбираются с таким расчетом, чтобы сегментный ток был 80 мА. Этот ток необходим для генерирования среднего тока, равного 10 мА, на сегмент при мультиплексировании индикаторов. В такой системе отображения данных в любой момент времени имеется только одна из восьми отображаемых позиций. Максимальный анодный ток в 8-разрядном светодиодном индикаторе составляет 560 мА (7 сегментов х 80 мА), однако средний анодный ток составляет 80 мА. В 16-разрядном индикаторе максимальный ток был бы 420 мА (7 сегментов х 60 мА). При мультиплексировании индикаторов ток сегмента увеличивается
Рис. 11.20. Схема подключения 8-разрядного светодиодного индикатора к микропроцессору 8088 посредством микросхемы программируемого периферийного интерфейса 82С55
Базовый интерфейс ввода-вывода
545
с 10 мА (для одного индикатора, потребляющего 10 мА на сегмент — как номинальный ток) до величины, равной произведению количества позиций индикаторов на 10 мА. Это означает, что в 4-разрядном индикаторе применяется ток равный 40 мА на сегмент, а в 5-разрядном индикаторе — 50 мА и т. д.
В данном индикаторе нагрузочный резистор сегмента индикатора пропускает ток 80 мА при падении напряжения на нем примерно 3,0 В. Напряжение равное 3,0 В на нагрузочном резисторе сегмента получается, учитывая напряжение на светодиоде, а именно 1,65 В номинально, и несколько десятых вольта падения напряжения на анодном и сегментном ключе. Следовательно, можно определить величину резистора как 3,0 В/80 мА = 37,5 Ом, а выбирая ближайшую стандартную величину номинала резистора, нагрузочный резистор сегмента составит 39 Ом.
Для расчета величины базового резистора необходимо учитывать коэффициент усиления транзистора 2N2222, применяемого в качестве сегментного ключа, который равен 100. Следовательно, базовый ток транзистора будет равен 80 мА/100 = 0,8 мА. Падение напряжения на базовом резисторе определим как разность между минимальным напряжением уровня логической 1 для ППИ 82С55 (3,0 В) и падением напряжения на переходе эмиттер-база транзистора (0,7 В). Таким образом, падение напряжения будет равно 2,3 В. Тогда величина резистора в цепи базы составит 2,3 В/0,8 мА = 2,875 кОм. Ближайший по значению стандартный резистор имеет величину 2,7 кОм, но для этой схемы выбран резистор 2,2 кОм.
К базе каждого анодного ключа 2N2907 подключен свой базовый резистор. Ток, проходящий через резистор, составляет 560 мА/100 = 5,6 мА, поскольку минимальный коэффициент усиления транзистора равен 100. Это значение тока несколько превышает максимальный ток на выходе микросхемы ППИ 82С55 равный 4,0 мА, но все же он достаточен для функционирования схемы без проблем. Максимальный ток на выходе ППИ 82С55 предполагает использование в качестве нагрузки ТТЛ-микросхему. Если бы величина тока составляла более 8,0—10,0 мА, тогда потребовалась бы соответствующая доработка схемы с использованием транзисторной пары Дарлингтона или другого транзисторного ключа. В данном случае, падение напряжения на базовом резисторе анодного ключа 2N2907 составляет напряжение Vcc = 5,0 В минус падение напряжения на переходе эмиттер-база транзистора (0,7В), минус напряжение на выводе порта (0,4 В) для сигнала низкого логического уровня, т. е. 3,9 В. Следовательно, величина резистора будет равняться 3,9 В/5,6 мА = 696 Ом. Ближайшая величина стандартного номинала резистора имеет значение 690 Ом, которая и выбрана для этой схемы.
Светодиодный индикатор должен быть проверен до начала функционирования программного обеспечения. Вначале необходимо запрограммировать ППИ 82С55. Это выполняется небольшой последовательностью команд, перечисленных в примере 11.8. Здесь оба порта А и В программируются на вывод.
Пример 11.8. Программа для программирования микросхемы ППИ 82С55
; Программирование ППИ 82С55
0000	ВО 80	MOV AL,10000000В
0002	ВА 0703	MOV DX,703H	; адрес
0005	ЕЕ	OUT DX,AL	; установка 7 бита порта 703Н
18 Зак 384
546
Гпава 11
Процедура мультиплексирования светодиодного индикатора приведена в примере 11.9. Для исправного функционирования светодиодного индикатора следует часто вызывать эту процедуру.
Пример 11.9. Процедура мультиплексирования светодиодного индикатора
; Процедура мультиплексирования 8-разрядного
; светодиодного индикатора.
; Эта процедура должна вызываться из программы
; всякий раз, когда необходимо вывести из памяти
; закодированные данные на 7-сегментный индикатор.
0006	DISP PROC NEAR USES AX BX DX SI
000А 9С 000В ВВ 0008 000Е В4 7F	PUSH?	;	сохранение регистра флагов ; установка регистров индикатора MOV ВХ,8	;	загрузка счетчика MOV AH,7FH	;	загрузка кода выборки
0010 BE 00FF R 0013 ВА 0701 0016 0016 8А С4 0018 ЕЕ 0019 4А 001А 8А 00 001С ЕЕ	MOV SI,OFFSET MEM-1 ; адрес данных MOV DX,701H	; адрес порта В ; отображение 8 символов DISP1: MOV AL,АН	; выбор позиции индикатора OUT DX,AL DEC DX	; адрес порта А MOV AL,[BX+SI]	; получение 7-сегментных данных OUT DX,AL
001D Е8 029А R 0020 DO СС 0022 42 0023 4В 0024 75 F0 0026 5Е 002С	CALL DELAY	; ожидание одной миллисекунды ROR АН,1	; следующая позиция индикатора INC	DX	;	адрес порта В DEC	ВХ	;	уменьшить счетчик JNZ	DISP1	;	повторить 8 раз POPF	;	восстановить регистр флагов RET DISP ENDP
Обратите внимание, что эта процедура запрашивает другую процедуру (delay), которая приводит к задержке времени в I мс. В этом случае процедура задержки времени не отображена, но она используется для предоставления времени включения каждой отображаемой позиции индикатора. Производители светодиодных индикаторов рекомендуют, чтобы индикатор вспыхивал с частотой от 100 до 1500 Гц. Используя задержку времени в I мс, осуществляется вывод каждого разряда данных в соответствующей позиции индикатора в течение 1 мс с общей частотой вывода на индикатор 1000 Гц/8 125 Гц.
Процедура отображения адресует участок памяти, где хранятся данные в 7-сегмент-ном коде для восьми разрядов индикатора, называемых мем. Регистр АН загружается
разовый интерфейс в вода-вы вода
547
кодом выборки (7FH), который в исходном положении адресует наиболее значимую оТображаемую позицию индикатора. После выбора этой позиции адресуется содержимое ячейки памяти мем + 7, откуда и получаются данные для вывода их на индикатор. Затем код выборки изменяется для задания следующей позиции индикатора и соответствующей ячейки памяти. Этот процесс повторяется восемь раз, последовательно отображая содержимое ячеек памяти от мем + 7 и до мем на 8-разрядном индикаторе, начиная со старшей позиции.
Подключение жидкокристаллического индикатора к ППИ 82С55
Жидкокристаллические индикаторы (ЖКИ), иначе, жидкокристаллические дисплеи (ЖКД) или LCD-индикаторы (LCD — liquid crystal display) быстро заменяют светодиодные индикаторы во многих устройствах. Единственным недостатком ЖКИ является го, что его трудно наблюдать при малой освещенности, где светодиодные индикаторы все еще используются.
На рис. 11.21 показано подключение ЖКИ типа DMC20481 корпорации Optrex с помощью микросхемы ППИ 82С55.
34
33
32
31
29.
28
27
DO D1 D2 D3 D4 D5 D6 D7
РАО PA1 PA2 РАЗ PA4 PA5 PA6 PA7
4.
3.
2.
4Q. JO. Jia. 37
5.
Jfi.
8
35
6
RD WR AO A1 RESET CS
PBO PB1 PB2 PB3 PB4 PB5 PB6 PB7
PCO PC1 PC2 PC3 PC4 PC5 PC6 PC7
18
_19___
_2Q___
21___
22
23
25
15
17___
13___
10___
DO
D1
B2 Bl -Q4.
B5 Bl BL
R/W
BS. _E.
4 строк х 20
ЖКИ
vcc
15
Vee
LEDA
vcc
10 кОм
LEDK

82С55
DMC20481
* Примечание: Максимальный ток равен 480 мА, а номинальный ток 260 мА
Рис. 11.21. Подключение жидкокристаллического индикатора DMC20481 с помощью ППИ 82С55
DMC20481 представляет собой индикатор, состоящий из 4 строк по 20 знаков в каждой, в котором в качестве входных данных допускается использовать ASCII-коды. Матрица для индикации одного знака состоит из 40 точек (5x8). На индикатор, помимо данных, подают и команды, которые инициализируют и управляют его работой. Индикатор DMC20481 имеет 16 выводов. Информационные выводы DO— D7, подключенные к порту А ППИ 82С55, используются для ввода отображаемых Данных и для считывания информации с индикатора. DMC20481 имеет четыре управляющих вывода. Вывод VEE используется для регулировки контрастности ЖКИ и обычно подключается к потенциометру на 10 кОм, как показано на рисунке. Вывод выбора регистра RS (register select) предназначен для указания данных (RS = 1)
548 Гпава if
или команд (RS = 0). Ввод разрешения Е (enable) должен иметь высокий логический уровень для выполнения операций считывания или записи информации. Наконец, вывод R/W указывает на выполняемую операцию считывания или записи. Как правило, на выводы RS и R/W в зависимости от операции подаются сигналы низкого или высокого логического уровня, далее выставляют данные на информационные выводы DO—D7 и затем на вывод Е посылается импульс для доступа к индикатору DMC20481. Кроме того, имеется два вывода, непоказанные на схеме которые предназначены для подсветки индикатора с помощью светодиодов. Для программирования жидкокристаллического индикатора DMC20481 следует вначале установить его в исходное состояние. Это применяется к любому индикатору, в котором используется блок управления с высокой степенью интеграции типа HD44780 (Hitachi) или эквивалентный ему. Вся линейка небольших панелей устройств отображения от корпорации Optrex программируется аналогичным образом. Для инициализации необходимо выполнить следующие шаги:
1.	Подождать не менее 15 мс после достижения напряжения Vcc уровня 5,0 В.
2.	Вывести команду функциональной настройки (ЗОН) и подождать не менее 4,1 мс.
3.	Вывести команду функциональной настройки (ЗОН) во второй раз и подождать не менее 100 мкс.
4.	Вывести команду функциональной настройки (ЗОН) в третий раз и подождать не менее 40 мкс.
5.	Вывести команду функциональной настройки (38Н) в четвертый раз и подождать не менее 40 мкс.
6.	Вывести 08Н для отключения индикатора и подождать не менее 40 мкс.
7.	Вывести 01Н для установки курсора в исходное положение и очистить индикатор, подождать не менее 1,64 мс.
8.	Вывести сигнал включения индикатора и выключения курсора (ОСН) и подождать не менее 40 мкс.
9.	Вывести 06Н для указания выполнения режима ввода с автоматическим приращением, перемещением курсора и подождать не менее 40 мкс.
Программа инициализации жидкокристаллического индикатора приводится в примере 11.10. Она достаточно объемная, но блок управления DMC20481 требует длительного диалога при инициализации.
Обратите внимание, что подпрограммы, обеспечивающие временные задержки, в листинг не включены. При подключении данного индикатора к персональному компьютеру для временных задержек можно использовать тактовую частоту системных часов, пример использования которой рассмотрен в главе 7.
Пример 11.10. Процедура init, выполняющая инициализацию индикатора
; процедура инициализации жидкокристаллического индикатора
0010
INIT PROC NEAR
Базовый интерфейс ввода-вывода
549
0010	ВА	0303	MOV	DX,CMD8255 ; обращение к регистру команд 82С55	
0013	ВО	80	MOV	AL,80Н	; настроить все порты на вывод
0015	ЕЕ		OUT	DX,AL	
0016	ВО	00	MOV	AL, 0	; очистить порт В
0018	ВА	0301	MOV	DX,PORTB	
001В	ЕЕ		OUT	DX, AL	
001С	Е8	004А	CALL	DELAY15	; ожидание 15 мс
001F	ВО	30	MOV	AL,ЗОН ;	первая команда функциональной настройки
0021	Е8	002А	CALL	OUTCMD ;	ее вывод
0024	Е8	0056	CALL	DELAY41 ;	ожидание 4,1 мс
0027	ВО	30	MOV	AL,ЗОН	
0029	Е8	• 0022	CALL	OUTCMD ;	вторая команда функциональной настройки
002С	ВО	30	MOV	AL,ЗОН ;	третья команда функциональной настройки
002Е	Е8	001D	CALL	OUTCMD	
0031	ВО	38	MOV	AL,38H ;	четвертая команда функциональной
0033	Е8	0018	CALL	OUTCMD ;	настройки
0036	Е8	0058	CALL	DELAY100	
0039	ВО	08	MOV	AL,08H ;	выключение индикатора
003В	Е8	0010	CALL	OUTCMD	
ООЗЕ	ВО	01	MOV	AL,01H ;	очистка индикатора
0040	Е8	000В	CALL	OUTCMD	
0043	ВО	ОС	MOV	AL,0CH ;	включение индикатора, выключение курсора
0045	Е8	0006	CALL	OUTCMD	
0048	ВО	06	MOV	AL,06H ;	перемещение курсора
004А	Е8	0001	CALL	OUTCMD	
004D	СЗ		RET		
004Е		INIT	ENDP		
; процедура вывода команды
004Е		OUTCMD PROC NEAR			
004Е	50		PUSH	AX	; сохранить команду
004F	ВА	0303	MOV	DX,CMD8255 ,	; задать регистр команд 82С55
0052	ВО	80	MOV	AL,80H	; настроить все порты на вывод
0054	ЕЕ		OUT	DX, AL	
0055	ВА	0300	MOV	DX,PORTA	
0058	58		POP	AX	
0059	ЕЕ		OUT	DX,AL	; выдать команду в порт А
005А	42		INC	DX	; задать адрес порта В
005В	ВО	04	MOV	AL, 4	; поместить лог. ”1" на вывод Е,
005D	ЕЕ		OUT	DX,AL	; а лог. "0" на вывод R/W# и S
005Е	90		NOP		; дополнительное время для
005F	90		NOP		; удержания на выводе Е лог. "1"
0060	ВО	00	MOV	AL, 0	
0062	ЕЕ		OUT	DX,AL	; сброс сигнала на выводе Е
0063	Е8	0029	CALL	DELAY100	; ожидание 100 мкс
0066	СЗ		RET		
0067		OUTCMD	ENDP		
В процедуру outcmd должны быть добавлены команды nop, для того чтобы при активизации жидкокристаллического индикатора на его выводе Е достаточно долго со
550	Гпава 1 у
хранился бы уровень логической 1. Такой процесс формирования задержки времени должен работать для большинства систем и тактовых частот, но такое добавление команды nop может понадобиться для продления времени выполнения и в некоторых других случаях.
Команды, используемые в диалоге инициализации, должны быть разъяснены перед программированием данных для индикатора DMC20481. Полный перечень команд/инструкций для жидкокристаллического индикатора приведен в табл. 11.4. Сравните команды, посылаемые на индикатор в программе инициализации с этой таблицей.
Таблица 11.4. Команды для большинства жидкокристаллических индикаторов корпорации Optrex
Команда	Код	Описание	Время выполнения
Очистка индикатора	0000 0001	Очищает индикатор и возвращает курсор в исходное положение	1,64 мс
Возврат курсора	0000 0010	Возвращает курсор в исходное положение	1,64 мс
Установка режима ввода	0000 0AS0	Устанавливает направление перемещения (А = 1 приращение) и сдвига (S = 1 сдвиг) курсора	40 мкс
Вкл/выкл индикатора	0000 1DCB	Включает/выключает	индикатор (D = 1 вкл) (С = 1 курсор включен) (В = 1 курсор мигает)	40 мкс
Сдвиг курсора или позиции знакоместа	0001 SR00	Устанавливает перемещение курсора и сдвиг позиции знакоместа (S = 1 сдвиг позиции знакоместа) (S = 0 перемещение курсора) (R = 1 вправо)	40 мкс
Функциональная настройка	001LNF00	Программирование знакоместа (L = 1 восемь разрядов, L = 0 четыре разряда) (N = 1 две строки) (F = 1 матрица 5x10 точек, F = 0 матрица 5x7 точек)	40 мкс
Установка адреса CGRAM	01XX ХХХХ	Устанавливает адрес ОЗУ генератора символов (CG — character generator)	40 мкс
Установка адреса DRAM	юхххххх	Устанавливает адрес ОЗУ индикатора	40 мкс
Считывание флага занятости	В000 0000	Считывает флаг занятости (В = 1 занят)	0
Запись данных	Данные	Записывает данные на индикатор или в ОЗУ генератора символов	40 мкс
Считывание данных	Данные	Считывает данные с индикатора или ОЗУ генератора символов	40 мкс
Базовый интерфейс ввода-вывода 551
После завершения инициализации требуются несколько процедур по отображению информации и управлению индикатором. Временные задержки после инициализации больше уже не нужны при передаче на индикатор данных либо команд. Для команды очистки дисплея все еще требуется время задержки, поскольку признак (флаг) занятости в этой команде не применяется. Флаг занятости, вместо указания времени задержки, проверяет: завершил ли индикатор операцию. Процедура по проверке флага занятости дана в примере ll.ll. Процедура busy проверяет жидкокристаллический индикатор на занятость, а выход из нее осуществляется только после завершения предыдущей команды.
Пример 11.11. Процедура busy, проверяющая занятость индикатора .......................................................................л
; процедура проверки занятости индикатора и
; возврат из нее, если он не занят
<’010	BUSY PROC .REPEAT			NEAR		
0010	ВА	0303	MOV	DX,CMD8255	; обращение к регистру команд	82С55
0013	ВО	90	MOV	AL,90H	; настройка порта А на ввод	
0015	ЕЕ		OUT	DX, AL		
0016	ВА	0301	MOV	DX,PORTB	; выбор порта В	
0019	ВО	01	MOV	AL, 1	; R/W# = 1	
001В	ЕЕ		OUT	DX,AL		
001С	ВО	05	MOV	AL, 5	; R/W# = 1, Е = 1, RS = 0	
001Е	ЕЕ		OUT	DX,AL		
001F	90		NOP		; задержка, для предоставления	доступа
0020	90		NOP			
0021	ВА	0300	MOV	DX,PORTA	; выбор порта А	
0024	ЕС		IN	AL,DX	; получение состояния флага занятости	
0025	50		PUSH	AX		
0026	ВА	0301	MOV	DX,PORTB		
0029	ВО	00	MOV	AL, 0		
002В	ЕЕ		OUT	DX, AL		
002С	ВА	0303	MOV	DX,CMD8255		
002F	ВО	80	MOV	AL,80H		
0031	ЕЕ		OUT	DX, AL		
0032	58		POP	AX		
0033	ВО	Е0	SHL	AL, 1		
			.UNTIL !	!CARRY?	; до тех пор пока не занят	
0037	СЗ		RET			
0038		BUSY ENDP				
Данные выполнения процедуры busy могут отсылаться на индикатор посредством другой процедуры, называемой write (запись). Процедура write использует процедуру busy для тестирования перед записью новых данных на индикатор. В примере 11.12 показана процедура write, которая осуществляет передачу ASCII-символов из регистра BL на индикатор в текущую позицию курсора.
Следует отметить, что во время выполнения диалога инициализации был установлен режим для автоматического приращения положения курсора, поэтому если процеду-
552
Глава 11
pa write вызывается более одного раза, то передаваемые на дисплей символы будут появляться один за другим, как на видеодисплее.
Пример 11.12. Процедура write, выполняющая передачу символов на индикатор
; процедура передачи ASCII-символов,
; находящихся в регистре BL, на индикатор
ООЗА	WRITE PROC	NEAR
00ЗА ВА 0303	MOV	DX,CMD8255
003D ВО 80	MOV	AL,80H
003F ЕЕ	OUT	DX,AL
0040 ВА 0300	MOV	DX,PORTA	; данные в порт A
0043 8А СЗ	MOV	AL, BL
0045 ЕЕ	OUT	DX,AL
0046 БА 0301	MOV	DX,PORTB
0049 ВО 02	MOV	AL, 2	; RS = 1, R/W# = 0, E = 0
004В ЕЕ	OUT	DX,AL
004С 90	NOP	
004D 90	NOP	
004Е ВО 06	MOV	AL, 6	; RS = 1, R/W# = 0, E = 1
0050 ЕЕ	OUT	DX, AL
0051 90	NOP	
0052 90	NOP	
0053 ВО 00	MOV	AL, 0	; RS = 0, R/W# = 0, E = 0
0055 ЕЕ	OUT	DX, AL
0056 Е8 FFB7	CALL	BUSY	; ожидание индикатора
0059 СЗ	RET	
005А	WRITE ENDP	
Еще одна процедура, которая необходима для работы с индикатором, — это процедура очистки и возврата курсора в исходное положение, называемая cls (пример 11.13). При наличии команды cls и представленных до этого процедур вы можете отобразить любое сообщение на дисплее, очистить его, отобразить другое сообщение и, по существу, управлять дисплеем. Ранее упоминалось, что для очистки команды требуется время задержки (не менее 1,64 мс) вместо вызова BUSY для нормального функционирования. В этой процедуре мы используем время задержки 4,1 мс.
Пример 11.13. Процедура cls, очищающая индикатор и перемещающая курсор в исходное положение
; процедура очистки индикатора и
; возврата курсора в исходное положение
005А	CLS PROC NEAR
005A BA 0303	MOV	DX,CMD8255
005D ВО 80	MOV	AL,80H
005F EE	OUT	DX, AL
Базовый интерфейс ввода-вывода
553
3060 ВА 0300	MOV	DX,PORTA
00 63 ВС 01	MOV	AL,1	; команда очистки индикатора
0065 ЕЕ	OUT	DX, AL
0366 ВА 03С1	MOV	DX,PORTВ
С069 ВО 04	MOV	AL, 4	; RS = 0, R/W# = 0, E = 1
006В ЕЕ	OUT	DX, AL
0?6С 90	NOP	
006 D 90	NOP	
006Е ВО 00	MOV	AL,0	; RS = 0, R/W# =0, E = 0
00/0 ЕЕ	OUT	DX, AL
3071 Е8 0044	CALL	DELAY41
0074 СЗ	RET	
00 /5	CLS	ENDP	
Дополнительные процедуры могли бы задавать адрес ОЗУ индикатора, определяющий, соответственно, позицию знакоместа. Этот адрес начинается с нулевой позиции и заканчивается адресом для последнего 19 символа в первой строке, 20 — это первая позиция индикатора, но уже другой строки, и т. д. Если же имеется возможность модифицировать адрес позиции знакоместа индикатора, то возможно изменять и отдельные символы на индикаторе, и даже считывать данные с индикатора. При необходимости эти процедуры можно разработать самостоятельно.
Несколько слов относительно ОЗУ, находящегося внутри индикатора. Жидкокристаллический индикатор DMC20481 имеет память на 128 байт, которая адресуется от ООН до 7FH. Эта память используется не полностью, поскольку для индикации 80 символов достаточно всего 80 байт. Например, однострочный индикатор на 20 символов использует только первые 20 байт памяти (ООН—13Н). Первая строка для любого типа подобных индикаторов всегда начинается с адреса ООН. Другая строка любого индикатора, с блоком управления HD44780, всегда начинается с адреса 40Н. Например, двухстрочный индикатор на 40 символов использует адреса ООН—27Н для хранения ASCII-данных первой строки. Вторая строка данных этого индикатора хранится по адресам 40Н—67Н. В индикаторе на четыре строки первая строка начинается с адреса ООН, вторая с 40Н, третья с 14Н и последняя четвертая строка с 54Н. Самое большое устройство отображения, использующее блок HD44780, имеет дисплей на две строки по 40 символов. Дисплей на четыре строки по 40 символов использует блок управления М50530 или пару HD44780. Поскольку информацию по этим устройствам легко найти в Internet, то в этом тексте они не рассматриваются.
Подключение шагового двигателя к ППИ 82С55
Другим, часто сопрягаемым с компьютерной системой, устройством является шаговый двигатель. Шаговый двигатель — это двигатель, управляемый от цифрового привода, выполняющий вращение на 360° дискретными шагами. Недорогой типовой шаговый двигатель является редукторным и осуществляет вращение на 15° за один шаг. Более дорогостоящие, высокоточные шаговые двигатели способны выполнять вращение на 1° за один шаг. Во всех случаях эти шаги усиливаются за счет магнитных полей и/или редуктора.
На рис. 11.22 приводится шаговый двигатель с возбуждением двух обмоток. Если же требуется меньшее количество мощности, то даже одна обмотка может подавать
554
Глава 11
питание в определенный момент времени, приводя к тому, что двигатель выполняет шаги на 45, 135, 225 и 315°.
Рис. 11.22. Шаговый двигатель с последовательными шагами вращения на: а) 45°; 6) 135°; в) 225° и г) 315°
На рис. 11.22 показан шаговый двигатель с четырьмя обмотками, которые взаимодействуют с одним полюсом ротора. Обратите внимание на то, что шаговый двигатель показан четыре раза при различном положении ротора (постоянного магнита), повернутого относительно своей оси на определенный угол. Такое вращение ротора осуществляется посредством возбуждения соответствующих обмоток двигателя. Шаговый двигатель приводится в действие усилителем на п-p-n транзисторной паре Дарлингтона, подающим в определенный момент времени достаточно большой ток на каждую пару обмоток.
Схема запуска шагового двигателя с четырьмя обмотками показана на рис. 11.23.
На этой схеме для подачи на двигатель сигналов возбуждения используется микросхема ППИ 82С55, дешифратор которой на рисунке не показан. Эти сигналы возбуждения могут вращать ротор двигателя в направлении по часовой или против часовой стрелки. Простая процедура по приведению двигателя в действие, в предположении, что порт А запрограммирован в режиме 0 как устройство вывода, приведена в примере 11.14. Эта подпрограмма вызывается со значением регистра
Базовый интерфейс ввода-вывода 555
СХ, в котором хранится число шагов и направление вращения двигателя. Если значение регистра СХ > 8000Н, то двигатель вращается по часовой стрелке, если СХ < 8000Н, то он вращается против часовой стрелки. Таким образом, самый крайний слева разряд содержимого регистра СХ отвечает за направление вращения шагового двигателя, а остальные 15 разрядов содержат число шагов.
Рис. 11.23. Подключение шагового двигателя к ППИ 82С55
Пример 11.14. Процедура управления шаговым двигателем
= 0040
PORT EQU	4ОН
; назначение порта А
; процедура, управляющая шаговым двигателем
0000			STEP PROC	NEAR	
0000	АО	0000 R	MOV	AL,POS	; получение позиции
0003	81	F9 8000	СМР	CX,8000H	
0007	77	10	JA	RH	; если вращение по часовой стрелке
0009	83	F9 00	СМР	CX, 0	
ооос	74	14	JE	STEP_OUT	; если нет шагов
000Е			STEP1:		
ооое	D0	СО	ROL	AL, 1	; шаг против часовой стрелки
0010	Е6	40	OUT	PORT,AL	
0012	Е8	ООН	CALL	DELAY	; ожидание 1 мс
0015	Е2	F7	LOOP	STEP1	; повторять пока СХ = 0
0017	ЕВ	09	JMP	STEP_OUT	
0019			RH:		
0019	81	El 7FFF	AND	CX,7FFFH	; очистка 15-го бита
556
Глава 11
001D			RH1:			
001D	D0	С8		ROR	AL, 1	; шаг по часовой стрелке
001 г	Еб	40		OUT	PORT,AL	
0021	Е8	0006		CALL	DELAY	; ожидание 1 мс
0024	Е2	F7		LOOP	RH1	; повторять пока СХ = 0
0026			STEP_	_OUT:		
0026	А2	0000		MOV	POS,AL	; сохранить позицию
0029	СЗ			RET		
0029			STEP	ENDP		
Обратите внимание, что процедура использует время задержки в I мс. Подпрограмма, выполняющая эту задержку, в приведенном примере не показана. Такая задержка требуется шаговому двигателю для того, чтобы ротор имел время для поворота в следующее положение.
Текущая позиция хранится в ячейке памяти pos, исходные значения которой должны быть связаны с кодами: ЗЗН, 66Н, ОССН или 99Н. Это позволяет с помощью элементарных команд циклического сдвига вправо ror (при вращении по часовой стрелке) или влево rol (при вращении против часовой стрелки) циклически сдвигать комбинацию двоичных разрядов для получения кода следующей позиции.
Шаговые двигатели, кроме того, могут работать в режиме полушагового интервала, при котором число шагов увеличивается в два раза. Для данного шагового двигателя можно получить 8 шагов за один цикл. Это достигается за счет использования обычного шагового цикла и дополнительным возбуждением только одной обмотки посредине целых шагов. Полушаговое перемещение позволяет устанавливать ротор в положения 0, 90, I80 и 270°. Таким образом, последовательность кодов, соответствующих всем позициям при полушаговом режиме, будет иметь вид: ИН, ЗЗН, 22Н, 66Н, 44Н, ОССН, 88Н и 99Н. Такая последовательность может быть получена из таблицы соответствия или формироваться программным обеспечением.
Подключение матричной клавиатуры
Клавиатуры по количеству имеющихся клавиш отличаются огромным разнообразием: от стандартных QWERTY-клав натур (на 101 клавишу, сопрягаемых с микропроцессором) до небольших специализированных клавиатур, содержащих только 4— 16 клавиш. Этот раздел текста посвящен небольшим клавиатурам, которые можно либо приобрести предварительно собранными, или сконструировать из отдельных клавишных переключателей.
На рис. 11.24 показана небольшая матрица клавиш на 16 переключателей, подключенная к портам Л и В микросхемы ППИ 82С55. В этом примере переключатели имеют конфигурации 4x4, но любую матрицу можно использовать в конфигурации 2x8.
Клавиши размещены в 4 строки (RowO— Row3) и четыре колонки (Со13—СоЮ). Каждая строка подсоединена к источнику напряжения 5,0 В через нагрузочный резистор 10 кОм, чтобы обеспечить подключение строки к сигналу высокого уровня, при условии, что ни одна из клавиш строки не нажата.
ППИ 82С55 дешифрируется с помощью ПМЛ типа PAL16L8 и имеет адреса портов ввода-вывода 50Н—53Н для микропроцессора 8088. Порт А программируется как
Рис. 11.24. Матрица клавиатуры 4x4, подключенная к микропроцессору 8088 посредством ППИ 82С55
разовый интерфейс ввода-вывода
558 Глава 11
порт ввода для считывания сигналов строк клавиш, а порт В программируется как порт вывода для выбора колонки. Например, если на выводы РВЗ—РВО порта В выводится код 1110 (причем логический ноль на выводе РВО), то выбираются четыре клавиши (0—3) в колонке 0 (СоЮ). Обратите внимание, что в этом случае единственными переключателями, которые могут подавать сигнал низкого логического уровня на порт А, являются переключатели 0—3. В это время даже если клавиши 4— F и будут замкнуты, то они никоим образом не могут повлиять на сигналы, поступающие на выводы порта А, сохраняя высокий логический уровень. Нажатая клавиша в выбранной колонке будет определена на пересечении со строкой, имеющей в данный момент низкий логический уровень, что легко обнаруживается с помощью считанного кода с выводов порта А. Аналогичным образом, при выводе комбинации 1101 в порт В, выбираются клавиши 4—7 в следующей колонке, а затем определяется, какая из них нажата в данный момент времени и т. д.
Блок-схема процедуры сканирования матрицы клавиатуры и устранения дребезга контактов нажатой клавиши представлена на рис. 11.25. Дребезг контактов клавиш устраняется за счет добавления незначительного времени задержки в пределах 10—20 мс.
Блок-схема имеет три главные части. Первая — ожидает до тех пор, пока клавиша будет отпущена. Это может показаться излишне громоздким решением, но поскольку микропроцессор выполняет программы очень быстро, то существует вероятность того, что программа может выполнить возврат в начало до того, как клавиша будет разомкнута. Поэтому вначале необходимо подождать, пока предыдущая клавиша не будет отпущена. Затем на блок-схеме показана часть, которая предназначена для ожидания перед нажатием клавиши. После обнаружения нажатой клавиши в последней части блок-схемы вычисляется ее позиция или соответствующий ей код.
Основная процедура клавиатуры, названная, использует процедуру scan для сканирования клавиш и процедуру delay — для задержки времени порядка 10 мс на устранение дребезга контактов. Процедура клавиатуры key вместе с остальными процедурами показана в примере 11.15.
Пример 11.15. Процедура сканирования клавиатуры и устранения дребезга контактов
; Процедура клавиатуры, которая осуществляет
; ее сканирование и после выхода из нее
; возвращает код нажатой клавиши в регистре AL
= 0004 = 0004 = 0050 = 0051	ROWS EQU COLS EQU PORTA EQU PORTB EQU	4 4 50H	; 51H	число строк число колонок адрес порта А адрес порта В
0000	KEY PROC		NEAR USES CX	
0001 Е8 002F	CALL	SCAN	проверка всех клавиш
0004 75 FA	JNZ	KEY	если клавиша нажата
0006 Е8 0048	CALL	DELAY	ожидание около 10 мс
0009 Е8 0027	CALL	SCAN	проверка всех клавиш
000С 75 F2	JNZ	KEY	если клавиша нажата
Базовый интерфейс ввода-вывода
559
ОООЕ	KEY1:
000Е	Е8 0022	CALL SCAN	; проверка всех клавиш
ООП	74 FB	JZ	KEY1	; если нет нажатой клавиши
0013	Е8 00ЗВ	CALL DELAY	; ожидание около 10 мс
0016	Е8 001А	CALL SCAN	; проверка всех клавиш
0019	74 F3	JZ	KEY1	; если нет нажатой клавиши
001В	50	PUSH АХ	; сохранение кода строки
001С	ВО 04	MOV AL,COLS	; вычисление исходной строки клавиши
001Е	2А Cl	SUB AL,CL
0020	В5 04	MOV CH,ROWS
0022	F6 E5	MUL CH
0024	BA C8	MOV CL,AL
0026	FE C9	DEC CL
0028	58	POP AX
0029	KEY2:
0029	DO C8	ROR AL, 1	; поиск позиции строки
002В	FE Cl	INC CL
002D	72 FA	JC	KEY2
002F	8A Cl	MOV AL, CL	; код поместить в регистр AL
	RET
0033	KEY ENDP
0033	SCAN PROC NEAR USES BX
0034	Bl 04	MOV CL, ROWS	; маска строки
0036	B7 FF	MOV BH, OFFH
0038	D2 E7	SHL BH,CL
003А	B9 0004	MOV CX,COLS	; загрузка счетчика колонок
003D	B3 FE	MOV BL,OFEH	; получение выбранного кода
003F	SCAN1:
003F	8A СЗ	MOV AL, BL	; выбор колонки
0041	E6 51	OUT PORTB,AL
0043	DO C3	ROL BL, 1
0045	E4 50	IN	AL, PORTA	; чтение строк
0047	0A C7	OR	AL,BH
0049	3C FF	CMP AL, OFFH	; проверка клавиши
004В	75 02	JNZ SCAN2
004D	E2 F0	LOOP SCAN1
004F	SCAN2:
	RET
0051	SCAN ENDP
0051	DELAY PROC NEAR USES CX
0052	B9 1388	MOV CX,5000	; 10 мс (при частоте 8 МГц)
0055	DELAY1:
0055	Е2 FE	LOOP DELAY1
	RET
0059	DELAY ENDP
560
Глава 11
Ожидание отпускания клавиши
I
Ожидание ----- нажатия клавиши
Рис. 11.25. Блок-схема процедуры сканирования клавиатуры и устранения дребезга контактов
Базовый интерфейс в вода-вы вода 561
Следует заметить, что процедура SCAN является общей, поэтому она может применяться с любой конфигурацией клавиатуры: от матрицы 2x2 до матрицы 8x8. Сделав изменение только в двух операторах в начале программы (rows и cols) можно настроить процедуру для клавиатуры с любым размером матрицы. Также обратите внимание на то, что в примере не показаны и необходимые шаги для инициализации ППИ 82С55 с тем, чтобы портА был настроен как порт ввода, а порт В как порт вывода.
Несколько слов относительно процедуры scan. Время между выбором колонки матрицы клавиш, в каждой из которой затем считываются сигналы строк, очень короткое. Небольшая временная задержка (в очень высокоскоростной системе) должна устанавливаться в двух точках для данных порта А, чтобы установить окончательное состояние строк. В большинстве случаев в этом нет необходимости, поскольку процедура scan не предусматривает сканирование клавиатуры с частотой выше 30 кГц, в противном случае, Федеральная комиссия по средствам связи США (FCC — Federal Communications Commission) не одобрит его применения в какой-либо системе.
Стробированный ввод режима 1
Режим I предполагает функционирование порта А и/или порта В как устройства ввода с защелками. Это позволяет внешним данным сохраняться в порте, пока микропроцессор не будет готов их извлечь. Порт С также используется в режиме 1, но ие для данных, а для управления или квитирования сигналов, которые помогают задействовать один или оба (А и В) порта как стробированные порты ввода. На рис. 11.26 показаны оба порта для режима 1 при стробировании операций ввода, а также соответствующая временная диаграмма.
Стробированный порт ввода захватывает данные, поступающие на выводы порта в течение активизации сигнала строба STB (strobe). Следует уточнить, что порт фиксирует данные во время положительного фронта этого сигнала, т. е. при переходе от О к 1. Сигнал STB способствует тому, чтобьГ данные были введены в порт, и он активизирует сигналы IBF (input buffer full — входной буфер полон) и INTR (interrupt request — запрос прерывания). Микропроцессор, заметив стробирование данных в порт программно (по сигналу IBF) или аппаратно (по прерыванию, вызываемого сигналом 1NTR), выполняет команду in для чтения данных из порта (RD). При считывании порт переводит сигналы IBF и INTR в неактивное состояние до тех пор, пока не будет выполнена стробированная передача в порт следующей порции данных.
Описание сигналов стробированного ввода режима 1
О STB
Стробирующий входной сигнал загружает данные в защелку порта, которая удерживает информацию, до ее ввода в микропроцессор с помощью команды in.
□ IBF
Сигнал IBF (input buffer full — входной буфер полон) является выходным сигналом, обозначающим наличие информации в защелке порта ввода.
562
Глава 11
Рис. 11.26. Стробированная операция ввода (режим 1) ППИ 82С55: а) внутренняя структура и 6) временная диаграмма
□	INTR
Сигнал INTR (interrupt request — запрос прерывания) является выходным сигналом, запрашивающим прерывание у микропроцессора. Вывод INTR приобретает высокий логический уровень, при сбросе сигнала STB, и очищается при вводе данных в микропроцессор из порта.
□	INTE
Сигнал INTE (interrupt enable — разрешение прерывания) не является ни входным, ни выходным сигналом портов. Это — внутренний сигнал, программируемый с помощью двоичного разряда РС4 порта С (для порта А) или бита РС2 порта С (для порта В).
Базовый интерфейс ввода вывода 563
П РС7, РС6
Выводы 7 и 6 порта С являются универсальными выводами для ввода-вывода, которые пригодны для любой цели.
Пример стробированного ввода
Отличным примером стробированного устройства ввода является клавиатура. Кодирующее устройство клавиатуры устраняет дребезг контактов кнопочных переключателей и формирует строб-сигнал при нажатой клавише, а выходные данные содержат ASCII-код нажатой клавиши.
На рис. 11.27 показана клавиазура, подключенная к стробированному входному порту А.
Рис, 11.27. Использование ППИ 82С55 для операций стробированного ввода данных с клавиатуры
Здесь сигнал на выводе DAV (data available — доступные данные) активизируется на 1,0 мкс каждый раз при нажатии кнопки на клавиатуре. Данные при этом стробируются в порт А, поскольку вывод DAV соединен с выводом РС4, предназначенного для подачи на него сигнала стробирования STB для порта А. Следовательно, каждый раз при нажатии на клавишу данные, поступающие на выводы РАО— РА7 порта А микросхемы ППИ 82С55, запоминают в нем. Сигнал STB активизирует ответный сигнал IBF, указывающий на наличие поступивших в порт А данных.
В примере 11.16 приведена процедура считывания данных клавиатуры при каждом нажатии на клавишу. По этой процедуре считывается код клавиши из порта А и происходит передача соответствующего ASCII-кода в регистр AL. Для определения нажатой клавиши производится чтение порта С и проверяется сигнал IBF или, иначе, бит РС5, чтобы увидеть, заполнен ли буфер. Если буфер пуст (IBF = 0), тогда подпрограмма продолжает проверку этого бита и дожидается нажатия символа на клавиатуре.
564
Глава 11
Пример 11.16. Процедура чтения клавиатуры и записи А8СП*кода символа в регистр AL
; Процедура, которая читает поступивший с клавиатуры код
; и возвращает ASCII-код символа в регистр AL
= 002	0		BIT5	EQU	2 OH	
= 002			PORTC	EQU	22H	
= 002	0		PORTA	EQU	20H	
0000			READ	PROC	NEAR	
0000	Е4	22		IN	AL,PORTC	; читать порт С
0002	АЗ	20		TEST	AL,BIT5	; проверить сигнал IBF
0004	74	ЕА		JZ	READ	; ожидание, если сигнал IBF = 0
000 с.	Е4	20		IN	AL,PORTA	; если буфер полон, получить данные
ООСН	23			RET		
0009			READ	ENDP		
Такой метод обслуживания устройств ввода-вывода называется обслуживанием с опросом или, иначе, обслуживанием по программе.
Стробированный вывод режима 1
На рис. И.28 приведены внутренняя конфигурация и временная диаграмма ППИ 82С55 при функционировании в качестве стробированного устройства вывода в режиме I.
Операция стробированного выхода аналогична операции вывода для режима 0, за исключением управляющих сигналов для обеспечения квитирования.
При записи данных в порт, который программируется как стробированный порт вывода, устанавливается сигнал OBF (output buffer full — выходной буфер полон), т. е. сигнал становится низкого логического уровня, чтобы указать на наличие данных в защелке порта. Этот сигнал говорит о том, что данные для внешнего устройства ввода-вывода выставлены, и, принимая которые, это устройство подтверждает их получение с помощью сигнала АСК (acknowledge — подтверждение). Поступивший в порт сигнал АСК сбрасывает сигнал OBF в состояние логической 1, указывая на незаполненное состояние буфера.
Описание сигналов стробированного вывода режима 1
□ OBF
Выходной сигнал OBF (output buffer full — выходной буфер полон) имеет низ-кий логический уровень, когда данные помещены (OUT) в защелку порта А или порта В. Этот сигнал становится высокого логического уровня при возврате импульса АСК от внешнего устройства.
разовый интерфейс ввода-вывода
565
Рис. 11.28. Операция стробированного вывода режима 1 микросхемы ППИ 82С55: а) внутренняя структура и б) временная диаграмма
□	АСК
Сигнал АСК (acknowledge — подтверждение) сбрасывает сигнал OBF, т. е. возвращает его на логический уровень 1. Сигнал АСК — это ответное действие внешнего устройства, указывающего на получение данных из порта интерфейса 82С55.
□	INTR
При получении внешним устройством данных достаточно часто прерывается микропроцессор посредством сигнала INTR (interrupt request — запрос прерыва-ния), который инициируется перепадом от логического 0 к 1 сигнала АСК. Этот сигнал формируется внутренним сигналом порта INTE (internipt enable — разрешение прерывания).
566
Гпава 11
□	INTE
Сигнал INTE (interrupt enable — разрешение прерывания) не является ни входным, ни выходным сигналом. Это — внутренний сигнал, который определяется для порта А битом РС6, а для порта В битом РС2 и предназначен для формирования сигнала INTR.
□	РС5, РС4
Выводы 5 и 4 порта С являются универсальными выводами для ввода-вывода в режиме I. Для установки и сброса сигналов на этих двух выводах может быть использована команда установки и сброса битов.
Пример стробированного вывода
Для демонстрации взаимодействия между принтером и ППИ 82С55 здесь использован интерфейс принтера, рассмотренный в разд. 11.1. На рис. 11.29 показано, что порт В подключается к принтеру, работающему по параллельному интерфейсу, при помощи восьми информационных линий для передачи ASCII-данных, вывода сигнала Strobe для стробирования передаваемых в принтер данных, а также приема сигнала АСК, подтверждающего получение ASCII-символа принтером.
Рис. 11.29. Подключение микросхемы ППИ 82С55, работающей в режиме стробированного вывода данных, к принтеру, использующему параллельный интерфейс
В этой схеме нет сигналов, формирующих сигнал Strobe, передаваемый в принтер, поэтому бит РС4 используется программой, которая и генерирует сигнал Strobe. Возвращающийся от принтера сигнал АСК, поступая на вывод РС2 ППИ 82С55, уведомляет его о получении данных.
В примере 11.17 представлена программа, которая посылает на принтер, хранящийся в регистре АН, ASCII-символ. Вначале процедура проверяет сигнал OBF (бит РС1), чтобы определить, пуст ли (OBF = 1) в данный момент времени буфер порта, что
Базовый интерфейс ввода-вывода
567
является признаком получения принтером данных из порта В. Если нет, то подпрограмма дожидается возвращения от принтера сигнала АСК, подтверждающего получение данных. Если же буфер пуст (OBF = 1), тогда подпрограмма отсылает на принтер через порт В содержимое регистра АН вместе с сигналом стробирования данных Strobe.
Пример 11.17. Процедура передачи ASCII-символа, сохраненного в регистре АН микропроцессора, в принтер через порт В
; Процедура, которая передает ASCII-симеол
; из регистра АН на принтер через порт В
ОСО	2		BIT1 EQU	2	
- 006	2		PORTC EQU	62H	
- 006	1		PORTB EQU	61H	
- 0063			CMD EQU	63H	
0000			PRINT PROC	NEAR	
			; проверка	готовности	принтера
0000	Е4	62	IN	AL., PORTC	; получить сигнал OBF#
0002	А8	02	TEST	AL,BIT1	; проверить OBF#
0004	'М	ГА	JZ	PRINT	; ожидание, если OBF# = 0
			передача	символа на	принтер
0 0 С с	8 А	С 4	MOV	AL, АН	; получить данные
0008	L6	61	OUT	PORTB,AL	; выставить данные дпя принтера
			; передача	на принтер	сигнала Утроба данных Strobe#
00 0А	ВО	08	MOV	AL, 8	; сигнал Strobe# = 0
00 ОС	Е6	63	OUT	CMD,AL	
О00Е	ВО	09	MOV	AL, 9	; сигнал Strobe# =- 1
0010	Е6	оЗ	OUT	CMD,AL	
0012	СЗ		RET		
0013	PRINT ENDP
Двунаправленные операции режима 2
В режиме 2, что допустимо только для выводов группы А, порт А становится двунаправленным: передача и прием данных осуществляются по одним и тем же проводам. Двунаправленные шины данные полезны при соединении двух компьютеров. Двунаправленная передача данных применяется также для параллельного высокоскоростного интерфейсного стандарта IEEE-488 или GPIB (general purpose instrumentation bus — интерфейсная шина общего назначения). На рис. 11.30 пока-
568
Глава 11
зана внутренняя структура ППИ 82С55 и временная диаграмма двунаправленной операции передачи данных в режиме 2.
Двунаправленная передача данных режима 2
Рис. 11.30. Режим работы 2 ППИ 82С55: а) внутренняя структура и б) временная диаграмма двунаправленной передачи данных
Базовый интерфейс ввода-вывода
569
Описание сигналов для двунаправленной передачи режима 2
□	INTR
Выходной сигнал INTR (interrupt request — запрос прерывания) используется для прерывания микропроцессора, как для ввода, так и вывода данных.
О OBF
Выходной сигнал OBF (output buffer full — выходной буфер полон) указывает, что выходной буфер содержит данные для двунаправленной шины.
□	АСК
Активный входной сигнал АСК (acknowledge — подтверждение) разрешает выходным буферам с тремя состояниями открыть доступ к данным порта А. Если же сигнал АСК имеет высокий логический уровень, то выходные буферы порта А находятся в состоянии высокого импеданса.
□	STB
Активный входной сигнал STB загружает входную зашелку порта А внешними данными из его двунаправленной шины.
П IBF
Выходной сигнал IBF (input buffer full — входной буфер полон) указывает на то, что буфер содержит данные для внешней двунаправленной шины.
□	INTE
Внутренние сигналы INTE1 и INTE2 (internipt enable — разрешения прерывания) участвуют в формировании сигнала INTR. В свою очередь на состояние этих сигналов оказывают влияние два бита порта С: РС6 (INTE1) и РС4 (INTE2).
□	РС2, РС1 и РСО
Эти три вывода порта С являются универсальными выводами, предназначенными для ввода-вывода в режиме 2. Для установки и сброса сигналов на этих выводах может быть использована команда установки и сброса битов.
Двунаправленная шина
Обращение к двунаправленной шине порта А осуществляется с помощью двух команд ввода-вывода: in и оит. При передаче данных по двунаправленной шине программа вначале должна проверить состояние сигнала OBF , для того чтобы определить, пустой ли буфер. Если буфер пуст (OBF = 1), то данные отсылаются на выходной буфер по команде оит. Внешняя схема также контролирует этот сигнал, чтобы определить: отправил ли микропроцессор данные на шину. Как только внешняя схема определит, что буфер полон (OBF = 0), она принимает данные с шины и отсылает обратно сигнал АСК , очищая тем самым выходной буфер. Таким образом, сигнал АСК устанавливает бит РС7 (OBF = 1) и разрешает выходным буферам трех состояний считывать данные. В примере 11.18 приводится процедура передачи содержимого регистра АН через двунаправленный порт А.
570
Глава 11
Пример 11.18. Процедура передачи содержимого регистра АН по двунаправленной шине И порта А
; Процедураг передающая содержимое регистра АН ; по двунаправленной шине порта А
= 0080	BIT7	EQU	8 OH
= 0062	PORTC	EQU	62H
= 0060	PORTA	EQU	60H
0000	TRANS	PROC	NEAR
0000 Е4 62		IN	AL,PORTC	; получить сигнал OBE#
0002 А8 80		TEST	AL,BIT7	; проверить сигнал OBF#
0004	74 FA		JZ	TRANS	; если OBF# = 1
0006 8А С4		MOV	AL,AH	; получить данные
0008 Е6 60		OUT	PORTA,AL	; передать данные
000А СЗ		RET	
000В	TRANS	ENDP	
При получении	данных по		двунаправленной шине порта А программа проверяет
сигнал IBF (бит РС5), чтобы определить: были ли данные стробированы в порт. Если сигнал IBF установлен, т. е. имеет высокий логический уровень (РС5 = 1), тогда данные вводят по команде in. Внешний интерфейс передает данные в порт с использованием сигнала STB. При активизации сигнала STB устанавливается сигнал IBF, и данные внутри порта А удерживаются в защелке. При выполнении команды in сигнал IBF сбрасывается (РС5 - 0), и данные порта переходят в регистр AL. В примере 11.19 приведена процедура считывания данных из порта.
Пример 11.19. Процедура считывания данных из двунаправленного порта А
; Процедура, при помощи которой данные считываются из
; двунаправленного порта А и помещаются в регистр AL
= 0020		BIT5	EQU	20H	
= 0062		PORTC	EQU	62H	
= 0060		PORTA	EQU	60H	
0000		READ	PROC	NEAR	
0000 Е4	62		IN	AL,PORTC	; получить сигнал IBF
0002 А8 0004 74	20 FA		TEST JZ	AL,BIT5 READ	; проверить сигнал IBF ; ожидание, если сигнал IBF = 0
0006 Е4 0008 СЗ	60		IN RET	AL,PORTA	; получить данные
0009
READ ENDP
Базовый интерфейс ввода-вывода
571
Сигнал INTR можно активизировать при передаче потока данных по шине в двух направлениях. Если сигнал INTR формируется обоими внутренними сигналами INTE (INTE! и INTE2), тогда оба (входной и выходной) буфера запрашивают прерывание. Это происходит при стробировании данных в буфер с использованием сигнала STB или при записи данных по команде опт.
Краткие суммарные сведения о режимах ППИ 82С55
На рис. 11.31 приведено графическое отображение суммарных сведений о трех режимах функционирования ППИ 82С55.
Режим 2
Режим О
ПортА	Ввод	Вывод
Порт В	Ввод	Вывод
0 1 Порт С	2 3 4	Ввод	Вывод
5 6 7		
Режим 1
Ввод	Вывод
Ввод	Вывод
INTRB IBFB STBb intra stba ibfa Ввод-вывод Ввод-вывод	INTRB 5bfb ACKB intra Ввод-вывод Ввод-вывод ACKa obfa
Ввод-вывод
Не используется
Ввод-вывод Ввод-вывод Ввод-вывод INTR STB IBF АСК OBF
Рис. 11.31. Суммарные сведения о режимах ППИ 82С55
Режим 0 обеспечивает простой ввод или вывод, режим I — стробированный ввод или вывод, а режим 2 — двунаправленный ввод-вывод. Как уже упоминалось, выбор этих режимов производится с помощью регистра команд ППИ 82С55.
11.4. Программируемый интерфейс клавиатуры/дисплея 8279
Программируемый элемент интерфейса клавиатуры/дисплея 8279 предназначен для сканирования клавиатуры на 64 кнопки включительно, и управления цифровым индикаторным табло вплоть до 16 разрядов. Интерфейс клавиатуры имеет встроенный буфер типа FIFO (First In, First Out — первым пришел — первым вышел), который позволяет ему хранить до восьми нажатий клавиш до того момента, как микропроцессор извлечет первый символ. Часть интерфейса, относящаяся к дисплею, с помощью внутреннего ОЗУ с конфигурацией 16x8 бит, в котором сохраняется кодированная отображаемая информация, может управлять цифровым индикаторным табло, имеющим до 16 разрядов.
572
Глава 11
Краткое описание интерфейса 8279
Интерфейс 8279 предназначен для облегченного сопряжения с любым микропроцессором. На рис. 11.32 приведена схема расположения выводов этого устройства и его логическое обозначение.
Далее приводится описание каждого вывода микросхемы 8279.
со н 0) 2)
О г- Cs| СП О т- CN со со tn со < < <
<
□ Q 0)
wcncnwcnOOOOOOO
> Е Е и
nnnnnnnnnnnnnnnnnnnn
CXJ
CXJ
00
CXJ
TTU'U U U U U U'U UUUUUUUUUUET
сл
ОС
Ш
Рис. 11.32. Схема расположения выводов (а) и логическое обозначение (6) программируемого интерфейса клавиатуры/дисплея 8279
Базовый интерфейс ввода-вывода	573
Описание выводов интерфейса 8279
□	АО
Адресный вход АО выбирает данные или управляет операциями обмена между микропроцессором и интерфейсом 8279. Низкий логический уровень сигнала на этом выводе выбирает данные, а высокий уровень — регистр управления или состояния.
□	BD
Выходной сигнал BD (blank display) используется для гашения индикатора.
□	CLK
Вывод CLK (clock) предназначен для подачи тактовых импульсов, которые выполняют внутреннюю синхронизацию для интерфейса 8279. Максимально допустимая частота на выводе CLK составляет 3,125 МГц для 9279-5 и 2,0 МГц для 8279.
□	CNTL/STB
Входной сигнал CNTL/STB (control/strobe — управление/строб) обычно соединяется с клавишей управления на клавиатуре (<Ctrl>). Кроме того, сигнал может быть использован для стробирования данных в буфер FIFO в режиме стробированного ввода.
П CS
Входной сигнал CS (chip select — выбор кристалла) включает интерфейс 8279 для программирования, чтения клавиш и информации состояния, управления записью и отображения данных.
□	DB7-DB0
Шина данных DB7—DBO (data bus) состоит из двунаправленных линий, которые соединяются с шиной данных микропроцессора.
□	IRQ
Выходной сигнал IRQ (interrupt request — запрос прерывания) устанавливается (принимает высокий логический уровень) при каждом нажатии клавиши на клавиатуре. Сигнал указывает, что данные клавиатуры доступны для микропроцессора.
□	OUT АЗ—OUT АО
Выходные сигналы, посылающие данные на сегменты дисплея (старшие е—g).
□	OUT вз-оит во
Выходные сигналы, посылающие данные на сегменты дисплея (младшие a—d).
□	RD
Входной вывод RD (read — чтение) напрямую соединяется с сигналом IORC или RD микропроцессорной системы. Соответствующий сигнал на этом выводе осуществляет чтение из информационных регистров или регистров состояния, когда сигнал на выводе CS имеет низкий логический уровень.
574
Глава 11
□	RESET
Вывод RESET (сброс) соединяется с одноименным сигналом системы и предназначен для выполнения сброса регистров устройства.
□	RL7-RL0
Входные выводы RL7—RLO (return line — обратная линия) используются для восприятия любого нажатия клавиши в матрице клавиатуры при ее сканировании.
□	SHIFT
Входной вывод SHIFT (смена регистра) обычно соединяется с одноименной клавишей <Shift> на клавиатуре.
□	SL3-SL0
Выходные сигналы на выводах SL3—SLO (scan line — линия сканирования) предназначены для сканирования матрицы клавиатуры или цифрового индикаторного табло (дисплея).
□	WR
Входной вывод WR (write — запись) соединяется к любому сигналу строба записи, формируемого внешней логикой. Сигнал низкого уровня на выводе WR позволяет производить запись данных в любой информационный или управляющий регистр интерфейса 8279.
□	Vcc
Вывод "питание" соединяется к источнику постоянного тока напряжением +5,0 В.
□	Vss
Вывод "земля" соединяется к выводу "земля" источника питания.
Сопряжение интерфейса 8279 с микропроцессором
На рис. 11.33 показана схема подключения интерфейса 8279 к микропроцессору 8088.
Интерфейс 8279 дешифрируется для работы с 8-разрядными адресами ввода-вывода ЮН и ИН, где порт ЮН является информационным, а ИН — управляющим. Представленная схема для дешифрирования адреса ввода-вывода интерфейса 8279 использует микросхему ПМЛ PAL16L8. Программа для программирования этой микросхемы показана в примере 11.20.
Пример 11.20. Программа для программирования микросхемы PAL16L8, применяемой для дешифрирования интерфейса 8279
TITLE	Address Decoder
PATTERN	Test 14
REVISION	A
AUTHOR	Barry B.	Brey
COMPANY	ВгеуСо
Базовый интерфейс ввода-вывода
575
DATE	7/10/99
CHIP	DECODERE PAL16L8
pins	1	2	3	4	5	6	7	8	9	10
	Al	A2	A3	A4	A5	A6	Д'?	NC	IOM	GND
pins	11	12	13	14	15	16	17	18	19	20
	NC	NC	NC	NC	NC	NC	NC	NC	CS	VCC
EQUATIONS
/CS = /А7 * /А6 * /А5 * A4 * /АЗ * /А2 * /А1 * IOM
Младший разряд АО адресной шины выбирает один из двух портов: информационный (АО = 0) или управляющий (АО = 1).
Обратите внимание, что сигнал CS выбирает интерфейс 8279 и обеспечивает формирование сигнала WAIT2 , который используется для задания двух тактов ожидания, чтобы устройство могло функционировать с микропроцессором 8088, работающим на частоте 8 МГц.
D0
D1
D2
D3
D4
D5
D6
D7
RD
WAIT2
3.0 MHz RESET
АО
А1
А2
АЗ
А4
А5
А6
А7
Ю/М
WR
12 13
14 15
16 17
18 19
10 11
22
3 9
21 4
__________1_
__________2
__________3
__________4
__________5
__________6
__________7
____8
__________9
11
PAL16L8
U2
8279
Рис. 11.33. Схема подключения интерфейса 8279, функционирующего как 8-разрядные порты ввода-вывода ЮН и 11Н, к микропроцессору 8088
На представленной схеме к микропроцессору не подключается только выходной сигнал IRQ. Этот сигнал является сигналом запроса прерывания, и он не рассмат
576 Глава 11
ривается в этом разделе. Прерывания, их применение и функционирование в системе рассмотрены в главе 12.
Интерфейс клавиатуры
Предположим, что клавиатура на 64 клавиши (без цифрового табло) соединена с микропроцессором 8088 через интерфейс 8279, как это показано на рис. 11.34. На самом деле с интерфейсом 8279 может быть использована матрица клавиатуры, имеющая любой размер: от 2x2 (4 клавиши) до 8x8 (64 клавиши).
Следует заметить, что каждая точка пересечения в матрице обычно имеет разомкнутый кнопочный переключатель, соединяющий при нажатии клавиши одну вертикальную колонку с одной горизонтальной строкой.
Дешифратор адреса порта ввода-вывода (U1) на этой схеме такой же, как и на рис. 11.33. Здесь порт ЮН является портом ввода-вывода данных, а порт ИН — управляющим портом. Дешифратор (U3) типа 74ALS138 формирует восемь стробирующих сигналов низкого уровня для каждой колонки матрицы клавиатуры. Сигналы с выводов SL2—SL0 интерфейса 8279 (U2) используются для управления дешифратором при сканировании, причем внутренняя схема интерфейса 8279 сканирует выводы RLO—RL7, выявляя замыкание клавишного переключателя. Нагрузочные резисторы, которые обычно используются на входных линиях строк клавиатуры (см. рис. 11.24), в данном случае не требуются, поскольку интерфейс 8279 имеет свою собственную нагрузку на вводы RLO—RL7.
Программирование интерфейса клавиатуры
До обнаружения нажатия клавиши интерфейс 8279 должен быть запрограммирован, что является более сложной процедурой, чем для интерфейса 82С55. Интерфейс 8279 имеет восемь командных слов, которые следует рассмотреть перед тем, как начать программировать. Первые три старшие разряда командного слова, отсылаемого на управляющий порт (в этом примере порт 11Н), выбирают одну из восьми различных функций, описание которых приведено в табл. 11.5.
Описание командных слов
Ниже приводится перечень командных слов для программирования интерфейса 8279.
Обратите внимание, что первые три старших разряда регистра управления можно взять из табл. 11.5, а за ними следуют другие информационные биты, применяемые к каждому типу функции управления.
□ 000DDMMM
Командное слово установки режима (mode set) с кодом операции ООО и двумя программируемыми полями выбирает режим работы интерфейса 8279. Поле DD выбирает режим работы дисплея (табл. 11.6), а поле МММ — режим работы клавиатуры (табл. 11.7).
Поле DD выбирает 8- или 16-разрядный дисплей и устанавливает поступление новых данных в крайнюю справа или крайнюю слева позицию дисплея.
Поле МММ — несколько сложнее. Оно обеспечивает операцию кодирования, дешифрирования или стробирования клавиатуры.
19 Зак 384
Матрица клавиатуры на 64 клавиши
PAL16L8
Рис. 11.34. Подключение клавиатуры на 64 клавиши к микропроцессору 8088 через интерфейс 8279
Базовый интерфейс ввода-вывода
578
Глава 11
Таблица 11.5. Функции командных слов интерфейса 8279				
D7	D6	D5	Функция	Описание
0	0	0	Установка режима	Выбирает разрядность и номер начальной позиции знакоместа дисплея, слева или справа, а также способ сканирования клавиатуры
0	0	1	Тактирование	Программируется внутренняя синхронизация и устанавливается время сканирования и время для устранения дребезга контактов
0	1	0	Чтение буфера FIFO	Осуществляет выбор режима чтения и задает адрес чтения буфера FIFO
0	1	1	Чтение данных дисплея	Осуществляет выбор режима чтения и задает адрес чтения дисплея
1	0	0	Запись на дисплей	Выбирает режим записи и адрес записи на дисплей
1	0	1	Запрет записи на дисплей	Допускает половинное гашение индикатора дисплея
1	1	0	Очистка	Очищает дисплей или буфер FIFO
1	1	1	Конец прерывания	Очищает сигнал IRQ, передаваемый на микропроцессор
	Таблица 11.6. Назначение двоичных разрядов поля DD командного слова установки режима
DD	Функция
00	8-разрядный дисплей с левой начальной позицией
01	16-разрядный дисплей с левой начальной позицией
10	8-разрядный дисплей с правой начальной позицией.
11	16-разрядный дисплей с правой начальной позицией Таблица 11.7. Назначение двоичных разрядов поля МММ командного слова установки режима
МММ	Функция
ООО	Кодирование клавиатуры с двумя заблокированными клавишами
001	Дешифрирование клавиатуры с двумя заблокированными клавишами
010	Кодирование клавиатуры с одновременно нажатыми N-клавишами
011	Дешифрирование клавиатуры с одновременно нажатыми N-клавишами
100	Кодирование устройства считывания матрицы клавиатуры
101	Дешифрирование устройства считывания матрицы клавиатуры
110	Стробирование клавиатуры, кодирование сканирования дисплея
111	Стробирование клавиатуры, дешифрирование сканирования дисплея
Базовый интерфейс ввода-вы вода
579
В режиме кодирования на выходах SL3—SL0 имеются сигналы с активным высоким уровнем сигнала в двоичном коде, соответствующем числам от 0 до 7 или от О до 15, в зависимости от выбираемого 8- или 16-разрядного дисплея. Эти же выводы в режиме дешифрирования имеют низкий уровень сигнала, причем в заданный момент низкий уровень сигнала имеет только один из четырех выходов. Дешифрируемые выходные сигналы повторяют комбинацию: 1110, 1101, 1011 и 0111. В режиме стробирования данные, поступающие на выводы RLO—RL7, стробируются по перепаду от 0 к 1 импульса, приходящего на вывод CNTL/STB интерфейса 8279, во внутренний буфер FIFO, где они и удерживаются для дальнейшего их использования микропроцессором. Кроме того, можно выбрать режим с блокировкой двух клавиш, или одновременным нажатием N-клавиш. Режим блокировки двух клавиш препятствует распознавание двух клавиш при одновременном их нажатии. Режим же одновременного нажатия N-клавиш допускает одновременное нажатие всех клавиш, от первой до последней.
□	001РРРР
Командное слово тактирования (clock) программирует внутренний тактирующий делитель. Код РРРРР является кодом для делителя частоты с предварительной установкой, который делит входную тактовую частоту сигнала, поступающего на вывод CLK, чтобы получить нужную рабочую частоту примерно в 100 кГц. Например, при тактовой частоте на выводе CLK интерфейса 8279 равной 1 МГц код РРРРР для делителя частоты с предварительной установкой будет соответствовать коду 010102, т. е. 10 в десятичной системе счисления.
□	010Z0AAA
Командное слово чтения буфера FIFO (read FIFO) задает адрес ячейки внутреннего буфера FIFO, по которому был сохранен код нажатой клавиши. Значения двоичных битов поля ААА задают адрес необходимой ячейки буфера FIFO от 0 до 7, а бит Z устанавливает автоматическое приращение для адреса.
□	011ZAAAA
Командное слово чтения данных дисплея ^display read) задает адрес одной из ячеек ОЗУ дисплея для чтения через порт. АААА — это адрес ячейки для соответствующей считываемой позиции знакоместа дисплея, a Z устанавливает режим автоматического приращения адреса. Эта команда используется в случае, когда должна считываться информация, хранящаяся в ОЗУ дисплея.
□	100ZAAAA
Командное слово записи на дисплей (write display) определяет адрес одной из позиции знакомест дисплея. Поле АААА адресует позицию для записи через информационный порт. Бит Z задает режим автоматического приращения адреса, чтобы последующие записи через информационный порт осуществлялись в последующие позиции знакомест дисплея.
□	1010WWBB
Командное слово запрета записи на дисплей (display write inhibit) запрещает запись в одну из половин каждой ячейки ОЗУ дисплея. Крайнее слева бит W запрещает запись в крайние слева четыре бита ячейки ОЗУ дисплея, а крайний справа бит W запрещает запись в крайние справа четыре бита. Поле ВВ функционирует подобным образом, за исключением того, что при этом одна половина дисплея гасится (выключается).
580
Глава 11
□	1100CCFA
Командное слово очистки (clear) очищает дисплей, буфер FIFO или их оба. Бит F очищает буфер FIFO, регистр состояния ОЗУ дисплея и устанавливает указатель адреса на ООО. Если биты СС имеют 00 или И, то все ячейки ОЗУ дисплея будут иметь значение 00000000, если СС = Ю, то все ячейки будут 0010000, и если СС = 11, то все ячейки имеют 11111111.
□	111Е000
Командное слово конец прерывания (end of interrupt) выдается для сброса сигнала IRQ на одноименном выводе в режиме обнаружения нажатия клавиши в матрице клавиатуры. Если бит Е = 1, то используется специальный режим для ошибок. Регистр состояния, в специальном режиме для ошибок, может указывать на замыкание многих клавиш.
Большое количество командных слов, программирующих интерфейс 8279, представляет собой некоторый комплекс. Перед программированием какой-либо функции, прежде всего, необходимо определяться с коэффициентом для делителя частоты. На схеме, приведенной на рис. 11.34, используется входной тактирующий сигнал частотой в 3,0 МГц. Поэтому при программировании делителя частоты, для получения внутренней тактовой частоты равной 100 кГц, необходимо в качестве кода РРРР командного слова тактирования выбрать код 111102, что соответствует 30 в десятичной системе.
Следующим этапом является программирование режима работы клавиатуры. Пример кодируемой клавиатуры представлен на рис. 11.34. Следует заметить, что данная схема включает внешний дешифратор 74ALS138 (U3), который преобразует закодированные данные, поступающие с выводов SLO—SL2 интерфейса 8279, в сигналы выборки колонки матрицы клавиатуры. В данном случае имеется свобода в выборе режима работы клавиатуры: или с блокировкой двух клавиш, или с одновременным нажатием N-клавиш, однако большинство приложений используют блокировку двух клавиш.
Наконец, следует запрограммировать выполнение операции с буфером FIFO. После одного программирования отсутствует необходимость в его перепрограммировании до тех пор, пока нам не потребуется произвести считывание прежних кодов клавиатуры. При каждом нажатии на клавишу данные накапливаются в буфере FIFO. Если данные считываются из буфера FIFO до его наполнения (восемь символов), то данные из FIFO следуют тем же порядком, что и данные символов. В примере 11.21 приводится программа инициализации интерфейса 8279, предназначенного для управления клавиатурой, показанной на рис. 11.34.
Пример 11.21. Программа инициализации интерфейса 8279 для подключения клавиатуры
; Инициализация интерфейса клавиатуры,
; представленного на рис. 11.34
0000 ВО ЗЕ	MOV AL,00111110В	; программирование коэффициента
0002 Е6 11	OUT 11H,AL	; деления для делителя частоты
Базовый интерфейс ввода-вывода
581
0004 0006	ВО 00 Е6 11	MOV OUT	AL, 0 11H, AL	; программирование режима
0008	ВО 50	MOV	AL,01010000B	
000А	Е6 11	OUT	11H,AL	; программирование буфера FIFO
После инициализации интерфейса 8279 требуется процедура для считывания данных из клавиатуры. Просматривая содержимое регистра состояния буфера FIFO, можно определить: набран ли символ или нет. Каждый раз, когда команда in адресуется к управляющему порту, копируется слово о состоянии буфера FIFO в регистр AL. На рис. 11.35 показано содержимое регистра состояния буфера FIFO и назначение каждого его бита.
Биты, показывающие число символов в буфере FIFO Указывает на то, что буфер FIFO заполнен Указывает, что буфер FIFO был считан пустым Показывает, что буфер FIFO заполнен и переполнен Указывает на многократное замыкание клавиш
Дисплей недоступен из-за команды очистки
Рис. 11.35. Регистр состояния буфера FIFO интерфейса 8279-5
Процедура, приведенная в примере 11.22, вначале проверяет регистр состояния буфера FIFO на предмет наличия в нем данных. Если биты NNN = ООО, то буфер FIFO — не заполнен. Если буфер FIFO заполнен, то подпрограмма вводит данные в регистр AL и возвращается с кодом клавиатуры» в регистре AL.
Пример 11.22. Процедура, читающая данные из буфера FIFO и возвращающая их в регистр AL
; Процедура, читающая данные из буфера FIFO и
; возвращающая код клавиатуры в регистр AL
= 0007	MASKS EQU	7
0000	READ PROC	NEAR
0000 Е4 11	IN	AL,11H	; чтение регистра состояния
0002 А8 07	TEST	AL,MASKS ; проверка битов NNN
0004 74 FA	JZ	READ	; если буфер заполнен
0006 E4 10	IN	AL, ЮН	; чтение данных из буфера FIFO
0008 СЗ	RET	
0009
READ ENDP
582
Глава 11
Данные, возвращаемые в регистре AL после выхода из подпрограммы, содержат необработанные данные клавиатуры. На рис. 11.36 показан формат этих данных для обоих режимов работы: сканирования и стробирования.
7	6	5	4	3	2	1	0
ст	SH	1	1	 Колонка 	1	1		1	1 Строка 1	1
------Указывается строка матрицы клавиатуры
------------------Указывается	колонка в матрице клавиатуры
-----------------Показывает состояние вывода SHIFT
-----------------Показывает состояние вывода CNTL а)
7	6	5	4	3	2	1	0
RL7	RL6	RL5	RL4	RL3	RL2	RL1	RL0
б)
Рис. 11.36. Коды, полученные из буфера FIFO интерфейса клавиатуры 8279-5: при сканировании (а) и стробировании (б)
При сканировании код возвращается от интерфейса клавиатуры и преобразовывается в код ASCII с помощью команды xlat по справочной таблице кодов ASCII. При сканировании код возвращается с номером строки и колонки и занимает младшие шесть разрядов.
Разряд SH показывает состояние вывода SHIFT, а разряд СТ — состояние вывода CNTL интерфейса 8279.
В режиме стробирования содержимое восьми входов RL7—RL0 появляется при выборке посредством подачи перепада импульса от 0 к 1 на вывод CNTL/STB (управ-ление/строб) интерфейса 8279.
Интерфейс 6-разрядного дисплея
На рис. 11.37 показана схема подключения 6-разрядного цифрового семисегментного индикатора (дисплея) с помощью интерфейса 8279 к микропроцессору 8088. В этой схеме используется ПМЛ PAL16L8 (программа не приведена) для дешифрирования интерфейса 8279 как порты ввода-вывода: 20Н (данные) и 21Н (регистр управления/состояния). Данные на сегменты дисплея поступают с выводов OUT А и OUT В интерфейса 8279. Эти разряды буферизуются усилителем (ULN2003A) для возбуждения сегментных входов дисплея.
Линейный дешифратор 3x8 типа 74ALS138 (U3) предназначен для управления анодными транзисторными ключами 2N2907 каждого из разрядов цифрового семисегментного индикатора. Закодированная информация о позиции знакоместа дисплея поступает с выводов SL2—SL0 интерфейса 8279 на входы АВС дешифратора. Обратите внимание, что самый левый индикатор дисплея соответствует коду 1012,
Рис. 11.37. Схема подключения 6-разрядного цифрового дисплея с помощью интерфейса 8279
Казовый интерфейс ввода-вывода_____________________________________________583
584
Глава 11
а правый — 0002. Эти коды, по сути, являются адресами позиций знакоместа дисплея, которые указываются в командных словах интерфейса 8279.
Для схемы необходимо подобрать величины резисторов, для того чтобы обеспечить ток сегментов 60 мА. В этой схеме использованы резисторы на 47 Ом. Если задать ток 60 мА, тогда средний ток каждого сегмента составляет 10 мА, поскольку ток проходит через сегмент только в течение одной шестой части времени. Анодные транзисторные ключи должны подавать ток на все семь сегментов плюс десятичные запятые. Общий анодный ток, при этом, составит 8x60 мА или 480 мА.
В примере 11.23 приведена программа инициализации интерфейса 8279 для работы с 6-разрядным дисплеем, которая программирует дисплей и очищает ОЗУ дисплея.
Пример 11.23. Программа инициализации интерфейса 8279, используемого для работы с 6-разрядным цифровым семисегментным индикатором
; Программа инициализации интерфейса 8279 для работы
; с б-разрядным дисплеем, показанным на рис. 11.37
0000 0002	ВО ЗЕ Еб 21	MOV OUT	AL,00111110B 21H,AL	; программирование коэффициента ; деления для делителя частоты
0004	ВО 00	MOV	AL, 0	; программирование режима
0006	Еб 21	OUT	21H,AL	
0008	ВО С1	MOV	AL,11000001B	; очистка дисплея
000А	Еб 21	OUT	21H,AL	
На рис. 11.24 приводится процедура, выполняющая отображение информации на дисплее. Данные передаются на подпрограмму с помощью регистра АХ. При этом регистр АН содержит 7-сегментный отображаемый код, а регистр AL — адрес позиции знакоместа (разряда) дисплея.
Пример 11.24. Процедура, выполняющая отображение информации на дисплее
; Процедура, которая выводит содержимое регистра АН
; на дисплей в позицию, указанную в регистре AL
= 0080			MASKS EQU	80H	
0000			DISP PROC	NEAR	
0000	50		PUSH	AX	; сохранение данных аккумулятора
0001	ОС	80	OR	AL,MASKS	; выбор позиции знакоместа
0003	Еб	21	OUT	21H,AL	
0005	8А	С4	MOV	AL, AH	; вывод данных на дисплей
0007	Еб	20	OUT	20H,AL	
0009	58		POP	AX	; восстановление данных
000А	СЗ		RET		
000В
DISP ENDP
Базовый интерфейс ввода-вывода
585
11.5.	Программируемый интервальный таймер 8254
Программируемый интервальный таймер 8254 состоит из трех независимых 16-раз-рядных программируемых счетчиков (таймеров). Каждый счетчик способен считать двоичные или двоично-десятичные числа (BCD — binary coded decimal). Максимально допустимая входная частота для любого счетчика составляет 10 МГц. Это устройство является полезным, когда микропроцессор должен управлять событиями в реальном масштабе времени. Программируемый интервальный таймер может иметь несколько вариантов его применения, например: часы реального времени, счетчик числа событий и управление скоростью и направлением вращения двигателя. Этот таймер применяется в персональном компьютере с адресами портов 40Н— 43Н и используется для следующих целей:
□	генерации сигнала запроса прерывания IRQ0 для системных часов, которые происходят через каждые 54,936 мс (частота 18,206 Гц);
П для регенерации динамической памяти системы;
□	для обеспечения временными соотношениями внутренней звуковой системы и других устройств.
В персональном компьютере класса XT (PC/XT) используется таймер 8253, а в PC класса АТ (PC/AT) - 8254.
Функциональное описание таймера 8254
На рис. 11.38 приведена схема расположения выводов микросхемы таймера 8254, который является более высокоскоростной версией таймера 8253, а также его внутренняя структурная схема, состоящая из трех отдельных счетчиков (таймеров). Каждый такой счетчик имеет три своих вывода: CLK^GATE и OUT. Вывод CLK предназначен для подачи на него базовой рабочей частоты для счетчика, вывод GATE в некоторых режимах работы управляет счетчиком, а на вывод OUT подается его выходной сигнал.
С микропроцессором соединяются выводы шины данных D7—DO, RD, WR, CS и выводы адресных входов А1 и АО. Эти адресные входы предназначены для выбора одного из четырех внутренних регистров, которые используются для программирования, считывания или записи данных на счетчик. На персональном компьютере имеется таймер 8253 или его эквивалент, дешифрируемый по адресам портов ввода-вывода 40Н—43Н. Счетчик 0 программируется для формирования сигнала IRQ0 с частотой 18,206 Гц, который прерывает микропроцессор с кодом вектора прерываний 08 для тактирования системных часов. Сигналы системных часов часто используются для синхронизации программ и событий. Счетчик 1 программируется на 15,2 мкс для запроса в PC/XT прямого доступа к памяти (DRQ0) с тем, чтобы выполнить регенерацию динамической памяти. В PC/AT этот таймер также участвует в регенерации памяти, но несколько иначе (без формирования сигнала DRQ0). Счетчик 2 программируется для формирования тонального сигнала звуковой системы персонального компьютера.
586
Глава 11
D7 С	1	24	□ Vcc
D6 Е	2	23	□ WR
D5 С	3	22	□ RD
D4 Е	4	21	□ CS
D3 Е	5	20	□ А1
D2 Е	6	8254 **9	□ АО
D1 Е	7	18	□ CLK 2
DO Е	8	17	□ OUT 2
CLKO Е	9	16	□ GATE 2
OUTO Е	10	15	□ CLK1
GATE 0 Е	11	14	□ OUT1
GND Е	12	13	□ GATE 1
б)
Рис. 11.38. Внутренняя структура (а) и схема расположения выводов (6) программируемого интервального таймера 8254
Базовый интерфейс в вода-вы вода	587
Назначение выводов
□ А1, АО
Выводы адресных входов А1, АО (address) предназначены для выбора одного из четырех внутренних регистров таймера 8254. Функции адресных битов А1, АО представлены в табл. 11.8.
Таблица 11.8. Функции адресных выводов таймера 8254
А1	АО	Функция
О 0 Выбор регистра счетчика О
О	1	Выбор регистра счетчика 1
1	0	Выбор регистра счетчика 2
1	1	Выбор регистра команд
□	CLK2-CLK0
Каждый из выводов CLK2—CLKO (clock) предназначен для подачи на них синхросигналов тактирования каждого из внутренних счетчиков (таймеров). Эти выводы часто подключаются к сигналу PCLK тактового синхрогенератора.
□	CS
Сигнал выбора кристалла CS (chip select) разрешает программирование, считывание или запись в регистры таймера 8254.
□	GATE2-GATE0
Сигналы, подающиеся на выводы GATE (вентиль), управляют работой соответствующего счетчика (таймера) для нескольких режимов таймера 8254.
□	GND
Вывод GND (ground) соединяется с линией "земля" источника постоянного тока.
□	OUT2-OUTO
На выводы OUT (output) для соответствующего счетчика (таймера) поступают выходные сигналы генерируемой каждым счетчиком формы.
П RD
Вывод RD (read) предназначен для считывания данных из таймера 8254 по линиям DO—D7 в режиме программирования, при этом сигнал CS должен быть низкого логического уровня. Вывод RD часто подсоединяется к сигналу IORC.
П Vcc
Этот вывод подключается к источнику питания с напряжением +5,0 В.
П WR
Вывод WR (write) служит для записи данных в таймер 8254 по линиям DO—D7 в режиме программирования, при этом сигнал CS должен быть низкого логического уровня. Вывод WR часто соединяется со стробом записи IOWC.
588
Глава 11
Программирование таймера 8254
Каждый счетчик программируется по отдельности посредством записи командного слова. На рис. II.39 приведен формат командных слов для программного таймера 8254.
При BCD=1 выбор счета в двоично-десятичных числах, при BCD=0 в двоичных числах
Выбор режима работы (с 0 по 5)
Управление чтением/записью 00 - фиксация команд счетчиком 01 - чтение/запись только "младшего байта" (LSB) 10 - чтение/запись только "старшего байта" (MSB) 11 - чтение/запись "младшего байта" (LSB), затем "старшего байта" (MSB)
Выбор счетчика
00 - счетчик 0
01 - счетчик 1
10-счетчик 2
11 - команда чтения только что записанной информации
Рис. 11.39. Командное слово для таймера 8254-2
Командное слово позволяет программисту выбрать счетчик, режим работы и тип операции (чтение/запись). Кроме того, командное слово определяет двоичный или двоично-десятичный счет. Каждый счетчик может программироваться на счет от 1 до FFFFH. Значение 0 соответствует FFFFH+1 (65,536) или 10,000 для счета в двоично-десятичных числах. Минимальное значение счета во всех режимах работы равно 1, за исключением режима 2 и 3, для которых счет начинается с 2. Счетчик 0 используется в персональных компьютерах с делением входной частоты равной 1,19318 МГц на 64К (FFFFH), чтобы генерировать частоту 18,2 Гц (18,206 Гц) сигнала IRQ0 для прерывания процессора от системных часов. Этот сигнал запроса на прерывание имеет наивысший приоритет среди маскируемых прерываний.
Командное слово использует бит BCD для выбора счета в двоично-десятичных (BCD = 1) или двоичных (BCD = 0) числах. Биты М2, Ml и МО определяют для счетчика один из шести возможных режимов работы (от режима 0 до режима 5). Биты RW1 и RW0 определяют, каким образом будет осуществляться операции чтения или записи данных в счетчик. Биты SCI и SCO определяют счетчик и специальный режим работы повтора чтения только что записанной информации, который рассмотрен далее в этом разделе.
Каждый счетчик имеет свое программное командное слово, которое определяет способ работы счетчика. Внутренние счетчики имеют разрядность 16 бит, но общение с ними возможно только байтами. При программировании счетчика двумя байтами, первый младший или, иначе, менее значимый байт (LSB — least-significant
Базовый интерфейс ввода-вывода 589
byte) прекращает счет, а другой старший или, иначе, более значимый байт (MSB — most-significant byte) запускает счетчик с новым значением счета. Порядок программирования является важным для каждого счетчика, но программирование разных счетчиков можно чередовать в целях лучшего управления. Например, командное слово можно послать в каждый счетчик перед передачей начальных значений счета для их индивидуального программирования. В примере 11.25 приведено несколько методов программирования счетчика 1 и 2. Первый метод вначале передает оба командных слова, а затем младший байт (LSB) для каждого счетчика, что останавливает их. И в завершение, передается старший байт (MSB) для обоих счетчиков, что запускает их на счет с новым значением. В другом примере приведено программирование вначале лишь одного счетчика, а затем только другого.
Пример 11.25. Различные варианты методов программирования счетчика 1 и 2
PROGRAM	CONTROL	WORD 1 ,	; настройка счетчика 1			
PROGRAM	CONTROL	WORD 2 .	; настройка счетчика 2			
PROGRAM	LSB 1		; программирование	LSB	и остановка	счетчика 1
PROGRAM	LSB 2		; программирование	LSB	и остановка	счетчика 2
PROGRAM	MSB 1		; программирование	MSB	для счетчика	1 и запуск его
PROGRAM	MSB 2		; программирование	MSB	для счетчика	2 и запуск его
или
PROGRAM CONTROL WORD 1 ,	; настройка счетчика 1
PROGRAM LSB 1	; программирование LSB и остановка счетчика 1
PROGRAM MSB 1	; программирование MSB для счетчика 1 и запуск его
PROGRAM CONTROL. WORD 2 t	: настройка счетчика 2
PROGRAM LSB 2	: программирование LSB и остановка счетчика 2
PROGRAM MSB 2	; программирование MSB для счетчика 2 и запуск его
Режимы работы
Счетчики программируемого интервального таймера 8254 могут работать в шести режимах: начиная с режима 0 по режим 5. На рис. 11.40 показано функционирование этих режимов для трех сигналов: тактирующего сигнала CLK, управляющего сигнала GATE и выходного сигнала OUT, а далее приведено их описание.
□ Режим 0
Позволяет использовать счетчик таймера 8254 в качестве счетчика событий. В этом режиме выходной сигнал имеет низкий логический уровень после записи командного слова и сохранения его до момента окончания подсчета тактов CLK равного N плюс запрограммированное число. Например, если запрограммировано 5 подсчетов, то низкий логический уровень на выводе OUT будет сохраняться до 6, начиная с N. Обратите внимание, что входной сигнал GATE должен иметь высокий логический уровень, чтобы разрешить счетчику производить подсчет. Если же сигнал GATE в середине счета перейдет на низкий логический уровень, то счет прекращается до тех пор, пока он вновь не перейдет на высокий логический уровень.
590
Глава 11
Режим 0 CLK
OUT
Режим 4
CLK
GATE
Режим 5
CLK
оит | Запуск с числом 5 в счетчике
оит
‘Запуск с числом 8 в счетчике
Примечание: Когда сигнал, поданный на вывод GATE, имеет низкий логический уровень, то он прекращает счет в режимах 2, 3 и 4
Рис. 11.40. Шесть режимов работы программируемого интервального таймера 8254-2
□ Режим I
Счетчик функционирует как ждущий мультивибратор (одновибратор). В этом случае импульс на выводе GATE запускает счетчик, так что на выходе OUT формируется сигнал низкого логического уровня в течение подсчета количества импульсов, поступивших на вывод CLK, и равного числу, загруженному в счетчик. Если число в счетчике равно Ю, тогда сигнал на выводе OUT будет иметь низкий логический уровень в течение 10 тактирующих периодов. Если во время подсчета тактовых импульсов на вывод GATE еще раз подать импульс, то счет
Базовый интерфейс в вода-вы вода
591
чик (мультивибратор) вновь перезапускается с подсчетом того же загруженного в счетчик числа импульсов CLK.
□	Режим 2
Позволяет счетчику генерировать непрерывную серию из отрицательных импульсов длительностью равной периоду импульсов CLK. Период импульсов определяется произведением периода тактовых импульсов CLK на число, загруженное в счетчик. Например, для числа Ю выходной сигнал имеет высокий логический уровень в течение 9 периодов тактовых импульсов, а низкий уровень — только одного периода. Этот цикл повторяется до тех пор, пока счетчик не будет перепрограммирован на новый счет или пока сигнал на выводе GATE не перейдет на нулевой логический уровень. Для того чтобы сформировать непрерывную серию импульсов, сигнал на выводе GATE в этом режиме работы должен иметь высокий логический уровень.
□	Режим 3
В этом режиме на выводе OUT формируются непрерывные прямоугольные импульсы (меандр) с периодом равным произведению числа загруженного в счетчик на период тактовых импульсов CLK при условии, что сигнал на выводе GATE имеет уровень логической единицы. При этом если загруженное число четное, то длительность выходного отрицательного импульса будет равна половине периода этих импульсов. Когда же загруженное число нечетное, то выходной сигнал имеет длительность высокого логического уровня на один период тактовых импульсов CLK больше, чем для низкого уровня. Например, если счетчик запрограммирован на число 5, то выходной сигнал будет иметь высокий уровень в течение трех периодов тактовых импульсов, а низкий уровень — в течение двух периодов.
□	Режим 4
В этом режиме счетчик на выводе OUT формирует одиночный отрицательный импульс длительностью в один период тактовых импульсов, причем длительность состояния высокого логического уровня (дб формирования импульса) будет равна произведению числа, загруженного в счетчик, на период тактовых импульсов. Например, если счетчик запрограммирован на число 10, то выходной сигнал имеет высокий логический уровень в течение 10 периодов тактовых импульсов и низкий уровень — в течение одного периода. Цикл не начинается, пока счетчик не закончит загрузку числа. В этом режиме счетчик работает как программируемый ждущий одновибратор. Так же, как и в режиме 2 и 3, в данном случае вывод GATE используется для разрешения работы счетчика. Сигнал на этом выводе должен иметь высокий логический уровень, для того чтобы счетчик работал в этих трех режимах.
О	Режим 5
В данном режиме счетчик работает как ждущий одновибратор аналогично режиму 4, за исключением того, что в данном случае он начинает работать от пускового отрицательного импульса на выводе GATE, а не после программирования счетчика. Этот режим также аналогичен режиму 1, поскольку в нем тоже возможен повторный запуск импульсом на выводе GATE.
592
Глава 11
Формирование формы сигнала с помощью таймера 8254
На рис. 11.41 показан таймер 8254, подключенный для работы с микропроцессором 8086, с адресами портов 700Н, 702Н, 704Н и 706Н. Адреса декодируются с помощью микросхемы ПМЛ типа PAL16L8, которая формирует также сигнал строба записи для таймера 8254. Кроме того, эта микросхема выдает для микропроцессора сигнал WAI12 для формирования им двух тактов ожидания, в том случае, когда происходит обращение к таймеру 8254. Фактически количеством тактов ожидания, вводимых в выполняемый процессором цикл, управляет соединенный с микропроцессором генератор тактов ожидания. Программа для ПМЛ PAL16L8 здесь не приводится, поскольку она такая же, как и во многих предыдущих примерах.
Рис. 11.41. Схема подключения таймера 8254, формирующего прямоугольные колебания (меандр) с частотой 100 кГц на выводе OUTO и непрерывные импульсы с частотой 200 кГц на выводе OUT1, к микропроцессору 8086, работающему на частоте 8 МГц
В примере 11.26 приведена программа для программирования таймера 8254, формирующего импульсы прямоугольной формы частотой 100 кГц на выводе OUT0 и непрерывные импульсы частотой 200 кГц на выводе OUT1. Для счетчика 0 применяется режим 3, а для счетчика 1 — режим 2. В счетчике 0 запрограммировано число 80, а в счетчике I — число 40. Эти числа формируют необходимые частоты выходного сигнала при условии, что частота тактовых импульсов на выводах CLK этих счетчиков равна 8 МГц.
Базовый интерфейс ввода-вывода
593
Пример 11.26. Программа для программирования таймера 8254 для формирования импульсов прямоугольной формы с частотой 100 кГц и непрерывных отрицательных импульсов с частотой 200 кГц
; Процедура, которая программирует таймер 8254
	; для схемы,	, приведенной	на рис. 11.41
осоо	TIME PROC	NEAR	
00С0 50	PUSH	AX	; сохранить содержимое
0001 52	PUSH	DX	; регистров АХ и DX
0002 ВА 0706	MOV	DX,706H	; адрес регистра управления
0005 ВО 36	MOV	AL,00110110B	; программирование счетчика 0
0007 ЕЕ	OUT	DX, AL	; на режим 3
0008 ВО 74	MOV	AL,01110100B	; программирование счетчика 1
00 ОА ЕЕ	OUT	DX, AL	; на режим 2
00GB ВА 0700	MOV	DX,700H	; адрес счетчика 0
ООСЕ ВО 50	MOV	AL, 80	; загрузить в счетчик число 80
0010 ЕЕ	OUT	DX,AL	
ООП 32 СО	XOR	AL, AL	
0013 ЕЕ	OUT	DX, AL	
0014 ВА 0702	MOV	DX,702H	; адрес счетчика 1
0017 ВО 28	MOV	AL, 40	; загрузить в счетчик число 40
0019 ЕЕ	OUT	DX,AL	
001А 32 СО	XOR	AL, AL	
001С ЕЕ	OUT	DX, AL	
001D 5А	POP	DX	; восстановить содержимое
001Е 58	POP	AX	; регистров АХ и DX
001F СЗ	RET		
0020	TIME ENDP		
Считывание из счетчика
В каждом счетчике имеется внутренняя защелка, которая считывается во время операции считывания из порта счетчика. Эти защелки обычно формируют счет. Если нужно запоминать содержимое счетчика, то посредством программирования командного слова для защелки счетчика (рис. Н.42) содержимое счетчика будет находиться в защелке до считывания из нее. При программировании считывания из защелки или из счетчика в защелке отслеживается содержимое счетчика.
При необходимости одновременного считывания более чем из одного счетчика используют формат командного слова чтения только что записанной информации (рис. Ц.43).
Если значение бита CNT командного слова чтения только что записанной информации будет соответствовать низкому логическому уровню, то это приведет к защелкиванию (фиксации) чисел в счетчиках, указанных в битах CNTO, CNT1 и
594
Глава 11
CNT2. Если же нужно защелкнуть регистр состояния, тогда бит ST должен иметь уровень логического 0.
На рис. 11.44 показан формат регистра состояния, отражающего состояние выходного вывода OUT, а также находится ли счетчик в нулевом состоянии (NULL = 1) и как счетчик запрограммирован.
00 - счетчик 0
01 - счетчик 1
10 - счетчик 2
11 - чтение только что записанной информации
Рис. 11.42. Формат командного слова защелки счетчика таймера 8254-2
в выбранных счетчиках
Рис. 11.43. Формат командного слова чтения только что записанной информации таймера 8254-2
Рис. 11.44. Формат регистра состояния таймера 8254-2
Базовый интерфейс ввода-вывода
595
Управление скоростью и направлением вращения двигателя постоянного тока
Одним из возможных применений таймера 8254 является использование его в качестве контроллера скорости вращения двигателя постоянного тока. На рис. 11.45 показано условное обозначение двигателя и соответствующая ему схема оконечного усилителя. Кроме того, этот рисунок иллюстрирует схему соединения таймера 8254, триггера, усилителя и двигателя.
Принцип действия схемы оконечного усилителя двигателя довольно простой. Если сигнал на выводе Q RS-триггера (U3A), выполненного на базе JK-триггера типа 74ALS112, имеет высокий логический уровень (Q = 0), то на базу транзистора Q2 (n-p-п) через базовый резистор, подключенный к напряжению 4-12 В и задающий рабочую точку транзистора, подается положительное напряжение, поскольку выходной транзистор инвертора U4B закрыт. Кроме того, положительное смещение присутствует и на базе транзистора Q1 (р-и-р) за счет закрытого выходного транзистора инвертора U4A. Это означает, что транзистор Q1 будет закрыт, а транзистор Q2 открыт, что приведет к тому, что плюсовая клемма двигателя соединится с "землей". Базы транзисторов Q3 (р-п-р) и Q4 (n-p-п) подключаются к ’земле" за счет открытых выходных транзисторов соответствующих инверторов (U4C и U4D). При этом транзистор Q3 будет открыт, a Q4 закрыт, что обеспечит подключение минусовой клеммы двигателя к напряжению 4-12 В. Поэтому сигнал высокого логического уровня на выводе Q RS-триггера (U3A) соединяет источник питания с напряжением 4-12 В к минусовой клемме двигателя, а "землю" — к плюсовой клемме. Такое соединение заставляет двигатель вращаться в обратном направлении. При изменении уровня сигнала на выводе Q RS-триггера (U3A) в состояние логического 0 состояние всех транзисторов изменяется на противоположное. При этом напряжение 4-12 В подается на плюсовую клемму двигателя, а "земля" — на минусовую клемму. Это заставляет двигатель вращаться в прямом направлении. Если на выходе триггера изменять уровни и длительность выходного сигнала, то двигатель будет вращаться в любом направлении с разными скоростями. Если коэффициент заполнения последовательности импульсов на выводе Q составляет 50%, то двигатель совсем не вращается, поскольку через него проходят токи переменной полярности и равные по длительности. На рис. 11.46 приведено несколько временных диаграмм, показывающих принцип формирования на выводе Q RS-триггера сигнала различной формы, оказывающей влияние на скорость и направление вращения двигателя.
Обратите внимание на то, что счетчики формируют импульсы со сдвигом во времени относительно друг друга, таким образом, изменяя коэффициент заполнения последовательности импульсов на выводе Q RS-триггера (U3A). Этот способ получения выходного импульсного сигнала называется модуляцией длительности импульса (pulse width modulation).
Для формирования таких форм колебаний оба счетчика программируются так, чтобы разделить входную тактовую частоту (PCLK) на 30 720. Изменяя момент времени запуска счетчика 0 по отношению к моменту запуска счетчика 1, меняется и коэффициент заполнения последовательности импульсов на выводе Q RS-триггера. Таким образом осуществляется управление скоростью и направлением вращения двигателя. Но зачем делить 8 МГц на 30 720? Коэффициент деления 30 720 кратен 256, поэтому предоставляется возможность для получения 256 различных значений,
Рис. 11.45. Схема регулирования скорости и направления вращения двигателя постоянного тока с использованием таймера 8254
596	___________________________________________Глава
Базовый интерфейс ввода-вы вода
597
30720
OUT1 (CL) [J
OUTO (PR)
и
Рис. 11.46. Временные диаграммы для схемы управления скоростью и направлением вращения двигателя: нет вращения (а), вращение с высокой скоростью в обратном направлении (б) и вращение с большой скоростью в прямом направлении (в)
управляющих скоростью и направлением вращения двигателя. С помощью этого коэффициента деления осуществляется формирование начальной рабочей частоты для двигателя равной приблизительно 260 Гц, которая довольно низка, для того чтобы привести двигатель в движение. Важно сохранить рабочую частоту ниже I000 Гц, но выше 260 Гц. В примере 11.27 показана процедура по управлению скоростью и направлением вращения двигателя.
Пример 11.27. Подпрограмма, управляющая скоростью и направлением вращения двигателя (рис. 11.45)
; Процедура, которая управляет скоростью и ; направлением вращения двигателя
598
Глава 11
; Когда эта процедура вызывается, то содержимое
; регистра АН определяет скорость и направление
; вращения двигателя, причем значение регистра АН
; находится в пределах от ООН до FFH
= 0706			CNTR	EQU	706H	
= 0700			CNTO	EQU	700H	
= 0702			CNTO	EQU	702H	
= 7800			COUNT	EQU	30720	
0000			SPEED	PROC	NEAR	
0000	50			PUSH	AX	: сохранение содержимого
0001	51			PUSH	DX	: регистров AX, DX и BX
0002	53			PUSH	BX	
0003	8А	CD		MOV	BL,AL	,	: вычисление числа
0005	В8	0078		MOV	AX, 120	
0008	F6	ЕЗ		MUL	BL	
000А	8В	D8		MOV	BX, AX	
ОООС	В8	7800		MOV	AX,COUNT	
000F	2В	СЗ		SUB	AX, BX	
ООН	8В	D8		MOV	BX, AX	
0013	ВА	0706		MOV	DX,CNTR	;	 программирование
0016	ВО	34		MOV	AL,00110100B ;	 управляющих слов
0018	ЕЕ			OUT	DX, AL	
0019	ВО	74		MOV	AL,01110100B	
001В	ЕЕ			OUT	DX,AL	
001С	ВА	0702		MOV	DX,CNT1	;	 программирование счетчика 1
001F	В8	7800		MOV	AX,COUNT	;	 для выполнения сброса триггера
0022	ЕЕ			OUT	DX, AL	
0023	8А	С4		MOV	AL, AH	
0025	ЕЕ			OUT	DX,AL	
0026			SPE:			
0026	ЕС			IN	AL,DX	;	' ожидание для счетчика 1
0027	86	С4		XCHG	AL,AH	;	- чтобы достичь
0029	ЕС			IN	AL,DX	;	I расчетного числа
002А	86	С4		XCHG	AL, AH	
002С	ЗВ	СЗ		CMP	AX,BX	
002Е	72	F6		JB	SPE	
0030	ВА	0700		MOV	DX,CNT0	;	* программирование счетчика 0
0033	В8	7800		MOV	AX,COUNT	;	; чтобы выполнить настройку
0036	ЕЕ			OUT	DX, AL	
0037	8А	С4		MOV	AL, AH	
0039	ЕЕ			OUT	DX,AL	
003А	5В			POP	BX	;	 восстановление содержимого
003В	5А			POP	DX	;	 регистров АХ, DX и ВХ
003С	58			POP	AX	
003D	СЗ			RET		
003Е
SPEED ENDP
Базовый интерфейс ввода-вывода
599
При вызове этой подпрограммы скорость вращения двигателя регулируется с помощью содержимого регистра АН. Поскольку скорость вращения задается 8-раз-рядным регистром, то при 50% коэффициенте заполнения последовательности импульсов в случае остановленного двигателя содержимое регистра АН соответствует числу 128. Таким образом, изменяя содержимое регистра АН, при обращении к подпрограмме, можно регулировать скорость и направление вращения двигателя. Скорость вращения двигателя будет увеличиваться в любом направлении изменением числа в регистре АН при обращении к подпрограмме. По мере приближения величины, находящейся в регистре АН, к ООН скорость вращения двигателя увеличивается в обратном направлении, а к FFH — в прямом направлении.
Подпрограмма устанавливает форму сигнала на выводе Q RS-триггера, вычисляя вначале число, с которым счетчик 0 начнет свою работу по отношению к счетчику 1. Для этого выполняется умножение содержимого регистра АН на 120, а затем результат вычитается из 30 720. Необходимость выполнения этих вычислений связана с тем, что счетчики являются вычитающими счетчиками, ведущими отсчет от запрограммированного числа до 0 при каждом запуске. Затем, счетчик 1 программируется записью в него числа 30 720 и запускается для генерирования сигнала сброса триггера. После запуска счетчика 1 производится считывание его и сравнение с вычисленным значением. После достижения момента совпадения запускается счетчик 0 с записью в нею числа 30 720. Далее с этой точки оба счетчика поочередно формируют сигнал сброса и установки RS-триггера с формированием тем самым на выводе Q RS-триггера выходного сигнала соответствующей формы. Это происходит вплоть до следующего обращения к подпрограмме.
11.6. Программируемый связной интерфейс 16550
Микросхема PC16550D, разработанная корпорацией Nanional Semiconductor, является программируемым связным интерфейсом, предназначенным для подключения, фактически, к любому типу последовательного интерфейса. Интерфейс 16550 является универсальным асинхронным приемопередатчиком (UART — Universal Asynchronous Receiver Transmitter), который полностью совместим с микропроцессорами фирмы Intel. Микросхема 16550 способна работать со скоростью передачи в пределах от 0 до 1,5 Мбод. Бод — это единица скорости передачи информации, которая равна количеству передаваемых в секунду битов, включая, в данном случае, стартовый, столовый, информационный и контрольный бит четности. Интерфейс 16550 также включает программируемый генератор скорости передачи и отдельные буферы FIFO для ввода и вывода данных, чтобы ослабить нагрузку на микропроцессор. В каждом буфере FIFO хранится 16 байтов. Это наиболее распространенный связной интерфейс в современном микропроцессорном оборудовании, включая персональный компьютер и большинство модемов.
Последовательная асинхронная передача данных
При последовательной асинхронной передаче данные передаются и принимаются без тактового и синхронизирующего сигналов. На рис. 11.47 показаны две группы последовательно и асинхронно передаваемых битов. Каждая такая передаваемая
600
Глава 11
группа битов называется посылкой или, иначе, кадром (frame). Каждый кадр содержит: стартовый бит, семь битов данных, бит контроля четности и один столовый бит. На рисунке показан кадр, содержащий Ю бит с одним ASCII-символом. Большинство систем связи с набором телефонного номера на компьютере (наиболее популярные онлайновые службы в США), такие как CompuServe, Prodigy и America Online, используют десять битов при последовательной асинхронной передаче данных с проверкой на четность. Большинство служб в Internet также применяют 10 бит, но они обычно не используют проверку на четность. Взамен передаются 8 информационных битов с заменой бита контроля четности еще одним битом данных. Это намного облегчает передачу информации, не содержащей ASCII-данных.
			Кадр (посылка)	►																		
* ! *	ST	Do	Di	d2	D3	d4	d5	De	p	*	ST	Do	D,	d2	D3	d4	d5	D6	p	*!*!*!
ST - стартовый бит
Do - D6 - биты данных
Р - бит паритета (контроля четности) * - стоп-бит
Рис. 11.47. Последовательная асинхронная передача данных
Функциональное описание микросхемы 16550
На рис. 11.48 приведена схема расположения выводов микросхемы универсального асинхронного приемопередатчика (UART) 16550. Эта микросхема выпускается в двух типах корпусов: корпусе типа DIP (dual in-line package) с 40 выводами или корпусе типа PLCC (plastic lead-less chip carrier) с 44 выводами. За передачу данных отвечают два полностью отделенных узла: приемник и передатчик. Поскольку каждый из них независим друг от друга, то интерфейс 16550 способен работать в симплексном, полудуплексном и дуплексном режимах. Примером симплексной системы связи является использование передатчика на радиостанции с ЧМ (частотной модуляцией) и соответствующего приемника у пользователя. Таким образом, в этом случае передача данных осуществляется только в одну сторону. Примером полудуплексной системы связи является частная или служебная радиосвязь на одной выделенной частоте, при которой передача и прием осуществляются поочередно (не в одно и то же время). Дуплексная система связи позволяет производить передачу и прием в обоих направлениях одновременно. Примером дуплексной связи является телефонная связь.
Одним из основных блоков интерфейса 16550 являются его буферы FIFO приемника и передатчика. Поскольку каждый буфер обладает памятью на 16 байт, то микропроцессор обращается к микросхеме UART только после получения им всех 16 байт данных. Кроме того, буфер FIFO удерживает 16 байтов, предназначенных для передачи, а микропроцессор в этот момент должен ожидать освобождения буфера передатчиком. Память типа FIFO делает универсальный асинхронный приемопередатчик идеальным при взаимодействии с высокоскоростными системами, поскольку при этом требуется меньше времени для его обслуживания.
Базовый интерфейс ввода-вывода
601
28	АО	D0 А1	16550	D1 А2	D2 cso	оз CS1	nl CS2	О® D6 MR	D7 RD	SIN WR	SOUT WR	BAUDOUT ADS	RCLK XIN	RTS XOUT	CTS TXRDY	ПЧР RXRDY	DCD DD IS	ni INTR	Rl OUT1 OUT 2		1
27			2
26			3
12			4
			5
13		
		6
14 Q 35		
			7
			8
21 °		
		10
		11
19		
		Q 15 9
18 с 25 £ 16		
		о 33 0 37 n 38 39
17		
24 Q 30		
		
		
Рис. 11.48. Схема расположения выводов универсального асинхронного приемопередатчика типа 16550
Интерфейс 16550 может управлять модемом (модул ятор/демодулятор), которой является устройством для преобразования ТТЛ уровней последовательных данных в звуковые сигналы, и которые могут передаваться по телефонной линии. Для управления модемом микросхема интерфейса 16550 имеет шесть предназначенных для этого выводов: DSR, DTR, CTS, RTS, RI и DCD.
Назначение выводов микросхемы 16550
П АО, А1 и А2
Сигналы, поступающие на выводы А2—АО (address), используются для выбора внутренних регистров при программировании и передаче данных. В табл. 11.9 представлены все регистры с перечислением комбинаций сигналов на адресных выводах для доступа к ним. Кроме того, в выборе некоторых регистров вместе с адресными выводами А2—АО участвует еще бит 7 регистра управления линией (LCR), называемый как DLAB (devisor latch access bit) — бит управления доступом к делителю частоты. В таблице обозначение X соответствует безразличному состоянию бита.
Таблица 11.9. Регистры UART 16550
Доступ				Регистр	
A2	A1	A0	DLAB	Имя	Название
0	0	0	0	RBR	Буферный регистр данных приемника (только для чтения)
0	0	0	0	THR	Регистр хранения данных передатчика (только для записи)
602
Глава 11
Таблица 11.9 (окончание)
Доступ				Регистр	
А2	А1	АО	DLAB	Имя	Название
0	0	0	1	DLL	Регистр младшего байта делителя частоты
0	0	1	1	DLM	Регистр старшего байта делителя частоты
0	0	1	0	IER	Регистр разрешения прерывания
0	1	0	X	IIR	Регистр идентификации прерываний (только для чтения)
0	1	0	X	FCR	Регистр управления буфером FIFO (только для записи)
0	1	1	X	LCR	Регистр управления линией
1	0 I	0	X	MCR	Регистр управления модемом
1	0	1	X	LSR	Регистр состояния линией
1	1	0	X	MSR	Регистр состояния модема
1	_±J	1	X	RCR	Регистр сверхоперативной памяти
□ ADS
Входной сигнал строба адреса ADS (address strobe) используется для защелкивания сигналов с линий адреса и выбора кристалла. Вывод ADS предназначен для использования с микропроцессорами Motorola. Если же он не нужен, как, например, для систем Intel, то этот вывод подсоединяется на "землю".
□	BAUDOUT
Выходной сигнал на выводе BAUDOUT (baud out) является синхронизирующим сигналом, который формируется генератором скорости передачи (Baud generator), относящимся к блокам передатчика. Чаще всего этот вывод соединяется с выводом RCLK для формирования сигнала синхронизации приемника, который должен быть равен сигналу синхронизации передатчика.
□	CSO, CS1, CS2
Все три сигнала выбора кристалла CSO, CS1 и CS2 (chip select), поступающие на одноименные выводы, должны быть активными, чтобы разрешить работу микросхеме UART 16550.
□	CTS
Активный сигнал CTS (clear to send) указывает, что модем или устройство сопряжения с телефонным оборудованием готовы к информационному обмену. Этот вывод часто используется в полудуплексных системах, для того чтобы в линии связи изменить направление передачи данных.
Казовый интерфейс ввода-вывода 603
0 D7-D0
Выводы шины данных D7—DO (data) микросхемы UART 16550 предназначены для обмена данными и соединяются с шиной данных микропроцессора.
□	DCD
Вывод детектирования несущей DCD (data carrier detect) используется модемом для передачи сигнала, информирующего микросхему 16550 об обнаружении несущей частоты.
□	DDIS
Выходной сигнал DDIS (disable driver) низкого логического уровня указывает на чтение микропроцессором данных из универсального асинхронного приемопередатчика (UART). Сигнал DDIS может быть использован для изменения направления потока данных, проходящих через буфер.
□	DSR
Входной сигнал готовности данных DSR (data set ready) указывает микросхеме UART 16550, что модем или устройство сопряжения с телефонным оборудованием готовы к работе.
□	DTR
Выходной сигнал DTR (data terminal ready) указывает на то, что терминал данных (микросхема UART 16550) готов к работе.
□	INTR
Выходной сигнал INTR (interrupt request) передается в микропроцессор и используется для запроса прерывания (INTR = 1) в случаях обнаружения ошибки в приемнике, или когда данные приняты приемником, или когда передатчик пуст.
□	MR
Входной сигнал на выводе MR (master reset) предназначен для инициализации интерфейса 16550. Вывод обычно подключается к системному сигналу RESET.
п бил, OUT2
Определяемые пользователем выходные выводы, которые могут обеспечить различными сигналами модем или другие устройства.
П RCLK
Входной сигнал синхронизации приемника RCLK (receiver clock) предназначен для приемника микросхемы UART.
□	RD, RD
Выводы RD и RD (read) (может использоваться любой) позволяют выполнять чтение данных из регистров UART, определяемых сигналами на адресных выводах.
П RI
Низкий логический уровень входного сигнала RI (ring indicator), выдаваемый модемом, обозначает получение им телефонного звонка (вызова).
604
Глава 11
□	RTS
Выходной сигнал RTS (request to send) указывает модему на то, что UART готов к передаче и запрашивает разрешение на выдачу данных.
□	SIN, SOUT
Это — выводы, с помощью которых осуществляется передача последовательных данных. Вывод SIN (serial input) предназначен для приема последовательных данных, а вывод SOUT (serial output) — для передачи.
□	RXRDY
Выходной сигнал готовности приемника RXRDY (receiver ready) предназначен для передачи полученных данных по процедуре прямого доступа к памяти (DMA) при условии разрешения выполнения подобных операций с помощью третьего бита регистра управления буфером FIFO (FCR).
П TXRDY
Выходной сигнал готовности передатчика TXRDY (transmitter ready) используется для передачи данных передатчиком по процедуре прямого доступа к памяти (DMA) при условии разрешения выполнения подобных операций.
□	WR, WR
Выводы WR и WR (write) (может использоваться любой) соединяются к соответствующему сигналу микропроцессора для записи команд и передаче данных в микросхему UART 16550.
□	XIN, XOUT
Это основные выводы, предназначенные для осуществления синхронизации микросхемы. Для создания кварцевого генератора к этим выводам обычно подключается кварцевый резонатор. При наличии внешнего источника синхронизации его тактовая частота подсоединяется к выводу XIN.
Программирование микросхемы 16550
Программирование связного интерфейса (микросхемы 16550) является достаточно простым, хотя может быть и несколько сложнее в сравнении с некоторыми другими, описанными в этой главе, программируемыми интерфейсами. Программирование состоит из двух частей: инициализации и программирование рабочих операций.
В персональном компьютере, использующем микросхему UART 1’6550 или эквивалентное программируемое устройство, порты ввода-вывода дешифрируются по адресам 3F8H—3FFH для порта СОМО и 2F8H—2FFH для порта COM2. Несмотря на то, что в этом разделе примеры приведены не для персонального компьютера, их можно адаптировать заменой номеров порта для управления СОМ-портами (communication port) персонального компьютера.
Инициализация
Обмен для инициализации микросхемы UART 16550, происходящий после возврата в исходное состояние аппаратного или программного обеспечения, состоит из двух
разовый интерфейс в вода-вы вода	605
--------------------------
частей: программирования регистра управления линией (LSR) и генератора скорости передачи. Регистр управления линией выбирает количество бит данных, количество стоповых и контрольных битов (четный или нечетный, и каким значением кодируется 1 или 0). Генератор скорости передачи программируется посредством делителя, который определяет скорость передачи в бодах для передатчика. На рис. 11.49 показан формат регистра управления линией.
Регистр управления линией (LCR) 7	6	5	4	3	2	1	0
DL	SB	ST	Р	РЕ	S	L1	L0
’------Количество бит данных
00-5 бит 01-6 бит 10-7 бит 11-8 бит
--------------Количество стоп-бит 0 -1 стоп-бит 1 - 2 стоп-бита или 1,5 бита для 5-битного кода данных
------------------Разрешение бита паритета (контрольного бита) 0 - запрещен 1 - разрешен
----------------------Выбор типа контроля
0 - нечетность 1 - четность
---------------------------Бит принудительного формирования бита паритета
0 - принудительное формирование отключено (контрольный бит генерируется в соответствии с паритетом выводимого символа) 1 - принудительное формирование включено (генерируется постоянное значение контрольного бита): 0 - если бит Р=1
1 - если бит Р=О
-------------------------------Формирование сигнала обрыва линии
0 - нет сигнала
1 - сигнал обрыва на выводе SOUT
-----------------------------------Бит управления доступом к делителю частоты
(полное название бита DLAB) 0 - защелка делителя выключена 1 - разрешение работы делителя
Рис. 11.49. Формат регистра управления линией (LSR) UART 16550
Регистр управления линией программируется посредством вывода данных по адресу ОН (А2, Al, АО). Два младших бита регистра управления линией выбирают количество передаваемых битов данных (5, 6, 7 или 8). Количество стоп-битов выбирается посредством бита S регистра управления линией. Если значение бита S = 0, то используется один стоп-бит, если S = 1, то используется 1,5 стоп-бита для посылки с пятью битами данных и два стоп-бита при любой другой посылке, при передаче 6, 7 или 8 бит данных. Для задания того или иного типа контроля при передаче данных используются следующие три бита регистра управления линией. Для того чтобы осуществлять передачу данных с проверкой по четности или нечетности, бит ST (stick) принудительного формирования бита паритета должен иметь нулевой логиче-
606
Глава 11
ский уровень, а бит РЕ (parity enable) разрешения бита паритета должен иметь значение логической I. При передаче данных без проверки по четности или нечетности, что характерно для соединений Internet, бит ST = 0 и бит РЕ = 0. Наконец, независимо от передаваемых данных постоянно должны приниматься или передаваться 0 или 1 в контрольном бите посылки, тогда бит ST = 1 и бит РЕ =1. В этом случае при передаче 1 значение бита Р должно соответствовать логическому 0, а при передаче 0 значение бита Р должно соответствовать логической 1. В табл. 11.10 представлены все варианты возможных кодов для битов управления типом контроля (РЕ, Р, ST) при передачах данных.
Таблица 11.10. Задание типа контроля при передаче данных с помощью битов РЕ, Р и ST
ST	р	РЕ	Функция
0	0	0	Передача данных без паритета
0	0	1	Передача данных с контролем по нечетности
0	1	0	Передача данных без паритета
0	1	1	Передача данных с контролем по четности
1	0	0	Передача данных без паритета
1	0	1	Постоянная передача/прием в бите паритета логической 1
1	1	0	Передача данных без паритета
1	1	1	Постоянная передача/прием в бите паритета логического 0
Оставшиеся биты регистра управления линией используются для передачи состояния обрыва линии и управления доступом к делителю частоты генератора скорости передачи. Если бит SB (6 бит) регистра управления линией имеет значение логической 1, то передается сигнал разрыва линии. Этот сигнал поступает с вывода SOUT микросхемы UART 16550 в течение всего периода времени при наличии в данном бите логической 1. Согласно определению, сигнал разрыва линии должен иметь длительность не менее двух фреймов (посылок) данных со значениями логического 0. Программное обеспечение в системе отвечает за синхронизацию по передаче сигнала разрыва линии. Для прекращения состояния разрыва линии 6 бит (бит SB) или же весь регистр управления линией сбрасывается. Старший 7 бит (бит DL или полное название бит DLAB) регистра управления линией при значении логической 1 разрешает работу делителя частоты генератора скорости передачи.
Программирование скорости передачи
Генератор скорости передачи программируется с помощью двух регистров защелки делителя, имеющих адрес 000 и 001 (А2, А1, АО). Следует отметить, что в этом случае бит DLAB регистра управления линией (LCR) должен иметь значение логической 1. При этом регистр младшего байта делителя частоты (DLL) по адресу 000 используется для удержания младшей части данных 16-разрядного делителя частоты, а регистр старшего байта делителя частоты (DLM) по адресу 001 используется для удержания старшей части данных. Величина частоты, которая используется делителем, определяется или внешним генератором, или частотой кварцевого резонатора.
Казовый интерфейс ввода-вывода 607
g табл. 11.11 приведены типовые скорости передачи, получаемые в случае применения частоты кварцевого резонатора на 18,432 МГц в качестве источника тактовых импульсов. В этой же таблице показаны соответствующие величины делителя, которые необходимы для получения определенной скорости передачи данных. Фактическое число, программируемое в делителе, будет в 16 раз больше представленного. Например, если в регистр делителя частоты будет записано число 240, то при входной тактовой частоте равной 18,432 МГц скорость передачи в бодах составит: 18,432 МГц/16 х 240 = 4800 бод.
Таблица 11.11. Соответствие значения, записанного в делитель частоты, и результирующей скорости передачи данных
Скорость передачи (бод)	Число, записанное в делитель частоты
	
110	10 473
300	3 840
1 200	920
2 400	480
4 800	240
9 600	120
19 200	60
38 400	30
57 600	20
115 200	10
Пример выполнения инициализации
/
Схема подключения микросхемы UART 16550 к микропроцессору 8088 показана на рис. И.50. Здесь в качестве дешифратора портов с 8-разрядными адресами F0H— F7H используется микросхема ПМЛ типа PAL16L8, причем программа для ее программирования не приведена.
Допустим, что при последовательной асинхронной передаче данных для одного кадра необходимо семь битов данных, контрольный бит по нечетности, скорость передачи 9600 бод и один стоп-бит. В примере 11.28 представлен листинг процедуры инициализации микросхемы UART 16550 для ее функционирования в соответствии с заданными условиями.
I Пример 11.28. Процедура инициализации микросхемы UART 16550
; Процедура инициализации микросхемы UART 16550
; с заданными следующими параметрами:
; скорость передачи 9600 бод, 7 бит данных, ; контроль по нечетности и один стоп-бит
608
Глава 11
= 00F3		LINE	EQU	0F3H	
= 00F0		LSB	EQU	0F0H	
= 00F1		MSB	EQU	0F1H	
= 00F2		FIFO	EQU	0F2H	
0000		START	PROC	NEAR	
0000	ВО	8A	MOV	AL,10001010B ;	: разрешение работы
0002	Еб	F3	OUT	LINE,AL	;	: делителя частоты
0004	ВО	78	MOV	AL,120	;	г программирование
0006	Еб	FO	OUT	LSB,AL	;	 скорости передачи
0008	ВО	00	MOV	AL, 0	
000А	Еб	Fl	OUT	MSB,AL	
ооос	ВО	OA	MOV	AL,00001010B ;	• 7-битной передачи данных,
000Е	Еб	F3	OUT	LINE,AL	;	 контроля по нечетности и 1 стоп-бита
0010	ВО	07	MOV	AL,00000111B ;	 разрешение работы
0012	Еб	F2	OUT	FIFO,AL	;	 передатчику и приемнику
0014	СЗ		RET		
0015		START	ENDP		
Последовательные данные
Рис. 11.50. Подключение микросхемы UART 16550 к микропроцессору 8088
609
разовый интерфейс ввода-вывода
З^есъ порт F3H соответствует регистру управления линией, а порты F0H и F1H соответствующим регистрам делителя частоты генератора скорости передачи данных. Последняя часть примера 11.28 с обращением к регистру управления буфером FIFO описывается в следующих нескольких абзацах.
Даже после программирования регистра управления линией и делителя частоты генератора скорости передачи микросхема UART 16550 все еще не готова к работе. Необходимо запрограммировать еще и регистр управления буфером FIFO, который соответствует порту F2H на приведенной схеме.
На рис. 11.51 показан формат регистра управления буфером FIFO (FCR) микросхемы UART 16550. Этот регистр разрешает работать передатчику и приемнику (бит 0 - 1) и очищает буферы FIFO передатчика и приемника, а точнее сбрасывает счетчики этих буферов, при этом сдвигающие регистры не сбрасываются. Он также обеспечивает управление прерываниями от UART 16550. Прерывания подробно рассмотрены в главе 12. Обратите внимание на то, что последняя часть примера 11.28 записывает код 0000011 12 (7) в регистр управления буфером FIFO. Этот код разрешает работать передатчику и приемнику и очищает оба буфера FIFO. После этого микросхема 16550 будет готова к работе, но без использования прерывания. Прерывания автоматически запрещаются, когда на вывод MR (master reset) UART 16550 поступает системный сигнал RESET высокого логического уровня.
Регистр управления буфером FIFO (FCR)
7	6	5	4	3	2	1	0
Разрешение буфера FIFO для передатчика и приемника О - запрещение 1 - разрешение
Сброс буфера FIFO
О - нет сброса 1 - сброс
Сброс буфера FIFO передатчика
О - нет сброса
1 - сброс
Управление режимом DMA
О - запрещение
1 - разрешение
Уровень заполнения буфера FIFO, при котором вырабатывается прерывание 00 - 1 байт (по умолчанию) 01-4 байта 10-8 байт 11 -14 байт
Рис. 11.51. Формат регистра управления буфером FIFO микросхемы UART 16550
20 Зак 384
610
Глава 11
Передача последовательных данных
Перед тем как станет возможной передача последовательных данных, нам необходимо ознакомиться с назначением регистра состояния линии (LSR) (рис. 11.52).
Регистр состояния линии (LSR) 7	6	5	4	3	210
ER	ТЕ	TH	Bl	FE	РЕ ОЕ DR
1----Готовность данных
0 - нет данных для чтения
1 - данные в буфере FIFO ----------Ошибка переполнения (потеря символа) 0 - нет ошибки
1 - ошибка
---------------Ошибка паритета 0 - нет ошибки 1 - ошибка
-------------------Ошибка кадра (не верный стоп-бит) 0 - нет ошибки 1 - ошибка
------------------------Индикатор обрыва линии
0 - нет обрыва
1 - обрыв линии
----------------------------Готовность передатчика для приема данных, предназначенных для передачи 0 - ожидание передатчика 1 - готовность
---------------------------------Передатчик пуст
0 - не пуст
1 - пуст
----------------------------------Ошибка принятых в буфер FIFO данных 0 - нет ошибки 1 - ошибка (по крайней мере одна)
Рис. 11.52. Формат регистра состояния линии микросхемы UART 16550
Регистр состояния линии содержит информацию о сбойных ситуациях и состоянии передатчика и приемника.
Подпрограмма, показанная в примере 11.29, предназначена для передачи содержимого регистра АН в микросхему UART 16550 и последующего вывода этого содержимого в виде последовательных данных на выводе SOUT. Подпрограмма вначале опрашивает бит TH регистра состояния линии (LSR), чтобы определить, готов ли передатчик для получения данных. В том случае, если передатчик готов, выполняется прием данных и последующая их передача. Подпрограмма предназначена для работы со схемой, представленной на рис. 11.50.
Пример 11.29. Процедура передачи данных с помощью микросхемы UART 16550
; Процедура, которая осуществляет передачу содержимого ; регистра АН посредством микросхемы UART 16550
Базовый интерфейс ввода-вывода
611
00F5			LSTAT	EQU	0F5H ;	адрес регистра состояния линии (LSR)
00F0			DATA	EQU	0F0H ;	адрес регистра данных передатчика (THR)
0000			SEND	PROC	NEAR	
0000	50			PUSH	AX	; сохранить содержимое регистра АХ
0001	Е4	F5		JN	AL,LSTAT ; получить содержимое регистра LSR	
0003	А8	20		TEST	AL,20H	; проверить бит TH регистра LSR
0005	74	FA		JZ	SEND	; ждать, пока передатчик не готов
0007	8А	С4		MOV	AL, AH	; если готов, то получить данные
0009	Еб	F0		OUT	DATA,AL	; передать данных
000В	58		J	POP	AX	; восстановить регистр АХ
00 ОС	СЗ			RET		
000D			SEND	ENDP		
Прием последовательных данных
Для считывания полученной информации из UART 16550 необходимо проверить бит DR (data ready) регистра состояния линии. В примере 11.30 приводится процедура по проверке этого бита для определения, получил ли приемник микросхемы 16550 какие-либо данные. После получения данных подпрограмма проверяет наличие ошибок. При наличии ошибки процедура завершается с содержимым регистра AL, которое соответствует ASCII-коду символа ”?”. При отсутствии ошибок подпрограмма завершается с содержимым регистра AL равным принятому символу.
Пример 11.30. Процедура получения данных из микросхемы UART 16550
; Процедура, которая получает данные из микросхемы
; UART 16550 и помещает их в регистр AL
= 00F5 = 00F0	LSTAT EQU		0F5H 0F0H	адрес регистра состояния линии (LSR) адрес регистра данных приемника (RBR)
	DATA	EQU		
0000	RECV	PROC	NEAR	
0000 Е4 F5		IN	AL,LSTAT	; получить содержимое регистра LSR
0002 А8 01		TEST	AL, 1	; проверить бит DR регистра LSR
0004 74 FA		JZ	RECV	; ждать, если данных нет в приемнике
0006 А8 0Е		TEST	AL,0EH	; если есть, проверить 3 бита ошибок
0008 75 03		JNZ	ERR	; при ошибке прийти на метку ERR:
000А Е4 F0		IN	AL,DATA	; читать данные из UART 16550
000С СЗ		RET		
000D	ERR:			
000D ВО 3F		MOV	AL,'2’	; признак ошибки поместить в AL
000F СЗ		RET		
0010	REVC	ENDP		
612 Глава Ц
Ошибки универсального асинхронного приемопередатчика
К ошибкам, определяемым микросхемой UART 16550, относятся: ошибка паритета ошибка кадра, ошибка переполнения. Ошибка паритета (parity error) указывает на то, что полученные данные имеют неправильный паритет. Ошибка кадра (framing error) или, иначе, посылки указывает на то, что стоп-бит располагается не на своем месте. Ошибка переполнения (overrun error) указывает на то, что данные переполнили внутренний буфер FIFO приемника. При нормальной работе эти ошибки не возникают. Появление ошибки паритета указывает на то, что во время приема возникла помеха. Ошибка кадра возникает при получении приемником данных, переданных на неверной скорости. Ошибка переполнения происходит только в том случае, когда программное обеспечение не успеет считать данные из UART перед тем, как буфер FIFO приемника будет полон. В приведенном примере не проверяется бит BI (break indicator), указывающий на состояние разрыва линии. Следует отметить, что состояние обрыва линии должно длиться на протяжении как минимум двух последовательных кадров с сигналом низкого логического уровня на выводе SIN микросхемы UART. Остальные регистры, которые используются для управления прерыванием и управления модемом, рассмотрены в главе 12.
11.7. Аналого-цифровой (АЦП)
и цифроаналоговый (ЦАП) преобразователи
Аналого-цифровой (АЦП) и цифроаналоговый (ЦАП) преобразователи используются для сопряжения микропроцессора с аналоговым внешним миром. Многие объекты, которые контролируются и управляются микропроцессором, относятся к аналоговым. Для сопряжения микропроцессора с этими объектами необходимо четкое понимание интерфейса и управления АЦП и ЦАП, которые преобразуют аналоговые и цифровые данные.
Цифроаналоговый преобразователь DAC0830
Достаточно простым и недорогим цифроаналоговым преобразователем является DAC0830 (изделие корпорации National Semiconductor). Данное 8-разрядное устройство преобразует 8-разрядные двоичные числа в аналоговые напряжения. Кроме этого устройства разработано множество других 10-, 12- или 16-разрядных ЦАП. Количество формируемых преобразователем уровней напряжения или, иначе, ступеней напряжения равно числу двоичных входных комбинаций. Следовательно, 8-разрядный преобразователь формирует 256 разных уровней напряжения, 10-раз-рядный преобразователь формирует 1024 уровня и т. д. DAC0830 — это среднескоростной преобразователь, который преобразует входной цифровой код в выходной аналоговый сигнал примерно за 1,0 мкс.
На рис. 11.53 приведено условное графическое обозначение преобразователя DAC0830. Это устройство имеет набор из восьми выводов DI7—DI0 шины данных для подачи на них цифрового входного кода и пару аналоговых выводов, обозначаемых 1Оит1 и 1оит2> которые являются вводами для внешнего операционного усилителя. Одна ступень напряжения на выходе для 8-разрядного преобразователя определяется как величина опорного напряжения, подаваемого на вывод VREF (refer-
Базовый интерфейс ввода-вывода	613
--------
ence voltage), деленная на 255. Например, если опорное напряжение составляет -5,0 В, то одна ступень напряжения на выходе составляет +0,0196 В. Обратите внимание на то, что выходное напряжение имеет полярность, противоположную опорному напряжению. Если на вход устройства подан код 1001 00102 (146), то выходное напряжение будет равно напряжению одной ступени умноженной на количество ступеней, т. е. 0,0196 х 146 = 2,862 В. При изменении опорного напряжения до -5,1 В одна ступень напряжения составит +0,02 В. Ступень напряжения часто называют разрешающей способностью (resolution) преобразователя.
Рис. 11.53. Условное графическое обозначение цифроаналогового преобразователя DAC0830
Внутренняя структура преобразователя DAC0830
На рис. Н.54 представлена внутренняя структура микросхемы цифроаналогового преобразователя DAC0830.	*
Обратите внимание на то, что устройство имеет два внутренних регистра-защелки. Первый — это регистр временного хранения данных, а другой соединяется с внутренней схемой преобразователя лестничного типа R-2R. В то время как вторая защелка удерживает один байт кода на время его преобразования, первая защелка может сохранить следующий байт входного кода. Во многих случаях первая защелка не используется, а применяется только вторая защелка для ввода данных в преобразователь. Это достигается посредством подачи сигнала высокого логического уровня к выводу ILE и сигнала низкого уровня к выводу CS (chip select) и WR1 (write).
Обе защелки преобразователя DAC0830 могут быть "прозрачными". Это означает, что в том случае, когда будет сформирован внутренний сигнал LE высокого логического уровня, данные пройдут сквозь защелку, а когда этот сигнал станет низкого логического уровня, то данные зафиксируются или, иначе говоря, защелкнутся в соответствующем регистре. Преобразователь имеет вывод VREF для подключения опорного напряжения, который устанавливает предельный уровень выходного напряжения. Например, если на вывод VRFF подать опорное напряжение равное —10 В, то выходное напряжение при максимальном входном цифровом коде (IIIIIIH2) составит +10 В. Выходной сигнал преобразователя лестничного типа R-2R появля
614
Глава 11
ется на двух выводах: Iquti и Iqut2- Эти выводы предназначаются для подключения к операционному усилителю, например, такому как цА741 или аналогичному.
‘Примечание: При низком логическом уровне сигнала LE данные, поступившие на входы D, защелкиваются в регистрах. При высоком уровне сигнала LE сигналы с входов D поступают на выводы Q.
Рис. 11.54. Внутренняя структура цифроаналогового преобразователя DAC0830
Подключение преобразователя DAC0830 к микропроцессору
На рис. П.55 показана схема подключения цифроаналогового преобразователя DAC0830 к микропроцессору.
В данной схеме в качестве дешифратора 8-разрядного адреса 20Н преобразователя DAC0830 используется микросхема PAL16L8. Каждый раз при выполнении команды out 20h,al выполняется обращение к преобразователю DAC0830 и содержимое регистра AL микропроцессора 8086 по шине данных передается на линии данных ADO-AD? приведенной схемы. Операционный усилитель цА741 питается от двухполярного источника постоянного тока с напряжением ±12 В, причем напряжение —12 В используется в качестве опорного напряжения для преобразователя DAC0830. Выход операционного усилителя питает транзисторный усилитель Q1, который приводит в движение электродвигатель постоянного тока с напряжением питания 12 В. Для более мощных электродвигателей этот усилитель выполняют по схеме Дарлингтона. В данном примере показано, как микропроцессор с помощью цифроаналогового преобразователя DAC0830 может управлять электродвигателем постоянного тока.
Базовый интерфейс ввода-вывода
615
“земля"
V
- аналоговая “земля"
Рис. 11.55. Цифроаналоговый преобразователь DAC0830, подключенный микропроцессору 8086, как устройство ввода-вывода с адресом 20Н
Аналого-цифровой преобразователь ADC0804
Недорогой аналого-цифровой преобразователь типа ADC0804 относится к семейству преобразователей ADC080X, аналогичных ему во всем, за исключением точности. Данное устройство совместимо с большой 'Группой микропроцессоров семейства Intel. Преобразователь ADC0804 является идеальным для многих прикладных задач, для которых не требуется высокая точность и быстродействие, несмотря на то, что в принципе существуют более скоростные и имеющие большую разрешающую способность АЦП.
Для преобразователя ADC0804 необходимо около 100 мкс, для того чтобы преобразовать аналоговое входное напряжение в цифровой код. На рис. 11.56 показано условное графическое обозначение преобразователя ADC0804 (изделие корпорации National Semiconductor).
Для того чтобы начать процесс преобразования на вывод WR АЦП, подается отрицательный импульс при условии, что на вывод CS уже поступил сигнал низкого логического уровня. Поскольку этому преобразователю требуется большое время для преобразования, то сигнал на выводе INTR сигнализирует об окончании преобразования. Сошлемся на временную диаграмму (рис. 11.57), которая показывает взаимосвязь управляющих сигналов.
Из временной диаграммы видно, что запуск преобразователя начинается с импульса WR, далее необходимо некоторое время ожидания на переход сигнала на выводе
616
Глава 11
INTR на низкий логический уровень и только после этого осуществляется считывание данных из преобразователя. Если же применить временную задержку на не менее 100 мкс, то в этом случае проверять вывод INTR не потребуется. Другой вариант предполагает соединение вывода INTR преобразователя к выводу запроса прерывания соответствующего контроллера, для того чтобы прерывание происходило после завершения преобразования. Процедура обработки прерывания должна предполагать выполнение чтения данных из преобразователя.
18 1Z_ 16 15 14 13 12 11
Д_ 2.
3_
5.
DBO DB1 DB2 DB3 DB4 DB5 DB6 DB7
V|N(+)
V,n(-)
CLKR
7
19
CS RD WR INTR
CLK IN<
VREF
AGND
A
9
8.
ADC0804
Рис. 11.56. Условное графическое обозначение аналого-цифрового преобразователя ADC0804
Рис. 11.57. Синхронизация аналого-цифрового преобразователя ADC0804
Аналоговый входной сигнал
Перед тем как подсоединять преобразователь ADC0804 к микропроцессору, необходимо разобраться с его аналоговыми входами. У ADC0804 имеется два аналоговых входа: VIN(+) и VIN(). Эти выводы подсоединяются к внутреннему операционному усилителю и являются дифференциальными вводами, как это показано на рис. 11.58.
Сигналы, поданные на дифференциальные входы, суммируются операционным усилителем, для формирования сигнала для внутреннего аналого-цифрового преобразователя. На рис. 11.58 показано несколько способов использования дифференциальных входов. В первом случае для подачи сигнала с амплитудой от 0 до 5,0 В
базовый интерфейс в вода-вы вода 617
(см. рис. 11.58, о) используется один не инверсный вход, в то время как другой, инверсный вход, подключен на "землю”. В другом случае (см. рис. 11.58, б) используется схема с изменением напряжения на инверсном входе VIN(), для регулирования напряжения смещения относительно "земли" для балансировки операционного усилителя.
Рис. 11.58. Аналоговые входы преобразователя ADC0804: для подачи относительно "земли" входного сигнала с амплитудой от 0 до +5,0 В (а) и для подачи входного сигнала при изменении смещения относительно "земли" (б)
Генерирование синхронизирующего сигнала
Для работы преобразователя ADC0804 необходим источник тактовых импульсов. Синхронизация может быть внешней или внутренней. В первом случае, осуществляется подача тактовых импульсов от внешнего генератора на вывод CLK IN преобразователя. Во втором случае, генерирование тактовых импульсов выполняется внутренней схемой преобразователя при использовании внешней RC-цепи. Допустимый диапазон частоты тактовых импульсов от 100 до 1460 кГц. Желательно использовать частоту, как можно ближе к 1460 кГц, чтобы обеспечить минимальное время преобразования. При внутренней генерации тактовых импульсов используется внешняя RC-цепь, которая подключается к выводам CLK IN и CLK R преобразователя, как это показано на рис. П.59.	'
Частота тактовых импульсов, при использовании такого соединения, вычисляется следующим уравнением:
l,l RC'
Рис. 11.59. Подключение внешней RC-цепи к выводам CLK IN и CLK R преобразователя ADC0804 для внутренней генерации тактовых импульсов
618
Глава 11
Подключение преобразователя ADC0804 к микропроцессору
На рис. 11.60 показана схема подключения преобразователя ADC0804 к микропроцессору 8086. Обратите внимание, что сигнал VREF никуда не подключается.
Схема предполагает, что дешифрирование ADC0804 осуществляется по двум адресам системы ввода-вывода. Порт с адресом 40Н предназначается для получения данных и порт 42Н для чтения сигнала 1NTR . Запуск преобразователя и считывание данных выполняется программно. Процедура, обслуживающая преобразователь ADC0804, приведена в примере 11.31. Следует отметить, что сигнал 1NTR опрашивается программно, и в том случае если он становится низкого логического уровня, то осуществляется чтение данных, и процедура завершается. После выхода из процедуры регистр AL будет содержать преобразованный цифровой код.
Пример 11.31. Процедура чтения данных из АЦП после окончания преобразования
; Процедура чтения данных из АЦП и запись их в регистр AL
0000			ADCX	PROC	NEAR	
0000	Е6	40		OUT	40H,AL	; начало преобразования
0002			ADCX1			
0002	Е4	42		IN	AL,42H	; получение сигнала INTR#
0004	А8	80		TEST	AL,80H	; проверка сигнала INTR#
0006	75	FA		JNZ	ADCX1	; ожидание, если сигнал INTR# = 1
0008	Е4	40		IN	AL,40H	; если INTR# = 0, чтение данных из АЦП
000А	СЗ			RET		
000В			ADCX	ENDP		
Рис. 11.60. Подключение преобразователя ADC0804 к микропроцессору
Базовый интерфейс ввода-вывода
619
Совместное применение ADC0804 и DAC0830
В этом разделе текста приводится пример, как оба ADC0804 и DAC0830 записывают и воспроизводят звуковой и речевой сигналы. Раньше, для генерирования речевого сигнала, часто использовали синтезатор речи, но результирующее качество полученной речи было слишком плохим. Для качественной записи речи человека и звуковых сигналов можно использовать аналого-цифровой преобразователь ADC0804, а для дальнейшего их воспроизведения применить цифроаналоговый преобразователь DACO83O.
На рис. 11.61 показана схема, которая предполагает два порта 700Н и 702Н для аналого-цифрового преобразователя ADC0804 и порт 704Н для цифроаналогового преобразователя DACO83O.
Программное обеспечение по приведению этих преобразователей в действие приведено в примере 11.32.
Пример 11.32. Программа обслуживания преобразователей ADC0804 и DAC0830, предназначенных для записи речи и звуковых сигналов с последующим их воспроизведением
	; Программа, которая записывает речевой сигнал ; в течение 1 секунды и воспроизводит его 10 раз ; перед тем, как записать новую порцию сигналов
	; Для задержек времени допускается применение
	; тактовой частоты 8 МГц (8086)
	.MODEL SMALL
	.DATA
0000	0500 [	WORDS DB 2048 DUP (?) ; Область для записи речи
	0000
	J .CODE
	. STARTUP"
0018	AGAIN:
0018	E8 000A	CALL READ	; прочесть речевой сигнал
001В	B9 000А	MOV СХ, 10	; установить счетчик на 10
001Е	LOOP1:
001Е	Е8 0023	CALL WRITE	; воспроизведение звука
0021	Е2 FB	LOOP LOOP1	; повторить 10 раз
0023	ЕВ ЕА	JMP AGAIN	; начать сначала
0025	READ PROC NEAR
0025	BF 0000 R	MOV DI,OFFSET WORDS ; адреса области данных
0028	B9 0500	MOV СХ,2048	; загрузить счетчик
002В	ВА 0700	MOV DX,0700H	; адрес порта данных ADC0804
002Е	READ1:
002Е	ЕЕ	OUT DX,AL	; начать преобразование
002F	83 С2 СО	ADD DX,2	; адрес регистра состояния
620
Глава 11
0032	READ2:
0032	ЕС	IN	AL, DX	; получить сигнал INTR#
0033	А8 80	TEST AL,8ОН	; проверить сигнал INTR#
0035	75 FB	JNZ READ2	; ожидание, пока INTR# = 0
0037	83 ЕА 02	SUB DX,2	; адрес порта данных ADC0804
003А	ЕС	IN	AL,DX	; получить данные из АЦП
003В	88 05	MOV [DI],AL	; запомнить в области памяти
003D	47	INC DI	; адрес следующей ячейки памяти
003Е	Е8 0018	CALL DELAY	; ожидать 1/2048 секунды
0041	Е2 ЕВ	LOOP READ1	; повторить 2048 раз
0043	СЗ	RET
0044	READ ENDP
0044	WRITE PROC NEAR
0044	51	PUSH CX	; сохранить регистр CX
0045	BF 0000 R	MOV DI,OFFSET WORDS ; адрес ячейки с данными
0048	В9 0500	MOV СХ,2048	; загрузить счетчик
004В	ВА 0704	MOV DX,0704H	; адрес ЦАП
004Е	WRITE1:
004Е	8А 05	MOV AL,[DI]	; получить данные из памяти
0050	ЕЕ	OUT DX,AL	; передать данные в ЦАП
0051	47	INC DI	; следующий адрес ячейки памяти
0052	Е8 0004	CALL DELAY	; ожидать 1/2048 секунды
0055	Е2 F7	LOOP WRITE1	; повторить 2048 раз
0057	59	POP СХ	; восстановить регистр СХ
0058	СЗ	RET
0059	WRITE ENDP
0059	DELAY PROC NEAR
0059	51	PUSH CX	; сохранить регистр CX
005А	B9 00E1	MOV CX,225	; задание задержки 1/2048 сек
005D	DELAY1:
005D	E2 FE	LOOP	DELAY1
005F	59	POP CX	; восстановить регистр CX
0060	СЗ	RET
0061	DELAY ENDP
	.END
Программа записывает речевой сигнал в течение одной секунды и затем 10 раз воспроизводит запись. Этот процесс повторяется до выключения системы. В этом примере делается выборка и запись речи в область памяти, называемую WORDS. Частота записи звуков определена как 2048 записей в секунду, что дает приемлемое качество звучания речи.
Базовый интерфейс ввода-вывода
621
Рис. 11.61. Схема записи и воспроизведения речи через динамик
Итоги
О Микропроцессоры 8086—Pentium 4 имеют два основных типа команд ввода-вывода: in и оит. Команда in вводит данные из внешнего устройства ввода-вывода в любой из регистров: AL (8-разрядный) или АХ (16-разрядный). Команда in используется различный формат: с фиксированным адресом, переменным адресом или как строковая команда insb/insw (80286—Pentium 4). Команда оит выводит данные из регистров AL или АХ на внешнее устройство ввода-вывода и
622
Глава 11
также команда in может использовать различный формат: с фиксированным адресом, переменным адресом или как строковая команда (outsb или outsw). Фиксированный формат команд ввода-вывода использует 8-разрядный адрес порта ввода-вывода, тогда как формат с переменным адресом и строковые команды используют 16-разрядный адрес порта, который должен находиться в регистре DX.
□ Изолированный ввод-вывод, называемый иногда прямым вводом-выводом, использует отдельную карту памяти для устройств ввода-вывода, чтобы освободить память для программ. Изолированный ввод-вывод использует команды in и out для передачи данных между устройством ввода-вывода и микропроцессором. Управляющая структура карты ввода-вывода использует сигнал IORC (I/O read control) и IOWC (I/O write control) плюс сигналы выбора банка ВНЕ и BLE (вывод АО для микропроцессоров 8086 и 80286) для воздействия на передачи данных в системе ввода-вывода. Микропроцессоры 8086 и 8088, рассмотренные в главе 9, используют соответственно сигнал М/Ю и Ю/М для генерации управляющих сигналов ввода-вывода.
□	Отображаемый в памяти ввод-вывод использует некоторую область памяти для пересылки данных ввода-вывода. Это снижает емкость имеющейся памяти, но отражается отрицательно на использование сигналов IORC и IOWC для пересылки данных ввода-вывода. Кроме того, любая команда по адресации памяти, может быть использована для пересылки данных между микропроцессором и устройством ввода-вывода, которое использует отражаемый в памяти ввод-вывод.
□	Все устройства ввода буферизованы с тем, чтобы передача данных ввода-вывода производилась только по шине данных при выполнении команды in. Буферная схема встраивается в периферийное программируемое устройство или располагается отдельно.
□	Все устройства вывода используют защелки, чтобы удерживать выходные данные при исполнении команды оит. Это необходимо потому, что данные появляются на шине данных менее чем на 100 нс по команде бит, а большинству выходных устройств требуются данные в течение существенно большего времени. Во многих случаях защелка встроена в периферийные устройства.
□	Квитирование и опрос — это методы управления процессом передачи информации между двумя независимыми устройствами, синхронизируемые несколькими сигналами управления. Например, компьютер запрашивает принтер: занят ли он, что определяется по сигналу BUSY от принтера. Если он не занят, то компьютер отсылает данные на принтер и информирует принтер, что данные доступны с помощью информационного стробирующего сигнала Strobe. Такая связь между компьютером и принтером является связью с квитированием или опросом.
□	Средства взаимодействия (схемы сопряжения) необходимы для многих устройств ввода, выполненных на базе переключателей, и многих устройств вывода, которые не являются ТТЛ-совместимыми.
□	Номер порта ввода-вывода появляется на линиях адресной шины А7—АО для команды ввода-вывода, имеющей формат с фиксированным адресом, и А15—АО для команды ввода-вывода с переменным адресом (А15—А8 имеют значение логического нуля для 8-разрядного порта). В обоих случаях адресные биты старше А15 не определены.
Базовый интерфейс ввода-вывода
623
□	Поскольку микропроцессоры 8086/80286/80386Х имеют 16-разрядную шину данных и адреса системы ввода-вывода связаны с байтовыми ячейками системы ввода-вывода, то пространство ввода-вывода также организовано по банкам, как и в запоминающей системе. Для интерфейса 8-разрядного устройства ввода-вывода с 16-разрядной шиной данных часто требуются отдельные записывающие стробы (для старшего и младшего банков) при операциях записи в системе ввода-вывода. Подобным же образом более старшие модели микропроцессоров, такие как 80486 и Pentium—Pentium 4, также имеют память системы ввода-вывода с организацией по банкам.
□	Дешифратор порта ввода-вывода во многом схож с дешифратором адреса памяти, за исключением того, что дешифратор порта системы ввода-вывода вместо дешифрирования целого адреса дешифрирует только 16-разрядный адрес для команд с переменным адресом, а зачастую и только 8-разрядный адрес порта для команд с фиксированным адресом.
□	Микросхема 82С55 является программируемым периферийным интерфейсом (ППИ) с 24 выводами (ввода-вывода), которые программируются двумя группами по 12 выводов каждая (группа А и группа В). ППИ 82С55 функционирует в трех режимах: обычный ввод-вывод (режим 0), стробированный ввод-вывод (режим 1) и двунаправленный ввод-вывод (режим 2). При подключении микросхемы ППИ 82С55 к микропроцессору 8086, имеющему тактовую частоту 8 МГц, вводятся два такта ожидания, поскольку быстродействие микропроцессора больше, чем скорость работы ППИ 82С55.
□	Микросхема 8279 является контроллером программируемой клавиатуры/дисплея, который способен управлять 64-клавишной клавиатурой и 16-разрядным цифровым индикаторным табло (дисплеем).
П Для работы матричного жидкокристаллического индикатора (LCD display) требуется изрядное количество программного обеспечения, но этот индикатор способен отображать информацию в коде ASCII *
П Микросхема 8254 является программируемым интервальным таймером с тремя 16-разрядными счетчиками, которые могут работать с двоичными или двоичнодесятичными числами. Каждый счетчик независим друг от друга и работает в шести разных режимах, к которым относятся: режим счетчика событий, ждущего мультивибратора (одновибратора), генератора импульсов, генератора прямоугольных импульсов (меандра), программируемого генератора одиночных импульсов и ждущего одновибратора, запускаемого импульсом.
О Микросхема 16550 является программируемым связным интерфейсом или, иначе, программируемым универсальным асинхронным приемопередатчиком (UART), способным принимать и передавать данные при асинхронной последовательной их передаче.
О DAC0830 является 8-разрядным цифроаналоговым преобразователем (ЦАП), который преобразует цифровой код в аналоговое напряжение за 1,0 мкс.
О ADC0804 является 8-разрядным аналого-цифровым преобразователем (АЦП), который преобразует аналоговый сигнал в цифровой за 100 мкс.
624
Глава 11
Контрольные вопросы и задания
I.	Объясните способ прохождения данных по командам in и out.
2.	Где хранится номер порта ввода-вывода для команды с фиксированным адресом ввода-вывода?
3.	Где хранится номер порта ввода-вывода для команды с переменным адресом ввода-вывода?
4.	Где хранится номер порта ввода-вывода для строковой команды ввода-вывода?
5.	В какой регистр вводятся данные по 16-разрядной команде IN?
6.	Опишите порядок действия команды OUTSB.
7.	Опишите порядок действия команды INSW.
8.	Сравните систему ввода-вывода, отображаемую в памяти, с системой изолированного ввода-вывода.
9.	Какой элемент интерфейса ввода является базовым?
10.	Какой элемент интерфейса вывода является базовым?
11.	Объясните термин квитирование применительно к компьютерным системам ввода-вывода.
12.	Четные адреса портов ввода-вывода находятся в  банках памяти системы ввода-вывода микропроцессора 8086.
13.	Нарисуйте схему формирования стробов записи для старшего и младшего банков системы ввода-вы вода.
14.	Какое назначение имеет схема устранения дребезга контактов?
15.	Разработайте интерфейс для подключения реле. Для работы реле необходимо напряжение 12 В и ток обмотки 150 мА.
16.	Разработайте дешифратор порта ввода-вывода, используя микросхему 74ALS138, которая будет генерировать сигналы для выбора в младшем банке следующих 8-разрядных портов ввода-вывода: ЮН, 12Н, 14Н, 16Н, 18Н, 1АН, 1СН и 1ЕН.
17.	Разработайте дешифратор порта ввода-вывода, используя микросхему 74ALS138, которая генерирует сигналы для выбора в старшем банке следующих 8-разрядных портов ввода-вывода: НН, 13Н, 15Н, 17Н, 19Н, 1ВН, 1DH и 1FH.
18.	Разработайте дешифратор порта ввода-вывода, используя микросхему PAL16L8, которая генерирует сигналы выбора 16-разрядных портов ввода-вывода, имеющих следующие адреса: 1000Н-1001Н, 1002Н-1003Н, 1004Н-1005Н, 1006Н-1007Н, 1008Н-1009Н, 100АН-100ВН, 100СН-100DH и 100EH-100FH.
19.	Разработайте дешифратор порта ввода-вывода, используя микросхему PAL16L8, которая генерирует сигналы выбора портов ввода-вывода младшего банка: 00А8Н, 00В6Н и 00EEH.
20.	Разработайте дешифратор порта ввода-вывода, используя микросхему PAL16L8, которая генерирует сигналы выбора портов ввода-вывода старшего банка: 300DH, 300ВН, 1005Н И1007Н.
21.	Почему в декодере 16-разрядного адреса порта игнорируются оба сигнала ВНЕ и BLE (АО)?
22.	К каким линиям шины данных подключено 8-разрядное устройство ввода-вывода, имеющее адрес 00ЮН системы ввода-вывода?
23.	К каким линиям шины данных подключено 8-разрядное устройство ввода-вывода, имеющее адрес 100DH системы ввода-вывода?
24.	Сколько программируемых выводов, предназначенных для ввода-вывода данных, имеется в микросхеме ППИ 82С55?
разовый интерфейс ввода-вывода	625
25	Перечислите выводы микросхемы ППИ 82С55. которые относятся к группе А и группе В. Какие два вывода микросхемы ППИ 82С55 осуществляют внутреннюю селекцию адреса порта ввода-вывода?
27.	К какому сигналу системной управляющей шины микропроцессора 8086 подключается вывод RD микросхемы ППИ 82С55?
Используя микросхему PAL16L8, разработайте схему подключения ППИ 82С55 к микропроцессору 8086 так, чтобы интерфейс функционировал по следующим адресам системы ввода-вывода: 0380Н, 0382Н, 0384Н и 0386Н.
29.	При возврате ППИ 82С55 в исходное состояние его порты ввода-вывода инициализируются по сигналу.
30.	Какие три режима рабо;ы имеет микросхема ППИ 82С55?
31.	Какое назначение имеет сигнал STB при операциях стробированного ввода ППИ 82С55?
32.	Объясните работу типового шагового двигателя, имеющего четыре индукционные обмотки.
33.	Что устанавливает сигнал на выводе IBF при операции стробированного ввода микросхемы ППИ 82С55?
34.	Напишите программу, обеспечивающую установку сигнала высокого логического уровня на выводе РС7 во время операции стробированного ввода ППИ 82С55.
35.	Каким образом устанавливается сигнал INTR (запрос прерывания) на одноименном выводе микросхемы ППИ 82С55 в режиме стробированного ввода?
36.	Какое назначение имеет сигнал АСК при операции стробированного вывода ППИ 82С55?
37.	Каким образом сбрасывается сигнал OBF при операции стробированного вывода ППИ 82С55?
38.	Напишите программу, чтобы определить: имеется ли высокий логический уровень на выводе РС4 при операции стробированного вывода ППИ 82С55.
39.	Какая группа выводов используется в двунаправленной операции 82С55?
40.	Какие выводы 82С55 относятся к универсальным выводам, предназначенным для ввода-вывода в режиме 2?
41.	Опишите принцип очистки жидкокристаллического индикатора (дисплея)?
42.	Каким образом осуществляется выбор позиции знакоместа в жидкокристаллическом индикаторе?
43.	Составьте короткую подпрограмму по размещению ASCII-кода символа Z в шестую позицию в жидкокристаллического индикатора.
44.	Каким образом производится проверка флага занятости в жидкокристаллическом индикаторе?
45.	Какие должны быть сделаны изменения в схеме на рис. 11.24, чтобы она функционировала с матрицей клавиатуры, состоящей из трех рядов и пяти колонок клавиш?
46.	Сколько обычно требуется времени для устранения дребезга контактов в клавиатуре?
47.	Что обычно подключается к выводу CLK микросхемы 8279?
48.	Сколько необходимо тактов ожидания для схемы сопряжения интерфейса 8279 с микропроцессором 8086, работающим с тактовой частотой 8 МГц?
49.	Составьте программу для программирования внутренней синхронизации при подключении вывода CLK микросхемы 8279 к тактовой частоте 3 МГц.
50.	Что представляет собой ошибка переполнения в микросхеме 8279?
626
Глава 11
51.	В чем состоит разница между кодированием и дешифрированием, которые выполняются микросхемой 8279 программируемого интерфейса клавиатуры/дисплея?
52.	Выполните схему подключения микросхемы 8279 к 16-разрядному микропроцессору 8086, функционирующую как 8-разрядные порты ввода-вывода 40Н—7FH. Используйте в качестве дешифратора микросхему 74ALS138 и задействуйте старшую или младшую часть шины данных.
53.	Выполните схему подключения 16-клавишной клавиатуры и 8-разрядного цифрового дисплея к микросхеме 8279.
54.	Интервальный таймер 8254 работает от тактовых импульсов с максимальной частотой 	Гц.
55.	В скольких разных режимах работает каждый счетчик в таймере 8254?
56.	Выполните схему подключения таймера 8254 так, чтобы он функционировал с адресами портов ввода-вывода: ХХ10Н, ХХ12Н, ХХ14Н и ХХ16Н. Составьте программу, чтобы запрограммировать счетчик 2 на генерирование импульсов прямоугольной формы с частотой 80 кГц, если на выводе CLK счетчика 2 имеются тактовые импульсы с частотой 8 МГц.
57.	Какое число нужно запрограммировать в счетчик таймера 8254 для вычисления 300 событий?
58.	Какой байт числа программируется первым при программировании в таймер 8254 16-раз-рядного числа?
59.	Объясните, как функционирует в таймере 8254 командное слово для чтения только что записанной информации (эхосчитывания).
60.	Запрограммируйте счетчик 1 таймера 8254, чтобы он генерировал непрерывную серию отрицательных импульсов с длительностью паузы 100 мкс и длительностью импульсов 1 мкс. Обеспечьте отображение частоты тактовых импульсов CLK, необходимой для этой задачи.
61.	Почему коэффициент заполнения последовательности импульсов на выходе счетчика таймера 8254 равный 50% удерживает двигатель на месте согласно схеме управления скоростью и направлением вращения двигателя, представленной в этой главе?
62.	Что включает в себя информация, которая передается при последовательной асинхронной передаче данных?
63.	Какая скорость измеряется в бодах?
64.	Напишите программу для микросхемы UART 16550 для работы с 6 битами данных, проверкой на четность, одним стоп-битом и со скоростью передачи 19 200 бод, используя тактовую частоту 18,432 МГц (предположите, что порты ввода-вывода имеют номера 20Н и 22Н).
65.	Какая будет частота сигнала, если микросхема UART 16550 генерирует последовательный сигнал со скоростью 2400 бод, а в делитель скорости передачи записано число 16?
66.	Дайте характеристику следующим терминам: симплекс, полудуплекс и дуплекс.
67.	Каким образом осуществляется сброс в исходное состояние микросхемы UART 16550?
68.	Составьте подпрограмму для UART 16550 для передачи 16 байтов из небольшого буфера по адресу, указанному регистром сегмента данных DS и смешением, находящимся в регистре SI (регистры DS и SI загружаются отдельно).
69.	Цифроаналоговый преобразователь DAC0830 преобразует 8-разрядный цифровой входной код в аналоговый выходной сигнал примерно за.
70.	Каково будет напряжение одной ступени на выходе DAC0830, если опорное напряжение составляет -2,55 В?
71.	Выполните схему подключения DAC0830 к 8086 с адресом порта ввода-вывода равным 400Н.
Базовый интерфейс ввода-вывода 627
72.	Напишите программу для схемы (вопроса 71) так, чтобы микросхема DAC0830 генерировала колебания напряжения треугольной формы. Частота сигнала колебания должна быть примерно 100 Гц.
73.	Аналого-цифровому преобразователю ADC080X требуется примерно для преоб-
разования аналогового напряжения в цифровой код.
74.	Для чего предназначается вывод INTR в преобразователе ADC080X?
75.	Для чего используется вывод WR в преобразователе ADC080X?
76.	Выполните схему подключения преобразователя ADC080X, имеющего порт 0260Н, для данных и 0270Н для проверки вывода INTR преобразователя.
77.	Разработайте программу для схемы подключения преобразователя ADC080X (согласно вопросу 76) для считывания входного напряжения (1 раз/100 мс) и записи результатов в массив памяти размером в 100Н байт.
ГЛАВА 1 2
Прерывания
Введение
В этой главе расширяется объем информации по системе ввода-вывода и программируемым периферийным интерфейсам посредством рассмотрения процедуры, которая называется "обработкой прерывания" (interrupt-processed). Прерывание — это процесс, инициируемый аппаратным или программным обеспечением, который прерывает любую выполняемую на данный момент программу. После возникновения прерывания выполняется процедура обработки прерывания.
Данная глава содержит примеры и дает подробное объяснение системы прерывания для всего семейства микропроцессоров Intel.
Темы главы
После ознакомления с данной главой вы сможете:
О объяснить систему прерываний семейства микропроцессоров Intel;
П объяснить действие команд программного прерывания: int, into, int з и bound;
П объяснить, каким образом флаг разрешения прерывания IF (interrupt flag) оказывает влияние на систему прерываний;
П описать функцию флага трассировки TF (trap flag) и операции по трассировке программ;
П разработать подпрограммы обслуживания прерываний, которые могут управлять медленными внешними периферийными устройствами;
П изложить суть системы прерываний микропроцессора, использующей программируемый контроллер прерываний 8259А и другое оборудование;
□ объяснить назначение и действие часов реального времени.
12.1. Основы процесса прерываний
В этом разделе рассматривается процесс прерывания в системе на базе микропроцессора, структуру и возможности прерываний для семейства микропроцессоров Intel.
Назначение прерываний
Прерывания, особенно полезны при сопряжении устройств ввода-вывода, которые снабжают или нуждаются в данных при относительно малой скорости передачи.
прерывания	629
Например, в главе 11 приведен пример с клавиатурой, подключенной с помощью микросхемы ППИ 82С55, использующей операцию стробированного ввода данных. 3 этом примере осуществляется программный опрос сигнала IBF, а точнее бита РС5 порта С микросхемы ППИ 82С55, для того чтобы определить, были ли получены данные от клавиатуры. При наборе символов на клавиатуре программа, обслужи-ваюшая ППИ 82С55, каждый раз выжидала время до следующего нажатия на клавишу- Этот процесс был настолько затратным по времени, что разработчики для управления этой ситуацией применили другую процедуру обслуживания устройств, а именно процедуру обслуживания по прерыванию. Обслуживание устройств по прерыванию, в отличие от метода опроса, позволяет микропроцессору выполнять другую программу, в то время как оператор при наборе на клавиатуре думает, какую следующую клавишу нажать. Кодирующее устройство клавиатуры, по нажатию клавиши, устраняет дребезг контактов переключателя и подает на выход один импульс для прерывания работы микропроцессора. Таким образом, микропроцессор выполняет другую программу до момента фактического нажатия клавиши. После чего он переходит на подпрограмму обслуживания клавиатуры, по которой и осуществляет считывание кода клавиши, а затем микропроцессор возвращается к прерванной программе. В результате, микропроцессор может напечатать отчет или завершить другую задачу, в то время как оператор печатает документ или думает, что печатать дальше.
На рис. 12.1 показан пример выполнения микропроцессором программ в течение некоторого отрезка времени, когда одновременно с выполнением основной программы осуществляется набор на клавиатуре и вывод данных на принтер.
Прерывание от клавиатуры
Прерывание от клавиатуры
Прерывание от принтера
sb	Основная программа					V////A
t
Прерывание от принтера
Рис. 12.1. Пример выполнения микропроцессором программ, показывающий на использование прерываний в типовой системе
Обратите внимание на то, что процедуры обслуживания прерывания от клавиатуры it принтера, вызываемые соответственно по прерыванию от клавиатуры и принтера, занимают при своем выполнении относительно мало времени.
Прерывания
Для выполнения процесса прерывания семейство микропроцессоров Intel имеет два вывода для осуществления запроса на прерывание от аппаратного оборудования INTR и NMI, а также один вывод INTA, с помощью которого подтверждается принятие запроса на прерывание. В дополнение к этим выводам микропроцессор также имеет возможность выполнения программного прерывания с помощью
632
Глава 12
□	Тип 4
Переполнение. При этом применяется специальный вектор, который используется командой into. Эта команда into прерывает программу и вызывает обработчик прерывания по вектору 4 при наличии состояния переполнения при условии, что флаг переполнения OF (overflow flag) установлен.
□	Тип 5
Нарушение границы массива, bound — это команда, которая сопоставляет содержимое первого операнда (регистра) с предельным значением, указанном во втором операнде или, точнее, в памяти. Второй операнд является базовым адресом двух слов или двойных слов в смежных ячейках памяти. Если содержимое регистра больше или равно первому слову в памяти и меньше либо равно другому слову, то прерывание не происходит, поскольку содержимое регистра находится в заданных пределах.
□	Тип 6
Недействительный код операции — происходит при появлении в программе неопределенного кода операции.
□	Тип 7
Сопроцессор отсутствует (not available) — происходит, если сопроцессор в системе не обнаружен. Если выполняется команда ожидания готовности сопроцессора wait или команда сопроцессора esc и сопроцессор не найден, то происходит исключение или прерывание типа 7.
□	Тип 8
Двойная ошибка — активизируется, если по одной и той же команде происходят два отдельных прерывания.
□	Тип 9
Переполнение сегмента памяти сопроцессора — происходит, если команда esc операнда памяти (код операции сопроцессора) заходит за пределы смещения адреса FFFFH.
□	Тип 10
Неправильный сегмент состояния задачи (TSS — task state segment) — происходит при неверном TSS, поскольку предельное поле сегмента не соответствует значению 002ВН или превышает его. В большинстве случаев это происходит потому, что TSS не инициализируется.
□	Тип 11
Сегмент отсутствует — это происходит, когда бит Р (Р = 0) в дескрипторе указывает на то, что сегмента нет в наличии или он неправильный.
□	Тип 12
Переполнение сегмента стека — это происходит при отсутствии стекового сегмента (Р = 0) или превышении границ сегмента стека.
□	Тип 13
Общая защита — происходит при большинстве нарушениях защиты в 80286— Pentium 4, работающих в системах, использующих защищенный режим. (Эти
Прерывания
633
ошибки в Windows случаются как общее нарушение защиты.) Ниже приводится перечень этих нарушений защиты:
а)	превышение лимита таблицы дескрипторов;
б)	нарушены правила о привилегиях;
в)	загрузка неверного типа дескриптора сегмента;
г)	запись в защищенный сегмент кода;
д)	чтение из только исполняемого сегмента кода;
е)	запись в сегмент данных только для чтения;
ж)	превышение лимита сегмента;
з)	CPL = IOPL при выполнении команд cts, hlt, lgdt, lidt, lldt, lmsw или ltr, где CPL — (current privilege level) текущий уровень привилегий, a IOPL — (I/O privilege level) уровень привилегий ввода-вывода;
и)	CPL > IOPL при выполнении команд сы, in, lock, out, outs и sti, где CPL — (current privilege level) текущий уровень привилегий, a IOPL — (I/O privilege level) уровень привилегий ввода-вывода.
□	Тип 14
Ошибка страницы — возникает при любой ошибке страницы памяти или доступа к коду в микропроцессорах 80386, 80486 и Pentium—Pentium 4.
□	Тип 16
Ошибка сопроцессора — ошибка сопроцессора (ERROR = 0) случается только с командами esc или wait в микропроцессорах 80386, 80486 и Pentium—Pentium 4.
□	Тип 17
Ошибка контроля выравнивания — указывает на то, что числовые данные (слово или двойное слова) адресованы в нечетную ячейку памяти (или в неправильную ячейку, если двойное слово). Такое прерывание эффективно для микропроцессоров 80486 и Pentium—Pentium 4.
□	Тип 18
Ошибка контроля процессора — активизирует прерывание режима управления системной памятью в микропроцессорах Pentium—Pentium 4.
Команды прерываний: BOUND, INTO, INT, INT3vt IRET
Из пяти команд программных прерываний для микропроцессора команды int и int з являются очень схожими, команды bound и into являются командами, выполнение которых зависит от соответствующих условий, а команда iret относится к специальной команде возврата из прерываний.
Команда bound, имеющая два операнда, сравнивает значение первого операнда (регистра), взятое как число со знаком, за границы, указанные во втором операнде (переменной). Второй операнд — два слова или двойных слова (в зависимости от разрядности операндов), рассматриваемые как целые числа со знаком, расположенные в памяти подряд. Первое значение считается нижней границей, второе — верхней. Если значение первого операнда (регистра) меньше нижней границы или больше
634 Глава 12
верхней, то вызывается прерывание типа 5. Например, если выполняется команда bound ах,data, то содержимое регистра АХ сравнивается с содержимым ячеек памяти data и data+1, а также — data+2 и data+з. Если значение регистра АХ меньше, чем содержимое data и data+1, или больше, чем содержимое data+2 и data+з, то происходит прерывание типа 5. Если же содержимое регистра АХ находится в пределах этих двух слов памяти, то никакого прерывания не происходит.
Команда into контролирует флаг переполнения OF (overflow flag). Если флаг установлен, т. е. OF = 1, то команда into обращается к процедуре, адрес которой хранится по вектору прерываний с номером 4. Если же флаг сброшен, т. е. OF = 0, то прерывания не будет и программа перейдет на выполнение следующей команды.
Команда int п обращается к процедуре обслуживания прерывания (или, иначе, обработчику прерывания), которая начинается с адреса, представленного «-номером вектора. Например, int 80н или INT128 обращаются к процедуре обслуживания прерываний, адрес которой хранится в векторе типа 80Н (000200Н—00303Н). Для определения адреса вектора умножаем только номер вектора (п) на 4, что дает начальный адрес вектора прерываний размером в 4 байта. Например, для прерывания int 5 начальный адрес вектора будет равен 4x5 или 20 (14Н). Вектор для команды int 5 начинается с адреса 000014Н и продолжается до адреса 000017Н. Каждая команда int содержится в двух словах памяти: первый байт содержит код операции, а другой номер — тип или номер прерывания. Единственным исключением этого является команда int з — однобайтная команда. Команда int з часто используется для указания точек останова в программе, поскольку достаточно просто позволяет ввести в программу программный код размером в 1 байт. Точки останова часто используются для отладки неисправного программного обеспечения.
Команда iret является специальной командой возврата из обработчика прерывания, используемая для возврата из процедуры программного или аппаратного прерывания. Команда iret во многом очень похожа на команду возврата из процедуры ret, поскольку она извлекает копию регистра флагов из стека. Команда iret загружает шесть байтов из стека: два для регистра IP, два для регистра CS и два для регистра флагов.
В микропроцессорах 80386—Pentium 4 также имеется команда iretd, поскольку эти микропроцессоры могут сохранять в стеке регистр EFLAG (32-разрядный), а также регистр EIP (32-разрядный) в защищенном режиме. При работе с микропроцессорами 80386—Pentium 4 в реальном режиме используется команда iret.
Прерывания в реальном режиме
Микропроцессор, после выполнения текущей команды, определяет условия, вызывающие прерывание посредством их проверки в представленном порядке: 1) исполняемая команда; 2) пошаговый режим работы; 3) немаскируемое прерывание (сигнал NMI); 4) переполнения сегмента сопроцессора; 5) аппаратное прерывание (сигнал INTR); 6) программное прерывание (команды INT).
При наличии одного и более условий прерывания действия выполняются в следующей последовательности:
1.	Содержимое регистра флагов сохраняется в стеке.
2.	Сбрасываются два флага прерываний: IF и TF. Этим блокируют вывод INTR и признак трассировки или пошаговой работы.
Прерывания
635
3	Содержимое регистра кодового сегмента (CS) сохраняется в стеке.
4	Содержимое регистра указателя команды (IP) сохраняется в стеке.
5.	Производится выборка содержимого вектора, которое затем помещается в оба регистра IP и CS с тем, чтобы следующая команда выполняла процедуру обслуживания прерываний, адресованную данным вектором.
Таким образом, при каждом прерывании микропроцессор сохраняет содержимое регистра флагов, регистра IP и CS, сбрасывает оба флага IF и TF, а затем переходит к процедуре обслуживания прерывания, адресованной вектором прерывания. Сброс флагов IF и TF происходит только после сохранения их в стеке. Возврат этих флагов в первоначальное состояние осуществляется в конце процедуры обслуживания прерывания при появлении команды iret. Следовательно, если прерывания были разрешены до процедуры обслуживания прерываний, то они автоматически повторно разрешаются в конце процедуры обслуживания по команде IRET.
Адрес возврата, а точнее содержимое регистров CS и IP, сохраняется в стеке во время выполнения процесса прерывания. Иногда адрес возврата указывает на следующую команду в программе, иногда — на команду или точку в программе, где произошло прерывание. Типы прерываний: 0, 5, 6, 7, 8, 10, 11, 12 и 13 сохраняют в стеке адрес возврата, который указывает на команду, нарушающую нормальный порядок работы вместо следующей команды в программе. Это в определенных ошибочных случаях предоставляет процедуре обслуживания прерываний возможность повторить команду.
Некоторые прерывания защищенного режима (типы 8, 10, 11, 12 и 13) размещают в стеке код ошибки вслед за адресом возврата. Код ошибки указывает селектор, по вине которого произошло прерывание. В случаях, когда селектор не является следствием ошибки, код ошибки равен 0.
Прерывания в защищенном режиме
Прерывания в защищенном режиме имеют точно такое же назначение, как и в реальном режиме, но таблица векторов прерываний отличается. В защищенном режиме работы, вместо вектора прерываний, используется набор из 256 дескрипторов прерываний, которые находятся в таблице дескрипторов прерываний (IDT — interrupt descriptor table). Таблица дескрипторов прерываний занимает 2 Кбайта (256x8, т. е. 256 дескрипторов по 8 байт в каждом). Таблица дескрипторов прерываний размещается в любом месте физической памяти, определяемом регистром таблицы дескрипторов прерываний (IDTR — Interrupt Descriptor Table Register).
Каждая отдельная запись в таблице дескрипторов прерываний IDT содержит адрес процедуры обслуживания прерываний, в виде селектора сегмента и 32-разрядного смещения. Кроме того, пятый байт дескриптора прерываний (всего их 8, начиная с 0 по 7) содержит бит Р (present), указывающий на присутствие или отсутствие сегмента в памяти, и биты DPL (descriptor privilege level), предназначенные для описания уровня привилегии прерывания. На рис. 12.3 показано содержимое дескриптора прерываний. Векторы прерываний реального режима могут быть преобразованы в прерывания защищенного режима посредством копирования адресов процедуры прерывания из таблицы прерываний векторов и преобразованием их в 32-разрядные относительные адреса, которые хранятся в дескрипторах прерываний. Один селектор
636
Глава 12
и дескриптор сегмента могут быть помещены в глобальную таблицу дескрипторов (GDT — Global Descriptor Table), которая идентифицирует первый мегабайт памяти как сегмент прерываний. Прерывание защищенного режима функционирует подобно прерыванию реального режима. Разница состоит лишь в наличии таблицы дескрипторов прерываний IDT и самих дескрипторах прерываний. Возврат из обоих прерываний осуществляется по команде iret или iretd. Единственным отличием является то, что микропроцессор в защищенном режиме имеет доступ к таблице дескрипторов прерываний IDT вместо таблицы векторов прерываний.
1 1 Смещение1(А31-А16) 	।			
Р	DPL	I 0 1110 I	ООН I I
। । Селектор [сегмента । ।		
। । Смещение! (А15-А0) i		
15	8 7	О
Рис. 12.3. Дескриптор прерываний защищенного режима
Флаги, относящиеся к прерыванию
Флаг разрешения прерывания IF (interrupt flag) и флаг трассировки TF (trap flag) сбрасываются во время прерывания после сохранения содержимого регистра флагов в стековой памяти.
На рис. 12.4 показано содержимое регистра флагов и месторасположение в нем флагов разрешения прерывания IF и флага трассировки TF.
	О	D	IF	TF	S	z		A		P		C
15	11 10 9876543210
Рис. 12.4. Формат регистра флагов
При установке флага IF сигнал, поступивший на вывод INTR микропроцессора, приводит к прерыванию, а при сбросе флага IF этот сигнал прерывания не вызывает. При установке флага трассировки (TF =1), после выполнения каждой команды, происходит прерывание типа 1 (int ih). Поэтому очень часто такой режим выполнения программы называют пошаговым.
При сброшенном флаге трассировки (TF = 0) идет нормальное выполнение программы. Этот флаг позволяет проводить отладку программ, как это показано в главах 17—19, в которых рассматриваются 32-разрядные микропроцессоры 80386— Pentium 4.
флаг прерывания устанавливается и очищается командами sti и сы соответственно. Специальных команд по установке и очистке флага трассировки TF нет. В примере 12.1 приведена процедура обслуживания прерывания, которая выполняет установку разряда флага трассировки регистра флагов, сохраненного в стеке.
Пример 12.1. Процедура установки флага трассировки
; Процедура, которая устанавливает флаг трассировки TF
0000			TRON		PROC	NEAR	
0000	50				PUSH	AX	; сохранить регистры в стеке
0001	55				PUSH	BP	
0002	8В	ЕС			MOV	BP,SP	; получить содержимое регистра SP
0004	8В	46	08		MOV	AX,[BP+8]	; получить значения флагов из стека
0007	80	СС	01		OR	AH, 1	; установить флаг TF
000А	89	46	08		MOV	[BP+8],AX	; сохранить флаги
000D	5D				POP	BP	; восстановить значения регистров
000Е	58				POP	AX	; из стека
000F	CF				IRET		
0010				TRON	ENDP		
В примере 12.2 приведена процедура обслуживания прерываний, которая, в отличие от предыдущей процедуры, наоборот сбрасывает флаг трассировки.
Пример 12.2. Процедура сброса флага трассировки
; Процедура, которая сбрасывает флаг TF, ; чтобы запретить трассировку
0000				TROFF PROC	NEAR	
0000	50			PUSH	AX	; сохранить содержимое регистров
0001	55			PUSH	BP	
0002	8В	ЕС		MOV	BP,SP	; получить содержимое регистра TF
0004	8В	46	08	MOV	AX,[BP+8]	; получить значение флагов
0007	80	Е4	FE	AND	AH,0FEH	; сбросить флаг TF
000А	89	46	08	MOV	[BP+8],AX	; сохранить флаги
000D	5D			POP	BP	; восстановить содержимое
000Е	58			POP	AX	; регистров из стека
000F	CF			IRET		
0010				TROFF ENDP		
Регистр флагов, в обоих примерах, извлекается из стековой памяти с помощью регистра ВР, который (по ошибке) адресует стековый сегмент. После извлечения содержимого регистра флагов бит TF или устанавливается (процедура TRON), или сбрасывается (процедура TROFF) перед возвратом из процедуры обслуживания прерываний. Команда iret восстанавливает регистр флагов с новым значением
638
Глава 12
рываний. Команда iret восстанавливает регистр флагов с новым значением флага трассировки.
Процедура трассировки программы
Допустим, что доступ к процедуре TRON осуществляется по команде int 4он, а к процедуре TROFF — по команде int 41н. Пример 12.3 выполняет трассировку программы сразу же после команды int 40н. Процедура обслуживания прерываний, приведенная в примере 12.3, реагирует на прерывание типа 1 (int 1н) или прерывание, связанное с трассировкой программы.
Всякий раз при возникновении прерывания, связанного с трассировкой программы (после выполнения каждой следующей команды за int 40н), процедура TRACE будет отображать все 16-разрядные регистры микропроцессора на экране электроннолучевой трубки. Таким образом будет обеспечен вывод содержимого регистров микропроцессора при выполнении трассировки программы для всех команд, расположенных между командами int 40н (TRON) и int 41н (TROFF).
Пример 12.3. Процедура вывода всех 16-разрядных регистров на экран при выполнении прерывания, связанного с трассировкой
	.MODEL TINY
0000	.CODE
0000	41 58 20 3D 20 42 RNAME DB ' AX = ','BX = ','CX = ' , ' DX =
	58 20 3D 20 43 58
	20 3D 20 44 58 20
	3D 20
0014	53 50 20 3D 20 42	DB 'SP = ','BP = ','SI = ','DI =
	50 20 3D 20 53 49
	0 3D 20 44 49 20
	3D 20
0028	49 50 20 3D 20 46	DB 'IP = ','FL = ','CS = ','DS =
	4C 20 3D 20 43 53
	20 3D 20 44 53 20
	3D 20
003С	45 53 20 3D 20 53	DB ' ES = ' , ' SS = '
	53 20 3D 20
DISP	MACRO PARI	
	PUSH	AX
	PUSH	DX
	MOV	DL,PARI
	MOV	AH, 6
	INT	21H
	POP	DX
	POP ENDM	AX
CRLF	MACRO	
	DISP	13
	DISP	10
ENDM
Прерывания
639
0046				TRACE	PROC	FAR USES AX BP BX			
0049	ВВ	0000 R			MOV	BX,OFFSET	RNAME ;	адрес наименований	
					CRLF				
0060	Е8	004D			CALL	DREG		вывести регистр	АХ
0063	58				POP	AX		получить ВХ	
0064	50				PUSH	AX			
0065	Е8	0048			CALL	DREG	/	вывести регистр	ВХ
0068	8В	С1			MOV	AX,CX			
00 6А	Е8	0043			CALL	DREG		вывести регистр	СХ
006D	8В	С2			MOV	AX,DX			
006F	Е8	003Е			CALL	DREG	;	вывести регистр	DX
0072	8В	С4			MOV	AX,SP			
0074	83	СО ОС			ADD	AX, 12			
0077	Е8	0036			CALL	DREG		вывести регистр	SP
007А	8В	С5			MOV	AX, BP			
007С	Е8	0031			CALL	DREG	;	вывести регистр	ВР
007F	8В	Сб			MOV	AX,SI			
0081	Е8	002С			CALL	DREG	;	вывести регистр	SI
0084	8В	С7			MOV	AX, DI			
0086	Е8	0027			CALL	DREG	;	вывести регистр	DI
0089	8В	ЕС			MOV	BP,SP			
008В	8В	46 06			MOV	AX,[BP+6]			
008Е	Е8	001F			CALL	DREG	;	вывести регистр	IP
0091	8В	46 ОА			MOV	AX,[BP+10]			
0094	Е8	0019			CALL	DREG		вывести флаги	
0097	8В	46 08			MOV	AX,[BP+8]			
009А	Е8	0013			CALL	DREG		вывести регистр	СХ
009D	8С	D8			MOV	AX, DS			
009F	Е8	ОООЕ			CALL	DREG		вывести регистр	DS
00А2	8С	СО			MOV	AX,ES			
00А4	Е8	0009			CALL	DREG	г		вывести регистр	ES
00А7	8С	DO			MOV	AX, SS			
00А9	Е8	0004			CALL	DREG	f	вывести регистр	SS
					IRET				
ООВО				TRACE	ENDP				
ООВО				DREG	PROC	NEAR USES	CX		
00В1	В9	0005			MOV	CX, 5		в счетчик 5	
00В4			DREG1:		DISP	CS:[BX]		вывод символа	
00BF	43				INC	BX		следующий адрес	
ООСО	Е2	F2			LOOP	DREG1	f	повторить 5 раз	
00С2	В9	0004			MOV	CX, 4	r	в счетчик 4	
00С5			DREG2:						
00С5	D3	С8			ROL	AX, 1	r	позиция цифры	
00С7	D3	С8			ROL	AX, 1			
00С9	D3	С8			ROL	AX, 1			
ООСВ	D3	С8			ROL	AX, 1			
00CD	50				PUSH	AX			
640
Глава
00CE	24	0F	AND .IF AL	AL,0FH , > 9	; преобразовать в ASCII
00D4	04	07	ADD AL,7		
			.ENDIF		
00D6	04	30	ADD	AL,ЗОН	
			DISP	AL	
00Е2	58		POP	AX	
00E3	Е2	Е0	LOOP	DREG2	; повторить 4 раза
			DISP	9	9	
			RET		
00F1			DREG ENDP		
			END		
Сохранение вектора прерывания в таблице векторов
В последовательности действий при установке вектора прерывания, иногда называемого перехватом прерывания (hook), ассемблер должен использовать абсолютную адресацию к памяти. В примере 12.4 показано, каким образом новый вектор добавляется в таблицу векторов прерываний с использованием ассемблера и вызова функций DOS. Здесь применение функции с номером 25Н для команды int 21н инициализирует вектор прерывания, настраивая его на программу обработки прерывания. Обратите внимание, что вначале процедура сохраняет старый номер вектора прерывания, считывая его посредством прерывания INT21H с функцией DOS номер 35Н. Описания функций DOS, вызываемых по команде int 21н, более подробно приведены в Приложении 1.
Пример 12.4. Программа, добавляющая в таблицу векторов прерывания новый вектор
0100 ЕВ 05
0102 00000000
.MODEL TINY
.CODE
; Программа, устанавливающая новый вектор NEW40
; для прерывания INT 4ОН
.STARTUP
JMP START
OLD DD ?
; новая процедура прерывания
0106	NEW40 PROC	FAR
0106 CF	IRET	
0107	NEW40 ENDP	
0107	START:	
0107 8C C8	MOV	AX,CS	; получить сегмент данных
0109 8E D8	MOV	DS, AX
010B B4 35	MOV	АН,35H	; получить старый вектор
010D B0 40	MOV	AL,40H	; прерывания
прерывания
641
610^ 0111 0115	CD 21 89 IE 0102 R 8С 06 0104 R	INT MOV MOV ; установка	21H WORD PTR OLD,BX WORD PTR OLD+2,ES нового вектора прерываний 4ОН
011^	ВА 0106 R	MOV	DX,OFFSET NEW40
011С	В4 25	MOV	АН,25H
0ПЕ	ВО 40	MOV	AL,40H
0120	CD 21	INT	21H
		; передать	NEW40 в память
0122	ВА 0107 R	MOV	DX,OFFSET START
0125	Dl ЕА	SHR	DX, 1
0127	Dl ЕА	SHR	DX, 1
0129	Dl ЕА	SHR	DX, 1
012В	Dl ЕА	SHR	DX, 1
012D	42	INC	DX
012Е	В8 3100	MOV	AX,3100H
0131	CD 21	INT	21H
		END	
12.2.	Аппаратные прерывания
Микропроцессор имеет два вывода для подачи на них двух различных сигналов запроса аппаратного прерывания: немаскируемого прерывания (NMI — non-maskable interrupt) и маскируемого прерывания (INTR — interrupt request). При активизации сигнала NMI, независимо от состояния флага разрешения прерывания IF, происходит прерывание типа 2 (int 2н). Идентификация источника прерывания осуществляется программно. При активизации сигнала INTR процессор формирует шинный цикл подтверждения прерывания INTA, в котором процессор получает извне вектор прерывания. По сигналу INTR может выбираться любой вектор прерывания. Однако, как правило, используются прерывания типов 20Н—FFH. Корпорация Intel зарезервировала прерывания ООН—IFH для внутреннего использования и дальнейшего расширения. К выводам микропроцессора, имеющим отношение к прерыванию, относится также вывод INTA. На этом выводе появляется одноименный выходной сигнал подтверждения прерывания INTA (interrupt acknowledge), который используется в ответ на сигнал INTR для получения типового номера вектора по шине данных D7—DO. На рис. 12.5 показаны все три вывода микропроцессора, которые относятся к процедуре прерывания.
Сигнал NMI
Немаскируемое прерывание активизируется по фронту сигнала NMI (переходу от О к 1), который является сигналом запроса немаскируемого прерывания процессора. Сигнал NMI, после его положительного фронта, должен сохранять свой высокий
21 Зак 384
642
Глава 12
Входные сигналы запроса прерывания
Выходной сигнал подтверждения прерывания
Рис. 12.5. Выводы микропроцессоров Intel, относящиеся к процедуре прерывания
логический уровень, пока не будет опознан микропроцессором. Сигнал, поступающий на вывод NMI, до опознавания положительного фронта импульса, должен иметь низкий логический уровень на протяжении не менее двух периодов тактовых импульсов. Сигнал NMI часто используется при ошибках паритета памяти и других основных неисправностях в системе, таких, например, как неисправность питания. Отключение питания можно легко обнаружить путем контролирования входного переменного напряжения, при исчезновении которого происходит формирование сигнала NMI и начинается процедура прерывания. В ответ на данный тип прерывания микропроцессор сохраняет все внутренние регистры в энергонезависимой памяти. На рис. 12.6 показана схема обнаружения отключения питания в сети, которая формирует сигнал NMI высокого логического уровня при перебоях с питанием переменного тока.
Рис. 12.6. Схема обнаружения отключения питания переменного тока
В этой схеме обеспечивается оптическая развязка от сети переменного тока. Выход оптопары подключен к формирователю импульсов прямоугольной формы, выпол-
ценному на инверторе с триггером Шмитта 74ALS14, который подает импульсы частотой 60 Гц на вход одновибратора 74LS122. Значения резистора R и конденсатора С, подключаемые к одновибратору, выбираются с таким расчетом, чтобы он сформировал импульс длительностью 33 мс или, иначе, равной двум периодам сети переменного тока. Поскольку микросхема 74LS122 является одновибратором со схемой повторного запуска, то на время подачи переменного тока на выходе Q будет присутствовать сигнал высокого логического уровня, а на выходе Q — низкого логического уровня.
При отключении питания переменного тока одновибратор перестанет получать пусковые импульсы, формируемые схемой 74ALS14. Это приведет к тому, что через 33 мс на выводе Q установится сигнал низкого уровня, а на выводе Q— высокого логического уровня. Таким образом, схема сформирует сигнал запроса немаскируемого прерывания NMI, который поступит на одноименный вывод микропроцессора и вызовет прерывание. Процедура обслуживания прерывания (здесь не показана) накапливает содержимое всех внутренних регистров и других необходимых данных в энергонезависимой памяти или памяти с резервным питанием. Такая система предполагает, что системный блок электропитания на его выходе имеет довольно большую фильтрующую емкость, которая после прекращения подачи переменного тока обеспечивает систему энергией еще на протяжении не менее 75 мс.
На рис. 12.7 показана схема подачи резервного электропитания на память после отключения основного питания постоянного тока. В данной схеме для переключения питания с источника постоянного тока на батарею применяются диоды. Поскольку используются кремниевые диоды, то подаваемое на схему памяти питание должно быть повышено с +5,0 до 5,7 В. Резистор номиналом 4,7 кОм используется для задания малого тока, с помощью которого осуществляется непрерывная подзарядка батарей питания при нормальной работе источника питания.
Рис. 12.7. Система памяти с питанием от никель-кадмиевых, литиевых или гелиевых батарей
При отключении основного источника постоянного тока напряжение на выводы Vcc системы памяти будет подаваться с батареи. Для большинства запоминающих устройств для сохранения данных достаточно напряжение питания около 1,5 В, по-этому даже нет необходимости иметь батареи напряжением в +5,0 В. Выводы WR
644
Глава 12
запоминающих элементов системы памяти с помощью резистора подключены к выводу питания Vcc, для устранения возможного ошибочного формирования сигнала записи при отключении основного питания.
Сигналы INTR и INTA
Вывод микропроцессора INTR (interrupt request) является выводом, чувствительным к уровню сигнала, поступающего на него, и до момента его распознавания микропроцессором должен сохранять высокий логический уровень. Сигнал INTR устанавливается внешним устройством, требующим маскируемого прерывания процессора по определенному событию, и сбрасывается при выполнении процедуры обслуживания прерывания. При поступлении в процессор сигнала запроса прерывания INTR прерывание происходит только в том случае, если будет установлен флаг разрешения прерывания IF.
В начале выполнения прерывания микропроцессор сохраняет в стеке содержимое регистра флагов, а затем сбрасывает флаг разрешения прерывания IF, запрещая гем самым удовлетворение любого следующего запроса на прерывание. Прерывания будут вновь разрешены, но только при установке флага IF, которая выполняется внутри процедуры обработки прерывания или в ее конце по команде iret, восстанавливающей из стека вместе со значениями регистров IP и CS прежнее содержимое регистра флагов. В защищенном режиме микропроцессоры 80386—Pentium 4 для возврата из процедуры прерывания используют команду iretd. Таким образом, обработка текущего прерывания может быть прервана либо немаскируемым прерыванием, либо другим маскируемым аппаратным прерыванием, при условии, если обработчик установит флаг IF. Прерывания, начинающиеся до завершения процедуры обработки текущего прерывания, называются вложенными прерываниями.
Микропроцессор в ответ на сигнал INTR выставляет сигнал подтверждения прерывания INTA. В это время после сохранения в стеке содержимого регистра флагов и сброса флага IF микропроцессор переходит к выполнению двух, следующих друг за другом циклам подтверждения прерывания, в которых системой генерируются два сигнала подтверждения прерывания INTA*. По завершению второго сигнала INTA вектор прерывания, выставленный запросившим прерывание устройством на шину данных D7—D0, поступает в микропроцессор. На рис. 12.8 показана временная диаграмма для сигналов микропроцессора INTR и INTA.
На рис. 12.9 показана простая схема, в которой применен вектор прерываний FFH, выдаваемый на шину данных и читаемый процессором вслед за появлением сигнала запроса на прерывание INTR. Обратите внимание на то, что вывод INTA в этой схеме никуда не подключен. Восемь резисторов, подключенные к напряжению питания Vcc, используются для подачи на шину данных (DO—D7) сигналов высокого логического уровня. Таким образом, микропроцессор будет автоматически видеть номер вектора FFH вслед за появлением сигнала INTR. Такое решение, безусловно, является наименее дорогим для реализации процедуры аппаратного прерывания.
1 В максимальном режиме работы микропроцессора два сигнала подтверждения прерывания INTA формируются микросхемой шинного контроллера 8288. — Ред.
Прерывания
645
Примечание:
*	Эти сигналы INTA формируются системой.
*	* В это время информация, выставленная на шину данных, игнорируется, хотя обычно и содержит номер вектора прерывания.
Рис. 12.8. Временная диаграмма процесса запроса и подтверждения прерывания
Рис. 12.9. Простой метод формирования вектора прерываний FFH
Использование буфера с тремя состояниями для выдачи вектора
На рис. 12.10 показана схема для формирования типового вектора прерываний и выдачи его на шину данных (DO—D7).
646
Глава 12
В ответ на получение сигнала запроса прерывания INTR. микропроцессор выдает сигнал INTA, который используется для разрешения работы 8-разрядного буфера с тремя состояниями 74ALS244. С помощью этого буфера при активизации процессором сигнала INTA вектор прерываний выдается на шину данных. Номер вектора прерываний можно легко изменить с помощью DIP-переключателей, которые показаны на этом рисунке. В данном примере номер вектора равен 80Н.
Рис. 12.10. Схема, формирующая с помощью DIP-переключателей любой номер вектора прерываний и выдающая его на шину данных D0—D7 в ответ на сигнал INTA , поступающий от микропроцессора
Формируемый фронтом сигнал запроса на прерывание INTR
Довольно часто на практике необходимо вместо вывода управляемого уровнем получить вывод, управляемый фронтом. Например, вывод INTR, чувствительный к
высокому логическому уровню, можно при помощи D-триггера преобразовать в вывод, реагирующий на фронт сигнала запроса на прерывание, как это показано на рис. 12.11.
Рис. 12.11. Преобразование управляемого фронтом вывода INTR в вывод, управляемый фронтом
В данной схеме вывод CLK триггера, чувствительный к положительному фронту входного сигнала, становится входом для фронта сигнала запроса прерывания, а вывод CL используется для сброса триггера в исходное состояние, которое происходит при выдачи микропроцессором сигнала подтверждения прерывания INTA. Сигнал RESET также сбрасывает триггер в исходное состояние, для того чтобы не было никаких запросов прерывания при включении системы.
Прерывание от клавиатуры, подключенной посредством микросхемы ППИ 82С55
Клавиатура, рассмотренная в главе 77, предоставляет простой пример функционирования сигнала INTR и процесса прерывания. На рис. 12.12 изображена схема подключения клавиатуры к микропроцессору посредством микросхемы программируемого периферийного интерфейса (ППИ) типа 82С55. На схеме также показано использование 8-разрядного буфера 74ALS244, который применяется для передачи на микропроцессор вектора прерываний 40Н в ответ на сигнал подтверждения прерывания от клавиатуры INTA.
ППИ 82С55 дешифрируется микросхемой ПМЛ PAL16L8 (программа для ее программирования не приводится) по адресам портов ввода-вывода микропроцессора
648
Глава 12
80386SX: 0500Н, 0502Н, 0504Н и 0506Н. ППИ 82С55 функционирует в режиме 1 (режиме стробированного ввода), поэтому при нажатии клавиши на клавиатуре выходной сигнал INTR (РСЗ) становится высокого логического уровня и, поступая на одноименный вывод микропроцессора INTR, запрашивает, таким образом, его прерывание. Сигнал на выводе INTR сохраняется на высоком логическом уровне до тех пор, пока ASCII-данные не будут считаны из порта А микросхемы ППИ 82С55. Иначе говоря, ППИ 82С55 запрашивает прерывание типа 40Н посредством сигнала INTR при каждом нажатии клавиши на клавиатуре. Сигнал DAV от клавиатуры приводит к защелкиванию данных в порт Айк установке сигнала запроса прерывания INTR.
Рис. 12.12. Схема подключения клавиатуры, работающей по прерыванию с использованием вектора 40Н, к микропроцессорной системе с помощью микросхемы ППИ 82С55
Прерывания 649
В примере 12.5 приведена процедура обслуживания прерывания для клавиатуры. Очень важно сохранить данные всех регистров, затрагиваемых прерыванием, перед их использованием. В программном обеспечении, необходимом для инициализации ППИ 82С55 и которое здесь не показано, буфер FIFO должен инициализироваться так, чтобы оба указателя (указатель входа и выхода из буфера) были одинаковыми, вывод запроса прерывания INTR был разрешен внутренним для ППИ сигналом INTE и запрограммирован режим работы.
Пример 12.5. Процедура обслуживания прерывания для клавиатуры
; Процедура обслуживания прерывания, ; которая читает коды клавиатуры, ; показанной на схеме (рис. 12.12).
= 0500 - 0506		PORTA EQU		500H 506H	
		CNTR	EQU		
0000	0100 [ 00	FIFO	DB 256 DUP (?)	;		буфер FIFO на 256 байт
0100	J 0000	INP	DW	7	указатель входа в буфер
0102	0000	OUTP	DW	2	указатель выхода из буфера
0104		KEY	PROC	FAR USES AX	ВХ DI DX
0108	2E: 8B IE	0100 R	MOV	BX,CS:INP	; загрузить указатель входа
010D	2E: 8B 3E	0102 R	MOV	DI,CS:OUTP	; загрузить указатель выхода
0112	FE C3		INC	BL	; проверить, полон ли буфер
0114	3B DF		CMP	BX,DI	; если буфер полон, то
0116	74 11		JE	FULL	; перейти на метку FULL:
0] 18	FE CB		DEC	BL	; если нет, то
ОПА	BA 0500		MOV	DX,PORTA	; получить данные
011D	EC		IN	AL, DX	; из ППИ 82С55
011E	2E: 88 07		MOV	CS:[BX],AL	; и сохранить их в буфере
0121 0126 0129	2E: FE 06 EB 07 90	0100 R FULL:	INC JMP	BYTE PTR INP DONE	
0129	B0 08		MOV	AL, 8	; запретить прерывания
012B 012E 012F 012F 0134	BA 0506 EE	DONE: KEY	MOV OUT IRET ENDP	DX,CNTR DX, AL	; от ППИ 82С55
Представленная процедура — короткая, т. к. микропроцессору 80386SX уже известно, что данные клавиатуры на момент обращения к процедуре уже имеются в наличии. Данные вводятся из клавиатуры и затем накапливаются в буфере FIFO (First In,
650
Глава 12
First Out — первым пришел — первым вышел). Большинство интерфейсов клавиатуры содержат буферы FIFO с емкостью не менее 16 байтов. В этом примере буфер FIFO имеет 256 байтов, что более чем достаточно для интерфейса клавиатуры. Обратите внимание на то, как используется команда inc byte ptr inp при добавлении единицы в указатель входа в буфер, который обеспечивает адресацию данных в буфере.
Вначале процедура проверяет заполнение буфера. Буфер будет полон, если значение указателя входа в буфер (INP — input pointer) будет иметь значение на один байт меньше указателя выхода (OUTP — output pointer). При заполнении буфера FIFO прерывания запрещаются с помощью регистра команд микросхемы ППИ 82С55, и далее выполняется возврат из процедуры прерывания. Если же буфер FIFO не заполнен, то данные из порта А сохраняют в буфере и выполняется приращение указателя входа в буфер до момента выхода из процедуры.
В примере 12.6 приведена процедура по извлечению данных из буфера FIFO.
Вначале эта процедура, так же как и предыдущая, проверяет два указателя, определяя, пустой ли буфер FIFO. Если значения указателей одинаковы, то буфер FIFO не заполнен, и процедура ожидает в цикле empty, в ходе которого непрерывно проверяются указатели. Прерывание цикла empty происходит с прерыванием клавиатуры, которая накапливает данные в буфере FIFO, чтобы тот не оставался больше пустым. Эта процедура возвращается в исходное состояние с символом в регистре АН.
Пример 12.6. Процедура, извлекающая данные из буфера FIFO
; Процедура, которая читает данные из
; указанного в примере 12.5 буфера FIFO и завершается, ; сохраняя их в регистр АН.
0134	READ	PROC	FAR USES BX DI DX
0137	EMPTY		
0137	2Е: 8В IE 0100 R	MOV	BX,CS:INP	; загрузить указатель входа
013D	2Е: 8В ЗЕ 0102 R	MOV	DI,CS:OUTP	; загрузить указатель выхода
0142	ЗВ DF	CMP	BX, DI
0144	74 F2	JE	EMPTY	; ожидание, если буфер пуст
0146	2Е: 8А 25	MOV	AH,CS:[DI]	; получить данные
0149	ВО 09	MOV	AL,9	; разрешить прерывания
014В	ВА 0506	MOV	DX,CNTR	; от ППИ 82С55
014Е	ЕЕ	OUT	DX,AL
014F	2Е: FE Об 0102 R	INC	BYTE PTR CS:OUTP
		RET	
0157	READ	ENDP	
12.3.	Расширение системы прерываний
В этой главе приводятся три общеизвестных метода расширения системы прерываний микропроцессора. В данном разделе разъясняется, каким образом можно с по-
Прерывания
651
мошью соответствующего аппаратного и программного обеспечения, путем модификации схемы, представленной на рис. 12.10, увеличить количество запросов на прерывание, поступающих на вывод INTR микропроцессора. Кроме того, объясняется организация системы прерываний с использованием программного последовательного опроса. В следующем разделе этой главы описывается третий метод, при котором можно за счет применения программируемого контроллера прерываний 8259А добавить до 63 запросов на прерывание.
Использование логического элемента И-НЕ и буфера 74ALS244
Схема, показанная на рис. 12.13, позволяет расширить систему прерываний до семи линий запросов на прерывание. Схема построена на базе схемы, представленной рис. 12.10. Единственным изменением является применение дополнительной 8-вхо-довой логической схемы И-НЕ, которая обеспечивает микропроцессор сигналом 1NTR при активизации любого из семи сигналов запроса на прерывание IR6— IR0.
Рис. 12.13. Расширение системы прерываний до семи запросов на прерывание, поступающих на вывод INTR микропроцессора
652
Глава 12
Принцип работы схемы
Если какой-либо входной сигнал запроса на прерывание IR6 —IR0 имеет низкий логический уровень, тогда выходной сигнал логической схемы И-НЕ (U2) становится высокого логического уровня, что приводит к запросу на прерывание процессора с помощью подачи этого сигнала на вывод INTR микропроцессора. Вектор прерывания, выдаваемый на шину данных буфером 74ALS244 (U1) во время импульса INTA, зависит от активной в данный момент линии запроса на прерывание. В табл. 12.1 приведены векторы прерываний, используемые при активизации одиночных сигналов запроса на прерывание.
Таблица 12.1. Векторы прерывания для одиночных сигналов запроса на прерывание для схемы согласно рис. 12.13
IR6	IR5	IR4	IR3	IR2	IR1	IR0	Вектор
1	1	1	1	1	1	0	FEH
1	1	1	1	1	0	1	FDH
1	1	1	1	0	1	1	FBH
1	1	1	0	1	1	1	F7H
1	1	0	1	1	1	1	EFH
1	0	1	1	1	1	1	DFH
0	1	1	1	1	1	1	BFH
В случае когда одновременно активными являются несколько запросов на прерывание, то генерируется иной, не представленный в таблице вектор прерывания. Например, если активными являются сигналы IR1 и IR0, то генерируется вектор прерывания FCH (252). Приоритет предопределяется номером сигнала запроса. Если сигнал IR0 будет иметь высший приоритет, тогда адрес вектора для сигнала IR0 запоминается в ячейке для вектора FCH. Таким образом, в такой системе вся верхняя часть таблицы векторов прерываний и ее 128 векторов прерываний должны использоваться для согласования всех возможных состояний для семи линий запроса на прерывание. Это выглядит несколько неэкономично, но во многих специальных применениях — это достаточно рентабельный подход для расширения системы прерываний.
Система прерывания с последовательным опросом
Расширение системы прерывания посредством использования прерывания с последовательным опросом во многом лучше, чем расширение с использованием буфера 74ALS244 и логической схемы И-НЕ, потому что для этого требуется только один вектор прерывания. Задача по определению приоритета отведена процедуре обслуживания прерывания. В этом случае программному обеспечению требуется дополнительное время для определения приоритета, но, в общем, это гораздо лучший подход для расширения системы прерывания.
Прерывания 653
На рис. 12.14 показана схема, которая состоит из трех логических элементов ИЛИ и двух микросхем ППИ 82С55 с четырьмя последовательно опрашиваемыми выводами INTR, подключенными к одному выводу INTR микропроцессора. Схема выполнена гак, что если какой-либо выходной сигнал 1NTR микросхем ППИ 82С55 переходит на высокий логический уровень, то это приводит к установке выходного сигнала схемы INTR, поступающего в микропроцессор, что в свою очередь вызывает прерывание.
При использовании системы с последовательным опросом опрос осуществляется по шине данных (DO—D7), линии которой можно подключить через нагрузочные резисторы к источнику питания с тем, чтобы для схемы использовать один вектор FFH. Следует заметить, что в системе с последовательным опросом может применяться любой вектор прерывания.
При активизации того или иного сигнала INTR микросхем ППИ 82С55 данная схема не обеспечивает индикации того, какой из них вызвал прерывание. Задача по определению активного выходного сигнала возлагается на процедуру обслуживания прерываний, которая должна опрашивать ППИ 82С55 с целью определения выходного сигнала, вызвавшего прерывание.
В примере 12.7 приведена процедура обслуживания прерываний, которая предназначена для системы с последовательным опросом запросов на прерывание. Процедура опрашивает каждую микросхему ППИ 82С55, для того чтобы принять решение о переходе на выполнение одной из четырех соответствующих процедур обслуживания прерываний.
Пример 12.7. Процедура обслуживания прерываний для системы с последовательным опросом запросов на прерывание
; Процедура последовательного опроса сигналов INTR
; микросхем ППИ 82С55 (рис. 12.14) для перехода на
; соответствующую процедуру обслуживания прерывания.
- 0504 0604	С1 С2	EQU EQU	504H	; 604H	;	 порт С первой микросхемы 82C55	
				: порт С второй микросхемы	82С55
= 0001	MASK1	EQU	1 ;	! сигнал INTRB (РСО)	
= 0008	MASK2	EQU	8	;	 сигнал INTRA (РСЗ)	
0000	POLL	PROC	FAR USES	АХ DX	
0002 ВА 0504		MOV	DX,C1 ;	• адрес первой микросхемы 82С55	
0005 ЕС		IN	AL,DX ;	 получить данные из порта	С
0006 А8 01		TEST	AL,MASK1		
0008 75 0F		JNZ	LEVEL_0 ;	 переход, если установлен	сигнал INTRB
000А А8 08		TEST	AL,MASK2		
000С 75 13		JNZ	LEVEL_1 ;	 переход, если установлен	сигнал INTRA
000Е ВА 0604		MOV	DX,C2 ;	 адрес второй микросхемы 82С55	
ООН ЕС		IN	AL,DX ;	 получить данные из порта	С
0012 А8 01		TEST	AL,MASK1		
0014 75 1В		JNZ	LEVEL_2 ;	 ’переход, если установлен	сигнал INTRB
0016 ЕВ 29 00		JMP	LEVEL_3 ;	’ переход, если установлен	сигнал INTRA
0019	POLL	ENDP			
654
Глава 12
Рис. 12.14. Система прерываний с последовательным опросом выводов INTR двух ППИ 82С55
Прерывания 655
12.4.	Программируемый контроллер прерываний 8259А
Программируемый контроллер прерываний 8259А (PIC — Programmable Interrupt Controller) осуществляет прием до восьми маскируемых запросов на прерывание с фиксированными уровнями приоритета, а также передачу в микропроцессор одного сигнала запроса на прерывание и кода вектора. Используя несколько контроллеров прерывания, можно без дополнительного аппаратного обеспечения расширить количество получаемых запросов до 64. Для такого расширения потребуется один ведущий (master) контроллер 8259А и восемь ведомых (slave) контроллеров 8259А.
Общая характеристика контроллера 8259А
На рис 12.15 показано условное графическое обозначение контроллера 8259А.
8259А
Рис. 12.15. Условное графическое обозначение программируемого контроллера прерываний 8259А
Контроллер 8259А достаточно легко можно подключать к микропроцессору, потому что большинство его выводов являются непосредственно подсоединяемыми к микропроцессору, за исключением вывода CS (который должен дешифрироваться дополнительной логикой) и вывода WR (который должен иметь импульс записи в банк ввода-вы вода). Ниже следует описание каждого вывода контроллера 8259А.
□	D7-D0
Двунаправленные выводы шины данных D7—DO (data) обычно соединяются к старшей или младшей шине данных микропроцессора 80386SX или шине данных 8088. При использовании микропроцессоров 8088 или Pentium—Pentium 4 подключение можно производить к любому 8-разрядному банку.
□	IR7-IR0
Вводы запросов на прерывание 1R7—IRO (interrupt request) используются для запроса прерывания у микропроцессора и подключения к подчиненному контроллеру в системе, использующей несколько контроллеров 8259А.
656
Глава 12
□	WR
Вывод записи WR (write) соединяется со старшим или младшим стробирующим сигналом записи в 16-разрядной системе или с любым стробирующим сигналом записи данных для системы любой размерности.
□	RD
Вывод чтения RD (read) соединяется с одноименным сигналом микропроцессора при минимальном режиме или с сигналом шинного контроллера IORC при максимальном режиме.
□	INT
Выходной сигнал INT (interrupt) ведущего или единственного контроллера в системе соединяется с выводом запроса на прерывание INTR микропроцессора, а в случае ведомого контроллера соединяется с выводом IR ведущего.
□	INTA
Вывод подтверждения прерывания INTA (interrupt acknowledge) соединяется с одноименным сигналом системы, обычно формируемым шинным контроллером. В системе, имеющей ведущий и ведомый контроллеры, этот вывод используется только для ведущего контроллера.
□	АО
Адресный вывод АО (address) предназначен для выбора различных командных слов при программировании контроллера прерываний 8259А.
П CS
Вывод выбора кристалла CS (chip select) разрешает работу контроллера 8259А при его программировании и управлении.
□	SP/EN
Вывод SP/EN (slave program/enable buffer — подчиненная программа/разреше-ние буфера) является выводом двойного назначения. При работе контроллера 8259А в буферизованном режиме больших микропроцессорных систем он служит выводом для управления приемопередатчиками шины данных. Если же контроллер 8259А не работает в буферизованном режиме, то вывод используется для программирования устройства в качестве ведущего (SP/EN = 1) или ведомого (SP/EN = 0) контроллера.
□	CAS2-CAS0
Выводы каскадирования CAS2—CASO (cascade) используются как выводы, соединяющие ведущий контроллер 8259А с ведомыми для каскадного их подключения в системе. Комбинациями сигналов на этих линиях определяется конкретный ведомый контроллер.
Прерывания 657
Подключение одного контроллера 8259А
На рис. 12.16 показано схема подключения одного контроллера 8259А к микропроцессору 8086. Здесь на вывод SP/EN подается сигнал высокого логического уровня, для указания того, что контроллер является единственным и ведущим. Контроллер 8259А дешифрируется устройством PAL16L8 (программа не показана) как порты ввода-вывода 0400Н—0204Н. Подобно другим периферийным устройствам, рассмотренным в главе 11, контроллеру 8259А требуется 4 такта ожидания, для того чтобы он нормально функционировал с микропроцессором 80386SX с тактовой частотой
Рис. 12.16. Подключение контроллера 8259А к микропроцессору 8086
658	Глава 1$
. и—
16 МГц, а также и большей частотой в случае использования других версий микр0, процессоров семейства Intel.
Каскадное подключение контроллеров 8259А
На рис. 12.17 показана схема соединения двух контроллеров 8259А с микропроцес~ сором 80386SX, которая часто применяется в компьютерах типа АТ с двумя контроллерами прерывания 8259А. В компьютерах типа XT или PC используется один контроллер 8259А с векторами прерываний 08Н—0FH. В компьютерах типа АТ вектор ОАН используется для каскадного подключения ведомого контроллера 8259А имеющего векторы от 70Н до 77Н. Таблица с перечислением функций для векторов прерываний, используемых в компьютерах типа PC, XT и АТ, представлена в Приложении 1.
В схеме (см. рис. 12.17) используются векторы 08Н—0FH и порты ввода-вывода 0300Н—0302Н для ведущего контроллера (LJ6), а также векторы 70Н—77Н и порты ввода-вывода 0304Н-0306Н для ведомого контроллера (U7). Обратите также внимание на то, что в схеме показано использование выводов SP/EN контроллеров 8259А для управления буферами шины данных типа 74ALS245 (U3 и U4). Эти буферные схемы используются только в очень больших системах, которые имеют множество устройств, подключаемых к одной и той же шине данных. На практике такие буферные схемы применяются редко.
Программирование контроллера 8259А
Программирование контроллера 8259А осуществляется с помощью командных слов инициализации и командных слов операций. Командные слова инициализации ICW (Initialization Command Word) программируются перед тем, как контроллер сможет функционировать в системе и определять основную операцию контроллера 8259А. Командные слова операции QCW (Operation Command Word) программируются во время нормального выполнения операций и управляют работой контроллера 8259А.
Командные слова инициализации
Существуют четыре командных слова инициализации ICW1 —ICW4 для контроллера 8259А, которые выбираются при высоком логическом уровне сигнала на выводе АО, за исключением ICW1, которое выбирается при АО = 0. При первом включении электропитания на контроллер 8259А должны поступать командные слова ICW1, ICW2 и ICW4. Если же при помощи командного слова ICW1 контроллер программируется для каскадного включения, тогда должны применяться также и командные слова ICW3. Поэтому при использовании в системе только одного контроллера прерываний 8259А должны быть запрограммированы три командных слова инициализации: ICW1, ICW2 и ICW4. Обратимся к рис. 12.18 относительно формата четырех командных слов инициализации ICW.
Далее следует описание каждого командного слова инициализации.
□ ICW1
Конфигурирует контроллер прерываний 8259А. При программировании ICW1 для работы с микропроцессорами 8086—Pentium 4 бит IC4 должен быть установлен. Биты ADI, А7, Аб и А5 находятся в безразличном состоянии при работе
660
Глава 12
ICW1 D7 D6 D5 D4 D3 D2 D1 DO
ICW2
D7 D6 D5 D4 D3 D2 D1 DO
a)
Рис. 12.18. Командные слова инициализации ICW контроллера прерываний 8259А
(см. продолжение)
Прерывания
661
A0=1
(Ведомый контроллер) D7 D6 D5 D4 D3 D2 D1 DO
ICW4
А0=1
07 D6 D5 D4 D3
D2 D1 DO
б)
Рис. 12.18. Окончание
микропроцессора, а применяются только при использовании 8-разрядного микропроцессора типа 8080/8085, которые в данном тексте не рассматриваются. Командное слово инициализации ICW1 определяет одиночную или каскадную работу контроллера при помощи программирования бита SNGL (single). При каскадной работе контроллеров необходимо программировать также и 1CW3. Бит LTIM (level triggered interrupt mode) определяет реагирование выводов запроса на прерывание контроллера на фронт или уровень сигнала.
П ICW2
Задает начальный номер вектора, который используется для выводов запроса на прерывание для данного контроллера. Например, если необходимо запрограмми
662
Глава 12
ровать контроллер 8259А для работы с векторами 08Н—0FH, то в это командное слово инициализации следует поместить 08Н. Подобно этому, при программировании контроллера для векторов 70Н—77Н в это командное слово инициализации помещают 70Н.
□ ICW3
Это командное слово инициализации используется только в случае, когда ICWI указывает на то, что система работает в каскадном режиме. Для ведущего (master) контроллера биты 7—0 (S7—So) указывают на наличие ведомых контроллеров, подключенных к выводам IR7—IR0 соответственно. Для ведомого (slave) контроллера биты 2—0 (1D2—1DO) содержат номер вывода IR ведущего контроллера, к которому он подключен (биты 7—3 = 0). Например, на рис. 12.17 ведомый контроллер подключен к выводу IR2. Чтобы запрограммировать ICW3 для этой схемы, помещают 04Н в ICW3 для ведущего контроллера и 02Н для ведомого. Допустим, что два ведомых контроллера подключаются к ведущему контроллеру, используя выводы IR0 и IR1. В этом случае ICW3 программируют значением ОЗН для ведущего контроллера, значением ООН для одного подчиненного контроллера и 01Н для другого.
□ ICW4
Программируется для применения с микропроцессорами 8086—Pentium 4, но не программируется в системе, которая функционирует с микропроцессором 8085. Крайний справа бит (цРМ) должен быть установлен для микропроцессоров 8086—Pentium 4, а остальные биты программируются следующим образом:
•	Бит AEOI (auto end of internipt) — выбирает автоматическое и обычное завершение прерывания (более полно рассматривается с командными словами операций). Команды завершения прерывания из OCW2 используются только в том случае, когда в ICW4 бит AEOI не установлен. При установке бита AEOI разрешается режим автоматического завершения прерывания, при котором автоматически сбрасывается бит запроса на прерывание и не изменяется приоритет. Это — предпочтительный режим работы для контроллера 8259А, и он сокращает продолжительность процедуры обслуживания прерывания.
•	Биты BUF (buffer) и M/S (master/slave) — используются вместе для выбора буферизованного или небуферизованного режима работы для ведущего или ведомого контроллера 8259А.
•	Бит SFNM (special fully nested mode) — включает режим полной вложенности для контроллеров 8259А, если этот бит имеет высокий логический уровень. Этим предоставляется высший приоритет запросу на прерывание от ведомого контроллера при его распознавании ведущим, во время обработки им другого прерывания от ведомого. Обычно, в данный момент времени производится обработка только одного запроса на прерывание, остальные запросы игнорируются до завершения обработки.
Командные слова операций
Командные слова операций OCW (Operation Command Words) используются для непосредственного управления работой контроллера 8259А после его программирования посредством командных слов инициализации. Выбор командных слов опера
Прерывания	663
ций осуществляется с помощью подачи сигнала низкого логического уровня на вывод АО контроллера, за исключением командного слова операции OCW1, которое выбирается при АО = 1. На рис. 12.19 приводятся комбинации двоичных разрядов для всех трех командных слов операций контроллера 8259А.
Далее следует описание каждого командного слова операций.
□ 0CW1
Используется для установки и сброса отдельных битов регистра масок, а также для его считывания. Установленный бит регистра масок выключает (маскирует) соответствующий вывод запроса на прерывание. Считывание регистра маски производится при считывании 0CW1. Поскольку в начале инициализации контроллера 8259А состояние маскирующих битов неизвестно, towOCWI должно программироваться при инициализации после программирования командных слов операций.
0CW1
D7 D6 D5 D4 D3 D2 D1 DO
0CW2 D7 D6 D5 D4 D3 D2 D1 DO
а)
Рис. 12.19. Командные слова операций OCW контроллера 8259А (см. продолжение)
664
Глава 12
Рис. 12.19. Окончание
□ 0CW2
Программируется в том случае, если не выбран режим автоматического завершения прерывания АЕО1 для контроллера 8259Л. В этом случае, данным командным словом операции определяется способ реагирования контроллера 8259А на прерывание. Далее перечислены следующие режимы:
•	Неспецифическое завершение прерывания (nonspecific end-of-interrupt) — при котором команда, посланная процедурой обслуживания прерывания, сигнализирует о завершении прерывания. При этом контроллер 8259А автоматически определяет активный уровень прерывания с наивысшим приоритетом и сбрасывает соответствующий бит регистра обслуживания прерывания. Сброс бита позволяет выполнить повторное прерывание или прерывание с низшим приоритетом.
•	Специфическое завершение прерывания (specific end-of-interrupt), при котором сброс бита регистра обслуживания определяется битами L2—L0 командного слова 0CW2.
•	Неспецифическое завершение прерывания с циклическим сдвигом приоритетов (rotate on nonspecific end-of-interrupt) выполняется точно так же, как и неспецифическое завершение прерывания, за исключением того, что в этом
Прерывания 665
случае после сброса бита регистра обслуживания прерывания ISR осуществляется циклический сдвиг уровней приоритета, причем низший 7 уровень приоритета становится на позицию только что обслуженного запроса. Например, если только что был обслужен запрос, пришедший на вывод IR4, т. е. он имел наивысший уровень равный 0, то его уровень приоритета становится наименьшим, т. е. равным 7, а запрос 1R5 получает наивысший 0 уровень приоритета.
•	Автоматическое завершение прерывания с циклическим сдвигом приоритетов (rotate in automatic end-of-interrupt). Данная команда должна посылаться на контроллер 8259А только один раз. Для отключения этого режима используется команда сброса режима циклического сдвига npnopnTeTOBw(CLEAR).
•	Установка приоритета (set priority) позволяет программисту, используя биты L2—L0, устанавливать для одного из запросов наименьший уровень приоритета без изменения состояния регистра обслуживания прерывания.
□ 0CW3
Выбирает регистр для считывания IRR или 1SR, режим специального маскирования и режим опроса (поллинга). При выборе режима опроса бит Р (polling) должен быть установлен и затем вместе с 0CW3 передан контроллеру 8259А. В режиме опроса информация об источнике прерывания запрашивается программно. Следующая операция чтения при АО = 0 интерпретируется как подтверждение прерывания и будет считывать опрашиваемое слово, которое контроллер выставляет на шину данных. Три крайние справа бита опрашиваемого слова указывают на активный запрос прерывания с наивысшим приоритетом. Крайний левый бит указывает на наличие прерывания и что должна быть выполнена проверка того, действительно ли три крайние справа бита содержат достоверную информацию.
Регистры состояния
В контроллере 8259А имеется три, предназначенные для считывания регистра, состояния: регистра запросов на прерывание IRR (internipt request register), регистра обслуживания прерывания ISR (in-service register) и регистра масок IMR (internipt mask register). Все три регистра состояния, представленные на рис. 12.20, 8-разряд-ныс и имеют одинаковую конфигурацию битов.
Регистр запросов 1RR указывает на то, какие выводы запросов на прерывание активные. Регистр обслуживания прерывания 1SR содержит уровень обслуживаемого прерывания. Регистр масок 1MR удерживает маскируемые биты и указывает, с какого прерывания снята маска.
Управление чтением регистров 1RR и ISR осуществляется посредством программирования с помощью командного слова операций OCW3, а регистр IMR считывается посредством OCW1.
При считывании регистра масок 1MR значение АО = 1, при считывании регистров IRR или 1SR — АО - 0. С помощью разрядов D0 и D1 командного слова операций OCW3 определяют, какой же регистр IRR или ISR будет читаться при значении АО = 0.
666
Глава 12
До обслуживания
Состояние регистра ISR а' Уровни приоритета
IS7	IS6	IS5	IS4	IS3	IS2	IS1	ISO
0	1	0	1	0	0	0	0
7	6	5	4	3	2	1	0
Низший приоритет
Наивысший приоритет
После обслуживания
IS7 IS6 IS5 IS4 IS3 IS2 IS1 ISO
Состояние регистра ISR 10	1	0	0000	0
Уровни приоритета |2	1076543
Наивысший приоритет	Низший приоритет
Рис. 12.20. Регистр обслуживания прерывания (ISR) контроллера 8259А: а) до обслуживания запроса IR4 и 6) после обслуживания запроса IR4
Пример программирования контроллера 8259А
На рис. 12.21 показана схема подключения программируемого контроллера прерывания 8259А к программируемому связному контроллеру UART 16550. На этой схеме вывод INTR микросхемы UART 16550 (Ul) подключен к выводу 1R0 программируемого контроллера прерывания 8259А (U3). Сигнал запроса на прерывание на выводе 1R0 устанавливается, когда:
□	передатчик готов послать другой символ;
□	приемник принял символ;
□	во время приема данных обнаружена ошибка;
□	возникает прерывание от модема.
Следует отметить, что UART 16550 дешифрируется микросхемой PAL16L8 (U2) и имеет порты ввода-вывода 40Н и 47Н, а контроллер 8259А — порты ввода-вывода 48Н и 49Н. Оба устройства подключены к шине данных микропроцессора 8088.
Инициализация
Первая часть программного обеспечения для данной системы должна запрограммировать оба контроллера 16550 и 8259А, а затем разрешить маскируемые прерывания микропроцессора 8088 с помощью сигналов, поступающих на его вывод INTR. Эта программа использует в памяти два буфера типа FIFO, которые хранят данные для передатчика и приемника. Каждый буфер FIFO имеет размер, равный 16 Кбайт, и адресуется парой указателей для входа в буфер и выхода из него.
Пример 12.8. Программа инициализации
; Программа инициализации UART 16550 и контроллера 8259А, ; включенных по схеме, показанной на рис. 12.21
667
= 0048	PIC1	EQU	48H	8259A управление при АО = 0
= 0049	PIC2.	EQU	49H	8259A управление при АО = 1
= 001B	ICW1	EQU	IbH	8259А ICW1
= 0080	ICW2	EQU	8 OH	8259А ICW2
= 0003	ICW4	EQU	3	8259А ICW4
= OOFE	OCW1	EQU	0FEH ;	8259А OCW1
= 0043	LINE	EQU	43H	16550 регистр управления линией
= 0040	LSB	EQU	4 OH	16550 регистр младшего байта делителя
= 0041	MSB	EQU	41H	16550 регистр старшего байта делителя
= 0042	FIFO	EQU	42H	16550 регистр управления буфером FIFO
= 0041	ITR	EQU	41H	16550 регистр разрешения прерываний
				•
0000	START	PROC	NEAR	
	/ ; Программирование			L6550, но без разрешения прерываний
0000 ВО 8A		MOV	AL,10001010B	; разрешение делителя частоты	
0002 E6 43		OUT	LINE,AL	
0004 BO 78		MOV	AL,120	; программирование скорости
0006 E6 40		OUT	LSB,AL	; передачи равной 9600 бод
0008 BO 00		MOV	AL, 0	
OOOA E6 41		OUT	MSB,AL	
OOOC BO OA		MOV	AL,00001010B	; 7 бит данных, бит контроля	
OOOE E6 43		OUT	LINE,AL	; на нечетность, 1 стоп-бит
0010 BO 07		MOV	AL,00000111В	; разрешение передатчика	
0012 E6 42		OUT	FIFO,AL	; и приемника
	; Программирование контроллера 8259A			
0014 BO IB		MOV	AL,ICW1	; программирование ICW1
0016 E6 48		OUT	PIC1,AL	
0018 BO 30		MOV	AL,ICW2	; программирование ICW2
001A E6 49		OUT	PIC2,AL	
001C BO 03		MOV	AL,ICW4	; программирование ICW4
001E E6 49		OUT	PIC2,AL	
0020 BO FE		MOV	AL,OCW1	; программирование OCW1
0022 E6 49		OUT	PIC2,AL	
0024 FB		STI		; разрешение прерывания
	; Разрешение прерываний 16550			
0025 BO 07	9	MOV	AL, 5	; прерывание при приеме символа
0027 E6 41		OUT	ITR,AL	; и в случае ошибки
0029 C3		RET		
002А
START ENDP
668
Глава 12
Рис. 12.21. Схема подключения UART 16550 к микропроцессору 8088 с помощью контроллера 8259А
Первая часть процедуры (start) программирует микросхему UART 16550 для прие-ма/передачи посылки, имеющей семь битов данных, контрольный бит с проверкой на нечетность, один столовый бит и скорость передачи 9600 бод. Регистр управления буфером FIFO также разрешает передатчик и приемник.
Другая часть программы программирует контроллер 8259А с помощью трех командных слов инициализации (1CW1, 1CW2 и 1CW4) и одного слова операций (OCW1). Контроллер 8259А настраивается для функционирования в режиме автоматического завершения прерывания с векторами 80Н—87Н. С помощью командного слова операций OCW1 программируют маску для запросов на прерывание, разрешая тем самым прерывания только от UART 16550. Далее по команде sti разрешаются маскируемые прерывания микропроцессора по сигналу 1NTR.
Последняя часть программы с помощью регистра разрешения прерываний 1ER разрешает прерывание от UART 16550 при приеме символа и в случае ошибки. Пере
Прерывания
669
датчик не вызывает прерывание до тех пор, пока он содержит данные для передачи. На рис. 12.22 приводится содержимое регистра разрешения прерываний UART 16550.
Следует отметить, что регистр разрешения прерывания способен разрешить или запретить прерывания от приемника, передатчика, в случае обрыва или ошибки линии, а также по изменению состояния модема.
Регистр разрешения прерываний
7	6 5 4	3 2	1	0
0	0	0	0	ЕМ	EL	ЕТ	ER
’-----Разрешение прерывания
от приемника 0=эапретить 1=разрешить
-----------Разрешение прерывания от передатчика 0-запретить 1=разрешить
----------------Разрешение прерывания из-за обрыва или ошибки линии 0=запретить 1 = разрешить
--------------------Разрешение прерывания от модема 0=запретить 1 ^разрешить
Рис. 12.22. Регистр разрешения прерываний UART 16550
Обработка запроса на прерывание от UART 16550
Так как устройство UART 16550 генерирует только один запрос на прерывание для различных причин, вызывающих прерывание, то программа обработки прерываний должна опрашивать устройство UART 16550, для установления типа произошедшего прерывания. Это осуществляется посредством опроса регистра идентификации прерываний (рис. 12.23). Обратите внимание, что регистр идентификации прерываний, предназначенный только для чтения, использует тот же самый порт ввода-вывода, что и регистр управления буфером FIFO, предназначенный только для записи.
Регистр идентификации прерываний
7	6 5 4 3 2 1	0
0	0	0	0	ID	ID	ID	PN
Признак необслуженного
запроса на прерывание 0=есть запрос 1=нетзапроса
Биты идентификации прерывания (см. таблицу 12.2)
Рис. 12.23. Регистр идентификации прерываний UART 16550
670
Глава 12
Регистр идентификации прерываний указывает: ожидается ли прерывание, тип прерывания и разрешены ли в памяти буферы FIFO передатчика и приемника. Содержимое битов управления прерываниями регистра идентификации прерываний представлено в табл. 12.2.
Таблица 12.2. Биты регистра идентификации прерываний UART 16550
Бит 3 (только в режиме FIFO)	Бит 2	Бит 1	Бит 0	Приоритет*	Тип	Управление сбросом
0	0	0	1	—	Нет прерывания	—
0	1	1 I	0	1	Ошибка приемопередатчика (паритета, формирования кадра, переполнения, обрыва линии)	Сброс — чтением регистра состояния линии
0	1	0	0	2	Наличие данных в приемнике	Сброс — чтением регистра данных приемника
1	1	0	0	2	Индикатор тайм-аута (за 4-кратный интервал времени передачи символа не принято и не передано ни одного символа, хотя в буфере FIFO имеется, по крайней мере, один)	Сброс — чтением регистра данных приемника
0	0	1	0	3	Регистр данных передатчика пуст	Сброс — записью данных в передатчик
0	0	0	0	4	Изменение состояние модема	Сброс — чтением регистра состояния модема
* Наивысший приоритет 1, а низший 4.
Процедура обслуживания прерываний должна проверить содержимое регистра идентификации прерываний IRR, для того чтобы определить событие, вызвавшее прерывание, и передать управление на соответствующую подпрограмму для этого события. В примере 12.9 приведена первая часть программы обработки прерываний, которая передает управление на метку recv: для прерываний, вызванных приемником, на метку trans: для прерываний, вызванных передатчиком, и на метку err: для прерывания по ошибке из-за состояния линии. Следует отметить, что в данном примере состояние модема не проверяется.
з Пример 12.9. Обработчик прерываний для UART 16550
; Обработчик прерываний для микросхемы UART 16550, ; показанной на схеме рис. 12.21.
Прерывания
671
0000		INT80	PROC	FAR	
0000	50		PUSH	AX	
0001	Е4	42	IN	AL,42H (	: получить содержимое регистра HR
0003	ЗС	06	CMP	AL, 6	; проверить, есть ли ошибки, и если да,
0005	74	20	JE	ERR	: то перейти к соответствующему обслуживанию
0007	ЗС	02	CMP	•AL, 2	: если прерывание вызвано передатчиком,
0009	74	55	JE	TRANS ;	: то перейти к соответствующему обслуживанию
ооов	ЗС	04	CMP	AL, 4 i	: если прерывание вызвано приемником,
000D	74	11	JE	RECV ;	- то перейти к соответствующему обслуживанию
Получение данных от UART 16550
Данные, которые принимает UART I6550, сохраняются не только в буфере FIFO внутри микросхемы, но также и в буфере типа FIFO, организованного в памяти, до тех пор, пока программное обеспечение не сможет их использовать. Буфер FIFO в памяти, используемый для приема данных, имеет размер I6 Кбайт. Следовательно, можно легко получить и накопить достаточно много символов до вмешательства микропроцессора для опорожнения приемником этого буфера. Буфер FIFO сохраняет данные в дополнительном сегменте, для того чтобы можно было применять для доступа к нему строковые команды, использующие регистр DL
Для получения данных от UART I6550 требуются две процедуры. Одна процедура считывает регистр данных UART 16550 при каждом запросе на прерывание, поступающем с вывода 1NTR на микропроцессор, и накапливает данные в буфере FIFO, расположенном в памяти. Другая процедура, показанная в примере I2.I0 и вызываемая из основной программы, считывает данные из этого буфера FIFO. Эта процедура предполагает, что указатели входа в буфер и выхода из него (пит и пит) уже инициализированы в диалоге инициализации системы, который здесь не показан.
Пример 12.10. Процедура чтения данных из буфера FIFO, расположенного в памяти
; Процедура, которая читает данные из буфера FIFO,
; расположенного в памяти, и сохраняет их в
; регистре AL при возврате из процедуры.
; Если буфер FIFO пуст, то имеет место возврат из
; процедуры с установленным флагом переноса С = 1.
0000	READ	PROC	NEAR USES BX	DI
0002	26: 8В ЗЕ 4002 R	MOV	DI, TOUT	;	 получить указатель выхода
0007	26: 8В 1Е 4000 R	MOV	BX,IIN	;	* получить указатель входа
ооос	ЗВ DF	CMP	BX, DI	;	• сравнить указатели
О00Е	F9	STC		 установить флаг переноса
000F	74 16	JE	DONE1	;	 переход, если буфер пуст
ООП	26: ВА 06	MOV	AL,ES:[DI] ;	1 получить данные из буфера
0014	47	INC	DI	;	 адрес следующего байта
672
Глава 12
0015	81	FF 4000 R	СМР	DI,OFFSET FIFO+16*1024
0019	26:	: 89 ЗЕ 4002 R	MOV	IOUT,DI	; сохранить указатель выхода
001Е	76	07	JBE	DONE	; переход, если в пределах буфера
0020	26:	: С7 06 4002 R	MOV	IOUT,OFFSET FIFO
	0000 R			
0027		DONE:		
0027	F8		CLC	; сбросить флаг переноса
0028		DONE1		
0028	9С		PUSHF	; сохранить флаг переноса
0029	Е4	41	IN	AL,41H	; читать регистр IER
002В	06	05	OR	AL, 5	; разрешить прерывания после
002D	Е6	41	OUT	41H,AL	; приема символа и при ошибке
002F	9D		POPF	
			RET	
0033		READ	ENDP	
Процедура read после завершения возвращает считанный из буфера FIFO символ, сохраненный в регистре микропроцессора AL. Если буфер FIFO пуст, то процедура завершается с установленным флагом переноса (С = I). Если же регистр AL содержит достоверный символ, то флаг переноса сбрасывается перед возвратом из процедуры READ.
Обратите внимание на то, как повторно используется буфер FIFO после изменения адреса байта данных, хранящихся в буфере. При превышении этого адреса вершины буфера, равного значению стартового адреса или, иначе, дна буфера плюс 16К. Сравнение адреса байта данных с вершиной буфера осуществляется по команде смр со смещением 0015. Также обратите внимание на то, что в конце этой процедуры прерывания в случае приема символа или по ошибке вновь разрешаются, если они были запрещены процедурой recv ввиду переполнения буфера FIFO.
В примере I2.ll приведена процедура обработки прерываний recv, которая вызывается каждый раз при получении приемником UART 16550 символа, предназначенного для микропроцессора. В данном примере прерывание использует вектор 80Н, по которому вызывается обработчик прерываний, приведенный в примере 12.9. При каждом прерывании, в случае получения приемником UART 16550 символов, процедура recv читает эти данные из буферного регистра приемника. Процедура recv накапливает эти символы в буфере FIFO, расположенном в памяти. Если буфер заполнен, то прерывания от приемника запрещаются с помощью регистра разрешения прерываниями микросхемы UART 16550. Это может привести к потере данных, но, по крайней мере, прерывание не вызовет затирание достоверных данных, которые уже находятся в памяти. При обнаружении устройством UART 16550 любого состояния ошибки в буфере FIFO запоминается символ ASCII "?" (3FH). Обратите внимание, что часть программы обработки прерываний с меткой err:, предназначенной для обнаружения ошибок, здесь не показана.
Пример 12.11. Процедура получения данных из приемника UART 16550 и сохранение их в буфере FIFO, расположенном в памяти
; RECV — одна из процедур обработчика прерываний, ; приведенного в примере 12.9.
Прерывания
673
0020	RECV:	; продолжить обработку прерываний
0020 53 0021	57 0022	56		PUSH ВХ	; сохранить в стеке PUSH DI	; содержимое регистров ВХ, DI и SI PUSH SI
0023 26: 8В 1Е	4002 R	MOV ВХ,IOUT ; загрузить указатель выхода
0028 26: 8В 36 002D 8В FE 002F 46	4000 R	MOV SI,IIN ; загрузить указатель входа MOV DI,SI INC SI
0030 81 FE 4000 0034 76 03	1 R	CMP SI,OFFSET FIFO+16*1024 JBE NEXT
0036 BE 0000 R 0039	NEXT:	MOV SI,OFFSET FIFO •
0039 ЗВ DE		CMP BX,SI ; буфер FIFO полон?
003В 74 0В		JE	FULL	; если да, перейти на метку FULL
003D Е4 40 003F АА		IN	AL,40Н ; считать принятые 16550 данные STOSB	; сохранить их в буфере FIFO
0640 26: 89 36	4000 R	MOV UN, SI ; сохранить указатель входа
0045 ЕВ 06 90 0048	FULL	JMP DONE	; перейти на метку DONE
0048 Е4 41		IN	AL,41H ; считать регистр IER
С04А 24 FA		AND AL,0FAH ; запретить прерывания по ошибке и
004С Е6 41 004Е	DONE:	OUT 41H,AL ; после приема символа приемником
004Е ВО 20		MOV ALz20H ; посылать контроллеру 8259А
0050 Е6 49 0052 5Е 0053 5F 0054 5В 0055 58 0056 CF		OUT	49H,AL ;	команду EOI POP	SI	;	восстановить содержимое POP	DI	;	регистров SI,	DI, BX	и AX, POP	BX	;	сохраненных в	стеке POP	AX IRET
Передача данных на UART 16550
Передача данных на устройство 16550 во многом осуществляется тем же способом, что и прием данных, за исключением того, что процедура обслуживания прерываний перемещает передаваемые данные из другого буфера FIFO размером 16 Кбайт, который так же, как и предыдущий, находится в памяти.
В примере 12.12 приведена процедура заполнения этого буфера данными, предназначенными для передачи на UART 16550 с последующим их выводом. Она аналогична процедуре, приведенной в примере 12.10, за исключением того, что она определяет заполнение буфера FIFO, а не его опустошение.
Пример 12.12. Процедура, заполняющая буфер FIFO данными, предназначенными для их последующей передачи в UART 16550
; Процедура, которая помещает данные в буфер FIFO, ; расположенный в памяти, для передачи их по ; прерыванию в передатчик.
Зак ЗК4
674
Глава 12
0000	SAVE	PROC	NEAR USES BX DI SI
0003 26: 8В	36 8004 R	MOV	SI,OIN ; получить указатель входа в буфер
0008 26: 8В	IE 8006 R	MOV	BX,OOUT ; получить указатель выхода
GOOD 8В ГЕ		MOV	DI,SI
000F 46		INC	SI
0010 81 ГЕ 8004 R		CMP	SI,OFFSET OFIFO+16*1024
0014 76 03		JBE	NEXT
0016 BE 4004	R	MOV	SI,OFFSET OFIFO
0019	NEXT:		
0019 ЗВ DE		CMP	BX,SI
001В 74 06		JE	DONE	; переход, если буфер полон
001D АА		STOSB	; сохранить данные в буфере
001Е 26: 89	36 8004 R	MOV	OIN,SI
0023	DONE:		
0023 Е4 41		IN	AL,41H ; читать регистр IER
0025 06 01		OR	AL,1	; разрешить прерывание после
0027 Е6 41		OUT	41H,AL ; завершения передачи
		RET	
002D	SAVE	ENDP	
В примере 12.13 приведена стандартная подпрограмма по обслуживанию прерываний для передатчика UART 16550. Эта процедура является продолжением программы обработки прерываний, представленной в примере 12.9, и аналогична процедуре recv из примера 12.11, за исключением того, что она определяет опустошение буфера FIFO, а не его заполнение.
Пример 12.13. Процедура обслуживания прерывания от передатчика
; Обработчик прерывания для передатчика UART 16550
0060	TRANS:
0060 53	PUSH BX	; сохранить в стеке
0061 57	PUSH DI	; содержимое регистров ВХ и DI
0062 26: 8В	1Е 8004 R MOV BX,OIN	; получить указатель входа
0068 26: 8В	ЗЕ 8006 R MOV DI,OOUT	; получить указатель выхода
006D ЗВ DF	CMP BX,DI
006F 74 17	JE	EMPTY	; переход, если буфер пуст
0071 26: 8А	05	MOV AL,ES:[DI] ; получить символ из буфера
0074 Е6 40	OUT	4ОН,AL	; передать его в UART 16550
0076 47	INC DI
0077 81 FF 8004 R	CMP DI,OFFSET OFIFO+16*1024	
007В 76 03	JBE NEXT1
007D BF 4004	R	MOV DI,OFFSET OFIFO
0080	NEXT1:
0080 26: 89	3E 8006 R MOV OOUT,DI
0085 ЕВ 07 90	JMP DONES	
0088	EMPTY:
0088 Е4 41	IN	AL,41H	; читать регистр IER
008А 24 FD	AND AL,0FDH	; запретить прерывания после
008С Е6 41	OUT 41H,AL	; завершения передачи
Прерывания
675
008Е			DONES:		
008Е	ВО	20	MOV	AL,20H	; послать контроллеру 8259A
0090	Е6	49	OUT	49H,AL	; команду EOI
0092	5F		POP	DI	; восстановить содержимое
0093	5В		POP	BX	; регистров DI, ВХ и АХ,
0094	58		POP	AX	; сохраненных в стеке
0095	СЕ		IRET		
Кроме того, UART 16550 имеет оперативный рабочий регистр, предназначенный для временного хранения данных, который программист может использовать по своему усмотрению. Помимо этого, UART 16550 имеет регистр управления модемом и регистр состояния модема. Эти регистры позволяют модему вызывать прерывание и управляют работой микросхемы UART 16550 с модемом. Формат регистра управления модемом и регистра состояния модема приведены на рис. 12.24.
Регистр управления модемом использует биты 0—3 для управления различными сигналами на выводах UART 16550. Бит 4 позволяет выбрать режим диагностики, в котором в микросхеме организуется внутренняя "заглушка" (loopback) для тестирования внутреннего канала данных и проверки отработки прерываний. Регистр состояния модема позволяет проверять состояния сигналов, поступающих от модема, а также контролировать принятие модемом сигнала вызова (звонка).
Регистр управления модемом
Управление сигналом на выводе DTR 0=пассивен (высокий уровень) 1 ^активен (низкий уровень)
Управление сигналом на выводе RTS О=пассивен (высокий уровень) 1 =активен (низкий уровень)
Управление сигналом на выводе OUT1 0=пассивен (высокий уровень) 1 =активен (низкий уровень)
Управление сигналом на выводе OUT2 0=пассивен (высокий уровень) 1=активен (низкий уровень)
Управление режимом диагностики 0=нормальный режим
1 =выбор режима диагностики
а)
Рис. 12.24. Регистр управления модемом и регистр состояния модема UART 16550 (см. продолжение)
676
Глава 12
Регистр состояния модема
Рис. 12.24. Окончание
Изменение состояния сигнала CTS 0=нет изменения
1 =CTS изменился
Изменение состояния сигнала DSR 0=нет изменения 1=DSR изменился
Задний фронт сигнала RI (окончание звонка) 0=нет изменения
1 =есть фронт
Изменение состояния сигнала DCD 0=нет изменения
1=DCD изменился
Состояния сигнала CTS О=пассивен (высокий уровень) 1=активен (низкий уровень)
Состояния сигнала DSR О=пассивен (высокий уровень) 1=активен (низкий уровень)
Состояния сигнала RI
О=пассивен (высокий уровень) 1=активен (низкий уровень)
Состояния сигнала DCD О=пассивен (высокий уровень) 1=активен (низкий уровень)
На рис. 12.25 показано сопряжение UART 16550 с интерфейсом RS-232C, который часто используется для управления модемом. В этот интерфейс входят буферные микросхемы передатчиков I488, предназначенные для осуществления преобразования ТТЛ-уровней сигналов UART 16550 в уровни сигналов интерфейса RS-232C, и схемы приемников 1489 для осуществления обратного преобразования.
Следует отметить, что уровни сигналов для интерфейса RS-232C обычно составляют: напряжение от +3 до +12 В для логического 0 и напряжение от -3 до -12 В для логической 1. Между уровнями -3 В до +3 В существует зона нечувствительности (неопределенности), обусловливающая гистерезис приемника, т. е. состояние линии будет считаться измененным только после достижения входным сигналом интерфейса RS-232C соответствующего порога (напряжения +3 В или —3 В).
Прерывания
677
Рис. 12.25. Схема подключения микросхемы UART 16550 к разъему интерфейса RS-232C с использованием передатчиков 1488 и приемников 1489
Для передачи или приема данных с помощью модема активизируется сигнал на выводе DTR (data terminal ready) (становится низкого логического уровня) и микросхема UART 16550 ожидает пока не будет получен ответный сигнал DSR (data set ready) низкого логического уровня от модема, поступающий на одноименный вывод и обозначающий готовность модема. По завершению такого обмена сигналами (квитирования) UART 16550 посылает модему сигнал запроса на передачу, устанавливая низкий логический уровень на соответствующем выводе RTS (request to send). Модем, если он готов, отсылает обратно на микросхему UART 16550 сигнал низкого логического уровня CTS (clear to send), указывающий на готовность модема к приему данных для последующей их передачи. Теперь процесс передачи информации может начаться. Сигнал DCD (data carrier detected), поступающий от модема, указывает на то, что модем обнаружил в линии несущую частоту. Этот сигнал также должен быть проверен до начала связи с применением модема.
12.5. Примеры прерываний
В качестве примеров практического использования прерываний в этом разделе текста представлены часы реального времени и обработка прерываний клавиатуры. Ул-сы реального времени (real-time clock) поддерживают реальный масштаб времени, т. е. обеспечивают систему значениями текущего времени. Время, приведенное в примере и выраженное в часах, минутах, секундах и 1/60 долях секунд, сохраняется в дво
678
Глава 12
ично-десятичном виде в четырех ячейках памяти. Обработчик прерываний клавиатуры использует периодические прерывания для сканирования клавиш клавиатуры.
Часы реального времени
На рис. 12.26 показана типовая схема, использующая линию питания переменного тока частотой 60 Гц, для периодического формирования сигнала запроса на немаскируемое прерывание NML
Напряжение 120 В переменного тока
Рис. 12.26. Преобразование сигнала линии питания переменного тока в сигнал NMI ТТЛ-уровня
Несмотря на то, что в схеме используется линия питания переменного тока, частота которого иногда незначительно изменяется, но за довольно длительный промежуток времени она является достаточно точной.
Поскольку на вход схемы подается напряжение переменного тока, то в ней, для формирования сигнала запроса на немаскируемое прерывание NMI, применяется инвертор с триггером Шмитта.
Обратите внимание на то, что, согласно схеме "земля", линии питания соединяются с системной "землей". Обычно вывод "земля" (нейтральный провод) выполняется проводом большей толщины, чем две другие линии питания (фазы и нуля).
Программное обеспечение для часов реального времени содержит процедуру обслуживания прерываний, которая вызывается 60 раз в секунду, и процедуру обновления результата отсчета времени, размещаемого в четырех ячейках памяти.
В примере 12.14 приводятся обе названные процедуры вместе с четырьмя зарезервированными байтами в памяти, используемыми для сохранения текущего времени в двоично-десятичном формате.
Пример 12.14. Программа обработчик прерывания для часов реального времени
		.MODEL TINY			
0000		.CODE			
		.STARTUP			
0100	ЕВ 04	JMP	TIMES		
0102	00	TIME DB	7	; счетчик	1/60 секунды
0103	00	DB	7	; счетчик	секунд
0104	00	DB	7	; счетчик	минут
0105	00	DB	7	; счетчик	часов
Прерывания
679
; Обработчик немаскируемого прерывания
0106	TIMES PROC	FAR
0106 50	PUSH	AX	; сохранить содержимое
0107	56	PUSH	SI	; регистров AX и SI в стеке
0108 В4 60	MOV	АН,60Н	; загрузить коэффициент счета 60
010А BE 0102	R	MOV	SI,OFFSET TIME ; загрузить адрес счетчика
010D Е8 0014	CALL	UP	; увеличить счетчик 1/60 сек
ОНО 75 0F	JNZ	DONE
0112 Е8 000F	CALL	UP	; увеличить счетчик секунд
0115 75 0А	JNZ	DONE	,
0117 Е8 000А	CALL	UP	; увеличить счетчик минут
ОНА 75 05	JNZ	DONE
0HC В4 24	MOV	АН,24Н	; загрузить коэффициент счета 24
011Е Е8 0003	CALL	UP	; увеличить счетчик минут
0121	DONE:	
0121 5Е	POP	SI	; перезагрузить содержимое
0122 58	POP	АХ	; регистров, сохраненных в стеке
0123 CF	IRET	
0124	TIMES ENDP	
0124	UP	PROC	NEAR
0124 2Е: 8А 04	MOV		AL,CS:[SI]	; получить содержимое счетчика
0127 46	INC	SI	; следующий адрес счетчика
0128 04 01	ADD	AL,1	; увеличить содержимое счетчика
012А 27	DAA	; преобразовать результат в BCD
012В 2Е: 88 44 FF MOV		CS:[SI-1],AL ; сохранить содержимое счетчика
012F 2А С4	SUB	AL,AH	; проверить коэффициент пересчета
0131 75 04	JNZ	UP1
0133 2Е: 88 44 FF MOV		CS:[SI-1],AL ; сбросить счетчик
0137	UP1:	
0137 СЗ	RET	
0138	UP	ENDP	
	END	
Обработка прерываний клавиатуры
Обработка прерываний клавиатуры заключается в сканировании клавиш клавиатуры посредством периодического прерывания. Процедура обслуживания этого прерывания каждый раз определяет нажатую клавишу и устраняет дребезг контактов. По обнаружению достоверной клавиши подпрограмма заносит код клавиши в буфер клавиатуры для дальнейшего считывания системой. В основе этого процесса лежит периодическое прерывание, которое может осуществляться таймером или другим устройством в системе.
680
Глава 12
Следует отметить, что большинство систем уже имеют периодически выполняемые прерывания для часов реального времени. В данном примере предполагается, что прерывание вызывает процедуру обслуживания прерывания каждые Ю мс.
На рис. 12.27 показана схема подключения клавиатуры к микросхеме ППИ 82С55. На рисунке не приведены таймер или другая схема, необходимые для запроса на прерывание каждые Ю мс. Программирование микросхемы ППИ 82С55, в приведенном программном обеспечении, также не отображено.
82С55
Рис. 12.27. Схема подключения телефонной клавишной панели к микросхеме ППИ 82С55
Микросхема ППИ 82С55 должна быть запрограммирована таким образом, чтобы порт А был портом ввода, порт В был портом вывода, и программа инициализации должна записать ООН в порт В. Эта схема использует память, расположенную в сегменте кода, для буфера клавиатуры и нескольких байтов, которые отслеживают процесс сканирования клавиатуры. В примере 12.15 приведена процедура обслуживания прерывания для клавиатуры.
Прерывания
и Пример 12.15. Обработчик прерывания для клавиатуры
; Процедура обработки прерывания для клавиатуры, ; показанной на схеме рис. 12.27.
	.MODEL TINY .386 .CODE					
						
0000						
= 1000		PORTA	EQU	1000Н	определить адрес порта	А
= 1001 0100 0102 BA 0105 EC 0106 ОС	1000 F0	PORTB EQU 1001H .STARTUP INTKEY PROC FAR USES AX DX ; MOV DX,PORTA IN AL,DX OR AL,0F0H .IF AL != 0FFH			определить адрес порта В * прерывание клавиатуры проверить нажатие клавиши если клавиша найдена, то	
010C FE 0117 C6 0123 53 0124 C6 0129 BB 012C BA 012F 8A 0131 EE 0132 DO 0134 BA 0137 EC 0138 0C 013E 80 0143 8A 0145 BA 0148 B0 014A EF 014B FE 014D DO 014F FE	06 0192 06 0192 06 0193 00FB 1001 C3 CB 1000 F0 C7 04 D8 1001 00 CF EB C7	R R 02 R 01	INC DBCNT	; увеличить счетчик дребезга .IF DBCNT==3	; если > 20 мс MOV DBCNT,2 .IF DBF==0 PUSH BX MOV DBF, 1 MOV BX,0FBH .WHILE 1	; найти клавишу MOV DX,PORTB MOV AL, BL OUT DX,AL ROR BL,1 MOV DX,PORTA IN AL,DX OR AL,0F0H .BREAK .IF AL != 0FFH ADD BH,4 .ENDW MOV BL,AL MOV DX,PORTB MOV AL,0	; очистить сигналы OUT DX,AX ; на выводах порта В DEC ВН .REPEAT	; найти код клавиши SHR BL,1 INC ВН			
.UNTIL !CARRY?
0153 8А	С7	MOV AL,BH
0155 8В	1Е 0194	R	MOV BX,PNTR
0159 2Е:	: 88 07	MOV CS:[BX],AL ; поместить код в буфер
015С FF	06 0194	R	INC PNTR
.IF ВХ == OFFSET DBCNT-1
682
Глава 12
0166 С7 06 0194 R 0182 R	MOV PNTR, OFFSET QUEUE
.ENDIF
016C 5 В	POP BX
.ENDIF
.ENDIF
.ELSE	; клавиша не найдена
016F FE 0Е	0192 R	DEC DBCNT .IF SIGN?	; уменьшить счетчик дребезга
0175 С6 06	0192 R 00	MOV DBCNT,0	; очистить счетчик и флаг
017А С6 06	0193 R 00	MOV DBF,0	
.ENDIF
.ENDIF
I RET
0182	INTKEY ENDP
0182 0010 [		QUEUE DB 16 DUP(?)	; буфер клавиатуры
	00 1		
0192	J 00	DBCNT DB 0	; счетчик дребезга
0193	00	DBF DB 0	; флаг дребезга
0194	0182 R	PNTR DW QUEUE END	; указатель на буфер
Обработчик прерывания клавиатуры находит нажатую клавишу и запоминает код клавиши в буфере клавиатуры. В этом буфере хранится необработанный код без обозначения номера клавиши. Например, код 1-й клавиши — ООН, а код 4-й клавиши — 01Н и т. д. Данная программа не отслеживает возможного переполнения буфера. Ее можно дополнить, но в большинстве случаев достаточно трудно осуществить работу с 16-байтным буфером.
В примере 12.16 приводится процедура извлечения данных из буфера клавиатуры и определения номера нажатой клавиши. Эта процедура не управляется прерыванием и вызывается только в том случае, когда программе потребуется информация от клавиатуры.
Пример 12.16. Процедура извлечения данных из буфера клавиатуры и определения номера нажатой клавиши
0198 01 04 019С 02 05 01А0 03 06	07 0А 08 00 09 0В	LOOK	DB 1,4,7,10 DB 2,5,8,0 DB 3,6,9,11	; таблица номеров ; клавиш клавиатуры
01А4 01А5 8В 1Е 01AF F9	0196 R	KEY	PROC NEAR USES BX MOV BX,OPNTR .IF BX == PNTR STC .ELSE	; буфер пуст
01В2 2Е: 8А 07 01В5 43			MOV AL,CS:[BX] INC BX .IF BX == OFFSET	; получить код клавиши DBCNT-1
Прерывания
683
01ВС вв 0182 R	MOV ВХ,OFFSET QUEUE .ENDIF
01BF 89 1Е 0196 R	MOV OPNTR,BX
01СЗ ВВ 0198 R	MOV BX,OFFSET LOOK
01С6 2Е: D7	XLAT CS:LOOK	; данные из таблицы в AL
01С8 F8	CLC
	.ENDIF
	RET
01СВ	KEY ENDP
В примере 12.17 приведена программа для вызова процедуры извлечения данных из буфера клавиатуры и определения номера нажатой клавиши.
[ Пример 12.17. Программа вызова процедуры извлечения данных из буфера клавиатуры Г и определения номера нажатой клавиши
01СВ Е8 FFD6
.REPEAT
CALL KEY
.UNTIL !CARRY?
Итоги
□	Прерывание — это процесс, инициируемый аппаратным или программным обеспечением, в результате которого прерывается выполнение текущей программы и осуществляется переход к процедуре обработки данного прерывания.
□	Прерывания полезны только в том случае, когда требуется обслуживать устройства ввода-вывода, работающие на низких скоростях.
□	Микропроцессор имеет пять команд, связанных с прерываниями: bound, int, int з, into и iret. Команды int и int з обращаются к процедурам с адресами, находящимся в векторе прерываний, номер которого указывается в команде. Команда bound вызывает прерывание с вектором 5, вызываемое в зависимости от выполнения условия. Команда into вызывает прерывание с номером 4 при условии установленного флага переполнения. Наконец, команда iret используется для возврата из процедур обслуживания прерываний.
□	Микропроцессор имеет три вывода: INTR, NM1 и INTA, использующиеся аппаратным обеспечением для процесса прерывания. Вводы прерываний 1NTR и NMI используются для запроса, соответственно, маскируемого и немаскируемого прерываний, а выход INTA применяется для подтверждения запроса на маскируемое прерывание.
□	Прерывания в реальном режиме работы обращаются к таблице векторов, которая занимает ячейки памяти ОООООН—003FFH. Каждый вектор прерываний состоит из четырех байтов и содержит сегмент и смещение процедуры обслуживания прерывания. В защищенном режиме работы прерывания обращаются к таблице дескрипторов прерываний IDT (interrupt descriptor table), которая содержит 256 дескрипторов прерываний. Каждая отдельная запись в таблице дескрипторов
684
Глава 12
прерываний содержит адрес процедуры обслуживания прерываний, в виде селектора сегмента и 32-разрядного смещения.
□	В структуре прерывания микропроцессора имеется два флага: флаг трассировки TF (trap flag) и флаг разрешения прерывания IF (internipt flag). Флаг IF разрешает маскируемые аппаратные прерывания, вызываемые сигналами, поступающими на вывод микропроцессора INTR, а установленный флаг TF вызывает прерывание после выполнения каждой команды программы и предназначается для се отладки.
□	Корпорация Intel зарезервировала первые 32 вектора прерываний для использования различными микропроцессорами семейства. Последние 224 вектора прерываний являются пользовательскими и могут выполнять любую необходимую функцию.
□	В случае реализации прерывания выполняются следующие действия: I) флаги проталкиваются в стек; 2) сбрасываются флаги IF и TF; 3) содержимое регистров IP и CS проталкиваются в стек; 4) вектор прерывания выбирается из таблицы векторов прерывания и с его помощью осуществляется переход на подпрограмму обслуживания прерывания.
□	Трассировка или пошаговое выполнение программы осуществляется при установке флага TF. Таким образом вызываемое прерывание предназначается для отладки программы после выполнения каждой команды.
□	При активизации сигнала, подаваемого на вывод микропроцессора NMI, независимо от состояния флага разрешения прерывания IF происходит прерывание по вектору 2 (tnt 2н). Идентификация источника прерывания осуществляется программно. Вывод NMI активизируется по положительному фронту сигнала.
□	При активизации сигнала, подаваемого на вывод микропроцессора INTR, процессор формирует шинный цикл подтверждения прерывания INTA, в котором он в течение двух импульсов INTA по шине данных DO—D7 получает вектор прерывания.
□	Способы формирования номера вектора прерываний, выставляемого на шину данных во время импульсов INTA, сильно отличаются друг от друга. В одном случае используются резисторы, формирующие вектор FFH, тогда как в другом для формирования любого номера вектора используется буфер с тремя состояниями.
□	Программируемый контроллер прерываний 8259А (PIC — programmable interrupt controller) добавляет для микропроцессора минимум восемь входов, предназначенных для запросов на прерывание. Если же требуется большее количество запросов, то контроллер можно каскадировать, чтобы в результате обеспечить до 64 входов запроса на прерывание.
□	Программирование контроллера 8259А — это двухэтапный процесс. Вначале в контроллер 8259А посылается серия командных слов инициализации (1CW), а затем — серия командных слов операций (OCW).
□	Контроллер прерываний 8259А содержит три регистра состояния: регистр масок прерываний IMR (interrupt mask register), регистр обслуживания прерывания ISR (in-service register) и регистр запроса на прерывание IRR (interrupt request register).
I Прерывания 685
О Часы реального времени используются для сохранения времени в реальном масштабе. Во многих случаях время хранится в двоичном или в двоично-десятичном виде в нескольких ячейках памяти.
Контрольные вопросы и задания
1.	Что прерывается прерыванием?
2.	Дайте определение термину прерывание.
3.	Что вызывается с помощью прерывания?
4.	Почему прерывания высвобождают время для микропроцессора? *
5.	Перечислите выводы микропроцессора, относящиеся к процессу прерываний.
6.	Перечислите пять команд микропроцессора, относящиеся к процессу прерываний.
7.	Что представляет собой вектор прерывания?
8.	Где в памяти микропроцессора располагаются векторы прерываний?
9.	Сколько различных векторов прерываний имеется в таблице векторов прерываний?
10.	Какие векторы прерываний зарезервированы корпорацией Intel?
11.	Объясните, каким образом происходит прерывание по вектору 0.
12.	Где находится таблица дескрипторов прерываний IDT для защищенного режима работы микропроцессора?
13.	Какую информацию содержит каждый дескриптор прерывания для защищенного режима работы микропроцессора?
14.	Опишите разницу между прерываниями, выполняемыми в защищенном и реальном режимах работы микропроцессора.
15.	Опишите действие команды bound.
16.	Опишите действие команды into.	*
17.	Какой адрес имеют ячейки памяти, содержащие вектор для команды INT 44Н?
18.	Объясните действие команды iret.
19.	Какое назначение имеет вектор прерывания с номером 7?
20.	Перечислите выполняемые действия при осуществлении процесса прерывания.
21.	Объясните назначение флага разрешения прерывания IF.
22.	Объясните назначение флага трассировки TF.
23.	Каким образом выполняется сброс и установка флага IF?
24.	Каким образом выполняется сброс и установка флага TF?
25.	По какому вектору происходит немаскируемое прерывание NMI?
26.	Активизируется ли сигнал INTA при немаскируемом прерывании NMI?
27.	Вывод INTR является чувствительным к входного сигнала.
28.	Вывод NM1 является чувствительным к входного сигнала.
29.	Активизация сигнала INTA, т. е. переход его на низкий логический уровень указывает, что микропроцессор находится в ожидании, который должен быть помешен на шину данных DO—D7.
30.	Что представляет собой буфер FIFO9
31.	Разработайте схему для выдачи вектора 86Н на шину данных в ответ на входной сигнал INTA.
686
Глава 12
32.	Разработайте схему для выдачи вектора ССН на шину данных в ответ на входной сигнал
INTA.
33.	Объясните, почему и как с помощью нагрузочных резисторов в ответ на импульс INTA можно осуществить выдачу на шину данных DO—D7 вектора FFH.
34.	Что представляет собой система прерываний с последовательным опросом?
35.	Почему устройства, запрашивающие прерывание, должны опрашиваться в системе прерываний с последовательным опросом?
36.	Что это за устройство 8 259А?
37.	Сколько потребуется микросхем 8259А для получения 64 запросов на прерывание?
38.	Для чего предназначены выводы IRO—IR7 микросхемы 8259А?
39.	В каком случае используются выводы CAS2—CASO микросхемы 8259А?
40.	К какому выводу ведущего устройства 8259А подключается вывод INT ведомого при каскадном варианте их соединения?
41.	Что означает ICW?
42.	Что означает OCW?
43.	Сколько требуется ICW для программирования устройства 8259А при работе его в системе в качестве ведущего?
44.	Где в устройстве 8259А хранится вектор?
45.	Каким образом в устройстве 8259А программируется чувствительность выводов IR?
46.	Какое назначение ICW1?
47.	Что представляет собой неспецифическое завершение прерывания EOI (end of interrupt)?
48.	Объясните принцип циклического сдвига приоритета в устройстве 8259А.
49.	Какое назначение IRR в устройстве 8259А?
50.	Какие порты ввода-вывода в персональном компьютере использует ведущее устройство 8259А?
51.	Какие порты ввода-вывода в персональном компьютере использует ведомое устройство 8259А?
ГЛАВА 1 3
Прямой доступ к памяти
Введение
В предыдущих главах была рассмотрена базовая система ввода-выврда и ввод-вывод с использованием прерываний. В настоящей главе представлена последняя разновидность системы ввода-вывода с использованием прямого доступа к памяти (ПДП) или, иначе, по-английски DMA (direct memory access). Метод ввода-вывода с использованием DMA обеспечивает устройствам прямой доступ к памяти без участия микропроцессора, т. е. в течение временного отключения микропроцессора от процесса обмена. Это позволяет осуществлять передачу данных между памятью и устройством ввода-вывода со скоростью, которая ограничивается только элементами памяти в системе или контроллером DMA. Скорость передачи при использовании DMA может достигать 32—40 Мбайт/с.
Передачи DMA используются для многих целей, но наиболее часто для регенерирования динамической памяти, обновления информации на экране видеодисплея и в системах внешней памяти на дисках. Кроме того, DMA-передачи используются для организации высокоскоростных передач типа "память-память".
В этой главе также объясняется работа дисковых накопителей и видеосистем, которые зачастую используют DMA для обмена данными. К запоминающим устройствам на дисках относятся накопители на гибких, жестких и оптических дисках, а к видеосистемам относятся цифровые и аналоговые мониторы.
Назначение главы
После завершения ознакомления с этой главой вы сможете:
□	описать принцип обмена данными с использованием DMA;
□	объяснить действие управляющих сигналов HOLD и HLDA, используемых для прямого доступа к памяти;
□	объяснить назначение контроллера DMA 8237 при обмене данными;
□	программировать контроллер DMA 8237 для выполнения обмена;
□	описать стандарты дисков, используемых в персональных компьютерах;
□	описать различные стандарты видеоинтерфейса персонального компьютера.
688
Глава 13
13.1. Основы процесса прямого доступа к памяти
Для запроса и подтверждения процесса прямого доступа к памяти (DMA) в системе на базе микропроцессора используются два управляющих сигнала. Сигнал HOLD (hold) — это входной сигнал для микропроцессора на одноименном его выводе, используемый для запроса системной шины со стороны устройства для выполнения им процесса прямого доступа к памяти, а сигнал HLDA (hold acknowledge) является выходным сигналом микропроцессора, подтверждающим предоставление системной шины для выполнения процесса DMA. На рис. 13.1 показана типичная временная диаграмма для этих двух управляющих сигналов микропроцессора для процесса DMA.
Рис. 13.1. Временная диаграмма для управляющих сигналов микропроцессора HOLD и HLDA для процесса DMA
Запрос на захват шины для выполнения операций DMA происходит при размещении на выводе HOLD микропроцессора сигнала высокого логического уровня. Микропроцессор (в течение нескольких тактовых импульсов) временно приостанавливает выполнение программы и освобождает шину адреса, данных и управления, переводя свои соответствующие выводы в состояние высокого импеданса. Микропроцессор в таком состоянии представляется таким, как будто бы он отсоединен от сокета (socket), в который он установлен. Это позволяет внешним устройствам ввода-вывода или другим микропроцессорам получить доступ к системной шине, для осуществления прямого доступа к памяти.
Временная диаграмма показывает, что сигнал HOLD формируется в середине периода тактового сигнала. Поэтому приостановка происходит в любое время действия любой команды из набора команд микропроцессора. Микропроцессор прекращает выполнение программы, как только он распознает сигнал HOLD, и затем переходит к освобождению шины.
Следует отметить, что сигнал HOLD имеет более высокий приоритет, чем сигналы запроса на прерывание INTR и NMI. Прерывания выполняются после завершения команды, тогда как сигнал HOLD оказывает действие в процессе выполнения команды. Единственный сигнал, имеющий приоритет выше приоритета сигнала HOLD, — это сигнал сброса RESET. Кроме того, обратите внимание на то, что сш-нал HOLD не может быть активирован во время действия сигнала RESET, иначе выполнение сброса не гарантируется.
Прямой доступ к памяти
689
Установка сигнала HLDA указывает на то, что микропроцессор отключился от системной шины. Обратите внимание, что за время от установки сигнала HOLD до установки сигнала HLDA происходят в течение нескольких периодов тактовых импульсов.
Установка сигнала HLDA является для внешнего устройства, запрашивающего шину, признаком того, что микропроцессор уступил управление памятью и пространством ввода-вывода. Таким образом, сигнал HOLD можно назвать сигналом запроса DMA, а сигнал HLDA — сигналом предоставления DMA.
Основные операции
Обмен данными без использования микропроцессора с помощью прямого доступа к памяти обычно осуществляется между устройством ввода-вывода и памятью. При выполнении процедуры DMA по команде чтения осуществляется операция передачи данных из памяти в устройство ввода-вывода, а по команде записи осуществляется обратная операция передачи данных, т. е. из устройства ввода-вывода в память. В обеих операциях управление памятью и устройством ввода-вывода осуществляется одновременно, и поэтому для них в системе имеются отдельные сигналы управления для чтения и записи. Такая специальная структура сигналов шины управления позволяет осуществлять обмен информацией с помощью прямого доступа к памяти. При выполнении процедуры DMA и операции чтения для передачи данных из памяти в устройство ввода-вывода одновременно активизируются сигналы MEMR (MRDC) и IOW (IOWC), а при операции записи активизируются сигналы MEMW (MWTC) и IOR (IORC). Такие сигналы шины управления имеются во всех системах на микропроцессорах семейства Intel. В частности, для микропроцессоров 8086/8088 необходимо сформировать эти сигналы или с помощью контроллера шины, или с помощью схемы, приведенной на рис. 13.2. При обмене с помощью прямого доступа к памяти контроллер DMA для обращения к памяти формирует адрес, а установив сигнал DACK (DMA acknowledge), выбирает устройство ввода-вывода.
Рис. 13.2. Схема, формирующая системные управляющие сигналы для обмена с использованием DMA
690
Глава 13
Скорость передачи данных определяется скоростью работы памяти или контроллера DMA, который часто управляет передачами DMA. В том случае когда быстродействие памяти составляет 100 нс, то обмен информацией с помощью DMA может происходить с частотой 1/100 нс или Ю МГц. Если же при работе контроллера DMA на максимальной частоте 5 МГц используется память с быстродействием 100 нс, то максимальная частота передачи данных составит 5 МГц, т. к. контроллер DMA работает медленнее, чем память. Во многих случаях контроллер DMA замедляет скорость системы во время обмена с помощью DMA.
13.2. Контроллер DMA 8237
Контроллер DMA 8237 во время обмена информацией с помощью DMA снабжает память и устройство ввода-вывода управляющими сигналами и адресом для обращения к памяти. Контроллер DMA обеспечивает формирование только 16 младших разрядов адреса памяти. Причем старшая часть адреса во время цикла DMA по шине данных поступает для дальнейшего хранения в отдельную защелку. Восемь разрядов младшей части 16-разрядного адреса выдаются контроллером непосредственно на шину адреса. Старшая же часть адреса памяти, дополняющая 16-разрядный адрес, сформированный контроллером 8237, при выполнении процедуры DMA хранится в специальном, находящемся в системе регистре страниц DMA. Контроллер DMA 8237 фактически является специализированным микропроцессором, задачей которого является высокоскоростная передача данных между памятью и устройством ввода-вывода. На рис. 13.3 представлены схема расположения выводов и блок-схема программируемого контроллера DMA 8237.
Несмотря на то, что в современных системах на базе микропроцессоров этого контроллера в качестве дискретного компонента может и не быть, в большинстве компьютерных систем он имеется в микропроцессорном наборе микросхем, который иначе называют чипсетом (chip set). В одну из микросхем чипсета, например, в интегральный системный периферийный контроллер 82357 ISP (ISP — Integrated System Peripheral Controller), не описанный здесь ввиду его сложности, входят два интегрированных контроллера DMA, которые программируются точно так же, как и отдельный контроллер DMA 8237. Кроме того, в состав интегрального системного периферийного контроллера входят два программируемых контроллера прерываний 8259А, поэтому-то изучение подобных дискретных компонентов актуально и в настоящее время, когда применяются чипсеты, а не дискретные микросхемы.
Контроллер DMA 8237 имеет четыре независимых DMA канала, которые совместимы с микропроцессорами 8086/8088. Хотя для многих небольших систем этих четырех каналов и достаточно, систему можно расширить с помощью каскадирования контроллеров 8237 до любого необходимого количества входных каналов. Контроллер DMA 8237 способен осуществлять обмен данными со скоростью 1,6 Мбайт/с. При однократном программировании каждый канал способен адресоваться к 64К памяти и может передать блок данных размером до 64 Кбайт.
RESET-
READY
Декреыентор
Вреыеншй регистр смета слое (16)
Шине 16 бит
Шина 16 бит
Инкремеитор/дехрементор
Временный регистр адресе (16)
1
IOR 1OW MLMR
READY I 6 HLDA [ 7
ADSTB[8
AEN [ 0 HRQ
CS CLK RESET DACK2 DACK3 DREQ3 DREQ2 DREQ1 DREQO (GND)Vu
40 1А7
за ]А5 37 JA4 38 :еор
35 ЗАЗ
w В237А 31
33 ] А1
32 )А0 JVcc(*5B) )D80 ]D81 ]D82 ]D83 ]D84 ]DACK0 ]DACK1 )DB5 JDB6 JDB7
должен быть подан высокий логический доеень
а)
Буфер чтения
Буфер чтения/залиси
CLOCK-
AEN
Регистр
управления
ADSTB
(4 х 16 бит)
(4 х 16 бит)
Регистр 31 КУКИ мл
Регистр базового адреса (4 х 16 бит)
Регистр текущего адреса (4 х 16 бит)
Блок оеофонизвции
Буфер записи
DREQ0- 4
HLDA-
HRQ
DACK3
Буфер чтения
Кодировщик приоритетов
циклического присвоения приоритете
т
Регистр управления (8)
Регистр масок (4)
Регистр запросов(4)
D0-O1
Внутренняя шина данных
Регистры
(4x6 бит)
б)
Регистр
Регистр временного храненье) (8)
Выходной буфер
Прямой доступ к памяти
Блок гомвцдного управления
у
D80-D87
Рис. 13.3. Программируемый контроллер DMA 8237А-5: а) схема расположения выводов микросхемы и 6) блок-схема контроллера
692
Глава 13
Назначение выводов и сигналов
□	CLK
На вывод CLK (clock) подается тактирующий сигнал с частотой не более 5 МГц1. Скважность тактирующего сигнала должна быть равна 2. В системе на микропроцессоре 8086/8088 для правильной работы контроллера 8237 при использовании системного тактирующего сигнала он должен быть усилен с помощью инвертора.
□	CS
Сигнал, подаваемый на вывод CS (chip select), разрешает программирование контроллера 8237. Вывод CS обычно соединяется с выходом дешифратора. Декодер не использует управляющие сигналы Ю/М (M/IO) микропроцессоров 8086/8088, т. к. в системе используются иные сигналы для управления памятью и устройствами ввода-вывода (MEMR , MEMW , IOR и IOW ).
□	RESET
Сигнал, поступающий на этот вывод, переводит контроллер 8237 в исходное состояние, т. е. сбрасывает регистры управления, состояния, запроса и временного хранения, а также устанавливает регистр масок.
□	READY
Активный сигнал на этом выводе указывает на готовность устройства. Сигнал низкого логического уровня на этом выводе переводит контроллер 8237 в состояния ожидания. Сигнал используется, если быстродействие памяти недостаточно для совместной работы с внешним устройством ввода-вы вода, и тогда с его помощью удлиняются циклы обращения к памяти.
□	HLDA
Установка сигнала на выводе HLDA (hold acknowledge) сигнализирует устройству о том, что микропроцессор освободил шину адреса, данных и управления для устройства запросившего прямого доступа к памяти.
□	DREQ3-DREQ0
Выводы DREQ3—DREQO2 (DMA request) используются для запроса передач с использованием прямого доступа к памяти для каждого из четырех каналов DMA. Поскольку чувствительность этих вводов к полярности входных сигналов программируется, то они могут быть выводами, возбуждаемыми сигналами высокого или низкого уровня.
□	DB7-DB0
Выводы DB7—DBO (data bus) подключаются к линиям шины данных микропроцессора и используются во время программирования контроллера DMA 8237.
1 Контроллер 8237А работает на частоте 3 МГц, а его модификации 8237А-4 и 8237А-5 на частотах 4 и 5 МГц соответственно. — Ред.
2 Часто эти выводы и соответствующие им сигналы контроллера DMA называют как DRQ (DMA request). — Ред.
Прямой доступ к памяти 693
О IOR
Двунаправленный вывод IOR (I/O read) используется во время программирования контроллера 8237 и в течение выполнения операции записи при использовании процедуры DMA.
о IOW
Двунаправленный вывод IOW (I/O write) используется во время программирования контроллера 8237 и в течение выполнения операции чтения при использовании процедуры DMA.
О ЕОР
Двунаправленный вывод завершения процесса прямого доступа к памяти ЕОР (end-of-process). Сигнал на этом выводе активизируется контроллером при достижении нуля счетчиком передаваемых байт для соответствующего канала. Кроме того, контроллер 8237 позволяет прекратить процесс DMA извне. В этом случае на вывод ЕОР должен быть передан сигнал низкого логического уровня. При появлении внутреннего или внешнего сигнала ЕОР контроллер прекращает процедуру прямого доступа к памяти и сбрасывает запрос DMA.
□	АЗ-АО
Выводы шины адреса АЗ—АО (address). В режиме программирования комбинациями сигналов, поступающих на эти выводы, выбирается один из внутренних регистров контроллера. В режиме обслуживания процесса DMA на эти выводы контроллером выставляется часть адреса.
□	А7-А4
Адресные выводы А7—А4 (address) являются выходами, с помощью которых контроллер осуществляет формирование части адреса в режиме обслуживания процесса DMA.
□	HRQ
Вывод HRQ (hold request) подключают к выводу HOLD микропроцессора, для того чтобы посредствам соответствующего сигнала запросить у микропроцессора системную шину для выполнения контроллером обмена по прямому доступу к памяти.
□	DACK3-DACK0
Сигналы на выводах DACK3—DACKO (DMA acknowledge) являются сигналами, подтверждающими выполнение процедуры прямого доступа к памяти по соответствующему каналу. Активный уровень сигналов (низкий или высокий) на этих выводах может программироваться. С помощью этих сигналов устройство, приславшее запрос на выполнение процесса DMA, информируется о возможности выполнения передачи по каналу DMA. Часто эти сигналы используются для выбора устройства ввода-вывода в течение выполнения DMA-передач.
□	AEN
Сигнал разрешения адреса AEN (address enable) разрешает работу адресной защелке DMA, соединенной с выводами DB7—DB0 контроллера DMA 8237 и предназначенной для формирования восьми разрядов старшей части адреса при
694
Глава 13
выполнении процесса прямого доступа к памяти. Он также используется для блокировки других буферов шин в системе с целью запрета ошибочной работы устройств, не участвующих в процедуре DMA.
□	ADSTB
Сигнал стробирования адреса ADSTB (address strobe) предназначен для фиксации старших восьми разрядов адреса в защелке адреса, переданных в нее из контроллера DMA по шине данных DB7—DB0.
□	MEMR
Сигнал чтения памяти на выводе MEMR (memory read) требует от памяти, чтобы она выставила данные на шину данных во время выполнения операции чтения DMA. Сигнал вырабатывается контроллером в паре с сигналом записи IOW , предназначенным для выбранного устройства ввода-вывода, выполняющего обмен по процедуре DMA.
□	MEMW
Сигнал записи в память на выводе MEMW (memory write) требует от памяти записать данные, выставленные на шину данных во время выполнения операции записи DMA. Сигнал вырабатывается контроллером в паре с сигналом чтения IOR, предназначенным для выбранного устройства ввода-вывода, выполняющего обмен по процедуре DMA
Внутренние регистры
□	Регистры текущего адреса
Регистр текущего адреса CAR (current address register) применяется для хранения 16-разрядного адреса памяти, используемого в передачах посредством DMA. В каждом канале для этой цели имеется свой регистр текущего адреса. Значение регистра текущего адреса, при передаче байта данных с использованием DMA, увеличивается или уменьшается в зависимости от того, как он запрограммирован.
□	Регистры текущего значения счета слов
Регистр текущего значения счета слов CWCR (current word count register) программирует канал на число байтов (до 64К), передаваемых в режиме работы процедуры DMA. В каждом канале для этой цели имеется свой регистр текущего значения счета слов. В регистр загружается число на одно меньше числа передаваемых байтов. Например, если в регистр CWCR загружено число 10, то в режиме выполнения операций DMA будет передано 11 байтов.
□	Регистры базового адреса и базового значения счета слов
Регистр базового адреса BA (base address) и регистр базового значения счета слов BWC (base word count) применяются во время автоматической инициализации канала. Эти регистры в режиме автоматической инициализации используются для загрузки регистра текущего адреса CAR и регистра текущего значения счета слов CWCR по завершении операций DMA. Это позволяет повторно использовать тс же самые значения для счета слов и адреса при передачах данных. В каж
Прямой доступ к памяти
695
дом канале используется пара своих регистров базовых значений адреса и счета слов.
□ Регистр управления
Регистр управления CR (command register) программирует работу контроллера DMA 8237. На рис. 13.4 показан формат регистра управления.
Регистр управления
7 6 5 4 3 2 1 0
Передачи "память-память"
0 - Запрещены
1 - Разрешены
0 - Запрещение фиксации адреса канала 0 при передачах "память-память"
1 - Разрешение фиксации адреса
в канале 0 при передачах "память-память"
х - Безразличное состояние, если передачи "память-память" запрещены
0 - Работа контроллера разрешена
1 - Работа контроллера запрещена
0 - Нормальный цикл обмена
1 - Укороченный цикл обмена
х - Безразлично при передачах "память-память"
0 - Фиксированный приоритет
1 - Циклический присваиваемый приоритет
0 - Обычный режим записи
1 - Запись при расширенном сигнале записи
х - Безразлично, если используется укороченный цикл обмена
0 - Чувствительность к высокому уровню сигнала DREQ
1 - Чувствительность к низкому уровню сигнала DREQ
0 - Низкий логический уровень активного сигнала DACK
1 - Высокий логический уровень активного сигнала DACK
Рис. 13.4. Формат регистра управления контроллера DMA 8237А
Бит 0 регистра управления используется для управления передачами "память-память" в режиме DMA. Для таких передач используется канал 0 контроллера DMA для задания адреса источника информации и канал I для указания адреса назначения. Выполняемые действия аналогичны действиям, осуществляемым по команде перемещения байта movsb. Байт считывается из ячейки памяти с адресом, находящимся в регистре текущего адреса CAR канала 0, и сохраняется в 8-разрядном регистре временного хранения контроллера 8237. Затем контроллер DMA 8237 инициирует цикл записи в память, при котором содержимое регистра временного хранения записывается в ячейку памяти по адресу, определяемому с помощью регистра текущего адреса CAR канала I. Число передаваемых байтов определяется регистром счета слов канала 1. Содержимое временного регистра счета слов канала 1 декрементируется, и когда в ходе передачи данных регистр
696
Глава 13
текущего значения счета слов обнулится, то генерируется признак конца счета, выдается сигнал ЕОР и процедура DMA завершается.
Следующий бит I регистра управления предназначен для управления фиксацией адреса канала 0 при передачах "память-память”. Например, когда необходимо заполнить некоторую область памяти одними и теме же данными, то в канале О адрес сохраняется неизменным (фиксируется), а в канале I изменяется. Этим самым выполняется копирование данных из ячейки памяти с адресом, определяемым регистром текущего адреса канала 0, в блок памяти, доступ к которому осуществляется с помощью канала 1 контроллера DMA.
Бит 2 является битом разрешения или запрещения работы контроллера, который полностью включает или выключает контроллер DMA 8237.
Бит 3 регистра управления устанавливает нормальный или укороченный режим обмена, т. е. определяет, содержит ли цикл обмена четыре периода тактовых импульсов при нормальном режиме работы или два периода при укороченном цикле.
Кроме того, при нормальном режиме обмена бит 5 используется для увеличения длительности импульса записи, таким образом, чтобы он появлялся на один такт раньше при синхронизации устройств ввода-вывода, которым требуется более широкий импульс записи.
Бит 4 регистра управления устанавливает тип приоритета для сигналов DREQ3— DREQ0, запрашивающих передачу с использованием DMA, и соответственно для каждого из четырех каналов контроллера. При фиксированном приоритете канал 0 имеет наивысший приоритет, а канал 3 — наименьший приоритет. В случае циклически присваиваемого приоритета наименьший приоритет назначается последнему обслуженному каналу. Остальные каналы получают уровни приоритета, циклически сдвигаясь по кольцу. Например, каналу 2, только что получившему доступ к обмену информацией в режиме DMA, присваивается наименьший уровень приоритета. При этом следующий уровень приоритета получит канал 1, затем канал 0, а каналу 3 будет назначен наивысший приоритет. Циклически присваиваемый приоритет, иногда называемый кольцевым, — это попытка уравнивания в правах всех каналов контроллера при получении доступа к выполнению процедуры DMA.
Оставшиеся два бита регистра управления (бит 6 и 7) программируют чувствительность к логическому уровню входного сигнала DREQ и логический уровень активного сигнала DACK.
□ Регистры режимов
Регистр режима работы MR (mode register) программирует принцип работы канала (рис. 13.5). Следует заметить, что каждый канал имеет свой 6-битный регистр режима работы, выбираемый с помощью двух младших битов этого регистра — бита 0 и 1. Оставшиеся биты регистра режима работы определяют: тип передачи, автоматическую инициализацию, увеличсние/уменьшение значения адреса и режим передач в канале.
Передачи в режиме проверки информации являются псевдо- или иначе холостыми передачами. В этом случае контроллер генерирует только адреса DMA, а все линии управления памятью и устройствами ввода-вы вода остаются неактивными.
Прямой доступ к памяти
697
Регистр режима работы
7 6 5 4 3 2 1 0
Биты выбора канала
00 - Канал 0
01 - Канал 1
10 - Канал 2
11 - Канал 3
Тип передачи
00 - Холостая (для проверки информации)
01 - Запись
10-Чтение
11 - Запрещено
хх - Безразличное состояние, если с помощью бита 7 и 6 выбран режим каскадирования
Автоинициализация
0 - Запрещена
1 - Разрешена
Управление инкрементированием/де-крементированием адреса 0 - Инкрементирование
. 1 - Декрементирование
Режим передачи
00 - По требованию
01 - Одиночные передачи
10 - Блочные передачи
11 - Передачи при каскадировании контроллеров
Рис. 13.5. Формат регистра режима работы контроллера DMA 8237А
Бит 7 и 6 регистра режима работы задают режимы передачи, которые включают: режим по требованию или запросу, одиночный режим, блочный режим и режим передачи при каскадировании контроллеров. Передача данных в режиме по требованию осуществляется до выработки контроллером признака конца счета или поступления внешнего сигнала ЕОР (end of process) или до перехода сигнала DREQ в пассивное состояние. При одиночном режиме передачи контроллер DMA после передачи каждого байта данных снима свой сигнал запроса шины HRQ, поступающий на вывод HOLD микропроцессора. Если же сигнал DREQ, приходящий от внешнего устройства ввода-вывода, удерживается в активном состоянии, тогда контроллер DMA 8237 снова с помощью сигнала HRQ запрашивает у микропроцессора шину для выполнения передачи с использованием прямого доступа к памяти. При блочном режиме передачи контроллер автоматически передает число байтов, указанное в регистре счета слов соответствующего канала. Режим передачи при каскадировании контроллеров применяется при наличии в системе более одного контроллера DMA 8237.
□	Регистр запросов
Регистр запросов RR (request register) позволяет контроллеру реагировать на запросы выполнения передач с помощью DMA, инициируемые программой. Каждый канал имеет свой бит в 4-разрядном регистре запросов (рис. 13.6, а). Эти за-
852
Глава 15
□	Multiple Memory Read
Цикл аналогичен получению доступа для считывания из памяти, за исключением того, что при этом цикл обычно используется для доступа ко многим данным вместо единичных.
□	Dual Addressing Cycle
Цикл позволяет по 32-разрядной шине обращаться к устройствам, имеющим 64-разрядную адресацию.
□	Memory-Read Line
Используется для считывания более двух 32-разрядных значений с шины PCI, как правило, это чтение до конца строки кэш-памяти.
□	Memory Write with Invalidation
Цикл аналогичен строковому доступу к памяти, но при этом осуществляется не чтение, а запись. Позволяет оптимизировать циклы обратной записи для недействительных данных кэш-памяти.
Конфигурационное пространство
Стандарт PCI определяет для каждого слота особую конфигурационную память или, иначе, конфигурационное пространство размером в 256 байт, которое не относится ни к пространству памяти, ни к пространству ввода-вывода, и позволяет компьютеру запрашивать интерфейс PCI. Эта особенность позволяет системе автоматически конфигурировать все устройства, устанавливаемые в слоты PCI. Корпорация Microsoft называет этот принцип PnP (plug-and-play) или, иначе, "включай и работай". На рис. 15.12 показана конфигурационное пространство (конфигурационная память) и его содержимое.
Рис. 15.12. Содержимое конфигурационного пространства на расширенной плате PCI
Шины ввода-вывода
853
Первые 64 байта конфигурационного пространства содержат стандартный заголовок, в котором содержатся идентификаторы производителя, идентификаторы устройства и его класса, а также описание необходимых системных ресурсов.
Первые 32 бита содержат два 16-разрядных идентификатора: идентификатор производителя — Vendor ID и идентификатор устройства — Device ID. Идентификатор устройства — это 16-разрядный код (D31—D16), который может быть равен значению FFFEH, если устройство не установлено, и значению между 0000Н—FFFEH, указывающему на, что компонент имеется. Коды принадлежности к классу обозначают класс интерфейса PCI. Код класса находится в разрядах D31-$D16 по адресу 08Н в заголовке конфигурационного пространства. Разряды D15—D0 указывают версию продукта и определяются производителем. Существующие коды принадлежности к классу приведены в табл. 15.5 и распределены руководящей группой PCI SIG (peripheral component interconnect special interest group). Эта же организация назначает идентификаторы производителя.
	Таблица 15.5. Коды принадлежности к классу
Код класса	Функция
оооон	Старые не VGA карты (не РпР)
0001 н	Старые VGA карты (не РпР)
01 ООН	Контроллер SCSI
0101Н	Контроллер IDE
0102Н	Контроллер накопителя на гибких магнитных дисках (НГМД)
01 ОЗН	Контроллер интеллектуального интерфейса периферийных устройств IPI (Intelligent Peripheral Interface)
0180Н	Прочие контроллеры НЖМД и НГМД
0200Н	Контроллеры Ethernet
0201Н	Контроллеры Token Ring
0202Н	Контроллеры для передачи данных по волоконно-оптическим каналам
0280Н	Прочие сетевые контроллеры
0300Н	Контроллеры VGA
0301Н	Контроллеры XGA
0380Н	Прочие видеоконтроллеры
0400Н	Контроллеры видеомультимедиа
0401Н	Контроллеры аудиомультимедиа
0480Н	Прочие контроллеры мультимедиа
0500Н	Контроллеры оперативной памяти (RAM)
0501Н	Контроллеры флэш-памяти
0580Н	Прочие контроллеры памяти
_0600Н	Главный мост (host bridge)
854
Гпава is
Таблица 15.5 (окончание)
Код класса	Функция
0601 н	Мост шины ISA
0602Н	Мост шины EISA
0603Н	Мост шины MCA
0604Н	Мост PCI—PCI
0605Н	Мост PCMCIA
	(personal computer memory card international association)
0680Н	Прочие мосты
0700Н—FFFEH	Резерв
FFFFH	Устройство любого другого, не вышеупомянутого класса
Регистр состояния 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
PER	SER	МАВ	TAB	STA	DEV	DP	FB8							
*- Быстрые циклы (1 - поддерживаются)
•---Данные контроля паритета (1 - ошибка)
---------Скорость синхронизации выборки команд (00 - быстрая
01 - средняя
10-низкая
11 - резерв) ----------Ведомое устройство отвергает транзакцию (1 - отмена) ----------Устанавливается ведущим устройством, когда оно обнаруживает отвергнутую транзакцию (1 - отвергнутая транзакция обнаружена)
-----------Ведущее устройство отменяет транзакцию (1 - отмена) ----------Системная ошибка (1 - ошибка)
----------Ошибка паритета (1 - ошибка)
Регистр команд
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О
ВВЕ SEE WC PER VPS MW! SC BM MAR IOR
LL Адрес пространства ввода-вывода (1 - разрешить) — Адрес пространства памяти (1 - разрешить) --------------Разрешение работы ведущим устройством в режиме управления шиной (1 - разрешить) --------------Разрешение специальных циклов (1 - разрешить) --------------Запись в память с недействительными данными (1 - разрешить) --------------Разрешение слежения за записью в регистр палитр VGA (0 - разрешить)
-------------------------------Разрешить нормальную реакцию на ошибку паритета (1 - разрешить) ____________________________________________________________________Управление циклом ожидания (0 - нет)________________________________ --------------------------------------------------------------------Разрешение генерации сигнала ошибки SERR (1 - разрешить) --------------------------------------------------------------------Разрешение ведущему устройству использовать быстрые смежные транзакции с разными устройствами (1 - разрешить 0 - транзакции с одним устройством)
Рис. 15.13. Содержимое регистра состояния и команд в конфигурационной памяти
LL/ины ввода-вывода
855
Слово состояния загружается в регистр состояния в разряды D31—D16 по адресу 04Н конфигурационной памяти, а команда в регистр команд в разряды D15—DO по этому же адресу. На рис. 15.13 приведен формат регистра состояния и регистра команд.
регистры базовых адресов содержат базовый адрес для обращения к пространству памяти, второй базовый адрес для обращения к пространству ввода-вывода и третий для обращения к ПЗУ карты расширения. Первые два слова двойной длины базового адресного пространства содержат 32- или 64-разрядный базовый адрес, который используется в интерфейсе PCI. Следующее двойное слово содержит базовый адрес для обращения к пространству ввода-вывода. Обратите внимание, что несмотря на то, что микропроцессоры Intel используют только 16-разрядный «адрес для обращения к пространству ввода-вывода, у них имеется место для расширения адреса ввода-вывода до 32 разрядов. Это позволяет системам, использующим семейство 680Х06 и PowerPC7, получать доступ к шине РС1, поскольку они имеют пространство ввода-вывода с доступом через 32-разрядный адрес. Процессоры 600X0 и PowerPC используют распределение памяти пространства ввода-вывода, рассмотренное в начале главы 11.
BIOS для шины PCI
Большинство персональных компьютеров на базе Pentium—Pentium 4 имеют шину PCI и соответственно расширение обычной системы BIOS, которое поддерживает работу с шиной РС1. Эти новые системы получают доступ к шине PCI по вектору прерываний 1АН. В табл. 15.6 перечисляются существующие функции BIOS для шины PCI, которые вызываются командой int iah. Номер функции задается с помощью регистра АХ, причем содержимое регистра АН должно быть равно В1Н.
В примере 15.7 показано, как используется прерывание INT 1АН для определения наличия расширения BIOS для шины PCI.
^Пример 15.7. Программа определения наличия расширения BIOS для шины PCI
.MODEL SMALL
0000	.DATA
0000	50 43 4F 53 20 50 4Е 54	49 20 52 24	20 42 4Е 4F		49 54 45	MES1	DB	' PCI	BIOS	NOT PRESENTS
			45	53						
0015	50 43	49	20	42	49	MES2	DB	'PCI	BIOS	PRESENTS'
	4F 53	20	50	52	45					
	53 45	4Е	54	24						
6 Семейство микропроцессоров фирмы Motorola. Первый процессор 68000 был выпущен в 1994 г — Ред.
7 В 1991 г. компаниями Apple, IBM и Motorola был основан альянс (AMI Alliance, по первым буквам названий фирм), целью организации которого была разработка процессоров серии PowerPC. Первый 32-разрядный RISC-процессор с суперскалярной архитектурой PowerPC 601, выпушенный в 1993 г., практически одновременно с процессором Intel Pentium, в некоторых тестах опережал его. — Ред.
856
Глава 15
0000	.CODE .STARTUP
0017 В4 В1 0019 ВО 01 001В CD 1А	MOV	АН,0B1H	;	проверка	расширения MOV	AL,01H	;	BIOS для	шины PCI INT	1AH
001D ВА 0015 R	MOV	DX,OFFSET MES2 .IF CARRY?
0022 ВА 0000 R 0025 В4 09 0027 CD 21	MOV	DX,OFFSET MES1 .ENDIF MOV	AH,9	; вывод сообщения INT	21H	; на монитор .EXIT END
Таблица 15.6. Функции BIOS для шины PCI, вызываемые по прерыванию INT 1АН
01H	Проверка присутствия расширения BIOS для шины PCI
При вызове	АН = 0В1Н AL = 01Н
При возврате	АН = ООН и флаг С = 0, если имеется расширение BIOS для шины PCI ВХ = номер версии EDX = строка ASCII-символов 'РСГ Флаг переноса установлен (С = 1), если нет расширения BIOS для шины PCI
02Н	Поиск устройства PCI по идентификатору
При вызове	АН = 0В1Н AL = 02Н СХ = идентификатор устройства DX = идентификатор производителя SI = индекс устройства (порядковый номер устройства)
При возврате	АН = код результатов (см. пояснение) ВХ = шина и номер устройства Флаг С = 1 для ошибки
Пояснение	Коды результатов: ООН = успешный поиск 81Н = функция не обеспечивается 83Н = неправильный идентификационный код производителя 86Н = устройство не найдено 87Н = неправильный номер регистра
Шины ввода-вы вода
857
	Таблица 15.6 (продолжение)
озн	Поиск устройства PCI по коду принадлежности к классу
При вызове	АН = 0В1Н AL = ОЗН ЕСХ = код принадлежности к классу SI = индекс устройства (порядковый номер устройства)
При возврате	АН = код результатов (см. пояснение для функции 02Н) ВХ = шина (регистр ВН) и номер устройства (регистр BL) Флаг С = 1 при ошибке
06Н	Генерация специального цикла PCI
При вызове	АН = 0В1Н AL = 06Н ВХ = шина и номер устройства EDX = данные специального цикла
При возврате	АН = код результатов (см. пояснение для функции 02Н) Флаг С = 1 при ошибке
Пояснение	Значения, поступающие в регистр EDX, выставляются на шину PCI во время фазы адресации
08Н	Чтение байта конфигурационного пространства устройства
При вызове	АН = 0В1Н AL = 08Н ВХ = шина (регистр ВН) и номер устройства (регистр BL) DI = номер регистра (0—FFH)	*•
При возврате	АН = код результатов (см. пояснение для функции 02Н) CL = данные из регистра конфигураций Флаг С = 1 при ошибке
09Н	Чтение слова конфигурационного пространства устройства
При вызове	АН = 0В1Н AL = 09Н ВХ = шина (регистр ВН) и номер устройства (регистр BL) DI = номер регистра (0—FFH, четный)
При возврате	АН = код результатов (см. пояснение для функции 02Н) СХ = данные из регистра конфигураций Флаг С = 1 при ошибке
858
Глава 15
	Таблица 15.6 (окончание)
ОАН	Чтение двойного слова конфигурационного пространства устройства •
При вызове	АН = 0В1Н	~~ AL = ОАН ВХ = шина (регистр ВН) и номер устройства (регистр BL) DI = номер регистра (0—FFH, кратный 4)
При возврате	АН = код результатов (см. пояснение для функции 02Н) ЕСХ = данные из регистра конфигураций Флаг С = 1 при ошибке
овн	Запись байта конфигурационного пространства устройства
При вызове	АН = 0В1Н AL = ОВН ВХ = шина (регистр ВН) и номер устройства (регистр BL) CL = данные для записи в регистр конфигураций DI = номер регистра (0—FFH)
При возврате	АН = код результатов (см. пояснение для функции 02Н) Флаг С = 1 при ошибке
ОСН	Запись слова конфигурационного пространства устройства
При вызове	АН = 0В1Н AL = ОСН ВХ = шина (регистр ВН) и номер устройства (регистр BL) СХ = данные для записи в регистр конфигураций DI = номер регистра (0—FFH, четный)
При возврате	АН = код результатов (см. пояснение для функции 02Н) Флаг С = 1 при ошибке
ODH	Запись двойного слова конфигурационного пространства устройства
При вызове	АН = 0В1Н AL = 0DH ВХ = шина (регистр ВН) и номер устройства (регистр BL) ЕСХ = данные для записи в регистр конфигураций DI = номер регистра (0—FFH, кратный 4)
При возврате	АН = код результатов (см. пояснение для функции 02Н) Флаг С = 1 при ошибке
Шины в вода-вы вода
859
После того как наличие расширения BIOS для шины PCI будет определено, можно считывать содержимое конфигурационного пространства, используя функции BIOS. Обратите внимание, что BIOS не обеспечивает передачу данных между компьютером и интерфейсом PCI. Передачу данных осуществляют драйверы, предусмотренные для интерфейса. Эти драйверы контролируют поток данных между микропроцессором и устройством, подключенным к шине PCI.
Интерфейс PCI
Интерфейс РС1 достаточно сложен. Для него необходима постоянная память (EPROM) для хранения информации производителя и другой информации, которая рассматривалась ранее в этом разделе главы. Элементарная структура интерфейса PCI приведена на рис. 15.14. Содержимое блок-схемы показывает, какие требуются компоненты для функционирования интерфейса PCI, сам же интерфейс не показан. Необходимыми компонентами для интерфейса PCI являются: регистры, блок паритета, инициатор и память EPROM, в которой, в частности, содержится идентификатор производителя. Ввиду сложности интерфейса достаточно часто при конструировании интерфейса PCI используется контроллер шины PCI. Контроллер шины PCI содержит структуру, показанную на рис. 15.14.
Рис. 15.14. Блок-схема интерфейса PCI
15.4.	Порт параллельного интерфейса (LPT-порт)
Порт параллельного интерфейса был введен в состав компьютера для подключения принтера, поэтому он получил название ЛРТ-порта (Line Printer — построчный принтер). Разъем этого порта расположен на тыльной стороне системного блока компьютера. Стандартный LPT-порт также называется стандартным параллельным портом или 5РР-порт (Standard Parallel Port). Кроме стандартного порта имеются расширения параллельного порта, которые поддерживают двустороннюю передачу и
860__________________;_______________	Глава 15
предназначены для повышения произволительности обмена по параллельному порту. К ним относят: порт с расширенными возможностями ECP (extended capability port) и улучшенный параллельный по^т ЕРР (enhanced parallel port). Интерфейс принтера предоставляет пользователю Доступ к восьми линиям, которые могут программироваться на прием или передачу Данных.
Описание LPT-порта
Параллельный порт (LPT1) обычно является портом ввода-вывода с адресами 378Н, 379Н и 37АН. Другой порт (LPT2), если имеется, располагается по адресам 278Н, 279Н и 27АН. Представленная ниже ицформацИЯ применима к обеим портам, но следует учитывать то, что далее используется адреса только для порта LPT1.
Поскольку параллельные интерфейсы Разрабатывала фирма Centronics, которая специализируется на производстве принтер^, поэтому параллельный интерфейс часто иначе называют интерфейсом Centronics. Интерфейс использует один 25-контактный разъем DB25, расположенный на тыльцОц стороне персонального компьютера, и один 36-контактный разъем Centronics, Который устанавливается на принтере. Схема расположения контактов этих разъемов представлена в табл. 15.7, а внешний вид разъемов показан на рис. 15.15.
Таблица 15.7. Сигналы и контакты разъемов параллельного порта (LPT)
Сигнал	Описание	Номера контактов разъема DB25	Номера контактов разъема Centronics 36
Strobe	Сигнал стробирования Данных. Данные действительны в случае н^зК0Г0 логического уровня сигнала. Сигнал сообщает приемнику (принтеру), что даНные готовы для приема их с шины данных	1	1
DO или Data 0	Бит 0 шины данных	2	2
D1 или Data 1	Бит 1 шины данных	3	3
D2 или Data 2	Бит 2 шины данных	4	4
D3 или Data 3	Бит 3 шины данных	5	5
D4 или Data 4	Бит 4 шины данных	6	6
D5 или Data 5	Бит 5 шины данных	7	7
D6 или Data 6	Бит 6 шины данных	8	8
D7 или Data 7	Бит 7 шины данных	9	9
Ack	Сигнал подтверждения прцнятия данных и готовности приемника (принтера) принять следующие данные	10	10
Busy	Сигнал занятости принтера обработкой полученных данных и негоуовности принять следующую порцию даннцх сигнал также активен при переходе прингера в состояние выключено (off-line), при ошибке и при отсутствии бумаги	11	11
Шины ввода-вывода
861
	Таблица 15.7 (окончание)		
		Номера	Номера
Сигнал	Описание	контактов разъема DB25	контактов разъема Centronics 36
РЕ или Paper End	Сигнал окончания бумаги. Получив его, компьютер переходит в режим ожидания	12	12
SLCT или Select	Сигнал готовности приемника. С помощью этого сигнала принтер сообщает, что он выбран и готов к работе	13	13
AutoLF или AutoFeed	Сигнал автоматического перевода строки. Получив его, принтер переводит каретку на следующую строку текста	14	14
Error	Сигнал ошибки принтера. Активен при внутренней ошибке, переходе принтера в состояние off-line или при отсутствии бумаги	15	32
Init	Сигнал инициализации (сброса) принтера. Его длительность должна составлять не менее 2,5 мкс. По этому сигналу выполняется очистка буфера печати	16	31
Selectin	Сигнал, с помощью которого компьютер сообщает принтеру, что принтер выбран и сейчас последует передача данных	17	36
+5V	Напряжение +5 В источника постоянного тока	—	18
Protective GND	Корпус для монтажной платы принтера (защитное заземление)	—	17
Signal GND	г Сигнал "Земля"	Все остальные	Все остальные
Параллельный порт может работать как для приема, так и для передачи данных по линиям DO—D7. Это позволяет подключать к персональным компьютерам через параллельный порт и другие устройства, кроме принтера, такие, например, как накопители Zip компании Iomega. Практически любые устройства, которые могут принимать и/или передавать данные по 8-разрядному интерфейсу, можно соединять к параллельному порту (LPT1) компьютера и это часто реализуется на практике.
Разъем Centronics 36
Рис. 15.15. Разъемы, используемые для параллельного порта
862
Глава 15
На рис. 15.16 показано содержимое регистра данных (378Н), регистра состояния (379Н) и регистра управления (37АН) порта LPT1.
Порт 378Н
Регистр данных D7 - DO (DR), адрес = Base
76543210 ◄— Биты
98765432
Контакты разъема DB25
Порт 379Н
Регистр состояния (SR), адрес = Base + 1
Этот регистр предназначен только для чтения. Возвращает информацию о сигналах Busy, ERROR и т. д. Обратите внимание, что некоторые биты отражают инверсное состояние линии, например, Busy
7	6	5	4	3	2	1	0 ◄— Биты
							
Error (1 - нет ошибки)
Celect (1 - принтер включен)
Paper End (1 - конец бумаги) Аск (1 - acknowledge) Busy (1 - принтер не занят)
Порт 37АН
Регистр управления (CR), адрес = Base + 2
7	6	5	4	3	2	1	0 <—Биты
							
Бит управления направлением передачи ------1
(0 - режим вывода, 1 - режим ввода данных)
Бит разрешения прерывания по спаду сигнала на линии Аск ---------
(1 - разрешить)
Бит разрешения работы принтера ---------------
Единичное значение бита соответствует низкому логическому уровню сигнала Selectin (1 - принтер выбран) Бит инициализации -------------------------------------------
Нулевое значение бита соответствует низкому логическому уровню на линии I nit (0 - инициализация принтера)
Бит автоматического перевода строки ----------------------
Единичное значение бита соответствует низкому логическому уровню сигнала AutoLF (1 - перевод строки принтера) Бит стробирования данных---------------------------------------------
Единичное значение бита соответствует низкому логическому уровню сигнала Strobe (1 - стробирование данных)
Рис. 15.16. Использование портов 378Н, 379Н и 37АН в качестве параллельного порта LPT1
Шины ввода-вывода
863
Использование параллельного порта без поддержки режима ЕСР
Для использования параллельного порта без поддержки режима ЕСР можно, в основном, следовать информации, представленной на рис. 15.16. Для считывания из этого порта вы должны, во-первых, инициализировать его (как это показано в примере 15.8), посылая код 20Н в регистр управления (CR) 37АН.
Пример 15.8. Инициализация принтера
MOV
MOV
OUT
AL,2ОН
DX, 3'7АН
DX, AL
Чтение данных из порта 378Н после его инициализации может производиться, как показано в примере 15.9. Обратите внимание, что процедура чтения из порта — очень простая.
Пример 15.9. Чтение данных из регистра данных параллельного порта
MOV	DX,378H
IN	AL,DX
Порт, для записи данных, должен инициализироваться аналогично показанному примеру 15.8, только вместо отправления кода 20Н необходимо послать в него код ООН. В примере 15.10 показан порядок записи данных в параллельный порт.
Пример 15.10. Запись данных в параллельный порт
MOV DX,378H
MOV	AL,WRITE_DATA
OUT DX,AL
На некоторых старых системах, которые в регистре управления не имеют бита управления направлением передачи, можно вывести код 0FFH в порт 378Н, перед началом ввода информации. Это действие замещает программирование регистра управления 37АН на режим ввода данных. После записи кода FFH можно выполнять чтение порта.
15.5.	Универсальная последовательная шина USB
Универсальная последовательная шина или, иначе, шина USB (universal serial bus) решила проблему с подключением периферийных устройств к персональному компьютеру. К этой шине можно подключать различные периферийные устройства, такие как клавиатура, мышь, джойстик, принтер и др., не выключая питания. Например, существующие на момент выхода шины USB (начало 1996 г.) звуковые кар
864
Глава 15
ты ISA использовали внутренний источник питания персонального компьютера, который создавал существенную помеху при звуковоспроизведении. Поскольку шина USB предоставляет звуковой карте свой источник питания, то шум от влияния питания персонального компьютера можно было убрать, обеспечивая высокую точность воспроизведения звука. Другие преимущества шины USB - это упрощение самого подключения, а также предоставление возможности подключения к большому количеству различных устройств (до 127) с помощью четырехпроводного кабеля. Этот интерфейс идеален для подключения клавиатур, звуковых карт и модемов. Скорость передачи данных с полной скоростью (full speed) работы составляет 12 Мбайт/с и при низкой скорости (low speed) работы — 1,5 Мбайт/с.
Следует отметить, что хост-контроллер или просто хост (host) — это главный контроллер, который входит в состав системного блока компьютера и управляет работой всех устройств на шине USB. На одной шине допускается наличие только одного хоста. Системный блок компьютера может содержать и несколько хостов, управляющих своими отдельными шинами USB. Кроме того, следует назвать еще один элемент шины USB — это функция. Под функцией (function) понимается периферийное устройство или отдельный его блок, способный передавать или принимать информацию по шине USB.
Длина кабеля ограничивается пятью метрами для интерфейса, работающего с полной скоростью, и тремя метрами с низкой скоростью работы. Максимально допустимая нагрузка этих кабелей по току составляет 100 мА при напряжении питания 5 В. Если же величина тока превышает 100 мА, тогда операционная система Windows рядом с устройством отображает желтый восклицательный знак.
Разъем
На рис. 15.17 показана схема расположения контактов стандартных разъемов шины USB (гнезда), которые располагаются на тыльной стороне компьютера. Существует две разновидности разъемов8. Каждый тип разъема имеет четыре вывода для сигналов, указанных в табл. 15.8.
Таблица 15.8. Назначение выводов шины USB
Номер контакта	Сигнал
1	5.0V
2	- Data
3	+ Data
4	GND
Выводы с напряжением +5,0 В и "земля", как упоминалось, могут использоваться для питания подсоединенных к шине устройств, но при условии что величина тока не превысит 100 мА/устройство. Информационные сигналы являются двухфазными
8 Кроме стандартных разъемов с введением в 2000 г. стандарта USB 2.0 появились еще и миниатюрные разъемы типа "В” ("mini-В")- — Ред.
Шины ввода-вы вода
865
или дифференциальными сигналами. Дифференциальная логическая единица передается путем подтяжки уровня напряжения линии +Data к напряжению более 2,8 В, а линии -Data к напряжению менее 0,3 В и наоборот при передаче дифференциального нуля
а)
ГЛ П
ИГ"ЕГ
б)
Рис. 15.17. Вид спереди двух видов стандартных разъемов шины USB, которые устанавливаются на компьютере. Гнезда USB: типа "А" (а) и типа "В" (б)
Данные шины USB
Информационные сигналы являются двухфазными сигналами, генерируемые схемой подобно той, которая изображена на рис. 15.18. На этом рисунке также изображен дифференциальный приемник сигналов из линии. К выходам пары передатчиков подключена микросхема защиты последовательного интерфейса USB с двумя каналами SN75240 производства фирмы Texas Instruments.
Рис. 15.18. Подключение к шине USB с использованием пары КМОП-буферов
В данной принципиальной схеме в качестве дифференциального усилителя линии и в качестве приемника применяется интегральная микросхема 75773 производства фирмы Texas Instruments.
Следующим этапом является рассмотрение взаимодействия сигналов на шине USB. Эти сигналы позволяют посылать данные на и принимать данные от host-компьютера. Данные по шине USB передаются битовыми последовательностями. Для передачи пакетов по шине USB используется метод кодирования данных, называемый NRZI (non-return to zero invert), или, иначе, метод кодирования без возврата к нулю с инвертированием. Данный метод кодирования не изменяет уровень сигнала при передаче логической единицы, в то время как уровень напряжения сигнала всякий раз изменяется на противоположный при каждой передачи логического нуля. На рис. 15.19 показан цифровой информационный поток и сигнал, сформированный шиной USB с использованием этого метода кодирования.
28 Зак 384
Глава 15
866 ----
Цифровые данные
Код NRZI
Рис. 15.19. Метод кодирования NRZI, используемый при передаче данных по шине USB
Фактически передаваемые данные включают в себя и биты синхронизации. При передаче данных, содержащих нули, приемнику и передатчику достаточно легко поддерживать синхронизацию, поскольку уровень сигнала будет постоянно изменяться. Если же данные содержат длинную последовательность единиц, то уровень сигнала изменяться не будет, и поэтому в этом случае возможно нарушение синхронизации. Поэтому для осуществления надежной передачи данных по методу NRZI применяют так называемый стаффинг (bit stuffing), т. е. вставку дополнительного бита нуля после каждых переданных подряд шести единиц. На рис. 15.20 показан последовательный информационный поток с добавленным битом нуля и алгоритм для формирования кода NRZI из необработанных цифровых данных.
Стаффинг увеличивает число передаваемых бит, но предоставляет приемнику возможность сохранять синхронизацию при передаче длинной последовательности цифровых данных, состоящей только из единиц. Следует заметить, что данные всегда передаются, начиная с самого младшего разряда, за которым идут последующие.
Управление шиной USB
Теперь, после того как разобран формат данных шины USB, рассмотрим команды, которые используются для передачи данных и выбора приемника. Информация по каналу передается в виде пакетов. Для установления связи вначале передается байт синхронизации, иначе SYNC (код 80Н), за которым следует идентификатор пакета или, иначе, PID (packet identification). PID содержит 4 бита, за которым следует
Цифровые данные
Передаваемые данные в коде NRZI с использованием стаффинга (bit stuffing)
0.0. 0.1. 1.1.1 1.1.1
Добавленный бит нуля
а)
Рис. 15.20. Передаваемые по шине USB данные в коде NRZI с использованием стаффинга (а) (см. продолжение)
Шины ввода-вывода
867
Рис. 15.20. Блок-схема, используемая для их формирования (6)
868
Глава 15
4-битное поле контроля Check, которое представляет собой побитовую инверсию кода PID. Например, если посылается команда с кодом PID равным 1000, то реально посылается код 0111 1000. В табл. 15.9 приведены доступные 4-разрядные идентификаторы пакетов (PID) и соответствующие им 8-разрядные коды9. Следует отметить, что существующие коды P1D подразделяются на четыре различных типов, относящихся к идентификаторам маркер-пакетов (Token Packet), идентификаторам пакетов данных (Data Packet), идентификаторам пакетов-подтверждений (Handshake) и идентификаторам специальных пакетов (Special Packet).
Таблица 15.9. Коды идентификатора пакета (PID)
8-разрядный код Поле	Код Check	PID	Наиме-нование пакета	Тип идентификатора	Описание
Е1Н 1110b	0001b	OUT	Token Packet	Маркер транзакции вывода. Передает адрес и номер конечной точки при передаче от хоста (host) к устройству-функции (function)
D2H 1101b	0010b	ACK	Handshake	Подтверждение безошибочного приема пакета
C3H 1100b	0011b	DataO	Data Packet	Пакет данных с четным PID. Пакеты с четным и нечетным PID чередуются для точной идентификации подтверждений
A5H 1010b	0101b	SOF	Token Packet	Маркер начала кадра (frame). Содержит номер начала кадра
69H 0110b	1001b	IN	Token Packet	Маркер транзакции ввода. Передает адрес и номер конечной точки при передаче от функции (function) к хосту (host)
5AH 0101b	1010b	NAK	Handshake	Приемник не сумел принять или передатчик не сумел передать данные
4BH 0100b	1011b	Datal	Data Packet	Пакет данных с нечетным PID. Пакеты с четным и нечетным PID чередуются для точной идентификации подтверждений
3CH 0011b	1100b	PRE	Special Packet	Специальный маркер. Сообщает, что следующий пакет будет передаваться в низкоскоростном режиме LS (low speed) до 1,5 Мбит/с
2DH 0010b	1101b	Setup	Token Packet	Маркер транзакции управления. Передает адрес и номер конечной точки при передаче команды от хоста (host) к функции (function)
1EH 0001b	1110b	Stall	Handshake	Поток прерван. Произошел сбой в конечной точке или запрос не поддерживается
9 Приведенные в табл. 15.9 коды PID соответствуют версии USB 1.1. Существуют также еще шесть кодов, появившиеся с реализацией версии USB 2.0. — Ред.
Шины ввода-вы вода
869
На рис. 15.21 приводятся форматы пакетов данных, маркер-пакетов, пакетов подтверждения или, иначе, квитирования и начала кадра, которые применяются при передачах по шине USB.
8 бит	4 бита	Маркер-пакет		4 бита	5 бит
		4 бита	7 бита		
SYNC	PID	Check	ADDR	ENDP	CRC5
Пакет начала кадра
8 бит	4 бита	4 бита	. 11 бит	5 бит
SYNC	PID	Check	Frame Number	CRC5
8 бит	4 бита	Пакет данных 4 бита от 1 до 1023 байт		16 бит
SYNC	PID	Check	Data	CRC16
Пакет подтверждения (квитирования)
8 бит 4 бита 4 бита
SYNC	PID	Check
Рис. 15.21. Типы пакетов шины USB и их формат
В конце каждого пакета выделяется некоторый интервал времени на состояние интерфейса, которое называют концом пакета или EOP (End Of Packet). Поле адреса ADDR в маркер-пакете содержит 7-разрядный адрес устройства-функции шины USB. Поле конечной точки ENDP (endpoint) содержит 4-разрядное число, используемое в интерфейсе USB для идентификации части USB-устройства, которое может быть как получателем, так и отправителем информации. Конечная точка 0 позволяет хосту опрашивать устройство с целью определения его типа и параметров, выполнять инициализацию и конфигурирование устройства, тогда как другие дополнительные конечные точки являются уникальными для каждого устройства шины USB. Они предназначаются для обмена данными с хостом. Дополнительные конечные точки могут работать либо только на передачу данных хосту, либо только на прием данных от хоста.
Поскольку каждый кадр имеет свой номер, то он хранится в поле номера кадра Frame Number пакета начала кадра, которое имеет 11 бит.
Для защиты полей пакета в протоколе USB используется циклический избыточный код или, иначе, CRC (cyclic redundancy check). Существует два формата этого кода: один — 5-разрядный CRC5 и другой, используемый для пакета данных, — 16-разрядный CRC16. Код CRC5 (5-разрядный) формируется полиномом X5 + X2 + 1, а 16-разрядный CRC16 формируется полиномом X16 + X15 + X2 + 1.
При реализации схемы формирования или обнаружения кода CRC операции сложения в указанных полиномах выполняют логические схемы ИСКЛЮЧАЮЩЕЕ ИЛИ.
870
Глава 15
Следует отметить, что код CRC — это механизм последовательного контроля. В случае использования 5-разрядного кода CRC при передачах без ошибки всех пяти бит CRC5 и битов данных остаток будет равен 0U00. Для 16-разрядного кода CRC при передачах без ошибки остаток будет равен 1000000000001101.
Шина USB использует идентификаторы пакетов-подтверждений АСК и NAK для координации передачи пакетов данных между хостом и устройством USB. После передачи хостом пакета данных в устройство USB, последнее передает обратно хосту пакет-подтверждения с идентификатором АСК (acknowledge — подтверждение) или NAK (not acknowledge — нет подтверждения). Если данные и код CRC приняты правильно, то посылается пакет с идентификатором АСК, а если нет, то с идентификатором NAK. При получении хостом пакета с идентификатором NAK, он повторяет передачу пакета данных до тех пор, пока приемник не примет его правильно. Такой метод передачи данных часто называют управлением потоком данных с остановом и ожиданием (stop and wait flow control). Хост должен ожидать от клиента получения пакета-подтверждения с идентификатором АСК или NAK прежде, чем передавать какие-либо другие пакеты данных.
15.6.	Ускоренный графический порт AGP
Корпорацией Intel в 1997 г. на базе шины PCI 2.1 был разработан стандарт на ускоренный графический порт или, иначе, порт AGP (accelerated graphics port). Порт AGP работает на частоте системной шины микропроцессора. Вначале порт AGP, представляющий собой 32-разрядную шину, работал на тактовой частоте 66 МГц. Поэтому его пропускная способность составляла 264 Мбайт/с для так называемого режима 1х. Он разрабатывался для осуществления передач между видеокартой и системной памятью с максимально возможной скоростью. В стандарте AGP версии 1.0 был предусмотрен и режим 2х, при котором передача данных осуществлялась по двум фронтам тактового импульса, что позволило при той же тактовой частоте 66 МГц получить в два раза большую пропускную способность, которая составила 528 Мбайт/с. Этот порт, вероятно, никогда не будет применен для подключения других устройств, кроме видеокарты, поэтому в данном разделе при его рассмотрении отведено немного места.
Впоследствии появилась шина AGP версии 2.0, в которой в режиме 4х пропускная способность достигла значения 1066 Мбайт/с10.
На рис. 15.22 показан интерфейс порта AGP компьютерной системы, построенной на базе процессора Pentium II. На структуре также изображены и другие шины, такие как локальная шина, шина PCI, USB и ISA. Приведенная структура аналогична и более современной структуре на базе микропроцессора Pentium 4 за исключением того, что в этих системах используются другие чипсеты и уже отсутствует шина ISA.
10 С выходом в 2002 г. окончательной версии спецификации AGP 3.0 (AGP 8х) пропускная способность шины достигла 2132 Мбайт/с. — Ред.
Шины ввода-вывода
871
Рис. 15.22. Структура современной компьютера, показывающая организацию всех используемых шин
Итоги
П Системы шин ISA, EISA, VLB, PCI и USB позволяют осуществлять подключение внешних устройств ввода-вывода и систем памяти к персональному компьютеру.
□	Шина ISA имеет две разновидности: 8- и 16-разрядную шину ISA, которые обе обеспечивают передачу данных с частотой 8 МГц.
□	Шина EISA (extended ISA) является расширенным вариантом шины ISA и обеспечивает 8-, 16- и 32-разрядные передачи данных между компьютером и внешними устройствами, подключенными к шине, также с частотой 8 МГц.
П Локальная шина VLB (VESA local bus) ассоциации VESA (video electronics standards association — ассоциация по стандартам в области видеоэлектроники) обеспечивает передачу данных между персональным компьютером и внешними устройствами ввода-вывода или памятью с частотой 33 МГц.
Q72 Глава 15
□ Шина PCI (peripheral component interconnect) обеспечивает 32- или 64-разрядные передачи данных между персональным компьютером и внешними устройствами ввода-вывода или памятью с частотой 33 МГц.
□ Интерфейс PnP (plug-and-play — ’’включай и работай") содержит память, в которой находится информация о конфигурации системы.
□ Шина USB (universal serial bus — универсальная последовательная шина) во многих приложениях заменила шину ISA. Шина USB имеет две скорости передачи данных: 1,5 и 12 Мбайт/с.
□ Шина USB использует систему NRZI для кодирования данных и применяет так называемый стаффинг (stuffing), т. е. добавление битов логического нуля при передачах более шести битов логической единицы, следующих подряд друг за другом.
□ Порт AGP (accelerated graphics port — ускоренный графический порт) является высокоскоростным портом, соединяющим запоминающую систему компьютера и видеокарту.
Контрольные вопросы и задания
1.	Расшифруйте аббревиатуру ISA?
2.	Какую разрядность данных обеспечивает шина ISA?
3.	Для расширения какой памяти иногда ранее использовалась шина ISA?
4.	Разработайте интерфейс для шины ISA, который должен иметь в своем составе микросхему 82С55 и дешифрироваться по адресам 800Н—803Н. Не забудьте про необходимость буферизовать все входные линии разрабатываемой карты интерфейса.
5.	Разработайте интерфейс для шины ISA, имеющий порты 0820Н—0823Н для управления одной микросхемой таймера 8254.
6.	Разработайте интерфейс для шины ISA для подключения микросхемы EPROM 27С256, имеющей адрес памяти FF0000H—FF7FFH при обращении к ней.
7.	Разработайте, применяя буфер 74LS244 и защелку 74LS374, интерфейс для шины ISA с 8-разрядным портом ввода с адресом ввода-вывода 808Н и 8-разрядным портом вывода с адресом ввода-вывода 80АН.
8.	Спроектируйте интерфейс для шины ISA, содержащий четыре ЦАП типа DAC0830 и имеющий соответственно четыре канала с аналоговым выходным сигналом в пределах от 0 до 5,0 В. Эти четыре канала должны дешифрироваться по адресам 800Н, 8ЮН, 820Н и 830Н. Также разработайте программное обеспечение для этого интерфейса.
9.	Спроектируйте интерфейс для шины ISA, но вместо четырех выходных аналоговых каналов, как это было в предыдущем задании, используйте четыре микросхемы АЦП для создания четырех аналоговых входных каналов, имеющих те же адреса.
10.	Разработайте таймер для фотолаборатории на плате с интерфейсом шины ISA, используя таймер или таймеры 8254. Ваш таймер должен генерировать сигнал низкого логического уровня длительностью 1/100 с с регулируемым периодом от 1/100 с до пяти минут. В качестве источника синхронизации используйте системные тактовые импульсы с частотой 8 МГц. Разрабатываемое вами программное обеспечение должно дозволять пользователю задавать время задержки с клавиатуры. Выходной сигнал таймера после инвертирования выходного сигнала таймера должен иметь низкий логический уровень в течение задаваемого времени для управления электронным реле, которое в свою очередь должно управлять фотоувеличителем.
Шины ввода-вывода 873
11.	Разработайте интерфейс для шины ISA, подключающий микросхему UART 16550 к персональному компьютеру. Разработайте программное обеспечение для передачи и приема данных со скоростью 300, 1200, 9600 и 19200 бод. Устройство UART должно отзываться на адрес 0E3XH порта ввода-вывода.
12.	Шина EISA может передавать______-разрядные данные при частоте 8 МГц.
13.	Опишите, каким образом выполнена модификация разъема ISA для согласования с ин-тсрфейсо.м EISA.
14.	С какой частотой работает локальная шина VLB?
15.	Использует ли локальная шина VLB контакты шины ISA?
16.	В чем заключается разница между локальной шиной VLB и шиной PCI?
17.	Объясните, каким образом можно зафиксировать адрес, полученный с шины PCL
18.	Какое назначение конфигурационного пространства в интерфейсе шины PCI?
19.	Объясните что такое РпР (plug-and-play)?
20.	Какое назначение сигнала на контакте С/ BE разъема шины РС1?
21.	Каким образом определяется присутствие расширения BIOS для шины PCI?
22.	Разработайте короткую программу для запроса шины РС1 с использованием расширения BIOS для шины PCI, которая считывает 32-разрядное содержимое регистра конфигурации 08Н. Учтите при этом, что номерами шины и устройства является 0000Н.
23.	Какое заметное преимущество имеет шина PCI по сравнению с шиной ISA?
24.	Какие скорости передачи данных имеет шина USB?
25.	Как производится кодирование на шине USB?
26.	Какая максимально используемая с шиной USB длина кабеля?
27.	Почему и в каких приложениях шина USB заменила шину ISA?
28.	Какое количество адресов устройств разрешено для шины USB?
29.	Что представляет собой кодирование NRZI?
30.	Что такое стаффинг (stuffing)?
31.	Нарисуйте форму сигнала на шине USB при подаче на нее необработанных цифровых данных: 1100110000110011011010.
32.	Какое количество данных может быть передано в одном пакете по шине USB?
33.	Какое назначение имеют идентификаторы пакетов NAK и АСК, применяемые при обмене данными по шине USB?
34.	Каковы значения пропускных способностей при передачах данных по шинам PCI и AGP?
35.	Какова пропускная способность шины AGP при передачах в системе, использующей видеокарту стандарта 4xAGP?
ГЛАВА 1 6
Микропроцессоры 80186, 80188 и 80286
Введение
Микропроцессоры Intel 80186/80188 являются усовершенствованными версиями предшествующих микропроцессоров 8086/8088. Микропроцессоры 80186/80188 и 80286 не представляют нового поколения архитектуры, они являются процессорами с 16-разрядной внутренней архитектурой и совместимы с микропроцессорами 8086/8088 снизу вверх. В этой главе дается общее представление о каждом микропроцессоре, и подчеркиваются отличия или имеющиеся улучшения в каждой версии. В первой части главы дается описание микропроцессоров 80186/80188, а в другой части представлен микропроцессор 80286.
Новым в этом издании является расширенное освещение семейства микропроцессоров 80186/80188. Эти процессоры имеют встроенные периферийные контроллеры. В дополнение к ним корпорация Intel выпустила на их базе по четыре модификации процессоров. Каждая такая модификация — это КМОП-версия микропроцессора-контроллера, которая обозначается прибавлением к наименованию базового процессора двухбуквенного суффикса: XL, ЕА, ЕВ и ЕС. Модификации 80C186XL и 80C188XL почти аналогичны с предыдущими базовыми моделями процессоров 80186/80188.
Назначение главы
После завершения ознакомления с этой главой вы сможете:
П описать усовершенствования аппаратного и программного обеспечения микропроцессоров 80186/80188 и 80286 в сравнении с 8086/8088;
□ назвать отличия версий встроенных контроллеров на базе микропроцессоров 80186 и 80188;
CJ выполнить подключение памяти и устройств ввода-вывода к микропроцессорам 80186/80188 и 80286;
CJ разрабатывать программное обеспечение с использованием усовершенствований, предусмотренных в этих микропроцессорах;
CJ описать работ)' блока управления памятью MMU (memory management unit);
CJ подробно описать работу операционной системы реального времени RTOS (real time operating system).
Микропроцессоры 80186, 80188 и 80286
875
16.1. Архитектура микропроцессоров 80186/80188
Микропроцессоры 80186 и 80188, подобны микропроцессорам 8086 и 8088, и почти одинаковы с ними. Единственным отличием между микропроцессорами 80186 и 80188 является разрядность их информационных шин. Микропроцессор 80186, впрочем, как и 8086, имеет 16-разрядную шину данных, тогда как микропроцессор 80188 и его предшественник 8088 имеет 8-разрядную информационную шину. Структура внутренних регистров микропроцессоров 80186/80188 практически идентична микропроцессорам 8086/8088. Единственная их разница состоит в том, что микропроцессоры 80186/80188 содержат дополнительные резервные векторы прерывания и некоторые очень мощные встроенные возможности ввода-вывода. Микропроцессоры 80186/80188 часто называют встроенными контроллерами (embedded controllers).
Версии микропроцессоров 80186/80188
Как упоминалось, имеется четыре разные версии микропроцессоров 80186/80188, которые все являются КМОП-микропроцессорами. В табл. 16.1 приводится каждая версия и их основные особенности. Микропроцессоры 80C186XL и 80C188XL наиболее сходны с базовыми версиями процессоров 80186/80188, тогда как микропроцессоры 80С186ЕС и 80С188ЕС являются наиболее усовершенствованными. В этом тексте приводится достаточно подробное описание микропроцессоров 80C186XL/80C188XL и объясняются дополнительные особенности и усовершенствования, предусмотренные в других версиях.
Базовая блок-схема микропроцессора 80186
На рис. 16.1 приводится блок-схема микропроцессора 80188, которая, в общем, представляет все версии, кроме усовершенствований и дополнительных особенностей, показанных в табл. 16.1.
Таблица 16.1. Четыре версии встроенных контроллеров 80186/80188
Особенность	80C186XL 80C188XL	80С186ЕА 80С188ЕА	80С186ЕВ 80С188ЕВ	80С186ЕС 80С188ЕС
Система команд как у 80286	+	+	+	+
Режим экономии питания ("зеленый" режим)	+	+	-	+
Режим выключения питания	-	+	+	+
Сопряжение с сопроцессором 80С187	+	+	+	+
Режим ONCE	+	+	+	+
Контроллер прерывания	+	+	+	+ (как 8259)
Блок таймера	+	+	+	+
S76____________________________________________________________________Глава 16
	Таблица 16.1			(окончание)
Особенность	80C186XL 80C188XL	80С186ЕА 80С188ЕА	80С186ЕВ 80С188ЕВ	80С186ЕС 80С188ЕС
Блок выбора кристалла	+	+	+	+
Контроллер DMA	+ (2 канала)	+ (2 канала)	-	+ (4 канала)
Блок последовательной передачи	—	-	+	+
Контроллер регенерации	+	+	+	+
Сторожевой таймер	-	-		+
Порты ввода-вывода	—	—	+ (16 бит)	+ (22 бит)
Следует отметить, что внутренняя структура этого микропроцессора немного сложнее, чем у микропроцессора 8088. Блок-схемы микропроцессоров 80186 и 80188 идентичны, за исключением очереди предварительной выборки, которая составляет 4 байта в микропроцессоре 80186 и 6 байт в микропроцессоре 80188. Микропроцессор 80188 (подобно 8088) имеет блок шинного интерфейса, или иначе BIU (Bus Interface Unit), и операционный блок, или EU (Execution Unit).
Кроме блока шинного интерфейса и операционного блока семейство микропроцессоров 80186/80188 имеет тактовый генератор, программируемый контроллер прерывания, программируемые таймеры, программируемый контроллер DMA и программируемый блок выбора кристалла. Данные усовершенствования существенно повышают эффективность микропроцессоров 80186/80188 и сокращают количество периферийных компонентов, требуемых для реализации вычислительной системы. Во многих популярных подсистемах персональных компьютеров использовались микропроцессоры 80186 и 80188 в качестве дискового контроллера с кэшем, контроллеров локальной сети (LAN — Local Area Network) и т. д. Микропроцессоры 80186/80188 также находят применение в сотовой телефонной сети в качестве коммутатора (switcher). Программное обеспечение микропроцессоров 80186/80188 идентично с микропроцессором 80286. Это означает, что все команды микропроцессора 80286, такие как команды целочисленного умножения на константу, сдвига (включая циклические) с указанием счетчика в константе, строковых операций ввода-вывода, pusha, рора, bound, enter и leave, все они функционируют и на микропроцессорах 80186/80188.
Основные особенности микропроцессоров 80186/80188
В этом разделе текста рассмотрены усовершенствования микропроцессоров 80186/80188 или встроенных контроллеров, которые применяются во всех версиях процессоров, кроме, указываемых в сноске. Более подробно функционирование каждой расширенной возможности и особенности для каждой улучшенной версии приведены в следующем разделе.
Генератор тактовых импульсов
Внутренний генератор тактовых импульсов заменяет внешний синхрогенератор 8284А, используемый в микропроцессорах 8086/8088. Это уменьшает число компонентов, находящихся в системе.
INT3/INTA1
S0-S2
SRDY ARDY TEST HOLD HLDA
RES RESET
MCS0-3
PCSO-4
DRQ0 DRQ1
Рис. 16.1. Блок-схема микропроцессора 80186. Обратите внимание, что эта блок-схема подходит и для микропроцессора 80188, за исключением отсутствия вывода BHE/S7 и того, что выводы AD15—AD8 обозначены как А15—А8
Микропроцессоры 80186, 80188 и 80286__________________877
878
Глава 16
Внутренний генератор тактовых импульсов имеет всего три вывода: XI, Х2 и CLKOUT (или в некоторых версиях процессоров: CLKIN, OSCOUT и CLKOUT). Выводы XI (CLK1N) и Х2 (OSCOUT) подключаются к кварцу, частота резонирования которого в два раза больше рабочей частоты микропроцессора. В версии микропроцессоров 80186/80188 с частотой 8 МГц к выводам XI (CLKIN) и Х2 (OSCOUT) подключается кварц на 16 МГц. Микропроцессоры 80186/80188 имеют версии со следующими рабочими частотами: 6, 8, 12, 16 или 25 МГц.
Вывод CLKOUT предназначен для обеспечения системы синхронизирующим сигналом, частота которого в половину меньше частоты кварцевого резонатора и имеет коэффициент заполнения 50% (меандр). Вывод CLKOUT синхронизирует другие устройства в системе и является источником тактирования возможных дополнительных микропроцессоров в системе.
Генератор тактовых импульсов, кроме этих внешних выводов, обеспечивает внутреннюю синхронизацию для внутреннего входного вывода микропроцессора READY, тогда как в системе на базе микропроцессоров 8086/8088 синхронизацию вывода READY осуществляет внешний синхрогенератор.
Программируемый контроллер прерываний
Программируемый контроллер прерываний PIC (Programmable Interrupt Controller) осуществляет внутренние и внешние прерывания и может управлять максимум двумя внешними контроллерами прерываний 8259А. Встроенные программируемые контроллеры прерывания микропроцессоров 80186/80188 при подключении внешнего контроллера 8259А функционируют как ведущего, а 8259А — в качестве ведомого. Модификации микропроцессоров 80С186ЕС и 8ОС188ЕС имеют контроллер прерываний, аналогичный контроллеру 8259А, вместо описываемого в данном тексте кон-гроллера для других версий (XL, ЕА и ЕВ). При работе контроллера прерываний с внешним контроллером 8259А у него имеется пять входов для прерываний: INTO— INT3 и NMI. Следует заметить, что количество имеющихся в наличии прерываний зависит от версии процессора: версия ЕВ имеет 6 входов, а версия ЕС — 16. Наличие внутреннего встроенного контроллера прерываний является расширением двух входов прерываний, имеющихся на микропроцессорах 8086/8088. Во многих системах вполне достаточно пять входов для обслуживания прерываний.
Таймеры
Секция таймеров включает три полностью программируемых 16-разрядных таймера. Таймеры 0 и 1 формируют сигналы для внешнего использования и возбуждаются или от встроенного в микропроцессор 80186/80188 тактового генератора, или от внешнего источника синхронизации. Эти таймеры используются также для подсчета внешних событий. Третий таймер, таймер 2, является внутренним и тактируется от встроенного в процессор тактового генератора. Выходной сигнал таймера 2 генерирует прерывание после указанного числа синхронизирующих импульсов и может обеспечивать синхронизацию других таймеров. Таймер 2 также может использоваться в качестве сторожевого таймера, поскольку его можно программировать на прерывание микропроцессора через определенный промежуток времени.
Модификации микропроцессоров 80С186ЕС и 80С188ЕС имеют дополнительный гаймер, называемый сторожевым (watchdog). Сторожевой таймер имеет 32-разряд-
Микропроцессоры 80186, 80188 и 80286
879
ный счетчик с внутренней синхронизацией от сигнала CLKOUT, имеющего частоту равную половине частоты кварцевого резонатора. Счетчик имеет обратный отсчет времени, и при каждом достижении значения 0 перезагружается и генерирует на выводе WDTOUT импульс длительностью равной четырем периодам сигнала CLKOUT. Этот выход можно использовать для любой цели: его можно соединить перемычкой с входом сброса RES для возврата микропроцессора в исходное состояние или с выводом NMI для вызова прерывания. Следует отметить, что при подключении его к выводам сброса RES или вызова немаскируемого прерывания NMI программное обеспечение системы должно осуществлять периодическое перепрограммирование счетчика, таким образом, чтобы он при счете не достигал нулевого значения. Назначение сторожевого таймера как раз и заключается в возврате системы в исходное состояние или прерывании ее работы в случае зависания или неверной работы программного обеспечения.
Программируемый блок DMA
Программируемый блок DMA имеет два или даже четыре канала DMA в версиях микропроцессоров 80С186ЕС/80С188ЕС. Каждый канал способен передавать данные между ячейками памяти, между памятью и устройством ввода-вывода, а также между устройствами ввода-вывода. Этот встроенный контроллер DMA аналогичен контроллеру DMA 8237, рассмотренному в главе 13. Основное отличие состоит в том, что контроллер DMA 8237 имеет четыре канала DMA, впрочем, как и модификация процессора 80С186ЕС/80С188ЕС.
Программируемый блок выбора кристалла
Блок выбора кристалла (chip-select unit) — это, по сути, встроенный программируемый дешифратор при обращении к памяти или устройствам ввода-вывода. Блок имеет шесть выходных линий для обращения к памяти, семь линий для обращения к устройствам ввода-вывода в модификациях процессора XL и ЕА и десять линий для обращения к памяти или устройствам ввода-вывода в модификациях ЕВ и ЕС.
Линии обращения к памяти в модификациях процессора XL и ЕА разделены на три группы, которые выбирают соответствующие большие области памяти в карте размещения информации в памяти микропроцессоров 80186/80188. Сигнал выбора нижней области памяти предоставляет память для векторов прерываний; сигнал выборки верхней области памяти разрешает память для ее очистки, и сигналы выбора средней области памяти включают в работу до четырех ЗУ с адресами средней области памяти. Граница нижней области памяти начинается с адреса ОООООН, а граница верхней области памяти заканчивается ячейкой с адресом FFFFFH. Размеры областей памяти программируются и с выбором области памяти могут автоматически вводиться такты ожиданий от 0 до 3.
В процессорах модификаций XL и ЕА каждый сигнал выбора устройств ввода-вывода адресует 128-байтный блок пространства ввода-вывода. Программируемая область устройств ввода-вывода начинается с базового адреса ввода-вывода, программируемого пользователем, и далее все семь 128-байтных блоков следуют непрерывно друг за другом.
В процессорах модификаций ЕВ и ЕС имеется вывод выбора верхней и нижней области памяти и восемь универсальных выводов для выбора памяти или устройства
880
Глава 16
ввода-вывода. Другим отличием является то, что в этих версиях встроенных контроллеров 80186/80188 могут программировать такты ожиданий от 0 до 15.
Режимы экономии электроэнергии и выключения питания
Чтобы снизить потребление электроэнергии, режим экономии энергии позволяет разделить тактовую частоту на 4, 8 или 16. Режим экономии энергии стартуется программным обеспечением и заканчивается аппаратно. Режим выключения питания полностью останавливает тактирование, но эта возможность в процессоре версии XL отсутствует. Режим выключения питания начинается исполнением команды ньт и завершается аппаратным прерыванием или перезагрузкой системы.
Блок управления регенерацией памяти
Блок управления регенерацией памяти генерирует адрес строки регенерации с программируемым интервалом. Однако блок управления регенерацией не мультиплексирует адрес для динамического ОЗУ — это все еще возложено на разработчика системы. Регенерируемый адрес подается на запоминающую систему в конце программируемого интервала регенерации вместе с управляющим сигналом RFSH. Запоминающая система должна выполнить цикл регенерации в период действия управляющего сигнала RFSH. Более подробно процедура регенерации памяти рассмотрена далее в разделе, поясняющем блок выбора кристалла.
Схема расположения выводов
На рис. 16.2 приведена схема расположения выводов микропроцессора 80C186XL. Примечание: Микропроцессор 80C186XL находится в 68-выводном корпусе с безвы-водным кристаллодержателем, или иначе LCC (Leadless Chip Carrier), или в корпусе
Вид сверху
Вид снизу
SO SI S2 ARDY CLKOUT
RESET В
X2 X1
Vss ALE/QSO RD/QSMD WR/QS1 □
BH£ □ A19/S6 □ A18/S5 □ A17/S4 □
JJULJUUUUULJUUULJUUU^L _
□ LCS
С PCS6/A2 EZ PCS5/A1 □ PCS4 □ PCS3 С PCS2 EZ PCS1 □ Yss_ EZ PCS0 CZ RES □ TMROUT1 EZ TMROUTO □ TMRIN1 C TMRINO □ DRQ1
Метка вывода номер 1
Рис. 16.2. Схема расположения выводов микропроцессора 80186
□
Микропроцессоры 80186, 80188 и 80286
881
Вид снизу на корпус PGA
®®®@®@@®@@®
®@
®®®@®®®®®®@ ®®®®®®®®® /
Вид снизу на корпус LCC
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
ппппппппппппппппп
34С		□ 52
33 Е		□ 53
32 С		□ 54
31 С		□ 55
зоЕ		□ 56
29 Е		□ 57
28 Е		□ 58
27Е		□ 59
26 Е		□ 60
25Е		□ 61
24Е		□ 62
23 Е		□ 63
22 Е		□ 64
21Е		□ 65
20Е		□ 66
19Е		□ 67
18Е		□ 68
wmwwwW
Рис. 16.3. Вид снизу на корпус типа PGA и LCC микропроцессора 80C188XL
с матричным расположением штырьковых выводов, или иначе PGA (pin grid array). Корпуса процессоров типа LCC и PGA показаны на рис. 16.3.
Описание выводов и соответствующих сигналов
Далее приводится описание каждого вывода микропроцессора и обращается внимание на различия между процессорами 80C186XL и 80C188XL. Некоторые остальные версии микропроцессоров описаны далее в этой главе.
□	Vcc
Вывод, предназначенный для подачи *на него питающего напряжения +5,0 В ± 10% от источника постоянного тока.
□	Vss
Вывод, к которому подключают системную "землю".
□	XI и Х2
К этим выводам обычно подключают кварцевый резонатор, который предназначен для функционирования с внутренним тактовым генератором. Внешний тактирующий сигнал можно соединять с выводом XI. Внутренний тактовый генератор работает с частотой, равной половине частоты кварцевого резонатора или внешнего тактирующего сигнала. Обратите внимание, что эти выводы в некоторых версиях микропроцессоров 80186/80188 обозначаются как CLKIN (XI) и OSCOUT (Х2).
□	CLKOUT
Этот вывод предназначен для обеспечения тактовыми импульсами периферийное оборудование системы. Частота сигнала на этом выводе равна половине частоты кварцевого резонатора или внешнего тактирующего сигнала, а коэффициент заполнения выходных импульсов равен 50% (меандр).
882
Глава 16
□	RES
Сигнал, поданный на этот вывод, сбрасывает (переводит в исходное состояние) микропроцессор 80186/80188. Для правильного выполнения сброса процессора сигнал на выводе RES, после подачи питания, должен удерживаться на низком логическом уровне не менее 50 мс. Этот вывод часто подсоединяется к RC-цепочке, с помощью которой в момент включения питания осуществляется сброс процессора в исходное состояние. Адрес ячейки (FFFF0H) сброса процессора идентичен с аналогичной ячейкой микропроцессора 8086/8088.
□	RESET
Сигнал высокого логического уровня на этом выводе сопровождает перевод процессора в исходное состояние. Сигнал предназначен для сброса периферийных устройств системы для их инициализации, когда сигнал на выводе RES микропроцессора имеет низкий логический уровень.
□	TEST
Этот вывод соединяется с выходом готовности BUSY цифрового сопроцессора 80187 и предназначен для проверки этой готовности. Вывод TEST опрашивается с помощью команды ожидания готовности сопроцессора wait.
□	TMRIN0 и TMRIN1
Эти выводы используются для подачи на них тактирующих сигналов для таймеров 0 и 1 с внешних источников синхронизации.
□	TMROUT0 и TMROUT1
На этих выводах появляются выходные сигналы с двух программируемых таймеров 0 и 1.
□	DRQ0 и DRQ1
На эти выводы подаются сигналы запроса выполнения процедуры DMA для соответствующего канала 0 и 1.
□	NMI
Вывод запроса на немаскируемое прерывание. Процедура запускается положительным фронтом сигнала, который после этого должен оставаться активным. При активизации немаскируемого прерывания используется вектор прерывания 2.
□	INTO, INTI, INT2/INTA0 и INT3/INTAI
Все эти выводы относятся к маскируемому прерыванию. Активные сигналы на этих выводах должны иметь высокий логический уровень. Кроме того, выводы могут быть запрограммированы на активизацию от уровня или фронта входного сигнала. При отсутствии внешнего контроллера прерываний 8259 все четыре вывода предназначаются для запроса на маскируемое прерывание, а при наличии такого контроллера только два из них.
□	A19/ONCE, А18, А17, А16
Мультиплексируемые выводы, предназначенные для выдачи либо адреса А19— А16, либо состояния процессора S6—S3. Следует отметить, что линии индикации состояния процессора S6—S3 находятся на соответствующих трех выводах адреса
Микропроцессоры 80186, 80188 и 80286
883
А18—А16 и в системе не функционируют, а используются только для тестирования процессора при его изготовлении. Вывод А19 является вводом для функции ONCE при сбросе. Если при сбросе процессора сигнал ONCE имеет низкий логический уровень, тогда микропроцессор входит в режим тестирования.
□	AD15-AD0
Мультиплексированные выводы шины адреса и данных. Во время такта Т1 микропроцессор 80186 размещает на этих выводах адрес А15—АО, а в течение трех тактов Т2, ТЗ и Т4 микропроцессор 80186 использует эти выводы в качестве шины данных для сигналов D15—D0. Обратите внимание, что в 8-разрядном микропроцессоре 80188 имеются несколько иные выводы AD7—AD0 и А15—А8.
□	ВНЕ
Сигнал низкого логического уровня на этом выводе указывает, что достоверные данные передаются по старшей половине шины данных D15—D8.
□	ALE
Выходной стробирующий сигнал разрешения адресной защелки ALE (address latch enable) показывает, что мультиплексированная шина микропроцессоров содержит адресную информацию. Активный сигнал высокого логического уровня на этом выводе должен появляться на полцикла раньше, чем аналогичный сигнал в микропроцессоре 8086. Он используется для демультиплексирования мультиплексированных шин адреса/данных и адреса/состояния. Хотя некоторые разряды состояния процессора S6—S3 и не используются в системе, все равно они должны быть разделены с соответствующими адресными сигналами А19—А16.
□	WR
Сигнал низкого логического уровня на этом выводе WR (write) используется для стробирования данных при операциях записи данных в память или устройство ввода-вывода.
□	RD
Сигнал низкого логического уровня на этом выводе RD (read) используется для стробирования данных при операциях чтения данных из памяти или устройства ввода-вывода.
□	ARDY
Входной сигнал высокого логического уровня на выводе ARDY (ascynchronous READY) информирует микропроцессоры 80186/80188 о готовности памяти или устройства ввода-вывода для выполнения операций записи или чтения.
Микропроцессор работает в обычном режиме, если этот вывод подсоединить к +5,0 В, и вставляет такты ожидания при заземлении вывода.
□	SRDY
Входной сигнал на выводе SRDY (synchronous READY) синхронизируется с системным тактовым сигналом, для обеспечения согласования по времени с вводом сигнала готовности. Вывод SDRY, аналогично выводу ARDY, подключается к напряжению +5,0 В, для того чтобы процессор не вставлял в циклы обмена данными такты ожидания.
884
Глава 16
О LOCK
Выходной сигнал на этом выводе управляется префиксом блокировки шины данных LOCK. При добавлении к команде префикса LOCK вывод LOCK переходит на низкий логический уровень в течение выполнения команды.
□	S2, S1 и SO
На эти выводы выставляются биты состояния процессора (status bits), предоставляя системе информацию о выполнении им того или иного цикла шины. Различные кодовые комбинации битов состояния процессора и соответствующие им циклы шины приведены в табл. 16.2.
Таблица 16.2. Биты состояния процессора S2, S1 и SO
S2	S1	so	Состояние процессора
0	0	0	Подтверждение прерывания
0	0	1	Чтение из порта ввода-вывода
0	1	0	Запись в порт ввода-вывода
0	1	1	Останов
1	0	0	Выборка кода операции
1	0	1	Чтение из памяти
1	1	0	Запись в память
1	1	1	Пассивное
□	UCS
Выходной сигнал низкого логического уровня на выводе UCS (upper-memory chip select) обеспечивает выбор верхней части карты размещения информации в памяти. Этот сигнал программируется для разрешения работы области памяти размером от 1 до 256 Кбайт с конечной ячейкой, имеющей адрес FFFFFH. Обратите внимание, что для процессоров версий ЕВ и ЕС этот вывод программируется несколько иначе и разрешает работать области памяти размером от 1 Кбайта до 1 Мбайта.
□	LCS
Выходной сигнал низкого логического уровня на выводе LCS (lower-memory chip select) обеспечивает выбор нижней части карты памяти процессора, начинающейся с ячейки 00000Н. Этот вывод программируется для выбора памяти размером от 1 до 256 Кбайт. Обратите внимание, что для процессоров версий ЕВ и ЕС этот вывод функционирует иначе и разрешает область памяти в пределах от 1 Кбайта до 1 Мбайта.
□	MCS0-MCS3
Выходные сигналы низкого логического уровня на выводах MCS0 — MCS3 (middle-memory chip select) обеспечивают выбор четырех запоминающих устройств в средней области памяти. Выводы программируются для выбора блока
Микропроцессоры 80186, 80188 и 80286 885
памяти размером от 8 до 512 Кбайт для каждого из четырех устройств. Обратите внимание, что эти выводы отсутствуют в процессорах версий ЕВ и ЕС.
П PCS0-PCS4
Пять выходных сигналов низкого логического уровня на выводах PCSO — PCS4 (peripheral chip select) предназначены для выбора периферийных устройств. Обратите внимание, что эти выводы отсутствуют в процессорах версий ЕВ и ЕС.
□	PCS5/A1 и PCS6/A2
Эти выводы программируются как линии выбора периферийных устройств или как внутренне защелкиваемые адресные биты А2 и А1. Обратите внимание, что эти выводы отсутствуют в процессорах версий ЕВ и ЕС.
П DT/R
Сигнал на этом выводе управляет направлением передачи данных через буферы шины данных, если они имеются в системе.
П DEN
Сигнал низкого логического уровня на выводе DEN (data enable) разрешает передачу данных через внешние буферы шины данных.
Характеристики процессора по постоянному току
Перед тем, как разрабатывать схему подключения процессора или использовать его, необходимо узнать характеристики процессора по постоянному току. Микропроцессорам 80С1880С188 требуется ток в пределах 415—600 мА от источника постоянного тока. Нагрузочная способность каждого выходного вывода имеет значение равное 3,0 мА для сигнала низкого логического уровня и -2 мА для сигнала высокого логического уровня.
Временные соотношения сигналов микропроцессоров 80186/80188
Временная диаграмма для микропроцессора 80186 показана на рис. 16.4. Представленная диаграмма идентична и для микропроцессора 80188, за исключением мультиплексированной шины адреса/данных, в которой имеются линии AD7—AD0 вместо AD15—AD0, и отсутствия в процессоре 80188 сигнала ВНЕ.
Базовый цикл шины микропроцессоров состоит из четырех периодов синхронизации, как и в микропроцессорах 8086/80186. Для выполнения цикла шины процессору, работающему на частоте 8 МГц, требуется 500 нс, а для версии процессора с частотой 16 МГц — 250 нс. Временные диаграммы для микропроцессоров 80186/80188 и 8086/8088 мало чем отличаются. Самым существенным отличием является то, что в диаграммах микропроцессоров 80186/80188 сигнал ALE устанавливается на полпериода тактового сигнала раньше, чем в диаграммах процессоров 8086/8088.
886
Глава 16
Время доступа к памяти
Одной из наиболее важных характеристик во временной диаграмме любого микропроцессора является время доступа к памяти. Вычисление времени доступа к памяти для микропроцессоров 80186/80188 идентично вычислению этого параметра для микропроцессоров 8086/8088. Следует напомнить, что время доступа — это время, предоставляемое памяти или устройству ввода-вывода для передачи данных на микропроцессор после передачи им адреса памяти или устройства ввода-вывода.
После тщательного рассмотрения временной диаграммы можно заметить, что адрес на адресной шине появляется с задержкой времени TCLAV после начала такта Т1. Максимальное значение параметра TCLAV для версии процессора с тактовой частотой 8 МГц составляет 44 нс (см. табл. 16.3). Выборка данных с шины данных производится в конце такта ТЗ, однако перед фиксацией их требуется время на установку данных на шину, определяемое как TDVCL. Время TDVCL для обоих микропроцессоров составляет 20 нс. Следовательно, время доступа равняется трем периодам
Рис. 16.4. Временные диаграммы для микропроцессоров 80186/80188: выполнение цикла чтения (а)
Микропроцессоры 80186, 80188 и 80286
887
тактовых импульсов за минусом времени TCLAV и TDVCL. Таким образом, время доступа для микропроцессора с тактовой частотой 8 МГц составляет: 375 нс — 44 нс - 20 нс; или 311 нс. Для версии микропроцессора с тактовой частотой 16 МГц время доступа вычисляется так же, но при этом время TCLAV составляет 25 нс, а время TDVCL равно 15 нс.
Примечание: 1. Линии состояния процессора не активны только до такта Т4.
2. Сигнал INTA формируется на один такт позже в подчиненном режиме.
Рис. 16.4. Временные диаграммы для микропроцессоров 80186/80188: выполнение цикла записи и подтверждения прерывания (б)
888
Глава 16
Таблица 16.3. Временные параметры микропроцессора 80188
Обозначение	Характеристика	80188 (8 МГц)		80188-6 (6 МГц)		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
Основные временные характеристики процессоров 80186						
TCLAV	Допустимая задержка до выдачи адреса	5	44	5	63	CL = = 20—100 пф для всех выводов
TCLAX	Время фиксации адреса	10		10		
TCLAZ	Задержка перевода шины адреса в состояние высокого импеданса	TCLAX	35	TCLAX	44	
TCHCZ	Задержка перевода линий управления в состояние высокого импеданса		45		45	
TCHCV	Задержка линий управления (после состояния высокого импеданса)		55		76	
TLHLL	Длительность сигнала ALE	TCLCL - 35		TCLCL - 35		
TCHLH	Задержка до активизации сигнала ALE		35		44	
TCHLL	Задержка до деактивизации сигнала ALE		35		44	
TLLAX	Время фиксации адреса при пассивном сигнале ALE	TCHCL- 25		TCHCL- 30		
TCLDV	Допустимая задержка данных	10	44	10	55	
TCLDOX	Время фиксации данных	10		10		
TWHDX	Время на фиксацию данных после снятия сигнала WR	TCLCL - 40		TCLCL - 50		
TCVCTV	Задержка 1 управления до активизации сигнала	5	70	5	87	
TCHCTV	Задержка 2 управления до активизации сигнала	10	55	10	76	
TCVCTX	Задержка управления до деактивизации сигнала	5	55	5	76	
Микропроцессоры 80186, 80188 и 80286
889
Таблица 16.3 (продолжение)
Обозначение	Характеристика	80188 (8 МГц)		80188-6 (6 МГц)		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
TCVDEX	Задержка до дезактивизации сигнала DEN (не в цикле записи)		70		87	
TAZRL	Задержка активизации сигнала READ после перевода шины адреса в состояние высокого импеданса	0		0		
TCLRL	Задержка активизации сигнала RD	10	70	10	87	
TCLRH	Задержка деактивизации сигнала RD	10	55	10	76	
TRHAV	Время до следующей активизации шины адреса после деактивизации сигнала RD	TCLCL - 40		TCLCL - 50		
TCLHAV	Допустимая задержка сигнала HLDA	10	50	10	67	
TRLRH	Длительность сигнала RD	2TCLCL - 50		2TCLCL - 50		
TWLWH	Длительность сигнала WR	2TCLCL - 40		2TCLCL - 40		
TAVAL	Время до перевода сигнала ALE в низкое состояние с момента, когда установлен действительный адрес	TCLCH - 25		TCLCH-45		
TCHSV	Задержка до активизации линий состояния	10	55	10	76	
TCLSH	Задержка до деактивизации линий состояния	10	55	10	76	
TCLTMV	Задержка таймера		60		75	100 пф макс.
TCLRO	Задержка до сброса		60		75	
TCHQSV	Задержка состояния очереди		35		44	
890
Глава 16
Таблица 16.3 (окончание)
Обозначение	Характеристика	80188 (8 МГц)		80188-6 (6 МГц)		Условия теста
		Мин., нс	Макс., нс	Мин., нс	Макс., нс	
Временные характеристики сигналов выбора кристалла процессора 80186
TCLCSV	Задержка до активизации сигналов выбора кристалла		66		80	
TCXCSX	Удержание сигналов выбора кристалла после деактивизации команды	35		35		
TCHCSX	Задержка деактивизации сигналов выбора кристалла	5	35	5	47	
Временные характеристики
TDVCL	Установка данных (A/D)	20				
TCLDX	Фиксация данных (A/D)	10				
TARYHCH	Время установки* активности сигнала AREADY	20				
TARYLCL	Время установки деактивизации сигнала AREADY	35				
TCHARYX	Время фиксации сигнала AREADY	15				
TSRYCL	Время установки перехода сигнала SREADY	35				
TCLSRY	Время фиксации перехода сигнала SREADY	15				
THVCL	Установка* сигнала HOLD	25				
TINVCH	Установка* сигналов INTR, NMI, TEST , TMRINO, TMRIN1	25				
TINVCL	Установка сигналов DRQO, DRQ1	25				
Чтобы гарантировать распознавание в следующих тактах.
Микропроцессоры 80186, 80188 и 80286
891
16.2. Программирование расширенных возможностей микропроцессоров 80186/80188
В этом разделе подробно описывается программирование и функционирование всех расширенных возможностей всех версий (XL, ЕА, ЕВ и ЕС) микропроцессоров 80186/80188. В следующем разделе подробно разбирается схема системы с применением процессора 80С188ЕВ, в которой используются многие из рассмотренных здесь возможностей процессора. Единственно, что из новых усовершенствований здесь не обсуждается, — это встроенный тактовый генератор, который был достаточно рассмотрен в предыдущем разделе.
Блок управления периферией
Все встроенные периферийные устройства управляются набором из 16-разрядных регистров, размещенных в блоке управления периферией, или, иначе РСВ (peripheral control block). Этот блок (рис. 16.5), по сути, является набором из 256 регистров, расположенных в пространстве устройств ввода-вывода или памяти. Следует заметить, что блок управления периферией применен в процессорах версий XL и ЕА. Далее в этом разделе приводятся пояснения и описания процессоров версий ЕВ и ЕС.
Блок управления периферией при сбросе микропроцессоров 80186/80188 автоматически располагается в верхней части карты распределения устройств ввода-вывода по адресам ввода-вывода FF00H—FFFFH. В большинстве случаев блок РСВ остается в этой области, но в любое время он может быть перемещен и в другую область пространства памяти или устройств ввода-вывода. Перемещение выполняется посредством замены содержимого регистра перемещения блока (рис. 16.6), расположенного в ячейках по относительным адресам FEH—FFH.
При возврате микропроцессоров 80186/80188 в исходное состояние в регистр записывается значение 20FFH. Таким образом, блок РСВ размещается по адресам ввода-вывода FF00H—FFFFH. Для того чтобы переместить блок РСВ, пользователь должен, применив команду оит, передать на адрес ввода-вывода FFFEH новую битовую комбинацию. Например, для перемещения блока РСВ в ячейки памяти 20000Н— 200FFH в регистр перемещения блока РСВ, имеющего адрес ввода-вывода FFFEH, посылается код 1200Н. Обратите внимание на то, что бит М/Ю, отвечающий за выбор пространства памяти или устройств ввода-вывода, имеет высокий логический уровень, а код 2000Н выбирает адрес памяти 20000Н в качестве базового адреса для блока РСВ. Следует отметить, что все обращения к блоку РСВ должны быть с помощью слов, поскольку он имеет 16-разрядную организацию регистров. В примере 16.1 приводится программное обеспечение по перемещению блока РСВ в ячейки памяти с адресами 20000Н—200FFH. Обратите внимание на то, что для программирования микропроцессора 16-разрядного процессора 80186 может использоваться 8- или 16-разрядная передача данных, а вот в 8-разрядном микропроцессоре 80188 никогда не следует применять команду out dx,ax, поскольку для ее выполнения требуются дополнительные такты.
892
Глава 16
Относительные
Регистр перемещения блока управления периферией	адреса FEN
	
Регистры канала 1	DAH
контроллера DMA	DOH
	
Регистры канала 0	САН
контроллера DMA	СОН
	
Регистры управления блока	А8Н
выбора кристалла	АОН
	
Регистры управления	66Н
таймера 2	60Н
Регистры управления	5ЕН
таймера 1	58Н
Регистры управления	56Н
таймера 0	50Н
	
Регистры управления	ЗЕН
контроллера прерываний	20Н
Рис. 16.5. Блок управления периферией микропроцессоров 80186/80188
15
ЕТ	SL	X	м/ю	I	1	I	1	I	I	I	1	1	1	I Адрес перемещения блока управления периферией (РСВ) (А1в - AJ 	i	i	i	i	i	i	i	i	i	i	i	
ЕТ - ESC-прерывание, если бит ЕТ = 1, и нет прерывания, если ЕТ = 0
SL - Режим ведомого (slave), если бит SL установлен, и режим ведущего (master), если бит SL сброшен M/IO - Пространство памяти или устройств ввода-вывода
X - Не используется
Рис. 16.6. Формат регистра перемещения блока управления периферией
Микропроцессоры 80186, 80188 и 80286
893
Пример 16.1. Программа перемещения блока управления периферией РСВ
0100	ВА FFFE	MOV	DX,0FFFEH	; адрес регистра перемещения блока РСВ
0103	В8 1200	MOV	AX,1200H	; код для нового размещения блока
0106	ЕЕ	OUT	DX, AL	; эта же операция может быть
; выполнена командой OUT DX,AX
Прерывания в микропроцессорах 80186/80188
Прерывания в микропроцессорах 80186/80188 выполняются идентично прерываниям микропроцессоров 8086/8088, за исключением дополнительных векторов прерывания для некоторых внутренних устройств. Полный список резервируемых векторов прерывания приводится в табл. 16.4. Первые пять векторов идентичны векторам прерывания микропроцессоров 8086/8088.
Таблица 16.4. Векторы прерывания процессоров 80186/80188
Наименование	Тип	Адрес	Приоритет
Ошибка деления на ноль	0	00000Н—00003Н	1
Пошаговый режим (трассировка)	1	00004Н—00007Н	1А
Немаскируемое прерывание по входу NMI	2	00008Н—оооовн	1
Точка останова	3	0000CH—0000FH	1
Переполнение	4	0001 ОН—0001 зн	1
Команда bound	5	00014Н—00017Н	1
Неиспользуемый код операции	6	00018Н—0001 ВН	1
ESC-код операции	7	0001 СН—0001FH	1
Таймер 0	*8	00020Н—00023Н	2А
Резерв	9	00024Н—00027Н	—
DMA0	10	00028Н—0002ВН	4
DMA 1	11	0002СН—0002FH	5
INTO	12	00030Н—00033Н	6
INT1	13	00034Н—00037Н	7
INT2	14	00038Н—0003ВН	8
INT3	15	0003СН—0003FH	9
Сопроцессор 80187	16	00040Н—00043Н	1
Резерв	17	00044Н—00047Н	—
Таймер 1	18	00048Н—0004ВН	2В
Таймер 2	19	0004СН—0004FH	2С
Приемник последовательных данных (только для процессора версии ЕВ)	20	00050Н—00053Н	ЗА
894
Глава 16
Таблица 16.4 (окончание)
Наименование	Тип	Адрес	Приоритет
Передатчик последовательных данных	21	00054Н—00057Н	ЗВ
(только для процессора версии ЕВ)
Обратите внимание, что наивысший уровень приоритета приведенных в таблице прерываний — это уровень 1, а наименьший — 9. Кроме того, некоторые прерывания имеют один и тот же уровень приоритета, а блок последовательной передачи данных находится только в процессорах версий ЕВ и ЕС.
Прерывание по команде проверки выхода за границы массива BOUD запрашивается в случае нахождения границы индексного регистра за пределами установленных в памяти значений. При выполнении микропроцессорами 80186/80188 неопределенного кода операции происходит прерывание по вектору неиспользуемого кода операции. Это — важно, когда программа начинает работать неправильно.
Следует заметить, что прерывание из-за неиспользуемого кода операции может вызвать любая команда, основное, чтобы она не была включена в набор команд ассемблера. На микропроцессорах Pentium Pro/Pentium 4 и некоторых предыдущих микропроцессорах Intel при получении команды с кодом 0F0BH или 0FB9H программа обращается к процедуре, адрес которой хранится в векторе неиспользуемого кода операции.
Прерывание по ESC-коду операции происходит при выполнении ESC-команды с кодом D8H—DFH. Это происходит только в том случае, когда в регистре перемещения блока управления периферией будет установлен бит ЕТ (escape trap). Если произошло ESC-прерывание, то адрес, сохраненный при этом в стеке, указывает либо на ESC-команду, либо на префикс переопределения сегмента.
Внутренние аппаратные прерывания для последующего выполнения должны быть разрешены с помощью флага разрешения прерывания 1F и не замаскированы запросы на прерывание. Следует напомнить, что флаг 1F устанавливается командой sti, а сбрасывается сы. Остальные внутренние прерывания рассмотрены в этом разделе далее при обсуждении таймеров и контроллеров DMA.
Контроллер прерываний
Контроллер прерываний внутри микропроцессоров 80186/80188 является достаточно сложным устройством. Контроллер имеет пять входов внешних запросов прерываний INTO—INT3 и NMI, два внутренних входа от двух каналов контроллера DMA и три от соответствующих внутренних таймеров. На рис. 16.7 представлена блок-схема структуры прерываний, которой управляет встроенный программируемый контроллер прерываний микропроцессоров 80186/80188.
Контроллер имеется в процессорах версий XL, ЕА и ЕВ, а в версии ЕС находится точный эквивалент пары устройств 8259А, рассмотренных в главе 12. Кроме того, в процессорах версии ЕВ два входа запросов прерываний, поступающие от соответствующих каналов контроллера DMA, заменены входами от встроенного устройства последовательного приема и передачи информации.
Контроллер прерываний работает в двух режимах: в режиме ведущего (master) и режиме ведомого (slave) контроллера. Следует отметить, что выбор режима работы в
Микропроцессоры 80186, 30188 и 80286
895
процессорах версий XL и ЕА определяется битом SL регистра перемещения блока управления периферией, имеющего относительный адрес FEH.
Таймер О Таймер 1 Таймер 2 DMA 0 DMA 1 INTO INT1 INT2 INT3 NMI
Рис. 16.7. Программируемый контроллер прерываний микропроцессоров 80186/80188 в режиме ведущего (master) контроллера
Кроме того, контроллер прерываний может работать с внешними программируемыми контроллерами прерываний 8259А в режиме каскадирования. Режим работы устанавливается разрядом регистра управления прерываний (версии ЕВ и ЕС), называемым разрядом CAS (Cascade). Если разряд CAS имеет высокий логический уровень, то контроллер прерываний работает в режиме каскадирования с внешними программируемыми контроллерами прерываний 8259А (рис. 16.8), а если разряд CAS имеет низкий логический уровень, то выбирается только внутренний контроллер прерывания. Поскольку в микропроцессорах 80186/80188 имеется достаточное количество входов для запросов на прерывание, поэтому режим каскадирования, как правило, используется редко.
В этой части текста не приводятся подробности программирования контроллера прерываний. Она ограничивается обсуждением внутренней структуры контроллера прерываний. Программирование и практическое применение рассматриваются в разделах с описанием таймера и контроллера DMA.
896
Глава 16
Рис. 16.8. Схема соединения микропроцессора 80С188ЕВ и двух программируемых контроллеров прерываний 8259А. Обратите внимание, что на схеме показаны только существенные линии соединения
Регистры контроллера прерываний
На рис. 16.9 показаны регистры контроллера прерываний в режиме ведущего (master). Эти регистры размещены в блоке управления периферией, начиная с относительного адреса 22Н. В процессоре версии ЕС, которая совместима с программируемым контроллером 8159А, для режима ведущего контроллера применяются порты контроллера прерываний с относительными адресами ООН и 02Н, а для ведомого режима — порты 04Н и 06Н. В процессоре версии ЕВ контроллер прерываний программируется по относительному адресу 02Н. Следует заметить, что процессор версии ЕВ имеет дополнительный вход прерываний INT4.
Обратите внимание, что для ведомого режима работы (slave) используемые регистры немного отличаются от регистров, применяемых для ведущего (master) режима кон-
Микропроцессоры 80186, 80188 и 80286
897
троллера. В частности, не используются регистры управления внешним прерыванием с входов INT2 и INT3, а также два регистра опроса, но зато добавляется регистр вектора прерывания.
Относительные адресе	Процессоры версий XL и ЕА
ЗЕН	Регистр управления прерыванием с входа INT3
ЗСН	Регистр управления прерыванием с входа INT2
ЗАН	Регистр управления прерыванием с входа INT1
38Н	Регистр управления прерыванием с входа INTO
36Н	Регистр управления прерыванием от канала 1 контроллера DMA
34Н	Регистр управления прерыванием от канала 0 контроллера DMA
32Н	Регистр управления прерыванием от таймера
ЗОН	Регистр состояния контроллера прерываний
2ЕН	Регистр запросов прерываний
2СН	Регистр обслуживания прерываний
2АН	Регистр маски приоритета
28Н	Регистр масок
26Н	Регистр состояния опроса
24Н	Регистр опроса
22Н	Регистр завершения прерывания
	
Относительные адреса	Процессоры версии ЕВ
1ЕН	Регистр управления прерыванием с входа INT3
1СН	Регистр управления прерыванием с входа INT2
1АН	Регистр управления прерыванием с входа INT1
18Н	Регистр управления прерыванием с входа INTO
16Н	Регистр управления прерыванием с входа INT4
14Н	Регистр управления прерыванием от устройства последовательной передачи данных
12Н	Регистр управления прерыванием от таймера
ЮН	Регистр состояния контроллера прерываний
ОЕН	Регистр запросов прерываний
ОСН	Регистр обслуживания прерываний
ОАН	Регистр маски приоритета
08Н	Регистр масок
06Н	Регистр состояния опроса
04Н	Регистр опроса
02Н	Регистр завершения прерывания
	
Рис. 16.9. Адреса ввода-вывода регистров управления контроллера прерываний процессоров 80186/80188
Каскадное включение с внешними контроллерами прерывания
Контроллер прерываний при работе в режиме каскадирования для расширения количества обрабатываемых прерываний использует до двух программируемых контроллеров прерываний 8259А. На рис. 16.8 показана схема подключения микропроцессоров 80186/80188 к двум внешним контроллерам прерываний. В данной схеме
29 Зак. 384
898
Глава 16
выводы INTO и INTI используются для соединения с выходами INT запроса прерываний контроллеров 8259А, а выводы INT2 (INTA0) и INT3 (INTA1) используются для подключения к двум соответствующим выводам подтверждения прерываний INTA внешних контроллеров.
Регистры управления прерываниями
Регистры управления прерываниями имеются в обоих режимах работы, каждый из них управляет одним источником прерывания. На рис. 16.10 приведен формат для каждого регистра управления прерываниями. Бит маски MASK разрешает, если он сброшен, или запрещает (маскирует), если установлен, прерывание от соответствующего источника, а биты приоритетов Р2—РО устанавливают соответствующий уровень приоритета. Наивысший уровень приоритета равен ООО, а наименьший — 111. Установка разряда CAS используется для разрешения режима каскадирования, а
Регистр управления прерыванием от таймера и устройства последовательной передачи данных 15	О
												м А S К	Р2	Р1	РО
Регистр управления прерыванием с входа INT2, INT3 и INT4 15	О
											L V L	М А S К	Р2	Р1	РО
Регистр управления прерыванием с входа INTO и INT1
15	О
									S F N М	С А S	L V L	М А S К	Р2	Р1	РО
Р2 - РО - Биты уровня приоритета
MASK - Бит маски прерывания, если он сброшен, то прерывание разрешено, если установлен - запрещено (замаскировано)
LVL - Бит выбора чувствительности линий запроса
О - прерывание по перепаду
1 - прерывание по уровню
CAS - Бит управления режимом каскадирования
1 - каскадирование О-нет
SFNM - Бит выбора режима вложенности приоритетов запросов на прерывание
Рис. 16.10. Регистры управления прерываниями
Микропроцессоры 80186, 80188 и 80286
899
сброс разряда выбирает режим работы только одного внутреннего контроллера прерываний. Установка бита SFNM (special fully nested mode) выбирает режим вложенности приоритетов запросов на прерывание ведущего и ведомого контроллеров. Этот режим позволяет встроенному и внешнему контроллеру 8289А организовать определенную структуру приоритетов.
Регистр запросов прерываний
Регистр запросов прерываний содержит отображение всех источников прерываний в каждом режиме работы. При запросе прерывания устанавливается соответствующий бит запроса прерывания, даже при его маскировании. Всякий раз, как только микропроцессор 80186/80188 подтверждает прерывание, запрос снимается. На рис. 16.11 приведен формат регистра запросов прерываний.
Регистр запросов прерываний (для процессоров версии ЕВ)
15	0
								1 N т 3	1 N т 2	1 N т 1	I N т 0	I N т 4	S Е R		т I м
Регистр запросов прерываний (для процессоров версий XL и ЕА) 15	0
								I N т 3	I N т 2	I N т 1	I N т 0	D М А 1	D М А 0		т I м
INT4 - INTO - Биты индикации необслуженных прерываний от внешнего источника с соответствующего входа
SER - Биты индикации необслуженного прерывания от устройства последовательной передачи данных DMA1 - DMA0 - Биты индикации необслуженных прерываний от соответствующего канала контроллера DMA TIM - Биты индикации необслуженного прерывания от таймера
Рис. 16.11. Регистр запросов прерываний
Регистр масок и регистр маски приоритета
Регистр масок имеет точно такой же формат, как и регистр запросов прерываний, показанный на рис. 16.11. Если источник замаскирован, то будет установлен соответствующий бит регистра масок, если же прерывание не замаскировано, то бит будет сброшен. Считывание из регистра масок производится для определения замаскированных и незамаскированных источников прерываний. Маскирование источника осуществляется установкой бита маски MASK источника прерывания в его регистре управления прерыванием. Регистр маски приоритета, показанный на рис. 11.12, показывает уровень приоритета, который может быть обслужен микропроцессорами 80186/80188 в данный момент. Уровень приоритета прерываний содержится в битах Р2—Р0. Установленное в регистре значение будет маскировать все источники прерывания, имеющие меньший уровень приоритета. Для того чтобы не
900
Глава 16
было необслуживаемых прерываний, в регистр записывают значение 111, для разрешения прерываний с любым уровнем приоритета.
Регистр маски приоритета
15	О
													Р2	Р1	РО
Р2 - РО - Биты уровня приоритета
Рис. 16.12. Регистр маски приоритета
Регистр обслуживания прерываний
Регистр обслуживания прерываний имеет такой же формат, как и регистр запросов прерываний, показанный на рис. 16.11. Если микропроцессор 80186/80188 подтверждает прерывание и переходит к процедуре обслуживания прерывания, то в регистре устанавливается бит, соответствующий источнику прерывания. По окончании прерывания подпрограмма обслуживания прерывания должна завершаться сбросом этого бита.
Регистр опроса и регистр состояния опроса
Регистр опроса и регистр состояния опроса имеют одинаковый формат, который приведен на рис. 16.13. Эти регистры имеют бит IREQ, который указывает на необ-служенное прерывание. Этот бит устанавливается при получении запроса прерывания с достаточным приоритетом и сбрасывается после подтверждения прерывания. Номер вектора прерываний, указанный битами VT4—VT0, соответствует необслу-женному прерыванию с наивысшим приоритетом.
Регистр опроса и состояния опроса
15	О
I R Е Q											V т 4	V т 3	V т 2	V т 1	V т 0
IREQ - Бит, указывающий на наличие необслуженного прерывания VT4 - VT0 - Биты типа вектора содержат тип вектора необслуженного (отложенного) прерывания с наивысшим приоритетом
Рис. 16.13. Регистр опроса и регистр состояния опроса
Регистр опроса и регистр состояния опроса могут показаться идентичными, поскольку они содержат одну и ту же информацию. Тем не менее чтение из них приводит к различному результату. При считывании из регистра опроса выполняется цикл подтверждения прерывания, контроллер прерываний корректирует содержимое регистра запросов прерываний, регистра обслуживания, регистра опроса и состояния опроса, как в случае выполнения нормального цикла подтверждения прерывания. При считывании же из регистра состояния опроса передается только состояние битов опроса без изменения какого-либо регистра контроллера прерываний. Эти
Микропроцессоры 80186, 80188 и 80286 QQ1
регистры используются только в режиме ведущего (master) контроллера, а в режиме ведомого (slave) нет.
Регистр завершения прерывания
Регистр завершения прерывания или EOI (end-of-interrupt) вызывает завершение прерывания, когда выполняется его запись по программе. На рис. 16.14 показано содержимое регистра завершения прерывания для режима ведущего контроллера.
Регистр завершения прерывания
15
О
NSPEC - Бит неспецифического завершения обслуживания
VT4 - VT0 - Биты типа прерывания
При записи типа прерывания в эти биты соответствующий бит в регистре обслуживания прерываний должен быть сброшен
Рис. 16.14. Регистр завершения прерывания
Следует отметить, что в режиме ведомого формат регистра завершения прерывания несколько отличается от представленного на рисунке, а точнее, в нем отсутствуют биты NSPEC, VT4 и VT3.
Регистр завершения прерывания предназначен для выдачи команд завершения прерывания в контроллер, с помощью которых в регистре обслуживания сбрасываются определенные биты. Обработчик прерываний обычно завершается командой завершения прерывания. Существует две разновидности таких команд: неспецифические и специфические. При неспецифическом завершении прерывания просто сбрасывается бит в регистре обслуживания, соответствующий прерыванию с наивысшим уровнем приоритета. Для того чтобы выдать неспецифическую команду завершения прерывания, в регистре завершения прерывания должен быть установлен бит NSPEC.
При специфическом завершении прерывания сбрасывается отдельный бит регистра обслуживания. Чтобы выдать специфическую команду завершения прерывания, нужно сбросить бит NSPEC и записать в биты VT4—VT0 регистра завершения прерывания тип прерывания, бит которого необходимо сбросить в регистре обслуживания. Например, чтобы сбросить бит, соответствующий прерыванию 1NT2, нужно записать значение 000EH в регистр завершения прерывания.
В режиме ведомого уровень прерывания для его завершения записывается в регистр завершения прерывания. Обратите внимание, что неспецифическое завершение прерывания в режиме ведомого не возможно.
Регистр состояния прерываний
Формат регистра состояния прерывания изображен на рис. 16.15. Биты Т2—ТО указывают на то, какой из таймеров (таймер 0, таймер 1 или таймер 2) выполняет пре
902
Глава 16
рывание. Такое уточнение необходимо потому, что все три таймера имеют одинаковый уровень приоритета прерывания. Эти биты устанавливаются при запросе таймером прерывания и сбрасываются в цикле подтверждения прерывания. Бит DHLT (DMA halt) — бит останова DMA — применяется только в процессорах версии XL и ЕА; и в случае его установки прекращаются DMA передачи. Обратите внимание, что формат регистра состояния прерываний для процессора версии ЕВ немного отличается от формата регистра для процессоров версии XL и ЕА.
Регистр состояния контроллера прерываний (для процессоров версий XL и ЕА)
15	О
D Н L Т													Т2	Т1	ТО
Регистр состояния контроллера прерываний (для процессоров версии ЕВ)
15	О
NMI											STX	SRX	Т2	Т1	то
DHLT - Бит останова DMA
Установка бита прекращает передачи DMA
T2 - ТО - Биты индикации необслуженных прерываний соответствующего таймера
NMI - Бит немаскируемого прерывания
При установленном бите указывает на необслуженное немаскируемое прерывание
STX - Бит последовательной передачи
При установленном бите указывает на необслуженное прерывание при последовательной передаче данных
SRX - Бит последовательного приема
При установленном бите указывает на необслуженное прерывание при последовательном приеме данных
Рис. 16.15. Регистр состояния прерываний
Регистр вектора прерываний
Регистр вектора прерываний есть только в режиме ведомого контроллера и только в процессорах версий XL и ЕА. Регистр имеет относительный адрес 20Н. Он используется для установки пяти самых старших разрядов номера вектора прерываний. На рис. 16.16 приводится формат этого регистра.
Таймеры
Микропроцессоры 80186/80188 имеют три полностью программируемых и независимых друг от друга 16-разрядных таймера. Два таймера (таймер 0 и таймер 1) имеют входные и выходные выводы, позволяющие им считать внешние события или
Микропроцессоры 80186, 80188 и 80286
903
Регистр вектора прерывания (имеется только в режиме ведомого (slave) контроллера)
15	О
											Т4	ТЗ	Т2	Т1	ТО
Т4 - ТО - Биты вектора прерывания
Биты определяют пять старших разрядов вектора прерываний для внутреннего источника прерываний.
Три младших разряда вектора прерываний являются фиксированными
Рис. 16.16. Регистр вектора прерываний
генерировать определенную последовательность сигналов. Третий таймер (таймер 2) подключен к тактирующим импульсам микропроцессоров 80186/80188. Таймер 2 используется как источник запроса режима DMA, как предварительный делитель частоты для других таймеров или как сторожевой таймер.
На рис. 16.17 показана внутренняя структура блока таймеров. Обратите внимание, что блок таймеров имеет одно счетное устройство, которое отвечает за обновление данных во всех счетчиках. Каждый таймер, по существу, является регистром для записи из счетного устройства (схема, которая считывает значение из регистра таймера и наращивает его перед возвращением). Счетное устройство также отвечает за генерирование выходных сигналов, поступающих на выводы TMR OUTO и TMR OUT1, считывание сигналов с выводов TMR IN0 и TMR IN 1 и запрос передачи DMA от сигнала завершения счета ТС (terminal count) таймера 2, если таймер 2 запрограммирован на запрос режима DMA.
Рис. 16.17. Внутренняя структура блока таймеров процессоров 80186/80188
904
Глава 16
Принцип действия регистров таймера
Таймеры управляются блоком регистров (рис. 16.18), находящимся в блоке управления периферией. Каждый таймер имеет регистр счета, регистр или два регистра максимального значения счета, а также регистр управления. Эти регистры могут в любое время считываться или записываться, поскольку построение микропроцессоров 80186/80188 гарантирует, что их содержимое при чтении или записи никогда не изменяется.
Регистр счета таймера содержит 16-разрядное число, которое наращивается всякий раз, когда в таймер поступает входной импульсный сигнал. Регистры таймера 0 и 1 наращиваются по положительному фронту сигнала, поступающего на их входные выводы, или каждым четвертым тактовым импульсом микропроцессоров 80186/80188, или же выходным сигналом таймера 2. Таймер 2 тактируется каждым четвертым тактовым импульсом микропроцессоров 80186/80188 и не имеет другого источника синхронизации. Это означает, что таймер 2 процессоров 80186/80188, функционирующих на частоте 8 МГц, работает с частотой 2 МГц и максимальная частота счета для таймеров 0 и 1 также составляет 2 МГц. На рис. 16.19 показана временная диаграмма работы таймера, в которой можно выделить четыре значимых периода входных тактирующих импульсов.
Каждый таймер имеет не менее одного регистра максимального значения счета, иначе называемый регистром сравнения (регистр сравнения А таймеров 0 и 1), который загружается из регистра счета соответственно максимальным значением, для генерирования выходного сигнала. Следует заметить, что таймер — это суммирующий счетчик. Всякий раз, когда содержимое регистра счета станет равным содержимому регистра максимального значения счета, то он сбрасывается. При максимальном значении счета равного 0000Н счетчик выполняет 216 = 65 536 счетных операций. Для любого другого значения таймер считает соответствующее число входных сигналов. Например, при максимальном значении счета равного 0002Н счетчик считает от 0 до 1, затем сбрасывается на 0 — счетчик по модулю 2 имеет два состояния.
Каждый из таймеров 0 и 1 имеет еще и другой регистр максимального значения счета (регистр сравнения В), который выбирается с помощью регистра управления таймера. Регистр максимального значения счета А или оба регистра максимального значения счета А и В используются с этими таймерами, что программируется битом ALT регистра управления. Таймер при использовании обоих этих регистров вначале считает до значения, указанного в регистре максимального значения счета А, потом сбрасывается в нулевое состояние, а затем производит счет до значения, хранящегося в регистре максимального значения счета В. Далее этот процесс повторяется. Использование регистров максимального значения счета позволяет таймеру выполнить 131 072 счетных операций.
Регистр управления (см. рис. 16.18) каждого из таймеров имеет 16 разрядов и определяет режимы работы таймера. Далее приводится описание каждого бита регистра управления.
П EN
Бит разрешения счета EN (enable) позволяет таймеру начать счет. Таймер при сброшенном бите EN не считает, а при его установке — таймер выполняет счет. Запись в этот бит может быть осуществлена только при установленном бите INH.
Микропроцессоры 80186, 80188 и 80286
905
Относительные адреса для процессоров различных версий XL и ЕА
ЕВ и ЕС
46Н или 66Н	Регистр управления таймера 2
44Н или 64Н	Резерв
42Н или 62Н	Регистр максимального значения счета А таймера 2
40Н или 60Н	Регистр счета таймера 2
ЗЕН или 5ЕН	Регистр управления таймера 1
ЗСН или 5СН	Регистр максимального значения счета В таймера 1
ЗАН или 5АН	Регистр максимального значения счета А таймера 1
38Н или 58Н	Регистр счета таймера 1
36Н или 56Н	Регистр управления таймера 0
34Н или 54Н	Регистр максимального значения счета В таймера 0
32Н или 52Н	Регистр максимального значения счета А таймера 0
ЗОН или 50Н	Регистр счета таймера 0 а)
Рис. 16.18. Адреса регистров, управляющих работой таймеров (а) и формат регистров управления (6)
906
Глава 16
Обслуживание Обслуживание Обслуживание Пассивное Обслуживание таймера 0 таймера 1 таймера 2 состояние таймера О
Примечание:
1 - Время разрешения входа TMR IN0
2 - Время разрешения входа TMR IN1
3 - Модификация величины счета в регистре счета таймера О
4 - Модификация величины счета в регистре счета таймера 1
Рис. 16.19. Временная диаграмма работы таймеров микропроцессоров 80186/80188
□	INH
Бит INH (inhibit) позволяет при записи в регистр управления таймером воздействовать на бит разрешения счета EN. Если запись осуществляется с установкой бита INH, то бит EN для управления счетом может устанавливаться или сбрасываться. Запись в регистр управления таймером со сброшенным битом INH не влияет на бит EN. Это позволяет менять другие функции таймера без разрешения или запрещения его счета. Следует отметить, что состояние бита INH не запоминается, при считывании он всегда будет сброщен.
□	INT
Бит разрешения прерывания INT (interrupt) позволят таймеру генерировать сигнал запроса на прерывание. При установленном бите INT сигнал запроса на прерывание формируется каждый раз, когда содержимое регистра счета достигает максимального значения равного содержимому регистра максимального значения счета. Прерывание не генерируется, если этот бит сброшен. Этот бит продолжает действовать при формировании сигнала запроса на прерывание даже, если бит EN сбрасывается после запроса на прерывание.
□	RIU
Бит используемого регистра сравнения RIU (register in use) указывает на применяемый таймером в данный момент времени регистр максимального значения счета. Если бит RIU сброшен, то используется регистр максимального значения счета А, если установлен, то — регистр В. Этот бит предназначен только для чтения, и попытка записи в него не вызывает никакого действия.
□	МС
Бит максимального значения счета МС (maximum count) указывает на то, что таймер достиг максимального значения. Этот бит устанавливается при достиже
Микропроцессоры 80186, 80188 и 80286
907
нии таймером максимального значения счета и остается в таком состоянии до тех пор, пока не будет сброшен при записи в него нуля. Обратите внимание, что бит МС не сбрасывается автоматически. Таким образом, этот бит позволяет программному обеспечению определять момент времени, когда счетчик достигает максимального значения.
□	RTG
Бит RTG (re-trigger) является активным только при работе от внутреннего источника синхронизации, когда бит EXT будет сброшен. В этом случае бит RTG используется только таймерами 0 и 1 для выбора режима работы при различном воздействии входных сигналов, поступающих на выводы таймера TMRIN0 и TMRIN1. Если бит RTG сброшен, то выполняется срабатывание по уровню, при этом таймер считает при высоком логическом уровне внешнего входного сигнала. При каждом низком логическом уровне входного сигнала таймер прекращает счет, фиксируя значение счета. Если же бит RTG установлен, то выполняется срабатывание по фронту, при этом внешний входной сигнал сбрасывает показания регистра счета таймера на 0000Н при каждом положительном фронте входного сигнала.
□	Р
Бит Р (prescaler) выбирает источник синхронизации для таймеров 0 и 1. Если биты EXT и Р сброшены, тогда источником является одна четвертая часть частоты сигнала синхронизации системы CLKOUT. Если при сброшенном бите EXT бит Р будет установлен, то тогда источником синхронизации будет являться таймер 2. Бит Р игнорируется, если используется внешняя синхронизация, при которой бит ЕХТ должен быть сброшен.
□	ЕХТ
Бит ЕХТ (external) предназначен для выбора вида синхронизации внутренней или внешней. Если бит ЕХТ установлен, то используется внешняя (external) синхронизация, если сброшен, то внутренняя. Дри установленном бите импульсы от внешнего источника подаются на выводы TMRIN0 или TMRIN1. Таймер в этом режиме увеличивает свое значение с каждым положительным фронтом сигнала, поступающим на входной вывод таймера. При сброшенном бите ЕХТ источником синхронизации является один из внутренних источников.
□	ALT
Бит ALT (alternate) выбирает режим работы с одним или двумя регистрами максимального счета. При этом если бит ALT сброшен, то выбирается режим с одним регистром (регистр сравнения А), а в случае если бит установлен, то выбирается альтернативный режим при использовании двух регистров максимального счета (регистра сравнения А и В).
□	CONT
Бит CONT (continuous) выбирает режим работы таймера, при котором формируется либо непрерывная последовательность импульсов, либо одиночный импульс. Если бит CONT установлен, то выбирается непрерывный режим работы. Счетчик в этом режиме автоматически продолжает считать после достижения максимального счета. Если же бит CONT сброшен, то таймер автоматически прекращает счет и сбрасывает бит EN. Обратите внимание, что при сбросе мик
908
Глава 16
ропроцессоров 80186/80188 таймеры автоматически запрещаются, т. е. сбрасываются биты EN.
Выходные выводы таймера
Каждый из таймеров 0 и 1 имеет выходной вывод, который используется для формирования импульсов прямоугольной формы (меандра) или импульсов произвольной длительности. Для формирования импульсов произвольной длительности таймер должен работать в режиме с одним регистром максимального счета (ALT = 0). В этом режиме на выходном выводе формируется сигнал высокого логического уровня до момента достижения счетчиком максимального значения, равного значению регистра максимального счета А, затем формируется импульс низкого логического уровня в течение одного периода импульсов синхронизации. С помощью бита CONT в регистре управления можно формировать одиночные или непрерывные (незатухающие) последовательности импульсов.
Для формирования меандра или импульсов с различным коэффициентом заполнения выбирается альтернативный режим работы с использованием двух регистров максимального счета (ALT = 1). В этом режиме на выходном выводе также формируется сигнал высокого логического уровня, пока таймером управляет регистр максимального счета А. Затем формируется импульс низкого логического уровня, длительностью которого управляет регистр максимального счета В. Таймер, как и в случае применения одного регистра максимального счета, может формировать одиночный импульс или непрерывную последовательность импульсов. Функции битов ALT и CONT при формировании импульсов показаны в табл. 16.5.
Таблица 16.5. Функции битов ALT и CONT регистра управления таймером
ALT	CONT	Режим
0	0	Одиночный импульс
0	1	Непрерывные импульсы
1	0	Одиночный импульс прямоугольной формы (меандр)
1	1	Непрерывные импульсы прямоугольной формы (меандр)
Практически любой коэффициент заполнения импульсов может быть сформирован в альтернативном режиме работы с использованием двух регистров максимального счета. Например, допустим, что на выходном выводе таймера требуется получить импульсы с коэффициентом заполнения 10%. Для этого в регистр максимального счета А нужно загрузить число 10, а в регистр максимального счета В загружают 90, чтобы сформировать на выходе сигнал высокого логического уровня в течение 10 тактовых импульсов и импульс низкого логического уровня в течение 90 тактовых импульсов. Таким образом, также осуществляется деление частоты источника синхронизации на коэффициент 100.
Пример часов реального времени
Для многих систем необходимо знание времени суток. Часто для этого используются так называемые часы реального времени (real-time clock). Таймер микропроцессоров 80186/80188 может служить источником синхронизации для программного обес
Микропроцессоры 80186, 80188 и 80286
909
печения, которому необходимы часы реального времени. Требуемое для этого аппаратное оборудование здесь не показано.
Все что для этого необходимо, так это подключить вывод TMR1N1 к источнику постоянного тока с напряжением +5,0 В через нагрузочный резистор, чтобы разрешить работу таймеру 1. В примере используются таймеры 1 и 2 для генерирования 1-секундного прерывания, которое обеспечивает программное обеспечение источником синхронизации.
Необходимое программное обеспечение для реализации часов реального времени приведено в примере 16.2 и 16.3. В примере 16.2 показана программа, которая необходима для инициализации таймеров.
(Пример 16.2. Программа инициализации таймеров процессора 80С188ЕА ( для реализации часов реального времени
; Программа для реализации часов реального времени ; с использованием микропроцессора 80С188ЕА
= FF62	Т2_СА	EQU 0FF62H	; адрес регистра сравнения А таймера 2
= FF66	T2_CON	EQU 0FF66H	; адрес регистра управления таймера 2
= FF60	T2_CNT	EQU 0FF60H	; адрес регистра счета таймера 2
= FF5A	Т1_СА	EQU 0FF5AH	; адрес регистра сравнения А таймера 1
= FF58	T1_CON	EQU 0FF58H	; адрес регистра управления таймера 1
= FF5E	T1_CNT	EQU 0FF5EH	; адрес регистра счета таймера 1
0010		CLOCK_	_UP	PROC	FAR	
0010	В8	4Е20		MOV	AX,20000	; значение счета для таймера 2
0013	ВА	FF62		MOV	DX,T2_CA	; адрес регистра сравнения А таймера 2
0016	ЕЕ			OUT	DX,AL	; программирование для 10 мс
0017	В8	0064		MOV	AX,100	; значение счета для таймера 1
001А	ВА	FF5A		MOV	DX,T1_CA	; адрес регистра сравнения А таймера 1
001D	ЕЕ			OUT	DX,AL	; программирование для 1 с
001Е	В8	0000		MOV	AX, 0	
0021	ВА	FF60		MOV	DX,T2_CNT	; адрес регистра счета таймера 2
0024	ЕЕ			OUT	DX,AL	; сброс регистра счета
0025	ВА	FF5E		MOV	DX,T1_CNT	; адрес регистра счета таймера 1
0028	ЕЕ			OUT	DX,AL	; сброс регистра счета
0029	В8	С001		MOV	AX,0C001H	; разрешение работы таймеру 2
002С	ВА	FF66		MOV	DX,T2_CON	; адрес регистра управления таймера 2
002F	ЕЕ			OUT	DX,AL	
0030	В8	Е009		MOV	AX,0E009H	; разрешение работы таймеру 1
0033	ВА	FF58		MOV	DX,T1_CON	; адрес регистра управления таймера 1
0036	ЕЕ			OUT	DX,AL	
0037	СВ			RET		
0038		CLOCK_	_UP	ENDP		
END
910
Глава 16
Пример 16.3. Процедура обслуживания прерывания, отсчитывающая время
0000 0001 0002	00 00 00	SECONDS MINUTES HOURS	DB ? DB ? DB ?	; секунды ; минуты ; часы
0100		INTRS	PROC	FAR USES AX SI
0102	BE 0000 R		MOV	SI,OFFSET SECONDS ; адрес ячейки, хранящей секунды
0105	В4 60		MOV	АН,60Н
0107	Е8 000F		CALL	UP_COUNT	; увеличить значение секунд
010А	75 0А		JNZ	ENDI
010С	Е8 000А		CALL	UP_COUNT	; увеличить значение минут
010F	75 05		JNZ	ENDI
0111	В4 24		MOV	АН,24Н
0113	Е8 0003		CALL	UP—COUNT	; увеличить значение часов
0116		ENDI:		
			IRET	
0119		INTRS	ENDP	
0119		UP_COUNT	PROC	NEAR
0119	2Е: 8А	04	MOV	AL,CS:[SI]	; получить значение счетчика
011С	46		INC	SI
011D	04 01		ADD	AL,1	; увеличить значение счетчика
011F	27		DAA	; BCD-коррекция после сложения
0120	2Е: 88	44 FF	MOV	CS:[SI-1],AL ; сохранить новое значение счетчика
0124	2А С4		SUB	AL,AH	; проверить коэффициент пересчета
0126	75 04		JNE	ENDU	; переход, если не требуется увеличения
				; следующей единицы времени
0128	2Е: 88	44 FF	MOV	CS:[SI-1],AL ; очистить счетчик
012С		ENDU:		
012С	СЗ		RET	
012D		UP COUNT	ENDP	
END
В примере 16.3 показана процедура обслуживания прерываний, которая отсчитывает время. В этом же примере имеется и другая процедура приращения BCD-значения счетчика по модулю. Необходимое программное обеспечение для установки вектора прерываний и времени суток здесь не приводится.
Таймер 2 программируется для деления на коэффициент 20 000. В результате деления тактовой частоты (2 МГц для версии микропроцессоров 80186/80188, работающих на частоте 8 МГц) получается частота 100 Гц или, иначе, импульсы с периодом 10 мс. Синхронизация таймера 1 выполняется с выхода таймера 2. Таймер 1 программируется на коэффициент деления, равный 100, и в результате чего он формирует один импульс в секунду. Регистр управления таймера 1 программируется таким образом, чтобы после формирования секундного импульса генерировать прерывание.
Для верного отсчета времени процедура обслуживания прерываний вызывается один раз в секунду. Процедура обслуживания прерывания прибавляет единицу к содер
Микропроцессоры 80186, 80188 и 80286 911
жимому ячейки памяти seconds, в которой соответственно хранятся секунды. После подсчета 60 секунд производится приращение содержимого следующей ячейки памяти mitutes. Наконец, один раз в час происходит приращение содержимого ячейки памяти hours. Время в двоично-десятичном виде запоминается в этих трех ячейках памяти с тем, чтобы программное обеспечение системы могло при необходимости иметь свободной доступ к информации о текущем времени.
Контроллер DMA
Контроллер DMA в микропроцессорах 80186/80188 имеет два полностью независимых канала. Каждый канал имеет свой набор 16- или даже 20-разрядных регистров, поэтому любая ячейка памяти или устройства ввода-вывода доступна для передачи в режиме DMA. Кроме того, каждый канал программируется на автоматическое увеличение или уменьшение значений для любых регистров указателей адресов источников или назначения. Обратите внимание, что процессоры версий ЕВ и ЕС несколько отличаются. В частности, в процессорах версии ЕС имеется модифицированный 4-канальный контроллер DMA, а в процессорах версии ЕВ контроллера DMA вообще нет. Следует заметить, что в данном тексте контроллер DMA процессора версии ЕС не рассмотрен.
На рис. 16.20 представлена внутренняя структура регистров контроллера DMA.
Относительный
Регистр управления DMA канала 1
Регистр счета передач канала 1
Регистр указатель адреса назначения канала 1
Регистр указатель адреса источника канала 1
Регистр управления DMA канала 0
Регистр счета передач канала О
Регистр указатель адреса назначения канала О
Регистр указатель адреса источника канала О
^5	Формат регистра управления	q										
М/Ю ; DEC ! INC	—г—г— М/io I DEC i INC , I	I.... —	TC	INT	SYNIiSYNO 1	p	IDRQ	X	CHGZ	START/ STOP	BYTE/ WORD
								NOCHG		
Биты указания Биты указания	Тип синхронизации
адреса назначения адреса источника
Рис. 16.20. Структура регистров контроллера DMA микропроцессоров 80186/80188
912
Глава 16
Эти регистры размещены в блоке управления периферией по относительным адресам C0H-DFH.
Оба набора канальных регистров DMA — идентичны; каждый канал содержит свой регистр управления, регистр указатель адреса источника и регистр указатель адреса назначения, а также регистр счета передач. Регистр счета передач является 16-разрядным и содержит количество передаваемых байтов (для микропроцессоров 80186/80188) или слов (только для микропроцессора 80186). При каждой передаче байта или слова значение регистра уменьшается на одно значение до момента окончания счета 0000Н.
Каждый из регистров указателей адреса источника и регистров указателей адреса назначения является 20-разрядным так, что передачи в режиме DMA могут выполняться в любую ячейку памяти или адрес ввода-вывода без помощи указания сегмента или относительных адресов.
Если источником или адресом назначения является порт ввода-вывода, тогда четыре старших бита А19—А16 должны быть равны нулю, иначе произойдет неправильное срабатывание.
Регистр управления каналом
В каждом канале DMA имеется свой регистр управления каналом (рис. 16.20), который определяет его работу. Шесть старших разрядов регистра относятся к указанию адреса источника и адреса назначения. Бит М/Ю указывает на обращение к памяти или устройству ввода-вывода, бит DEC (decrement) вызывает уменьшение значения соответствующего регистра указателя, а бит INC (increment) приводит к увеличению этого значения. Если же оба бита INC и DEC будут установлены, то значение регистра указателя адреса (после каждой передачи в режиме DMA) не изменяется. Обра-гите внимание, что с помощью этого контроллера DMA возможны передачи типа 'память-память”.
Бит ТС (terminal count) предназначен для прекращения передачи данных в канале DMA, когда показания регистра счета передач канала уменьшаются до значения JOOOH. Если этот бит ТС установлен, то контроллер DMA продолжает передавать занные даже после достижения значения конечного счета.
Бит INT (interrupt) предназначен для разрешения выполнения прерываний. При установке этого бита происходит прерывание после достижения значения конечного 'чета в регистре счета передач канала.
Биты SYN1— SYN0 выбирают тип синхронизации для канала:
3 00 — нет синхронизации;
1 01 — синхронизация от источника;
3 10 — синхронизация от получателя;
3 11 —- резерв.
1ередача данных в режиме работы без синхронизации или при синхронизации от источника выполняется со скоростью 2 Мбайт/с. В этих режимах работы передача данных происходит без прерывания. При выборе синхронизации от получателя скорость передачи более медленная (1,3 Мбайт/с), и контроллер после каждой DMA-1ередачи передает управление микропроцессорам 80186/80188.
Микропроцессоры 80186, 80188 и 80286 913
Бит Р (priority) устанавливает уровень приоритета канала. Если бит Р установлен, то канал имеет высший приоритет. При одинаковом уровне приоритета в обоих каналах контроллер чередует каналы для передачи данных.
Бит IDRQ (internal DMA request) разрешает внутреннюю передачу данных в режиме DMA от таймера 2. Если этот бит установлен, то запрос на выполнение передач DMA исходит от внутреннего источника — таймера 2. Если же бит IDRQ сброшен, то разрешаются выводы DRQ1—DRQ0 для получения внешнего запроса.
Установка бита CHG/NOCHG разрешает изменять бит START/STOP при записи в регистр управления. Бит START/STOP активизирует начало или останавливает DMA-передачу. Для начала передачи в режиме DMA оба бита CHG/NOCHG и START/STOP должны быть установлены. Младший бит регистра управления BYTE /WORD выбирает передачу байтами, когда он сброшен, или словами, когда установлен.
Пример передачи типа “память-память"
Встроенный в процессор контроллер DMA способен выполнять передачи типа "память-память”. Процедура, используемая для программирования контроллера и начала передачи данных, приведена в примере 16.4.
Пример 16.4. Процедура для программирования контроллера DMA для выполнения им j передач типа "память-память"
.MODEL SMALL
.186
0000	.CODE
; Процедура DMA-передачи типа "память-память"
; Вызываемые параметры:
DS:SI = адрес источника данных ES:DI = адрес назначения данных СХ = число байт для передачи
GETA	MACRO	SEGA,OFFA,DMAA	
	MOV	AX,SEGA	получить сегмент адреса
	SHL	AX, 4	сдвинуть сегмент влево на 4 позиции
	ADD	AX,OFFA	сложить со смещением
	MOV	DX, DMAA	адрес контроллера DMA
	OUT	DX,AL	программировать 16 младших разрядов
	PUSHF		сохранить в стеке возможный флаг переноса
	MOV	AX,SEGA	получить сегмент адреса
	SHR	AX, 12	получить 4 старших бита
	POPE		вернуть из стека возможный флаг переноса
	ADD	AX, 0	сложить с возможным переносом
	ADD	DX,2	
914
Глава 16
	OUT ENDM	DX,AL
0000	MOVES	PROC	FAR
GETA	DS,SI,	,0FFC0H	; программирование адреса источника
GETA	£3,01,	,0FFC4H	; программирование адреса назначения
0032 ВА FFC8	MOV	DX,0FFC8H	; программирование регистра счета передач
0035 8В С1	MOV	АХ,СХ
0037 ЕЕ	OUT	DX,AL
0038 ВA FFCA	MOV	DX,0FFCAH	; программирование регистра управления
003В В8 В606	MOV	АХ,ОВ6С6Н
003Е ЕЕ	OUT	DX,AL	; начать DMA-передачу
003F СВ	RET	
0040	MOVES	ENDP	
	END	
Процедура в примере 16.4 осуществляет перемещение данных из ячейки, расположенной в сегменте данных по смещению, указанному в регистре SI, в ячейку дополнительного сегмента данных по смещению, указанному в регистре DI. Число байт для перемещения указывается в регистре СХ. Эта операция идентична команде rep movsb, но выполняется она с гораздо большей скоростью.
Блок выбора кристалла
Блок выбора кристалла упрощает сопряжение памяти и устройств ввода-вывода с микропроцессорами 80186/80188. Этот блок содержит программируемую логику выбора кристалла. В малых и средних вычислительных системах для выбора памяти или устройства ввода-вывода никакого внешнего дешифратора не требуется. Однако для больших вычислительных систем внешние дешифраторы необходимы. Имеется два отличающихся блока выбора кристалла; один для процессоров версий XL и ЕА, а другой для процессоров версий ЕВ и ЕС.
Выбор элементов памяти
В малых и средних вычислительных системах на базе микропроцессоров 80186/80188 для выбора разных внешних элементов памяти используются шесть выводов (версии XL и ЕА) и десять выводов (версии ЕВ и ЕС). Вывод UCS (upper chip select) предназначен для выбора ЗУ, размещаемого в верхней части карты памяти, и которое часто используется как ПЗУ. Для этого вывода с помощью программирования соответствующего регистра можно задать размер ПЗУ и число необходимых тактов ожидания. Обратите внимание, что программируется только стартовый (базовый) адрес, а конечным адресом ПЗУ является адрес FFFFFH. Вывод LCS (low chip select) предназначен для выбора ЗУ (обычно ОЗУ), которое начинается с ячейки памяти 00000Н. Размер области памяти и число тактов ожидания программируются аналогичным образом, как и для вывода UCS , но при помощи другого регистра. Остальные четыре или восемь выводов предназначены для выбора элементов ЗУ, разме
Микропроцессоры 80186, 80188 и 80286
915
щаемых в средней части карты памяти. Четыре вывода MCS3 — MCS0 в процессорах версии XL и ЕА программируются для задания начального (базового) адреса и размера области памяти. Обратите внимание, что все устройства должны быть одного и того же размера.
Восемь выводов GCS7 — GCS0 в процессорах версий ЕВ и ЕС предназначены для выбора ЗУ или устройств ввода-вывода, которые с помощью соответствующих регистров могут быть запрограммированы для задания размера и базового адреса.
Выбор периферийных устройств
С помощью выводов PCS6 —PCS0 микропроцессоры 80186/80188 версий XL и ЕА адресуют до семи внешних периферийных устройств. Базовый адрес устройства ввода-вывода программируется в регистре базового адреса выбора кристалла периферии (PACS) для любой 1-килобайтной области с размером блока адресов, равного 128 байт для каждого из устройств. Следует заметить, что в процессорах версий ЕВ и ЕС для выбора восьми ЗУ или устройств ввода-вывода используются выводы GCS7-GCS0.
Программирование блока выбора кристалла процессоров 80186/80188 версий XL и ЕА
Число тактов ожидания программируется для каждого раздела пространства памяти и устройств ввода-вывода. Микропроцессоры 80186/80188 имеют встроенный генератор тактов ожидания, который может добавлять в цикл шины до трех тактов ожидания.
В табл. 16.6 приведены состояния битов R2—R0, которые имеются в каждом программируемом управляющем регистре для выбора разного числа тактов ожидания.
Таблица 16.6. Биты R2, R1 и R0 процессоров версий XL и ЕА, управляющие количеством тактов ожидания и необходимостьк>наличия сигнала готовности READY
R2	R1	R0	Число тактов ожидания	Необходимость наличия внешнего сигнала готовности READY
0	X	X	—	Да
1	0	0	0	Нет
1	0	1	1	Нет
1	1	0	2	Нет
1	1	1	3	Нет
Бит R2 определяет необходимость использования внешнего сигнала готовности устройства READY для генерации тактов ожидания. При установленном бите R2 внешний сигнал готовности READY, поступающий от устройства, игнорируется, а количество вставляемых в цикл тактов ожидания определяют биты Rl—R0, которые в этом случае могут задать максимальное количество тактов, равное трем. Если же бит R2 сброшен, то необходим внешний сигнал готовности READY, но в этом случае количество тактов ожидания не ограничивается и может быть больше.
916
Глава 16
Допустим, что микросхема EPROM емкостью 64 Кбайт размещается на самой вершине системы памяти и для ее нормальной работы требуется два такта ожидания. Чтобы выбрать это устройство для данного участка памяти, вывод UCS должен быть запрограммирован для диапазона адресов памяти F0000H—FFFFFH и двух тактов ожидания. На рис. 16.21 показаны все управляющие регистры для обращения к памяти и устройствам ввода-вывода и имеющие в блоке управления периферией относительные адреса АО—А8Н.
Относительный адрес
АОН
Регистр управления верхней областью памяти (UMCS) 15	О
0	0	А17	А16	А15	А14	А13	А12	А11	А10	0	0	0	R2	R1	R0
Регистр управления нижней областью памяти (LMCS) 15	О
0	0	А17	А16	А15	А14	А13	А12	А11	А10	0	0	0	R2	R1	R0
Регистр базового адреса выбора кристалла периферии (PACS) 15	О
А19	А18	А17	А16	А15	А14	А13	0	0	0	0	0	0	R2	R1	R0
Регистр базового адреса средней области памяти (MMCS) 15	О
А19	А18	А17	А16	А15	А14	А13	0	0	0	0	0	0	R2	R1	R0
Регистр размера блока средней области памяти (MPCS) 15	О
0	Мб	М5	М4	М3	М2	М1	МО	ЕХ	MS	0	0	0	R2	R1	R0
Рис. 16.21. Управляющие регистры блока выбора кристалла микропроцессоров 80186/80186 версий XL и ЕА
Обратите внимание, что младшие три разряда этих управляющих регистров показаны в табл. 16.6. Регистр управления верхней областью памяти (UMCS) размещается в ячейке блока управления периферией по относительному адресу АОН. Этот 16-разрядный регистр должен быть запрограммирован для участка памяти со стартовым адресом F0000H (для данного примера) и числа тактов ожидания равного двум.
Микропроцессоры 80186, 80188 и 80286 917
Обратите внимание на то, что два старших бита адреса должны программироваться как 00, и что в регистре программируются только биты А17—А10, относящиеся к стартовому адресу. Примеры кодов для разных объемов памяти приведены в табл. 16.7.
Таблица 16.7. Программирование регистра UMCS, имеющего относительный адрес АОН в блоке управления периферией процессоров 80186/80186 версий XL и ЕА
Стартовый адрес	Программируемый размер блока	Значение регистра*
FFC00H	1К	3FC4H
FF800H	2К	3F84H
FF000H	4К	3F04H
FE000H	8К	ЗЕ04Н
FC000H	16К	ЗС04Н
F8000H	32К	3804Н
F0000H	64К	3004Н
E0000H	128К	1004Н
СООООН	256К	0004Н
* Значение для случая, когда не используется внешний сигнал готовности READY и такты ожидания.
Поскольку для нашего примера требуются два такта ожидания, а стартовый адрес аналогичен адресу в табл. 16.7 для размера блока 64К, то необходимое значение будет аналогично приведенному в таблице за исключением трех крайних справа разрядов, а именно 110 вместо 100. Таким образом, в регистр UMCS в нашем случае должно быть записано значение 3006Н.
Предположим, что для статического ОЗУ ецкостью 32 Кбайт, расположенного в нижней области системы памяти, не нужны такты ожидания и не требуется сигнал готовности READY. Для программирования вывода LCS для выбора этого устройства, регистр управления нижней области памяти (LMCS) загружается точно так же, как и регистр UMCS. В этом примере в регистр LMCS, расположенный в блоке управления периферией по смещению А2Н, посылается значение 07FCH. В табл. 16.8 приведены значения регистра LMCS для программирования вывода LCS.
Таблица 16.8. Программирование регистра LMCS, имеющего относительный адрес А2Н в блоке управления периферией процессоров 80186/80186 версий XL и ЕА
Конечный адрес	Размер блока	Значение регистра’
003FFH	1К	0004Н
007FFH	2К	0044Н
00FFFH	4К	00С4Н
01FFFH	8К	01С4Н
918
Глава 16
Таблица 16.8 (окончание)
Конечный адрес	Размер блока	Значение регистра*
03FFFH	16К	03С4Н
07FFFH	32К	07С4Н
0FFFFH	64К	0FC4H
1FFFFH	128К	1FC4H
3FFFFH	256К	3FC4H
* Значение для случая, когда не используется внешний сигнал готовности READY и такты ожидания.
Средняя область памяти программируется с помощью двух регистров: MMCS и MPCS, расположенных в блоке управления периферией по смещениям А6А и А8Н соответственно. Регистр MMCS программирует стартовый или, иначе, базовый адрес для трех линий выбора средней области памяти MCS3—MCS0 и число необходимых тактов ожидания. Регистр MPCS определяет размер блока памяти и соответствующий индивидуальный размер ЗУ (табл. 16.9).
Таблица 16.9. Программирование регистра MPCS, имеющего относительный адрес А8Н в блоке управления периферией процессоров 80186/80186 версий XL и ЕА
Размер блока	Размер ЗУ (кристалла)	Значение регистра*
8К	2К	0144Н
16К	4К	0344Н
32К	8К	0744Н
64К	16К	0F44H
128К	32К	1F44H
256К	64К	3F44H
512К	128К	7F44H
* Значение для случая, когда не используется внешний сигнал готовности READY и такты ожидания, а также бит ЕХ регистра MPCS сброшен, а бит MS установлен.
Кроме размера блока, как и для других областей памяти, программируется также и число тактов ожидания. Биты ЕХ и MS регистра MPCS определяют функционирование линий выбора периферии PCS6 — PCS0 , которые рассмотрены далее.
Предположим, к примеру, что в среднюю область памяти добавлены четыре статических ОЗУ емкостью по 32 Кбайт с адресами, начиная с ячейки 80000Н и по ячейку 9FFFFH, для работы которых не требуются такты ожидания. Для данного примера в регистр MMCS загружается значение 8004Н. Регистр MPCS программируется значением 1F44H, полагая, что бит ЕХ = 0 и MS = 1, а для работы с периферийными устройствами не требуются такты ожидания и сигнал готовности READY.
Регистр базового адреса выбора кристалла периферии (PACS), расположенный в блоке управления периферией по смещению А4Н, предназначен для программиро
Микропроцессоры 80186, 80188 и 80286
919
вания выводов выбора периферийных устройств PCS6 — PCS0 совместно с битами ЕХ и MS регистра MPCS. Регистр PACS фиксирует стартовый или, иначе, базовый адрес для периферийных устройств, выбираемых с помощью выводов PCS6 — PCS0 . Адреса внешних устройств могут быть размещены в пространстве памяти или в пространстве устройств ввода-вывода. В том случае если размещение осуществляется в пространстве устройств ввода-вывода, то биты базового адреса А19—А16 порта должны быть равны нулю. После программирования стартового (начального) адреса любой 1-килобайтной области она разделяется на блоки по 128 байт для каждого из 7 устройств, выбираемых с помощью соответствующих выводов PCS6 — PCS0 .
Например, если регистр PACS программируется значением 0204Н, когда не требуются такты ожидания и сигналы готовности устройств READY, то стартовый адрес устройства памяти будет 02000Н или для порта ввода-вывода 2000Н. В случае портов ввода-вывода базовые адреса портов для устройств, выбираемых с помощью выводов PCS6 —PCS0, распределятся следующим образом: PCSO= 2000H, PCSl= 2080H, PCS2 = 2100Н, PCS3= 2180H, PCS4= 2200H, PCS5 = 2280H и PCS6 = 2300H.
Бит MS регистра MPCS определяет выводы выбора устройств, адреса которых отображаются в пространстве памяти или в пространстве устройств ввода-вывода. Если бит MS сброшен, то линии выбора устройств PCS6 —PCS0 дешифрируют устройства памяти, а если бит установлен, то устройства ввода-вывода.
Бит ЕХ регистра MPCS определяет функциональное назначение выводов PCS6 и PCS5 . Если бит ЕХ установлен, то эти выводы выбирают устройства ввода-вывода; если же бит ЕХ сброшен, то по этим выводам в систему выдаются сигналы линий адреса А2 и А1 соответственно, которые должны быть в дальнейшем зафиксированы в защелке. Линии адреса А1 и А2 используются некоторыми устройствами ввода-вывода для выбора своих внутренних регистров и предусматриваются для этой цели.
Программирование блока выбора кристалла процессоров 80186/80188 версий ЕВ и ЕС
В процессорах 80186/80188 версий ЕВ и ЕС, как уже упоминалось ранее, имеют несколько другой блок выбора кристалла. В этих более новых версиях микропроцессоров 80186/80188 имеется вывод выбора кристалла верхней и нижней областей памяти. Вместо выводов выбора ЗУ, расположенных в средней области памяти, или выводов выбора периферийных устройств, в процессорах версий ЕВ и ЕС имеются восемь общих выводов выбора кристалла GCS7 —GCS0, которые выбирают либо устройства памяти, или устройства ввода-вывода.
Программирование этого блока также отличается, поскольку каждый вывод выбора кристалла имеет свой регистр начального адреса и регистр конечного адреса. На рис. 16.22 приведены относительные адреса для регистров, соответствующих каждому выводу блока выбора кристалла, и формат регистров начального и конечного адреса.
Обратите внимание, что программирование блока выбора кристалла для процессоров версий ЕВ и ЕС более простое, чем для предыдущих версий XL и ХА. Например, чтобы запрограммировать вывод UCS для адреса, начинающегося с ячейки
920
Глава 16
Относительный адрес	
А6Н	Регистр конечного адреса (вывод UCS)
А4Н	Регистр начального адреса (вывод UCS)
А2Н	Регистр конечного адреса (вывод LCS)
АОН	Регистр начального адреса (вывод LCS)
9ЕН	Регистр конечного адреса (вывод GCS7)
9СН	Регистр начального адреса (вывод GCS7)
9АН	Регистр конечного адреса (вывод GCS6)
98Н	Регистр начального адреса (вывод GCS6)
96Н	Регистр конечного адреса (вывод GCS5)
94Н	Регистр начального адреса (вывод GCS5)
92Н	Регистр конечного адреса (вывод GCS4)
ЭОН	Регистр начального адреса (вывод GCS4)
8ЕН	Регистр конечного адреса (вывод GCS3)
8СН	Регистр начального адреса (вывод GCS3)
8АН	Регистр конечного адреса (вывод GCS2)
88Н	Регистр начального адреса (вывод GCS2)
86Н	Регистр конечного адреса (вывод GCS1)
84Н	Регистр начального адреса (вывод GCS1)
82Н	Регистр конечного адреса (вывод GCS0)
80Н	Регистр начального адреса (вывод GCS0)
	а)
Рис. 16.22. Регистры блока выбора кристалла в процессорах 80186/80188 версий ЕВ и ЕС. Распределение адресов управляющих регистров (а)
Микропроцессоры 80186, 80188 и 80286 921
Регистр начального адреса 15	О
А19	А18	А17	А16	А15	А14	А13	А12	А11	А10	0	0	WS3	WS2	WS1	WS0
Регистр конечного адреса
15	О
А19	А18	А17	А16	А15	А14	А13	А12	А11	А10	0	0	С S Е N	I S т О р	м Е м	R D Y
б)
Примечание:
Биты с 6 по 15 относятся к адресам устройств памяти А19—А10 или устройств ввода-вывода А15—А6;
Биты WS3—WS0 предназначены для задания тактов ожидания в диапазоне от 0 до 15;
При установке бита CSEN разрешается выбор кристаллов, а при его сбросе запрещается;
Установка бита ISTOP запрещает проверку конечного адреса, который в этом случае имеет значение OFFFFFH для устройств памяти или OFFFFH для устройств ввода-вывода;
При установленном бите МЕМ выбираются устройства памяти, а при сброшенном устройства ввода-вывода;
Если бит RDY установлен, то разрешается использование внешнего сигнала готовности READY при необходимости иметь количество тактов ожидания больше чем 15, если же бит сброшен, то внешний сигнал готовности игнорируется.
Рис. 16.22. Формат регистров начального и конечного адреса (б)
F0000H и заканчивающегося в ячейке FFFFFH (64 Кбайт), регистр начального адреса с относительным адресом А4Н программируется значением F002H для начального адреса F0000H с двумя состояниями ожиданий. Регистр конечного адреса, имеющий относительный адрес А6Н, программируется значением 000EH для разрешения устройства памяти с конечным адресом FFFFFH, для работы с которым не используется сигнал готовности READY. Другие выводы блока выбора кристалла программируются аналогичным образом.
16.3.	Пример использования процессора 80С188ЕВ
Поскольку микропроцессоры разработаны со встроенными контроллерами, то в данном разделе текста дается пример использования возможностей такого устройства. Пример иллюстрирует подключение памяти и устройства ввода-вывода к микропроцессору 80С188ЕВ. Кроме того, представлено программное обеспечение, необходимое для программирования микропроцессора 80С188ЕВ и внутренних регистров после выполнения сброса системы в исходное состояние. На рис. 16.23 представлена схема расположения выводов микропроцессора 80С188ЕВ. Следует напомнить, что отличия этой версии от версии XL приведены в тексте, ранее.
Однако микропроцессор 80С188ЕВ имеет несколько особенностей, которые прежде не рассматривались. К ним можно отнести наличие двух портов ввода-вывода (Р1 и
922
Глава 16
Р2), которые используются совместно с другими функциями, и два встроенных в микропроцессор последовательных связных интерфейса. Однако в этой версии процессора нет контроллера DMA, как в процессоре версии XL.
ю
7 36 51 53 52
46
45
48
47
41
40
44
18
14
15
57 5а
59
55
56
54
50
49
37
38
13
12
17
31
32
.34-35
CLKIN	A19/#ONCE
OSCOUT	A18
CLKOUT	A17
	A16
RESIN	A15
RESOUT	A14
	A13
HOLD	A12
HLDA	A11
NMI	A10
INTO	A9
INT1	A8
INT2	
INT3	AD7
INT4	AD6
	AD5
TMR IN0	AD4
TMR OUTO	AD3
TMR IN1	AD2
TMR OUT1	AD1
	ADO
P2.0/RXD1	
P2.1/TXD1	RD
P2.2/BLCK1	WR
P2.3/SINT1	ALE
P2.4/#CTS	DEN
P2.5/BLCK0	DT/#R
P2.6	
P2.7	LCS
	UCS
READY	
TEST	P1.0/#GCS0
LOCK	P1.1/#GCS1
	P1.2/#GCS2
S2	P1.3/#GCS3
S1	P1.4/#GCS4
SO	P1.5/#GCS5
	P1.6/#GCS6
RFSH	P1.7/#GCS7
PDTMR	
CTS0	
RXD0	
TXD0	
80С188ЕВ
Я1 Я2 81 80 79 77 75 73 71 69 67 62
78
76
74
72
70
68
66
61
11
16
29
30
2S. 27 26 25 24 21 2Q. ЛЯ
4
Рис. 16.23. Схема расположения выводов микропроцессора 80С188ЕВ
Микропроцессор 80188 может входить в состав малой вычислительной системы, которая может быть использована в качестве учебного микропроцессорного тренажера. В тренажере, приведенном в этом тексте, для хранения управляющей программы используется одна микросхема EPROM типа 27256, для хранения данных три статических ОЗУ типа 62256, а также микросхема программируемого интерфейса клавиатуры/дисплея 8279 и один из портов встроенных последовательных связных интерфейсов. На рис. 16.24 показана схема микропроцессорного тренажера на базе микропроцессора 80С188ЕВ.
Выбор постоянной памяти, выполненной на микросхеме EPROM 27256 (U3), осуществляется выводом UCS , а статические ОЗУ (U4—U6) выбираются с помощью
Рис. 16.24. Малая вычислительная система на базе микропроцессора 80С188ЕВ
Микропроцессоры 80186, 80188 и 80286_________________923
924
Глава 16
вывода LCS (U4) и выводов GCSO (U5) и GCS1 (U6). Контроллер клавиату-ры/дисплея типа 8279 (U8) выбирается выводом GCS2. Обратите внимание, что для нормальной работы системы нужно учитывать необходимое количество тактов ожидания для каждого устройства. Так при программировании данная микросхема EPROM должна иметь пять тактов ожидания, предполагающих действительно медленную работу микросхемы EPROM (450 нс), два такта ожидания должно быть предусмотрено для статического ОЗУ (250 нс) и два такта ожидания для интерфейса клавиатуры/дисплея типа 8279. Более быстродействующие микросхемы постоянной памяти или статического ОЗУ уменьшают или даже устраняют необходимое число тактов ожидания. В системе предусмотрено следующее распределение адресов памяти: F8000H—FFFFFH для постоянной памяти, 00000Н—07FFFH, 80000Н—87FFFH и 88000Н—8FFFFH для статического ОЗУ, и для контроллера 8289 порты ввода-вывода 1000Н— 107FH. Адрес блока управления периферией микропроцессора 80С188ЕВ имеет стандартные неизменные адреса портов ввода-вывода FF00H— FFFFH.
В примере 16.5 приведено программное обеспечение, необходимое для инициализации микропроцессора 80С188ЕВ. Программное обеспечение, необходимое для программирования контроллера клавиатуры/дисплея типа 8279 и функционирования системы в качестве тренажера на базе микропроцессора, здесь не приводится.
Пример 16.5. Программа для инициализации микропроцессора 80С188ЕВ
.MODEL SMALL .186
0000		.CODE			
		; Программа инициализации			процессора 80C188EB.
			ORG	8000H	; начало адресов EPROM
8000		MAIN:			
8000	ВА	FFA6	MOV	DX,0FFA6H	; адрес регистра конечного адреса вывода UCS#
8003	В8	000Е	MOV	AX,000EH	; программируемое значение адреса FFFFFH
8006	ЕЕ		OUT	DX,AL	; установить конечный адрес для вывода UCS#
8007	ВА	FFA0	MOV	DX,0FFA0H	; адрес регистра начального адреса вывода LCS#
800А	В8	0002	MOV	AX,0002H	; значение адреса 00000Н с 2-мя тактами ожидания
800D	ЕЕ		OUT	DX,AL	; установить начальный адрес для SRAM U4
800Е	ВА	FFA2	MOV	DX,0FFA2H	; адрес регистра конечного адреса вывода LCS#
8011	В8	080А	MOV	AX,080AH	; программируемое значение адреса 07FFFH
8014	ЕЕ		OUT	DX,AL	; установить конечный адрес для SRAM U4
8015	ВА	FF80	MOV	DX,0FF80H	; адрес регистра начального адреса вывода GCS0#
8018	В8	0802	MOV	AX,0802H	; значение адреса 08000Н с 2-мя тактами ожидания
801В	ЕЕ		OUT	DX,AL	; установить начальный адрес для SRAM U5
801С	ВА	FF82	MOV	DX,0FF82H	; адрес регистра конечного адреса вывода GCS0#
801F	В8	100А	MOV	AX,100AH	; программируемое значение адреса 0FFFFH
8022	ЕЕ		OUT	DX, AL	; установить конечный адрес для SRAM U5
Микропроцессоры 80186, 80188 и 80286
925
8023	ВА	FF84	MOV	DX,0FF84H	; адрес регистра начального адреса вывода GCS1#
8026	В8	1002	MOV	AX,1002H	; значение адреса 10000Н с 2-мя тактами ожидания
8029	ЕЕ		OUT	DX,AL	; установить начальный адрес для SRAM U6
802А	ВА	FF86	MOV	DX,0FF86H	; адрес регистра конечного адреса вывода GCS1#
802D	В8	180А	MOV	AX,180AH	; программируемое значение адреса 17FFFH
8030	ЕЕ		OUT	DX,AL	; установить конечный адрес для SRAM U6
8031	ВА	FF88	MOV	DX,0FF88H	; адрес регистра начального адреса вывода GCS2#
8034	В8	1002	MOV	AX,1002H	; значение адреса 1000Н с 2-мя тактами ожидания
8037	ЕЕ		OUT	DX,AL	; установить начальный адрес для 8279
8038	ВА	FF8A	MOV	DX,0FF8AH	; адрес,регистра конечного адреса вывода GCS2#
803В	В8	1048	MOV	AX,1048H	; программируемое значение 103FH (I/O)
803Е	ЕЕ		OUT	DX,AL	; установить конечный адрес для 8279
803F	ВА	FF60	MOV	DX,0FF60H	; регистр управления скоростью передачи в бод
8042	В8	8067	MOV	AX,8067H	; формировать скорость передачи 9600 бод
8045	ЕЕ		OUT	DX,AL	; установить скорость последовательной передачи
8046	ВА	FF62	MOV	DX,0FF62H	; регистр управления последовательной передачей
8049	В8	0059	MOV	AX,59H	; 7 бит данных, проверка на четность, 1 стоп-бит
804С	ЕЕ		OUT	DX,AL	; настроить последовательный порт
804D	ВА	FF66	MOV	DX,0FF66H	; регистр состояния последовательной передачи
8050	ED		IN	AX, DX	; очистить последовательный порт
8051	ВА	FF62	MOV	DX,0FF62H	; регистр управления последовательной передачей
8054	ED		IN	AX, DX	; читать содержимое регистра
8055	83	С8 20	OR	AX,20H	; установить бит REN
8058	ЕЕ		OUT	DX,AL	; разрешить последовательный порт
; Остальная часть программного Обеспечения системы помещается здесь.
	ORG	0FFF0H
FFFO ВА FFA4	MOV	DX,0FFA4H
FFF3 В8 F805	MOV	AX,0F805H
FFF6 ЕЕ	OUT	DX,AL
FFF7 Е9 8006	JMP	MAIN
	END	
; установить адрес размещения
; адрес регистра начального адреса вывода UCS#
; значение адреса F8000H с 5-ю тактами ожидания
; установить начальный адрес для вывода UCS#
; перейти на начало EPROM
16.4.	Операционная система реального времени
Данный раздел текста описывает операционную систему реального времени RTOS (Real Time Operating System). Для построения RTOS применяются прерывания, поскольку они используются во встроенных устройствах микропроцессора. Все системы, нами
926
Глава 16
ная от самого элементарного встроенного устройства до самой сложной системы, должны иметь операционную систему.
Что представляет собой операционная система реального времени?
Операционная система реального времени (RTOS) — это операционная система, использующаяся во встроенных приложениях и выполняющая задачи в предсказуемый промежуток времени. Операционные системы, подобные Windows, откладывают многие задачи и не гарантируют их выполнение в предсказываемый промежуток времени. Система RTOS, как и любая другая операционная система, имеет сходные базовые модули. На рис. 16.25 приведена базовая структура операционной системы, которая могла бы быть размещена в микросхемах EPROM или флэш-памяти.
Переход на загрузку
Рис. 16.25. Структура операционной системы RTOS
Все операционные системы имеют три основных компонента: I) модуль инициализации; 2) ядро; 3) данные и процедуры. Модуль инициализации используется для программирования всех компонентов аппаратного обеспечения системы, загрузки специфических для системы драйверов и программирования содержимого регистров микропроцессора. Ядро выполняет основную задачу системы, обеспечивает системные вызовы или функции и заключает в себе встроенную систему. Модуль процедур и данных содержит все процедуры и статические данные, используемые операционной системой.
Пример системы
На рис. 16.26 показана простая система на базе микропроцессора 80С188ЕВ со встроенными контроллерами.
Эта система содержит жидкокристаллический индикатор, имеющий 2 строки по 16 знаков в каждой, который отображает текущее время и температуру. Программное обеспечение системы записано в небольшом программируемом ПЗУ 32К х 8 бит (03). Статическое ОЗУ 32К х 8 (U2) используется в качестве стека и для хранения времени. База данных содержит новые значения температуры и время снятия этих показаний.
Рис. 16.26. Простая система на процессоре 80С188ЕВ
Микропроцессоры 80186, 80188 и 80286
со Ki
928
Глава 16
Датчик температуры расположен внутри цифрового термочувствительного элемента LM70, производства корпорации National Semiconductor по цене менее $1. Взаимодействие с микропроцессором осуществляется в последовательном формате, и преобразователь имеет разрешение 10 разрядов плюс знаковый разряд. На рис. 16.27 приведена схема расположения выводов датчика температуры LM70.
Вид сверху на датчик температуры LM70
Рис. 16.27. Датчик температуры LM70
Датчик LM70 посредством двунаправленного вывода для последовательной передачи данных S1/O осуществляет передачу данных на и от микропроцессора. Информация синхронизируется сигналами, поступающими на вывод SC. LM70 содержит три 16-разрядных регистра: регистр конфигурации, регистр датчика температуры и регистр идентификации. Регистр конфигурации выбирает или режим отключения (XXFFH), или режим непрерывного преобразования (XX00H). Регистр температуры содержит температуру со знаком в крайних слева И разрядах 16-разрядного слова данных. Для отрицательной температуры содержимое регистра хранится в дополнительном коде. Регистр идентификации при считывании имеет значение 8100. Показания температуры считываются из датчика LM70 в соответствии со шкалой в Цельсиях, и каждый шаг измерений составляет 0,25 °C. Например, если содержимое регистра датчика температуры равно 0000 1100 100Х ХХХХ или значению в десятичном виде 100, то температура составляет 25 °C.
В примере 16.6 приводится программное обеспечение для системы с четким выделением каждого модуля операционной системы (модуля инициализации, ядра, модуля процедур и данных). Система выполняет измерение температуры один раз в минуту и запоминает ее, последовательно добавляя день, время в часах и минуты. Под днем здесь понимается количество суток, которое начинается с нуля при инициализации системы. Размер области памяти для хранения этих данных составляет 16 Кбайт, что позволяет сохранить до 4096 измерений.
Пример 16.6. Программное обеспечение для простой системы на базе процессора 80С188ЕВ
; Простая система, работающая в реальном времени,
; для микропроцессора 80С188ЕВ.
; Версия с жидкокристаллическим индикатором.
Микропроцессоры 80186, 80188 и 80286
929
; INT 4ОН задержка в глиллисекундах для BL (диапазон от 1 до 99)
; INT 41Н задержка в секундах для BL (диапазон от 1 до 59)
; Примечание* время задержки должно быть записано в шестнадцатеричном виде!
; т. е. 15 миллисекунд это 15Н.
; INT 42Н вывод символа строки на жидкокристаллический индикатор
; ES:BX адрес пустой строки
; AL = где (80Н строка 1, СОН строка 2)
; INT 43Н очистка жидкокристаллического индикатора
.MODEL TINY
.186	; разрешить набор команд процессоров 80186/80188
.CODE
.STARTUP
; Должен использоваться ассемблер MASM 6.11
; командная строка = ML /АТ XXXXXXXX.ASM
Описание макрокоманд
IO	MACRO	PORT,DATA
	MOV	DX,PORT
	MOV	AX,DATA
	OUT ENDM	DX,AX
CS_IO MACRO PORT,START,STOP
IO PORT,START
IO PORT+2,STOP
ENDM
SEND MACRO VALUE,COMMAND,DELAYS
PUSH	DX	
MOV	AL,VALUE	
MOV	DX,0FF56H	
OUT	DX,AL	; значение в порт 1
MOV	DX,0FF5AH	; читать порт 2
IN	AL,DX	
AND	AL,OBDH	
OR	AL,COMMAND	
OUT	DX,AL	; передать RS
OR	AL, 2	
OUT	DX, AL	; Е = 1
AND	AL,OFDH	
OUT	DX,AL	; Е = 0
PUSH	BX	
MOV	BL,DELAYS	
INT	4 OH	
POP	BX	
POP	DX	
ENDM		
30 Зак. 384
930
Глава 16
KEY
SENDS
READS
MACRO IN	AL,DX
SHR	AL, 1
ENDM
MACRO WHAT PUSH CX PUSH BX MOV	BX,AX
MOV	CX, 16
.REPEAT
SHL BX, 1 IN	AL, DX
.IF CARRY?
OR AL,80H OUT DX,AL .ELSE
AND AL,7FH OUT DX,AL .ENDIF OR AL, 4 OUT DX,AL AND AL, OFBH OUT DX,AL .UNTILCXZ POP BX POP CX ENDM
MACRO PUSH	BX
PUSH	CX
MOV	BX,16
.REPEAT
IN	AL, DX
OR	AL,80H
OUT	DX,AL
IN	AL,DX
TEST	AL,4
.IF ZERO? CLC .ELSE STC .ENDIF RLC	BX,1
OR	AL,7FH
OUT	DX,AL
.UNTILCXZ MOV AX,BX POP CX POP BX ENDM
Микропроцессоры 80186, 80188 и 80286
931
Модуль инициализации
IO	0FFA6H,000EH	конечный адрес для вывода UCS
CSJ	[O 0FFA0H,0,80AH	программирование вывода LCS
IO	0FF54H,0	регистр управления портом 1
IO	0FF5CH,0	регистр управления портом 2
IO	0FF58H,0039H	регистр направления для порта 2
MOV	AX, 0	сегмент адреса 0000
MOV	DS,AX	для DS, ES, и SS
MOV MOV MOV	ES, AX SS,AX SP,8000H	установить указатель стека (0000:8000)
MOV	BX,OFFSET INT_TABLE	- 100Н	; установить векторы прерывания
.WHILE WORD PTR CS:[BX] !=		0
MOV
MOV
MOV
MOV
ADD
AX,CS:[BX]
DI,CS:[BX+2]
DS:[DI],AX
DS:[DI+2],CS
BX, 4
.ENDW		
MOV BYTE PTR DS:[40FH] , IO 0FF40H,0 IO 0FF42H,1000	,0	;	время не показывать ; регистр счета таймера 2 ; регистр максимального счета таймера	2
IO 0FF46H,0E001H	; регистр управления control таймером	2
IO 0FF08H,00FCH MOV DX,0FF5AH MOV AL,OH OUT DX,AL SENDS 0 MOV AX,500H MOV DS:[404H],AX	; регистр масок ; Е = 0 для индикатора ; включить модуль температуры : инициализировать последовательность	как пустую
MOV DX:[406H],AX STI CALL INIT_LCD	; прерывания разрешить ; инициализировать жидкокристаллический индикатор	
Системное программное обеспечение (ядро)
MOV
MOV
MOV
MOV
MOV
BYTE ] WORD ] BYTE ] AX,CS ES, AX
PTR
PTR
PTR
DS:[40FH],0
DS:[40СН],0
DS:[40EH],0 ; строка 1 сообщения
; не отображать время/температуру
; очистить значение времени 00:00:00 AM
932
Глава 16
MOV	AL,80H
MOV	BX,OFFSET MES1 - 100H
INT	42h	; показать "The Temp/Clock!"
MOV	BL, 3
INT	41H	; задержка времени 3 секунды
INT	43H	; очистить индикатор
MOV	AL,80Н
MOV	ВХ,OFFSET MES2 - 100Н
INT	42Н	; показать "Set Hours"
MOV	AL,OCOH
MOV	BX,OFFSET MES3 - 100H
INT	42H	; показать "Hours = 00"
.REPEAT MOV SI,40EH	; адрес часов
MOV CL,24H MOV CH,0C8H CALL KEYS .UNTIL CARRY? MOV AL,80H MOV BL,OFFSET MES4 - 100H INT 42H	; показать "Set Minutes"
MOV AL,OCOH MOV BX,OFFSET MES5 - 100H INT 42H	; показать "Minutes = 00"
.REPEAT MOV SI,40DH	; адрес минут
MOV CL,OCAH MOV CL,60H CALL KEYS .UNTIL CARRY? MOV AX,0 MOV ES,0 .WHILE 1
INT 43H	; очистить индикатор
MOV BYTE PTR DS:[40FH],OFFH	; показать время/температуру
.REPEAT	; ожидание нажатия клавиши
.REPEAT KEY .UNTIL !CARRY? MOV BL,15H INT	4OH
KEY .UNTIL !CARRY?
MOV	BYTE PTR DS:	[40FH],0	; время/температуру выключить
INT	42H	
MOV	SI,DS:[406H]	; получить самое старое значение температуры
.WHILE 1 CALL DTEMP ADD SI,4 .IF SI == 5400H
MOV SI,500H .ENDIF
Микропроцессоры 80186, 80188 и 80286
933
MOV CH,DS:[40CH] ; тайм-аут 2 секунды ADD CH,2 DAA .IF CH >= CL SUB CH,CL DAS .ENDIF .REPEAT .REPEAT .BREAK .IF CH == DS:[40CH] KEY .UNTIL CARRY? MOV BL,15H INT 40H KEY .UNTIL CARRY? .REPEAT	; ожидать нажатия клавиши
.REPEAT
.BREAK .IF CH == DS:[40CH] KEY .UNTIL !CARRY? MOV BL,15H INT 40H KEY .UNTIL [CARRY? . ENDW . ENDW
; Процедуры и данные, следующие за системным программным обеспечением
MES1	DB 'The Temp/Clock!',0
MES2	DB 'Set Hours',0
MES3	DB 'Hours = 00',0
MES4	DB 'Set Minutes',0
MES5	DB 'Minutes = 00',0
MES6	DB 'C at '
; Таблица	векторов прерываний
INT_TABLE DW	DW TIM2 - 100H 4CH
DW	DELAYM - 100H
DW	100H
DW	DELAYS - 100H
DW	104H
DW	STRING - 100H
DW	108H
DW	CLEAR - 100H
934
Глава 16
DW 10СН
DW 0
dtemp proc	NEAR
MOV	AX,DS:[SI]
MOV	BX,410H
SHR	AX, 7	; преобразовать в градусы Цельсия
TEST	AL,80Н
.IF	!ZERO?
	NOT	AL
	MOV	BYTE PTR [BX],
	INC	BX
.ENDIF .IF AL > 99
SUB AL, 100
MOV BYTE PTR [BX] , 'Г INC BX
.ENDIF
AAM
ADD AX,3030H
MOV [BX],AH
MOV [BX+1],AL
ADD BX,2
MOV DI,OFFSET MES6 - 100H
MOV CX,5 .REPEAT
MOV AL,CS:[DI]
MOV [BX],AL INC BX INC DI .UNTILCXZ MOV AL,DS:[40EH] CALL STORE MOV BYTE PTR [BX],':' INC BX MOV AL,DS:[40DH] CALL STORE MOV BYTE PTR [BX],0 MOV	AL,8OH
MOV BX,410H INT 42H
DTEMP ENDP		
KEYS	PROC	NEAR
	MOV	DX,0FF5AH
	MOV	AX, 0
	PUSH	ES
	MOV	ES,AX
Микропроцессоры 80186, 80188 и 80286
935
MOV	ВХ,4ООН	; показать часы/минуты
MOV AL,[SI]
CALL STORE
MOV BYTE PTR [BX],0
MOV BX,OFFSET 4OOH
MOV AL,CH
INT 42H
POP ES
MOV CH,DS:[40CH] ; тайм-аут 2 секунды
ADD CH,2
DAA
.IF CH >= CL
SUB CH,CL
DAS
.ENDIF .REPEAT	; ожидать выполнения
.REPEAT .IF CH == DS:[40CH] STC RET .ENDIF KEY .UNTIL CARRY? MOV BL,15H INT	4OH
KEY .UNTIL CARRY? .REPEAT	; ожидать нажатия клавиши
.REPEAT .IF CH == DS:[40CH] STC RET .ENDIF KEY .UNTIL !CARRY?
MOV BL,15H INT 40H KEY .UNTIL !CARRY? MOV AL,[SI] ADD AL,1 DAA .IF AL >= CL
MOV AL,0 .ENDIF MOV [SI],AL CLC RET
KEYS ENDP
936
Глава 16
Обслуживание прерывании таймера 2. (Один раз в миллисекунду)
TIM2	PROC FAR USES ES DS AX BX SI DX MOV AX, 0 MOV DS,AX MOV ES,AX MOV	BX,409H	; адрес часов реального времени - 1 MOV	SI,OFFSET MODU-101H	; адрес таблицы коэффициентов пересчета - 1 .REPEAT INC	SI	; указатель на коэффициент пересчета INC	ВХ	; указатель на счетчик MOV	AL,[ВХ] ; получить значение счетчика ADD	AL,1	; добавить 1 DAA	; преобразовать в BCD .IF AL == BYTE PTR CS:[SI] ; проверить коэффициент пересчета MOV AL,0 .ENDIF MOV [BX],AL ; сохранить новое значение .UNTIL !ZERO? || BX == 40EH IO 0FF02H,8000H	; конец прерывания .IF BYTE PTR DS:[40AH] == 0 && BYTE PTR DS:[40BH] == 0 CALL DISPLAY ; начать процесс индикации .ENDIF IRET
?IM2	ENDP
1ODU	DB 0	; Mod 100
	DB 10H	; Mod 10
	DB 60H	; Mod 60
	DB 60H	; Mod 60
DB 24Н	; Mod 24
•ISPLAY PROC NEAR	; показать время дня(один раз в секунду)
.IF BYTE PTR DS:[40FH] != О ; если индикатор времени не равен нулю STI	; разрешить прерывания
.IF BYTE PTR DS:[4ОСН] == 0	; один раз в минуту
CALL TEMP	; показать и записать время
.ENDIF
MOV BX,3F0H
MOV	SI,40EH	; адрес часов
MOV	AL,[SI]	; получить часы
.IF AL > 12H	; до полудня (AM) или после полудня (PM)
SUB AL,12H DAS
.ELSEIF AL == 0 MOV AL,12H
.ENDIF
Микропроцессоры 80186, 80188 и 80286
937
CALL	STORE
MOV	BYTE PTR [BX],’:’
INC	BX
MOV	AL,[SI]	; получить минуты
CALL	STORE
MOV	BYTE PTR [BX],’: ’
INC	BX
MOV	AL,[SI]	; получить секунды
CALL	STORE
MOV	DL,'A'	; до полудня (AM) или после полудня (PM)
.IF	BYTE PTR DS:[40EH] > 11H
MOV DL,'P' .ENDIF
MOV BYTE PTR [BX],’ ’
MOV [BX+1],DL
MOV BYTE PTR [BX+2],’M’
MOV BYTE PTR [BX+3],0	; конец строки
MOV	BX,3F0H	; буфер индикатора
MOV	AL,0C2H	; начальная позиция индикатора
INT 42H
MOV AX,DS:[SI] ; показать температуру
MOV BX,410H
SHR AX,7	; преобразовать в градусы Цельсия
TEST AL,80H .IF !ZERO?
NOT AL
MOV BYTE PTR [BX], INC BX .ENDIF .IF AL > 99 SUB AL,100 MOV BYTE PTR [BX],’1’ INC BX .ENDIF
AAM
ADD AX,3030H
MOV [BX],AH
MOV [BX+1],AL
MOV	BYTE PTR [BX+2],’C’
MOV	BYTE PTR [BX+3],0
MOV AL,8OH
MOV BX,410H
INT 42H .ENDIF RET
DISPLAY ENDP
STORE PROC NEAR
PUSH AX
SHR AL,4
938
Глава 16
	MOV POP AND MOV ADD MOV ADD DEC RET	DL,AL AX AL, 15 DH,AL DX,3030H [BX] , DX BX,2 SI
STORE	ENDP	
TEMP	PROC	NEAR USES SI
	READS	; считать текущую температуру в регистр АХ
	MOV	SI,DS:[404H]	; получить указатель
	MOV	DS:[SI],AX	; сохранить температуру
	MOV	AL,DS:[40EH]	; считать время в часах
	MOV	DS:[SI+2],AL
	MOV	AL,DS:[40DH]	; считать минуты
	MOV	DS:[SI+3],AL
	ADD	SI,4
	.IF SI	: == 5400Н
	MOV SI,500H	
	.ENDIF	
	MOV	DS:[404Н],SI
	ADD	SI,4
	.IF SI	’ == 5400H
	MOV SI,504H	
	.ENDIF	
	MOV	DS:[406H] ,SI
	RET	
TEMP	ENDP	
DELAYM		PROC FAR USES DS BX AX
	STI	; разрешить прерывания
	MOV	AX, 0
	MOV	DS,AX
	MOV	AL,DS:[40AH]	; считать счетчик миллисекунд
	ADD	AL,BL	; BL = количество миллисекунд
	DAA	
	.REPEAT	
	.UNTIL AL == DS:[40AH]	
	IRET	
DELAYM	ENDP
DELAYS	PROC FAR USES DS BX AX
STI MOV	; разрешить прерывания AX, 0
Микропроцессоры 80186, 80188 и 80286
939
MOV DS,AX
MOV AL,DS:[40CH]
ADD AL, BL
DAA
.IF AL >= 60H
SUB AL,60H
DAS
.ENDIF
.REPEAT
.UNTIL AL == DS:[40CH]
IRET
получить секунды
DELAYS ENDP
INIT_LCD PROC NEAR
MOV	BL,6OH	; ожидать 60 миллисекунд
INT 40H MOV CX,4 .REPEAT
SEND 38H,0,6 .UNTILCXZ
SEND 8,0,2
SEND 1,0,2
SEND 12,0,2
SEND 6,0,2 RET
INIT_LCD ENDP
STRING PROC FAR USES BX AX
STI	; разрешить прерывания
SEND AL,0,1	; переслать начальную позицию
.REPEAT
SEND BYTE PTR ES:[BX],2,1
INC BX .UNTIL BYTE PTR ES:[BX] == 0 IRET
STRING ENDP
CLEAR PROC FAR USES AX BX
STI	; разрешить прерывания
SEND 1,0,2 IRET CLEAR ENDP
ORG 080F0H	; переустановить адрес EPROM на 32K
940
Глава 16
RESET:
10 0FFA4H,0F800H
; начальный адрес для вывода UCS
DB ОЕАН	; JMP F800:0000	(F8000H)
DW ООООН,0F800H
END
Многопоточная система
Иногда нам требуется реализовать операционную систему, которая может обрабатывать множество потоков. Множество потоков обрабатываются ядром системы, используя прерывание от часов реального времени. Один из методов планирования очередности обслуживания процессов в небольшой системе RTOS предполагает использование временного интервала для переключений между разными процессами. Этот временной интервал может быть любой продолжительности, который в некоторой степени зависит от скорости выполнения программы микропроцессором. Современные микропроцессоры исполняют множество команд за один или два тактовых импульса. Допустим, что компьютер выполняет только одну команду за каждые два такта. Если же выбрать временной интервал равный 10 мс, то компьютер с тактовой частотой 100 МГц сможет выполнить за это время до 500 000 команд. При использовании меньшей тактовой частоты временной интервал устанавливают 10 или даже 100 мс.
Каждый такой временной интервал активизируется прерыванием от таймера. Обработчик прерываний должен просмотреть очередь процессов или задач. При этом компьютер или продолжает выполнение старой задачи либо при отсутствии новых переходит в режим ожидания задачи, или же приступает к выполнению новой задачи из очереди. Очередь задач является циклической и может включать любое их число вплоть до некоторого конечного предела для конкретной системы. Например, очередь в малой системе с десятью элементами была бы небольшой. Длина очереди определяется потребностями системы и может быть большей или меньшей. Каждый элемент очереди задач должен содержать указатель на процесс (CS:IP), а также иметь соответствующее состояние процессора. Кроме того, элементы очереди могут содержать время выполнения задачи, на случай зависания программы, приоритет и компонент, который может продлевать временной интервал. В следующем примере не используется ни приоритет, ни компонент для увеличения временных интервалов. Ядро системы будет обслуживать процессы строго на основе линейного или циклического алгоритма, по мере поступления их из очереди.
Чтобы создать программу-планировщик для системы, нам потребуется выполнить процедуры или макрос для запуска нового приложения, для аннулирования приложения после его завершения, а также временного прекращения исполнения приложения, если ему потребуется время для доступа к устройствам ввода-вы вода. Каждый из этих макросов получает доступ к очереди задач, размещаемой в системе памяти по адресу 0500Н. В очереди задач будет использована структура данных, показанная в примере 16.7 для более простого формирования очереди, которая должна будет иметь участок памяти для всех 10 элементов очереди. Таким образом, данная организация очереди позволяет нам запускать в данный момент времени до 10 процессов.
Микропроцессоры 80186, 80188 и 80286
941
Пример 16.7. Структура данных в очереди проЦессЬ^:	%j
PRESENT	DB 0	; Если ООН = нет процесса,	а если FFH = присутствует
RAX	DW ?	; состояние процессора	
RBX	DW ?		
RCX	DW ?		
RDX	DW ?		
RSP	DW ?		
RBP	DW ?		
RSI	DW ?		
RDI	DW ?		
RFLAG	DW ?		
RIP	DW ?		
RCS	DW ?		
RDS	DW ?		
RES	DW ?		
RSS	DW ?		
DUMMY1	DW ?	; для будущего использования и для создания	
DUMMY2	DB ?	; размера элемента равного	32 байта (20Н байт)
Структура данных, приведенная в примере 16.7, копируется в память 10 раз, чтобы завершить организацию очереди во время инициализации системы; следовательно, она не содержит активного процесса при инициализации. Кроме того, нужно установить указатель очереди на 500Н. В данном примере указатель очереди хранится в ячейке 4FEH. В примере 16.8 представлен один из возможных вариантов инициализации.
Пример 16.8. Вариант формирования структуры очереди за/(ач при инициализации . - ч ............................................................................
PUSH DS
MOV АХ,О	v
MOV DS,AX
MOV SI,500H
MOV BX,OFFSET PRESENT - 10OH
MOV CX,10 .REPEAT
MOV BYTE PTR DS:[SI],0
ADD SI,32 .UNTILCXZ
MOV DS:[4FEH],500H ; установить указатель очереди процессов POP DS
Процедура new, вызываемая по прерыванию INT 60Н и приведенная в примере 16.9, добавляет к очереди один процесс и просматривает все ее 10 элементов очереди с целью нахождения нуля в первом байте present, который указывает на незаполненный элемент. Если процедура находит незаполненный элемент очереди, то она размещает начальный адрес процесса в ячейки rcs и rip, а 0200Н — в ячейку rflag. Запись значения 200Н в ячейку rflag гарантирует, что прерывание будет разрешено в самом начале процесса, что предотвращает систему от аварийного отказа. Процедура new ожидает (при уже запланированных 10 процессах) пока не завершится
942
Глава 16
первый процесс. Для каждого процесса также выделяется пространство под стек секциями по 256 байт, начиная с относительного адреса 7500Н, так чтобы младший процесс имел стек с адресами 7500Н—75FFH, следующий процесс имел стек с адресами 7600Н—76FFH и т. д. Назначение участка стека мог бы распределять алгоритм управления памятью.
Пример 16.9. Процедура добавления процесса в очередь
INT60H PROC FARUSES DS АХ DX SI
MOV AX,0	; BX = смещение, DX = сегмент
MOV DS,AX .REPEAT	; ожидание, если очередь заполнена
MOV SI,500H - 32
MOV CX,10
.REPEAT	; найти свободный элемент
ADD SI,32 DEC CX
INT60H
.UNTIL BYTE PTR DS:[SI] == 0	|| SI == 660H
.UNTIL BYTE PTR DS:[SI] == 0 CALL SAVE_STATE	
MOV WORD PTR DS:[SI+17],200H ;	регистр флагов
MOV DS:[SI+19],BX	регистр IP
MOV DS:[SI+21], DX MOV AX,SS	регистр CS
MOV DS:[SI+27],AX MOV AX,10 SUB CX,AX SHL AX,8 ADD AX,7500H	регистр SS
MOV DS:[SI+9],AX	регистр SP
MOV BYTE PTR DS:[SI],0FFH IRET ENDP	активизировать процесс
pause является простым вызовом процедуры задания временного интервала (INT 12Н), который приостанавливает процесс и вновь возвращает управление процедуре, преждевременно прекращая временной интервал этого процесса. Такое досрочное прекращение позволяет другим процедурам продолжать выполнение программы до возврата в текущий процесс.
Заключительная управляющая процедура kill, которая располагается по вектору прерывания 61Н и показана в примере 16.10, удаляет приложение за счет размещения в ячейке present структуры данных очереди процессов значения ООН, которое и удаляет процесс из очереди.
Пример 16.10. Процедура, удаляющая процесс из очереди > l
INT61 PROC	FARUSES DS AX DX SI
MOV AX,0
MOV DS,AX
Микропроцессоры 80186, 80188 и 80286
943
MOV SI,DS:[4FEH]
получить указатель очереди процессов
MOV DS:[SI],0	; удалить процесс
JMP INT12A
INT61 ENDP
Процедура обслуживания прерывания задания временного интервала для микропроцессора 80С188ЕВ, использующего интервал времени в 10 мс, приведена в примере 16.11. Поскольку она относится к процедуре обслуживания прерываний, то следует позаботиться об эффективности ее исполнения. В примере 16.11 показана процедура временного интервала, располагаемого по вектору прерываний 12Н для операции со встроенным в микропроцессор 80С188ЕВ таймером 1.
Г Пример 16.11. Процедура задания ВременноТа йнтервала равного 10 мс
INT12 PROC
FARUSES DS АХ DX SI ; обслуживание таймера 1
MOV АХ,0	; адрес совместно используемой памяти
MOV DS,AX
MOV SI,DS:[4FEH] ; получить текущий указатель очереди
CALL SAVE-STATE	; сохранить текущее состояние процессора
INT12A:
ADD SI,32	; получить следующий процесс
.IF SI == 660Н	; сделать очередь циклической
MOV SI,500H .ENDIF .WHILE BYTE PTR DS:[SI] != FF ADD SI,32 .IF SI == 660H MOV SI,500H .ENDIF
. ENDW		
MOV	DX,0FF38H	; регистр сч^та таймера 1
MOV	AX, 0	; установить значение счета 0000Н
OUT	DX,AX	; для завершения интервала в 10 мс
MOV	DX,0FF02H	; регистр завершения прерывания
MOV	AX,8000H	
OUT	DX,AX	; установить бит NSPEC
JMP	LOAD_STATE	; получить следующее состояние процессора
; из очереди процессов
INT12 ENDP
Запуск системы, происходящий сразу после ее инициализации, должен быть единственным процессом внутри бесконечного цикла ожидания, как это показано в примере 16.12.
.................     ..«•«...............................................       •	•’ Л . •	J
| ^Пример
SYSTEM_START:
MOV ВХ,OFFSET WAITLOOP - 100H
MOV DX,0F800H
944
Глава 16
INT 60Н	; вызов процедуры NEW для запуска потока WAITLOOP
ADD DS:[4FEH],32 ; только в течение этого первого раза
STI	; разрешить прерывания
; другие процессы, были бы начаты здесь
WAITLOOP: .WHILE 1
INT 12Н .ENDW
; системный холостой цикл ожидания
; раннее завершение интервала
И наконец, последние нерассмотренные процедуры save state и load state, предназначенные для загрузки и сохранения контекстного состояния процессора при переключении от одного процесса к другому. Эти процедуры вызываются прерыванием задания временного интервала и представлены в примере 16.13.
Пример 16.13. Процедуры save_state и lqadjstate
SAVE_STATE PROC NEAR
MOV	DS:[SI+3],BX	; сохранить содержимое BX
MOV	DS:[SI+5],CX	; сохранить содержимое CX
MOV	DS:[SI+9],SP	; сохранить содержимое SP
MOV	DS:[SI+11],BP	; сохранить содержимое ВР
MOV	DS:[SI+15], DI	; сохранить содержимое DI
MOV	DS:[SI+25],ES	; сохранить содержимое ES
MOV	DS:[SI+27],SS	; сохранить содержимое SS
MOV	BP,SP	; получить содержимое SP
MOV	AX, [BP+2]	; получить содержимое SI
MOV	DS: [SI+13]	; сохранить содержимое SI
MOV	AX, [BP-i-4]	; получить содержимое DX
MOV	DS:[SI+7]	; сохранить содержимое DX
MOV	AX,[BP+6]	; получить содержимое АХ
MOV	DS:[SI+1]	; сохранить содержимое АХ
MOV	AX,[BP+8]	; получить содержимое DS
MOV	DS:[SI+23]	; сохранить содержимое DS
MOV	AX, [BP+10]	; получить содержимое флагов
MOV	DS: [SI+17]	; сохранить содержимое флагов
MOV	AX, [BP+12]	; получить содержимое CS
MOV	DS: [SI+21]	; сохранить содержимое CS
MOV	AX,[BP+23]	; получить содержимое IP
MOV RET	DS:[SI+19]	; сохранить содержимое IP
SAVE_STATE ENDP
LOAD_STATE PROC NEAR
MOV	SS,DS:[SI+27]	; получить содержимое SS
MOV	SP,DS:[SI+9]	; получить содержимое SP
MOV	AX,DS:[SI+19]	; получить содержимое IP
PUSH	AX	; содержимое IP в стек
MOV	AX,DS:[SI+21]	; получить содержимое CS
Микропроцессоры 80186, 80188 и 80286
945
PUSH	AX	; содержимое CS в стек
MOV	AX,DS:[SI+21]	; получить содержимое флагов
PUSH	AX	; сохранить его в стеке
MOV	AX,DS: [SI-F23;	; получить содержимое DS
PUSH	AX	; содержимое DS в стек
MOV	AX,DS:[SI+13]	; получить содержимое SI
PUSH	AX	; содержимое SI в стек
mov	AX,DS: [SIH]	; получить содержимое АХ
MOV	BX,DS:[SI+3]	; получить содержимое ВХ
MOV	CX,DS:(SI+5j	; получить содержимое СХ
MOV	DX,DS:[Sl+7]	; получить содержимое DX
MOV	BP,DS:[SI+11]	; получить содержимое ВР
MOV	DI,DS:[SI+15]	; получить содержимое DI
MOV	ES,DS:[SI+25]	; получить содержимое ES
POP	SI	
POP	DX	
POP	AX	
POP IRET	DS	
LOAD STATE ENDP
16.5.	Микропроцессор 80286
Микропроцессор 80286 является усовершенствованной версией микропроцессора 8086, который был разработан для многопользовательской и мультизадачной операционной среды. Микропроцессор 80286 способен адресоваться к 16 Мбайтам физической памяти и 1 Гбайту виртуальной памяти за счет использования системы управления памятью. В этом разделе текста рассматривается микропроцессор 80286, который нашел применение в первых персональных компьютерах АТ и с которым связан настоящий "бум" на компьютерном рынке. ^Микропроцессор 80286, по существу и в основном, является аналогом микропроцессора 8086, который правда оптимизирован для выполнения команд за меньшее число периодов тактовой частоты. Он, безусловно, является усовершенствованной версией процессора 8086, поскольку содержит блок управления памятью и имеет несколько расширенную систему команд. В настоящее время процессор 80286 больше не используется в персональных компьютерных системах, но иногда находит применения в системах управления как встроенный контроллер.
Аппаратные особенности
На рис. 16.28 приведена блок-схема микропроцессора 80286. Обратите внимание, что микропроцессор 80286, в отличие от микропроцессоров 80186/80188, не содержит в себе встроенных контроллеров. Вместо них он содержит блок управления памятью, иначе MMU (Memory-Management Unit), который на блок-схеме назван блоком адресации (address unit). Тщательное ознакомление с блок-схемой показывает, что адресные выводы А23—АО, а также выводы BUSY , CAP, ERROR , PEREQ и РЕАСК являются новыми или добавленными выводами, которых нет в микропроцессоре 8086.
Рис. 16.28. Блок-схема микропроцессора 80286
д46_______________________________________________Глава 16
Микропроцессоры 80186, 80188 и 80286
947
Сигналы BUSY , ERROR , PEREQ и РЕАСК используются при работе с сопроцессором, примером которого является 80287. Обратите внимание, что аналогичный вывод TEST процессора 8088/8086 в процессоре 80286 называется BUSY . Шина адреса разрядностью 24 бита позволяет адресоваться к 16 Мбайтам физической памяти. Вывод САР соединяется с конденсатором емкостью 0,047 мкФ ±20% с рабочим напряжением 12 В, который в свою очередь подключают к нулевому потенциалу. Конденсатор необходим для работы внутреннего делителя частоты. Для сравнения на рис. 16.29 приведены условные схемы обозначения микропроцессоров 8086 и 80286. Следует заметить, что микропроцессор 80286 не имеет мультиплексированной шины адреса/данных.
-^-Tmn
22
-75— READY
-if- CLK RESET
—— INTR
17
8086
ADO AD1 AD2 AD3 AD4 AD5 AD6 AD7 AD8 AD9 AD10 AD11 AD12 AD13 AD14 AD15 AD16/S3 A17/S4 A18/S5 A19/S6
15
63
RESET
HLDA HOLD NMI TEST
13
11
___5
___3
___2
37
34
DEN DT/B M/IO
I2
RD
WR Hi”
ALE -g-
INTA
25
SO
S1
M/IO LOCK NMI INTR
67
_57_
52
HOLD HLDA
ERROR BUSY PEREQ PEACE___
COD/INTA
CAP
80286
AO A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23
ВНЕ
33
28
_25_
22
20
18
17
12
10
1
_4Q_
DO D1 D2 D3 D4 D5
D8 -Цг
D9 -fi-dio -44-D11 -4i-D12 -41-D13 -4£-
50
37
3!
45
—55—>CLK
A
D15
Рис. 16.29. Схемы обозначения микропроцессоров 8086 и 80286
В главе 1 уже упоминалось, что микропроцессор 80286 работает в реальном и защищенном режимах. В реальном режиме работы микропроцессор 80286, используя только 16-разрядную шину адреса, адресуется лишь к 1 Мбайту памяти и, в сущности, является идентичным с микропроцессором 8086. В защищенном режиме работы микропроцессор 80286, используя все 24 разряда, адресуется уже к 16 Мбайтам физической памяти.
На рис. 16.30 представлена простейшая система на базе микропроцессора 80286.
948
Глава 16
Шина
управления
Рис. 16.30. Схема соединения микропроцессора 80286 с синхрогенератором 82284 и шинным контроллером 82288
Обратите внимание, что тактирование процессора обеспечивается синхрогенератором 82284 аналогичным с уже рассмотренным 8284А, а управляющими сигналами система снабжается шинным контроллером 82288 аналогичным 8288, также рассмотренным ранее. Кроме того, следует заметить, что на схеме отсутствуют защелки, необходимые при демультиплексировании совмещенной шины адреса/данных микропроцессора 8086.
Система команд
Система команд микропроцессора 80286 включает все команды процессоров 8086/8088 и имеет ряд дополнительных команд. Дополнительные команды управляют системой виртуальной памяти с помощью блока управления памятью микропроцессора 80286. В табл. 16.10 перечислены все эти команды с комментариями относительно назначения каждой из них. Обратите внимание, что здесь приведены только дополнительно добавленные команды к микропроцессору 80286. Кроме них система команд микропроцессора 80286 содержит новые добавленные еще и для
Микропроцессоры 80186, 80188 и 80286 949
микропроцессоров 80186/80188 команды, такие как: ins, outs, bound, enter, leave, pusha, popa, а также команды целочисленного умножения на константу и команды сдвигов, включая циклические, с указанием счетчика в константе.
Таблица 16.10. Дополнительные команды микропроцессора 80286
Команда Назначение
clts Сбрасывает бит флага переключения задач
lgdt Загружает из памяти регистр глобальной таблицы дескрипторов
sgdt Сохраняет в памяти содержимое регистра глобальной таблицы дескрипторов
lidt Загружает из памяти регистр таблицы дескрипторов прерываний
sidt Сохраняет в памяти содержимое регистра таблицы дескрипторов прерываний
lldt Загружает из регистра или памяти регистр локальной таблицы дескрипторов
sldt Сохраняет в регистре или в памяти содержимое регистра локальной таблицы дескрипторов
lmsw Загружает регистр состояния машины (MSW)
smsw Сохраняет содержимое регистра состояния машины
lar	Загружает права доступа дескриптора
LSL	Загружает граничное значение сегмента
str	Сохранение содержимого регистра задачи
ltr	Загружает регистр задачи
arpl	Приводит уровень привилегии к наибольшему значению
verr Проверяет сегмент на возможность считывания
verw	Проверяет сегмент на возможность записи.	**
Ниже следует описание некоторых специальных команд, которые используются для управления защитой.
П CLTS
Команда clts (clear task-switched flag) сбрасывает бит флага переключения задач TS (task-switched) в регистре состояния машины MSW (machine state word). Если флаг TS установлен и следующая команда, относящаяся к сопроцессору 80287, вызовет прерывание (тип вектора 7). Это позволяет программно определить, относится ли контекст сопроцессора к текущей задаче. Команда clts используется в системе и считается привилегированной командой, поскольку она может выполняться только в защищенном режиме с нулевым уровнем привилегий. Команды для установки флага TS не существует. Однако установить флаг можно при помощи записи логической единицы в бит 3 (TS) регистра состояния машины MSW с использованием команды lmsw.
□ LAR
Команда lar (load access rights) считывает дескриптор сегмента и размещает копию байта прав доступа в 16-разрядный регистр. Примером является команда
950
Глава 16
lar ах, вх, которая загружает регистр АХ байтом прав доступа из выбранного дескриптора по значению селектора, указанного в регистре ВХ. Команда используется для получения прав доступа, чтобы она могла быть проверена перед программным использованием сегмента памяти, описанного дескриптором.
□	LSL
Команда lsl (load segment limit) загружает в выделенный для пользователя регистр граничное значение сегмента. Например, команда lsl ах,вх загружает в регистр АХ граничное значение сегмента, описываемое дескриптором, который выбирается селектором, указанным в регистре ВХ. Эта команда используется для проверки граничного значения сегмента.
□	ARPL
Команда arpl (adjust requested privilege level) используется для проверки селектора, чтобы уровень привилегий запрашиваемого селектора не нарушался. Примером является команда arpl ах,сх. Регистр АХ содержит запрашиваемый уровень привилегий, а СХ содержит значения селектора вызывающего процесса для доступа к дескриптору. Если запрашиваемый уровень привилегий имеет приоритет ниже, чем у проверяемого дескриптора, то устанавливается флаг нуля ZF. Использование команды гарантирует, что параметр-селектор в подпрограмме не запросит большего уровня привилегированности, чем ему позволит вызывающий процесс.
П VERR
Команда verr (verify for read access) проверяет сегмент на возможность считывания. Если вспомнить содержание главы /, то сегмент кода может иметь защиту от несанкционированного чтения. Если считывание из сегмента кода разрешено, то устанавливается флаг нуля ZF, если же не разрешено, то флаг будет сброшен. Команда verr ах проверяет дескриптор, выбираемый с помощью регистра АХ.
□ VERW
Команда verw (verify for write access) проверяет сегмент на возможность записи. Если вспомнить содержание главы 7, то сегмент кода может иметь защиту от несанкционированной записи. Если запись в сегмент кода разрешена, то устанавливается флаг нуля ZF, если же не разрешена, то флаг будет сброшен.
Виртуальная память
Механизм виртуальной памяти (virtual memory machine) позволяет системам, имеющим относительно небольшую физическую память (16 Мбайт для микропроцессора 80286), отображать достаточно большую область памяти (I Гбайт для процессора 80286). Сам же механизм виртуальной памяти заключается в том, что на жестком диске создается файл обмена (swap-файл) размером в несколько десятков мегабайт, который, по сути, является как бы расширением оперативной памяти системы. При работе системы по мере необходимости осуществляется перекачка данных и программ между файлом обмена на жестком диске и физической памятью. Адресация к виртуальной памяти в системе осуществляется с помощью дескрипторов. Каждый дескриптор процессора 80286 описывает сегмент памяти размером в 64 Кбайта, а сам процессор имеет возможность использовать 16К дескрипторов. Таким образом, это позволяет системе иметь виртуальную память емкостью до 1 Гбайт (64 Кбайтх16К).
Микропроцессоры 80186, 80188 и 80286
951
В главе 1 уже упоминалось, что дескрипторы описывают сегмент памяти только в защищенном режиме. Микропроцессор 80286 имеет дескрипторы, которые определяют коды, данные, стековые сегменты, прерывания, процедуры и задачи. Доступ к дескриптору выполняется загрузкой, выполняемой в защищенном режиме, сегментного регистра селектором. Селектор получает доступ к дескриптору, который описывает область памяти. Более подробно о дескрипторах и их применениях см. в главах 1, 17 и 18. Для детального рассмотрения системы управления памятью в защищенном режиме работы следует обратиться к этим главам.
Итоги
П Микропроцессоры 80186/80188 имеют аналогичный с микропроцессорами 8086/8088 базовый набор команд, за исключением нескольких новых добавленных команд. Следовательно, микропроцессоры 80186/80188 являются улучшенными версиями микропроцессоров 8086/8088. К новым командам относятся: pusha, рора, ins, outs, bound, enter, leave, а также команды целочисленного умножения на константу и команды сдвигов, включая циклические, с указанием счетчика в константе.
П Микропроцессоры 80186/80188 имеют ряд встроенных в него устройств, таких как: генератор синхронизирующих импульсов, программируемый контроллер прерываний, три программируемых таймера, программируемый контроллер DMA, программируемый логический блок выбора кристалла, сторожевой таймер, логическую схему регенерации динамического ОЗУ и некоторые другие дополнительные функции в зависимости от версии процессора.
П Встроенный синхрогенератор позволяет микропроцессорам 80186/80188 работать либо от внешнего источника синхронизации ТТЛ-уровня, либо от кварцевого резонатора, соединенного с выводами XI (CLKIN) и Х2 (OSCOUT). Имеются микропроцессоры с тактовой частотой в пределах qt 6 до 20 МГц.
П Программируемый контроллер прерываний регулирует все внутренние и внешние запросы. Он также может работать с двумя внешними контроллерами прерываний типа 8259А.
П Внутри микропроцессоров 80186/80188 размещены три программируемых таймера. Каждый таймер — это полностью программируемый 16-разрядный счетчик, используемый для формирования сигналов различной длительности или для подсчета числа событий. Два таймера (таймеры 0 и 1) имеют внешние вводы и выводы. Третий таймер (таймер 2) синхронизируется от системных тактовых импульсов и используется или для обеспечения синхронизации другому таймеру, или для запроса режима работы DMA.
П Встроенный программируемый контроллер DMA — это полностью программируемый двухканальный контроллер. Передача данных в режиме DMA осуществляется между ЗУ и устройством ввода-вывода, между устройствами ввода-вывода, а также осуществляется передача типа "память-память”. Запросы на передачу данных в режиме DMA осуществляются от программного или аппаратного обеспечения, или от таймера 2.
П Программируемый блок выбора кристалла является внутренним дешифратором, который обеспечивает 13 выходных выводов: для выбора памяти (6 выводов) и
952
Глава 16
для выбора устройств ввода-вывода (7 выводов). Этот блок программируют на осуществление добавления до трех тактов ожидания (0—3) и на работу с использованием внешнего сигнала готовности READY или без него. Число тактов ожидания для процессоров 80186/80188 версий ЕВ и ЕС может программироваться в пределах от 0 до 15.
□ Единственным различием в синхронизации микропроцессоров 80186/80188 и 8068/8088 является то, что во временных диаграммах микропроцессоров 80186/80188 сигнал ALE устанавливается на полпериода тактового сигнала раньше, чем в диаграммах для процессоров 8086/8088.
□ Время доступа к памяти для микропроцессоров 80186/80188 с тактовой частотой 6 МГц составляет 417 нс, а для процессоров с тактовой частотой 8 МГц составляет 390 нс.
□ Периферийные внутренние устройства микропроцессоров 80186/80188 программируются посредством регистров блока управления периферией, который после инициализации системы размещается по адресам FF00H—FFFFH системы ввода-вывода. Этот блок может перемещаться в любую область пространства памяти или устройств ввода-вывода за счет изменения содержимого в регистре регистра перемещения блока управления периферией, имеющего после инициализации адрес FFFEH пространства ввода-вывода.
□ Микропроцессор 80286 является усовершенствованным микропроцессором 8086, включающим в себя блок управления памятью (MMU). Микропроцессор 80286 способен адресоваться к 16 Мбайтам физической памяти.
□ Микропроцессор 80286 содержит те же самые команды, что и микропроцессоры 80186/80188, за исключением нескольких новых дополнительных команд, управляющих работой блока управления памятью.
□ Микропроцессор 80286, посредством блока управления памятью, способен адресоваться к 1 Гбайту виртуальной памяти, которую определяют две таблицы 16К дескрипторов.
Контрольные вопросы и задания
1.	Перечислите отличия между микропроцессорами 8086/8088 и 80186/80188.
2.	Какие аппаратные усовершенствования имеются в микропроцессорах 80186/80188, которых нет в микропроцессорах 8086/8088?
3.	К какому типу интегральных схем можно отнести микропроцессоры 80186/80188?
4.	Какой сигнал будет на выводе CLKOUT при подсоединении кварцевого резонатора на 20 МГц к выводам XI и Х2?
5.	Опишите различия между версиями процессоров 80C188XL и 80С188ЕВ.
6.	Нагрузочная способность по выходу для любого вывода микропроцессоров 80186/80188 составляет для сигналов низкого логического уровня.
7.	Сколько периодов тактовых сигналов имеется в цикле шины микропроцессоров 80186/80188?
8.	Какое основное отличие имеется во временных диаграммах микропроцессоров 8086/8088 и 80186/80188?
9.	В чем заключается важность параметра времени доступа к памяти?
Микропроцессоры 80186, 80188 и 80286 953
10.	Какое время доступа к памяти в микропроцессорах 80186/80188, работающего на частоте 6 МГц?
11.	По какому адресу размещаются регистры блока управления периферией после сброса микропроцессоров 80186/80188 в исходное состояние?
12.	Напишите последовательность команд, которая необходима для перемещения блока управления периферией в ячейки памяти по адресу 10000Н—100FFH.
13.	Какой вектор прерывания используется выводом INTO в микропроцессорах 80186/80188?
14.	Сколько векторов прерываний доступно для контроллера прерываний, расположенного в микропроцессорах 80186/80188?
15.	Какие два режима работы имеет контроллер прерываний?
16.	Какое назначение имеют регистры управления прерываниями процессоров 80186/80188?
17.	При замаскированном источнике прерываний бит маски в регистре масок прерываний должен быть.
18.	Какое отличие между регистром опроса и регистром состояния опроса контроллера прерываний?
19.	Какое назначение имеет регистр завершения прерывания?
20.	Сколько 16-разрядных таймеров имеется в микропроцессорах 80186/80188?
21.	Какие таймеры имеют входные и выходные выводы?
22.	Какой таймер непосредственно подключен к тактирующим импульсам процессоров 80186/80188?
23.	Объясните принцип работы таймера при использовании им двух регистров максимального счета.
24.	Какое назначение имеет бит INH регистра управления таймера?
25.	Какое назначение разряда Р регистра управления таймера?
26.	Какой тип операции для таймеров 0 и 1 выбирается с помощью бита ALT соответствующего регистра управления?
27.	Объясните, как используются выходные выводы таймера.
28.	Напишите для таймера 1 программу формирования непрерывной последовательности сигналов, имеющего высокий логический уровень в течение 123 тактирующих импульсов и низкий логический уровень в течение 23 импульсов.
29.	Напишите для таймера 0 программу формирования одиночного импульса после завершения 105 тактирующих импульсов.
30.	Сколько DMA-каналов управляются контроллером DMA в микропроцессоре 80C186XL?
31.	Каждый регистр указателя адреса источника и регистр указателя назначения контроллера DMA имеет__________разрядов.
32.	Каким образом программно можно начать DMA-передачу в канале?
33.	Блок выбора кристалла процессоров 80186/80188 версии XL и ЕА имеет__выводов для
выбора ЗУ.
34.	Блок выбора кристалла процессоров 80186/80188 версии XL и ЕА имеет__выводов для
периферийных устройств.
35.	Последней ячейкой блока верхней области памяти, которая выбирается с помощью вывода UCS, является ячейка.
36.	Выводы выбора элементов памяти в средней области памяти процессоров 80186/80188 версии XL и ЕА программируются для адреса и размера блока.
37.	Нижняя область памяти, которая выбирается с помощью вывода LCS, начинается с адреса .
954 Глава 16
38.	Внутренний генератор тактов ожидания процессоров 80186/80188 версии ЕВ и ЕС способен вводить в цикл шины от______до_____тактов ожидания.
39.	Запрограммируйте регистр блока выбора кристалла, имеющий смещение А8Н, процессоров 80186/80188 версии XL и ЕА, чтобы размер блока среднего диапазона памяти составлял 128 Кбайт.
40.	Какое назначение имеет бит ЕХ регистра блока выбора кристалла, имеющий смещение А8Н?
41.	Напишите программу для программирования вывода GCS3 , чтобы выбирать устройство памяти, имеющего адреса 20000Н—2FFFFH, и добавить два такта ожидания в цикл шины.
42.	Напишите программу для программирования вывода GSC4 , так чтобы выбирать устройство ввода-вывода, имеющего адрес ЮООН—103FH, и добавить один такт ожидания в цикл шины.
43.	Микропроцессор 80286 адресуется к байтам физической памяти.
44.	При использовании блока управления памятью микропроцессор 80286 адресуется к байтам виртуальной памяти.
45.	Набор команд микропроцессора 80286 идентичен с , за исключением команд управления работой блока управления памятью.
46.	Какое назначение имеет команда VERR?
47.	Какое назначение имеет команда LSL?
48.	Что такое RTOS?
49.	Каким образом могут обрабатываться множество потоков с помощью RTOS?
ГЛАВА 1 7
Микропроцессоры 80386 и 80486
Введение
Микропроцессор 80386 является полной 32-разрядной версией предыдущих 16-раз-рядных микропроцессоров 8086/80286 и символизирует значительное достижение в архитектуре процессоров — поворот от 16-разрядной к 32-разрядной архитектуре. Наряду с увеличением разрядности имеется также много усовершенствований и дополнительных функций. Микропроцессор 80386 обеспечивает: переключение задач, более совершенное управление памятью, управление виртуальной памятью со страничной трансляцией адресов (paging) или без нее, защиту программного обеспечения и возможность использования запоминающей системы большой емкости. Все программное обеспечение, написанное для прежних микропроцессоров 8086/8088 и 80286 совместимо снизу вверх и для микропроцессора 80386. Объем адресуемой памяти процессором увеличился с 1 Мбайта (для микропроцессора 8086/8088) или 16 Мбайт (для микропроцессора 80286) до 4 Гбайт, доступных процессору 80386 в защищенном режиме. Микропроцессор 80386 может переходить из защищенного режима работы в реальный режим без аппаратного сброса микропроцессора, который требует значительных затрат времени и был необходим в случае использования процессора 80286.
Микропроцессор 80486 является улучшенной версией микропроцессора 80386 и выполняет многие его команды за один период тактовых импульсов. Микропроцессор 80486 также имеет внутренний кэш первого уррвмя емкостью на 8 Кбайт и встроенный высокопроизводительный математический сопроцессор, программно совместимый с сопроцессором 80387. Следует отметить, что процессор 80486DX4 имеет кэшпамять емкостью 16 Кбайт. Микропроцессор 80486, работая на такой же тактовой частоте, что и микропроцессор 80386, является на 50% более производительным. В главе 18 рассмотрены процессоры Pentium и Pentium Pro, имеющие кэш-память первого уровня общей емкостью 16 Кбайт (8 Кбайт для команд и 8 Кбайт для данных), которые работают со скоростью в два раза быстрее, чем микропроцессор 80486. Микропроцессоры Pentium и Pentium Pro также имеют улучшенный встроенный математический сопроцессор, работающий примерно в пять раз быстрее, чем сопроцессор микропроцессора 80486. В главе 19 рассмотрены и другие дополнительные усовершенствования микропроцессоров Pentium II—Pentium 4.
Назначение главы
После завершения ознакомления с этой главой вы сможете:
□	сопоставлять микропроцессоры 80386 и 80486 с предыдущими микропроцессорами Intel;
956
Глава 17
□	описать принцип работы блока управления памятью и блока страничной трансляции адресов микропроцессоров 80386/80486;
□	осуществлять переключение из защищенного режима в реальный режим работы;
□	описать дополнительные команды и режимы адресации микропроцессоров 80386/80486;
□	объяснить принцип работы системы с кэш-памятью;
□	подробно описать структуру прерываний и прямого доступа к памяти микропроцессоров 80386/80486;
□	сравнить микропроцессор 80486 с микропроцессором 80386;
□	объяснить принцип работы кэш-памяти микропроцессора 80486.
17.1. Микропроцессор 80386
Прежде чем использовать микропроцессор 80386 или любой другой микропроцессор в системе, следует понять назначение каждого его вывода. В данном разделе главы подробно рассматривается каждый вывод микропроцессора 80386 в процессе работы с внешней запоминающей системой и устройствами ввода-вывода.
На рис. 17.1 представлены условные графические обозначения микропроцессоров 80386DX и 80386SX. Микропроцессор 80386DX помещен в 132-контактный корпус типа PGA (pin grid array), т. е. корпус с матричным расположением штырьковых выводов. Наиболее распространены были две версии микропроцессора 80386: процессор 80386DX, рассматриваемый в этой главе, и упрощенный процессор 80386SX с внешней 16-разрядной шиной данных, хотя внутри он использовал 32-разрядную шину.
Более новая версия микропроцессора 80386 — 80386ЕХ содержит в себе: блок управления шиной АТ, блок управления регенерацией динамического ОЗУ, программируемый блок выбора кристалла, контроллер прерываний,, контроллер DMA, блок таймеров, блок последовательной передачи данных, 26 выводов шины адреса, 16 выводов шины данных. На рис. 17.2 представлено условное графическое обозначение микропроцессора 80386ЕХ.
Микропроцессор 80386DX, имея 32-разрядную шину данных и 32-разрядную шину адреса, способен адресоваться к 4 Гбайтам физической памяти. Микропроцессор 80386SX, подобно микропроцессору 80286, адресуется к 16 Мбайтам памяти и имеет в своем распоряжении только 24-разрядную шину адреса и 16-разрядную шину данных. Микропроцессор 80386SX был разработан после микропроцессора 80386DX для использования, не требующего полной версии 32-разрядной шины. Микропроцессор 80386SX применялся во многих персональных компьютерах, которые использовали ту же самую системную плату, что и для микропроцессора 80286. В то время, когда большинству приложений, включая Windows, требовалось менее 16 Мбайт памяти, процессор 80386SX был популярной и менее дорогостоящей версией микропроцессора 80386. В дальнейшем, несмотря на то, что процессор 80486 становился все более дешевым для построения новых вычислительных систем, все равно процессор 80386 долгое время оставался востребованным для многих приложений. Например, микропроцессор 80386ЕХ, хотя в персональных компьютерах и не использовался, но был очень популярен во встраиваемых системах.
Микропроцессоры 80386 и 80486
957
H12 ТИТ
H14 J14 K14 K13 L14 KiT L13 N14 M12 N13 N12 PTT P12
DO D1 D2 D3
D5
D6
D7
D8 D9
N11 N10 P11 P10
M9 N9
P9 N8
P7 N6 P5 N3~ M6
P4 P3 M5
D1O D11
D12
D13
D14
D15
D16
D17
D18
D19
D20
D21
D22
D23
D24 D25 D26 D27
D28 D29 D30 D31
80386DX
BEO BE1 BE2 ВЕЗ
A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 АЗО A31
E14. "PIT
C14,
D14
M14
ADS NA BS16 READY
HOLD HLDA
W/R
D/C
M/IO LOCK
PEREQ BUSY
INTR NMI RESET CLK2
Рис. 17.1. Условные графические обозначения микропроцессоров 80386DX и 80386SX
Микропроцессору 80386, как и предыдущим версиям семейства микропроцессоров Intel, для работы требуется только один источник питания напряжением +5,0 В. Средний ток потребления процессором 80386 составляет: 550 мА для процессора, работающего на тактовой частоте 25 МГц, 500 мА для процессора с частотой 20 МГц и 450 мА для процессора, работающего на частоте 16 МГц. Кроме того, имеется версия процессора с тактовой частотой 33 МГц, который имеет ток потребления равный 600 мА. Ток потребления микропроцессора 80386ЕХ составляет 320 мА при работе на частоте 33 МГц.
Обратите внимание, что ток потребления процессора, во время некоторых режимов его работы, может возрастать до 1,0 А. Это означает, что источник питания и схема разводки питания должны быть рассчитаны на эти всплески тока. Процессор имеет многочисленные выводы Vcc и Vss, которые для правильной работы микропроцессора должны быть все подключены к источнику постоянного тока с напряжением +5,0 В (Vcc) и заземлены (Vss). Некоторые выводы процессора обозначены как N/C (по connection) и не должны быть куда-либо подключены. Помимо названных были и несколько другие версии микропроцессоров 80386SX и 80386ЕХ, имеющие пониженное напряжение питания +3,3 В. Эти процессоры применялись в портативных
958
Глава 17
блокнотных компьютерах (notebook) или портативных компьютерах (laptop) и обычно упакованы в корпус для поверхностного монтажа.
RESET CLK2
P1.0/DCD0# P1.1/RTS0# P1.2.DTR0# P1.3/DSR0#
P1.4/RI0#
P1.5/LOCK#
P1.6/HOLD
P1.7/HLDA
P2.0/CS0# P2.1/CS1#
P2.2/CS2#
P2.3/CS3#
P2.4/CS4#
P2.5/RXD0
P2.6/TXD0 P2.7/CTS0#
рз.оямиоито P3.1/TMROUT1 P3.2/INT0 P3.3/INT1 P3.4/INT2 P3.5/INT3 P3.6/PWRDOWN P3.7/COMCLK
UCS
CS6#/REFRESH#
м/ю* RD# WR# D/C# W/R# READY# BS8# BLE# ВНЕ# ADS# NA#
NMI SMI# LBA# TDO TDI TMS FLT# PEREQ/TMCLK2 ERROR#HMROUT2 BUSY#/TMRGATEO INT4/TMRCLK0 INT5/TMRGATE0 INT6/TMRCLK1 INT7/TMRGATE1 TCK
80386ЕХ
DO D1
D2 D3 D4 D5
D6 D7 D8 D9
D10 D11 D12 D13 D14 D15
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16/CAS0 A17/CAS1 A18/CAS2 A19 A20 A21 A22 A23 A24 A25
DTR1#/SRXCLK RI1#/SSIOTX RTS1#SSIOTX
DSR1#/STXCLK DACK1#/TXD1 EOP#/CTS1# WDTOUT DRQ0/DCD1# DRQ1/RXD1 TRST# SMIACT# DSCKO#CSS#
5
41
ft

Рис. 17.2. Условное графическое обозначение микропроцессора 80386ЕХ со встроенными контроллерами
Каждый выходной вывод линий адреса и данных микропроцессора 80386 способен обеспечить ток до 4,0 или 5,0 мА все остальные выходные выводы. Это означает о повышении тока возбуждения в сравнении с 2,0 мА, которые были на выходных выводах предшествующих микропроцессоров 8086, 8088 и 80286. Выходной ток для большинства выходных выводов микропроцессора 80386ЕХ составляет даже 8,0 мА. Каждый входной вывод имеет малую величину тока нагрузки, которая составляет всего лишь около ±15 мкА. Однако даже эти малые значения тока в некоторых сис
Микропроцессоры 80386 и 80486 959
темах, за исключением самых малых, приводят к необходимости применения шинных буферных схем.
Далее приводится назначение каждой группы выводов и соответствующих сигналов микропроцессора 8O386DX:
О А31-А2
Выходные адресные линии А31—А2 (address) с тремя состояниями адресуются к 1Г х 32 битам (4 Гбайтам) физической памяти микропроцессора 80386. Обратите внимание, что при внутренней дешифрации двух младших разрядов адреса АО— А1 формируются сигналы разрешения байта ВЕЗ — ВЕО (byte enable) для выбора одного или всех четырех байт в 32-разрядной памяти. Также следует отметить, что микропроцессор 80386SX имеет 16-разрядную шину данных вместо обычной 32-разрядной шины микропроцессора 80386DX. Кроме того, микропроцессор 80386SX имеет адресную линию АI, а сигналы для выбора байта заменены сигналами ВНЕ и BLE. Сигнал ВНЕ (byte high enable) разрешает старший байт, а сигнал BLE (byte low enable) — младший байт шины данных.
□	D31-D0
Выводы двунаправленной шины данных D31—DO (data) с тремя состояниями осуществляют передачу данных между микропроцессором, памятью и системой ввода-вывода. Обратите внимание, что 16-разрядный микропроцессор 80386SX имеет выводы D15—D0.
□	ВЁЗ-ВЁО
Сигналы разрешения байтов памяти ВЕЗ — ВЕО (byte enable) осуществляют выбор байта, слова или двойного слова при обращении к данным. Эти сигналы формируются внутри микропроцессора при дешифрации разрядов двух линий адреса А1 и АО. Обратите внимание, что в 16-разрядном микропроцессоре 80386SX эти выводы заменены на выводы gHE , BLE и добавлена линия адреса А1.
□	М/Ю
Высокий логический уровень сигнала на выводе М/Ю (meinory/Ю) указывает на обращение к памяти, а низкий — на обращение к портам ввода-вывода или подтверждение прерывания. При обращении к портам ввода-вывода адресная шина содержит только 16-разрядный адрес ввода-вывода на адресных выводах А15-А2.
□	W/R
Вывод W/R (write/read) указывает на текущий цикл шины записи при высоком логическом уровне сигнала на этом выводе или на цикл чтения — при низком логическом уровне.
□	ADS
Сигнал на выводе ADS (address status) активизируется, когда микропроцессор выдает действительный адрес памяти или устройств ввода-вывода, начиная выполнять цикл шины, во время которого действительны сигналы W/R, D/С ,
960
Глава 17
М/Ю, ВЕЗ--ВЕО и А31—А2. Этот сигнал объединяется с сигналом W/R для формирования отдельных сигналов считывания и записи, которые имелись в системах на базе предыдущих микропроцессоров 8086—80286.
□	RESET
Сигнал аппаратного сброса на одноименном выводе RESET переводит микропроцессор в исходное состояние 80386 для выполнения программы, начиная с ячейки памяти АААААААОН. При этом микропроцессор 80386 возвращается в реальный режим и устанавливаются 12 старших разрядов адреса (FFFH) до выполнения команды дальнего перехода или вызова. Это необходимо для совместимости с предыдущими микропроцессорами.
□	CLK2
Вывод CLK2 (clock) предназначен для подачи на него внешнего сигнала синхронизации, частота которого в два раза больше, чем рабочая частота микропроцессора 80386. Например, для работы микропроцессора 80386 на частоте 16 МГц, на этот вывод необходимо подать тактовые импульсы с частотой 32 МГц.
П READY 
Сигнал, поступающий на вывод READY (bus ready), управляет числом тактов ожидания, вводимых в циклы шины для увеличения времени доступа к памяти. Шинный цикл увеличивается на неограниченное время до появления сигнала низкого логического уровня на этом выводе.
□	LOCK
Сигнал низкого логического уровня на выводе LOCK является сигналом монополизации процессором управления шиной. Вырабатывается после активизации сигнала ADS при выполнении команды с префиксом LOCK и автоматически в циклах подтверждения прерывания INTA.
□	D/C
Сигнал на выводе D/C (data/control) определяет тип цикла шины. При высоком логическом уровне сигнала указывает на то, что по шине данных передаются данные памяти или устройств ввода-вывода, а при низком логическом уровне — что микропроцессор выбирает код в цикле подтверждения прерывания или при останове.
□	BS16
Сигнал высокого уровня, поступающий на вывод BS16 (bus size) выбирает работу процессора с 32-разрядной шиной данных, а когда сигнал имеет низкий логический уровень, то работу с 16-разрядной шиной данных. В большинстве случаев если микропроцессор 80386DX работает с 16-разрядной шиной данных, то экономичнее использовать 16-разрядный микропроцессор 80386SX. Обратите внимание, что в 16-разрядном микропроцессоре 80386ЕХ имеется немного другой вывод BS8, который выбирает работу с 8-разрядной шиной данных.
□	NA
Входной сигнал низкого логического уровня на выводе NA (next address) вынуждает микропроцессор 80386 выдать на выход адрес следующей команды или
Микропроцессоры 80386 и 80486 961
данных в текущем цикле тины. Этот вывод часто используется для запроса следующего адреса при конвейерной адресации, когда внешние схемы готовы воспринять новый адрес.
□	HOLD
Сигнал высокого логического уровня, поступающий на вывод HOLD, запрашивает предоставления устройству управления локальной шиной для выполнения им передач в режиме DMA.
□	HLDA
Выходной сигнал высокого логического уровня на выводе HLDA (hold acknowledge) указывает на то, что микропроцессор 80386 освобождает шину, переводя все двунаправленные и выходные линии, кроме его самого, в состояние высокого импеданса, удовлетворяя запрос управления шиной, поступивший на вывод HOLD.
□	PEREQ
Сигнал низкого логического уровня, поступающий на вывод PEREQ (processor extension (coprocessor) request), запрашивает микропроцессор 80386 на передачу операнда во внутренний FIFO-буфер сопроцессора или из него, в ответ на который процессор выполняет передачи в циклах ввода-вывода. Этот вывод имеет непосредственное соединение с одноименным выводом арифметического сопроцессора 80387.
□	BUSY
Сигнал низкого логического уровня, поступающий на вывод BUSY, сигнализирует процессору, что сопроцессор занят выполнением операции. Этот вывод используется командой WAIT или FWA1T, которые ожидают готовности сопроцессора, кроме того, он также имеет непосредственное соединение с одноименным выводом арифметического сопроцессора 80387. *
□	ERROR
Сигнал низкого логического уровня, поступающий на вывод ERROR, указывает микропроцессору, что сопроцессор обнаружил ошибку.
□	INTR
Сигнал высокого логического уровня, поступающий на вывод INTR (interrupt request), используется для запроса маскируемого прерывания.
□	NMI
Сигнал высокого логического уровня, поступающий на вывод NMI (non-maskable interrupt), как и в предыдущих версиях микропроцессоров, запрашивает выполнение немаскируемого прерывания.
Система памяти
Система физической памяти, к которой микропроцессор 80386DX может адресоваться, имеет емкость 4 Гбайт. Кроме того, процессор имеет поддержку виртуальной памяти объемом до 64 Тбайт отображаемой на физическую память с помощью блока
31 Зак 384
962
Глава 17
управления памятью и дескрипторов. Следует заметить, что виртуальная адресация позволяет использовать программу более 4 Гбайт при наличии метода свопинга (swapping) и при большой емкости винчестера. На рис. 17.3 показана организация системы физической памяти микропроцессора 80386DX.
Рис. 17.3. Организация системы физической памяти для микропроцессора 80386
Память разделена на четыре 8-разрядных банка памяти, с емкостью до 1 Гбайт в каждом. Такая 32-разрядная организация памяти позволяет иметь доступ к байту, слову или двойному слову. Микропроцессор 80386DX способен передать 32-раз-рядные данные за один цикл памяти, тогда как для этого микропроцессору 8088 требовалось четыре цикла, а микропроцессорам 80286 и 80386SX необходимо два цикла. Большая разрядность данных очень важна, особенно для чисел с плавающей точкой одинарной точности, которые занимают 32 разряда. Достаточно развитое программное обеспечение использует числа с плавающей точкой для хранения данных, поэтому 32-разрядные ячейки памяти ускоряют выполнение программы, если она написана с учетом разрядности памяти.
Адрес каждого байта памяти представляется в шестнадцатеричной системе счисления, как для прежних версий процессоров. Разница состоит в том, что микропроцессор 80386DX использует 32-разрядную шину адреса с памятью, адресуемой в диапазоне 00000000Н—FFFFFFFFH.
Доступ к двум банкам памяти в системе, построенной на микропроцессорах 8086, 80286 и 80386SX, осуществляется посредством сигналов BLE (АО — на 8086 и 80286) и ВНЕ . Доступ к банкам памяти микропроцессор 80386DX выполняет с помощью четырех сигналов ВЕЗ — BE0 . Такая организация памяти позволяет получить доступ к одному байту при активизации микропроцессором одного разрешающего сигнала.
Микропроцессоры 80386 и 80486
963
При активизации двух разрешающих сигналов процессор адресуется к слову. В большинстве случаев при адресации к слову осуществляется обращение к банку О и 1 или к банку 2 и 3. Ячейка памяти 00000000Н находится в банке 0, ячейка 00000001Н — в банке 1, ячейка 00000002Н — в банке 2 и ячейка 00000003 — в банке 3. Микропроцессор 80386DX не имеет адресных выводов АО и А1, поскольку они дешифрируются внутри процессора как сигналы разрешения байтов. Аналогично, в 16-разрядном микропроцессоре 80386SX нет адресного вывода АО, поскольку он дешифрируется в сигналы BLE и ВНЕ. Микропроцессор 80386ЕХ адресуется к слову данных, размещаемому в двух банках 16-разрядной системы памяти, при пассивном сигнале BS8 (высоком логическом его уровне) или же к байту в 8-разряд-ной системе при активизации этого сигнала.
Буферизованная система
На рис. 17.4 показано подключение микропроцессора 80386DX к буферам, которые увеличивают нагрузочную способность по выходу его выводов адреса, данных и управления.
Этот микропроцессор работает на тактовой частоте 25 МГц, используя входной синхронизирующий сигнал с частотой 50 МГц, который формируется интегрированным кварцевым генератором. Такие генераторы обычно используются для обеспечения синхронизации современного оборудования на базе микропроцессоров. Поскольку в приведенной системе возможно использование прямого доступа к памяти, то вывод микропроцессора HLDA используется для разрешения работы всех буферных схем. Если же в системе не предполагается передач в режиме DMA, то выводы разрешения буферов могут быть просто заземлены.
Конвейерная адресация и кэш-память
Кэш-память — это буфер, который позволяет микропроцессору 80386 функционировать более эффективно при работе с относительно медленной динамической памятью. Конвейерная адресация — это особый способ предоставления доступа к памяти, предусматривающий возможность начала (фазы адресации) нового цикла, не дожидаясь завершения обмена данными предыдущего цикла. Микропроцессор 80386 с тактовой частотой 16 МГц предоставляет ЗУ со временем доступа 50 нс или меньше функционировать с максимальной скоростью. Очевидно, что динамических элементов памяти с этим временем доступа крайне мало. Фактически применяемые в настоящее время динамические элементы памяти имеют время доступа около 40— 60 нс. Это означает, что возникает необходимость применения какого-либо специального средства для оптимального сопряжения элементов памяти, функционирующих медленнее, чем это требуется микропроцессору. Существует три таких средства: память с чередованием адресов, кэширование и конвейерная адресация.
Конвейерная адресация является наиболее предпочтительным средством при работе с памятью, поскольку микропроцессор имеет поддержку этого режима. Конвейерный режим предоставляет памяти дополнительное время при обращении к данным за счет начала формирования адреса нового цикла, не дожидаясь завершения обмена предыдущего цикла. За счет этого дополнительного времени расширяется время обращения к памяти с 50 до 81 нс в случае микропроцессора 80386, работающего на тактовой частоте 16 МГц. Конвейер (pipe), как его часто называют, устанавливается
964
Глава 17
Рис. 17.4. Полностью буферизованная система на микропроцессоре с тактовой частотой 25 МГц
микропроцессором. При выборке команды из памяти микропроцессор зачастую получает дополнительное время перед выборкой следующей команды. В это дополнительное время адрес следующей команды выставляется на шину адреса досрочно. Это время (один период тактовых импульсов) используется для предоставления до
Микропроцессоры 80386 и 80486 965
полнительного времени при обращении к медленным элементам памяти, которые используют его для начала дешифрации адреса. Конвейерный режим в основном используется контроллерами памяти, позволяя им более эффективно использовать быстрый страничный режим и чередование адресов.
Преимущество конвейера используется не при всех обращениях к памяти. Это означает, что в некоторых циклах памяти не применяется конвейерный режим. Для циклов памяти без применения конвейерной адресации требуется один такт ожидания, тогда как при использовании конвейерного режима, как правило, тактов ожидания не требуется. В целом конвейерная адресация является экономичным решением для сокращения периода обращения к медленнодействующей памяти.
Однако не все системы могут использовать преимущество конвейерной адресации. Это, прежде всего, те системы, которые работают с частотами 20, 25 и 33 МГц. В таких системах с более высокими скоростями работы должен использоваться другой способ для увеличения скорости работы с системой памяти. Система кэшпамяти улучшает общие рабочие характеристики систем памяти при неоднократном доступе к одним и тем же данным. Обратите внимание, что микропроцессор 80486 имеет встроенный кэш, называемый кэшем первого уровня (level one cache), а микропроцессор 80386 использует только кэш второго уровня (level two cache), т. е. внешний кэш, реализованный в виде отдельных микросхем статической памяти и контроллера располагаемых на материнской плате.
Кэш — это быстродействующая система памяти, которая размещается между микропроцессором и системой динамической памяти. Устройствами кэш-памяти обычно являются элементы статической памяти, имеющие время доступа менее 25 нс. Как правило, применяются системы кэш-памяти второго уровня размером от 32 Кбайт до 1 Мбайт. Необходимая емкость кэш-памяти в большей степени определяется приложением, чем микропроцессором. Если программа небольшая и обращается за небольшим объемом данных в памяти, то выгоднее использовать кэш небольшой емкости. Если программа большая и обращается к большим блокам памяти, то рекомендуется применять кэш с наибольшей емкостью. Во многих случаях кэш размером 64 Кбайт значительно повышает скоррбТь системы, но максимальных преимуществ можно достичь при кэш емкостью в 256 Кбайт. Экспериментально было установлено, что увеличение емкости кэш-памяти свыше 256 Кбайт в системе на микропроцессоре 80386 приводит к несущественному повышению быстродействия.
Системы памяти с чередованием адресов
Система памяти с чередованием адресов или, иначе, расслоение памяти (interleaved memory system) — это еще одно средство повышения скорости системы. Единственный недостаток его состоит в существенном удорожании системы памяти, связанного с ее организацией. Системы памяти с чередованием адресов устраняют необходимость в применении тактов ожидания. Однако в некоторых системах такты ожидания все еще требуются, но их число значительно сокращено. Для реализации системы памяти с чередованием адресов требуются два или большее количество шин адреса и контроллер, снабжающий адресами каждую из шин. Системы с использованием двух шин называются системами с двукратным чередованием адресов (two-way interleave), а с использованием четырех шин — системами с четырехкратным чередованием (four-way interleave).
Память с чередованием адресов делится на две или четыре части (секции). Например, если система памяти с чередованием адресов разработана для микропроцессора
966
Глава 17
80386SX, то одна ее секция содержит 16-разрядные адреса 000000Н—000001Н, 000004Н—000005Н и т. д., а другая ее секция содержит адреса 000002—000003, 000006Н—000007Н и т. д. В то время как микропроцессор получает доступ к ячейкам 000000Н—000001Н, управляющая логика чередованием формирует строб-сигнал адреса для ячеек 000002Н—000003Н. Этот строб выбирает и получает доступ к слову в ячейке 000002Н—000003Н, в то время как микропроцессор обрабатывает слово в ячейке 000000Н—000001Н. Данный процесс чередует секции памяти, повышая тем самым производительность системы памяти.
Чередование увеличивает продолжительность предоставляемого времени для обращения к памяти, поскольку адрес памяти генерируется до того, как микропроцессор получает к ней доступ. Это происходит потому, что микропроцессор способен осуществлять конвейерную адресацию, посылая следующий адрес до завершения предыдущего цикла обмена с памятью.
Проблема чередования, хотя и не главная, состоит в том, что доступ к памяти должен быть организован так, чтобы каждая секция адресовалась поочередно. В ходе выполнения программы это происходит не всегда так. Обычно микропроцессор поочередно адресуется к памяти примерно в течение 93% времени. В остальные 7% времени микропроцессор адресуется к данным, расположенным в одной и той же секции памяти. Это означает, что в эти 7% времени в циклах обмена с памятью запоминающая система должна добавлять такты ожиданий. В этом случае сокращается время доступа к памяти, поскольку память должна ожидать получения следующего адреса до тех пор, пока не будут переданы предыдущие данные. Поскольку памяти предоставляется меньше времени для доступа к памяти, то при обращении в один и тот же банк памяти требуется состояние ожидания.
На рис. 17.5 представлена временная диаграмма, на которой показан момент появления адреса на шине адреса микропроцессора для системы памяти с чередованием адресов.
Эта временная диаграмма показывает, что следующий адрес выставляется на шину еще до момента получения данных в текущем цикле памяти. Она также показывает, как увеличивается время доступа при использовании чередования адресов каждой секции памяти в сравнении с доступом без чередования адресов, при котором требуются дополнительные такты ожидания.
На рис. 17.6 показана схема управления чередованием. Вероятно, что эта достаточно сложная логическая схема требует некоторого пояснения. Прежде всего, если сигнал на входе SEL, используемого для выбора режима чередования, имеет низкий логический уровень (не активный), то сигнал ожидания WAIT становится высокого логического уровня. Кроме того, оба выхода ALE0 и ALE1 , используемые для стробирования адреса в секции памяти, в этом случае также имеют высокий логический уровень, что делает подсоединяемые к ним защелки прозрачными.
Как только сигнал на входе SEL становится высокого логического уровня, то эта схема начинает работать в режиме чередования. Ввод А1 используется для определения, на выходе какого из триггеров (U5B или U5A) появится сигнал низкого логического уровня, чтобы выбрать соответствующую секцию памяти. Кроме того, устанавливаемое значение для сигналов стробирования адреса ALE0 и ALE1 с помощью схемы управления чередованием сравнивается с предыдущим их состоянием.
Рис. 17.5. Временная диаграмма системы памяти с чередованием адресов
WAIT
ALEO (ADSO)
ALE1 (ADS1)
Рис. 17.6. Логическая схема управления чередованием для формирования отдельных сигналов стробирования адреса и сигнала ожидания WAIT, используемых для управления памятью с чередованием адресов
968	Гпава
Микропроцессоры 80386 и 80486
969
Рис. 17.7. Система памяти с чередованием адресов, демонстрирующая защелки адресов и логическую схему управления чередованием
Если же одна и та же секция памяти выбирается второй раз, то сигнал WAIT становится низкого логического уровня, запрашивая тем самым состояние ожидания.
На рис. 17.7 показана система памяти с чередованием адресов, которая использует схему, приведенную на рис. 17.6. Обратите внимание на то, как используются сигналы ALE0 и ALE1 для фиксирования адреса для каждой секции памяти.
Каждый банк памяти имеет 16-разрядную организацию данных. Если же при доступе к памяти требуются 8-разрядные данные, то в большинстве случаев в цикл обмена с памятью будут добавлены такты ожидания. В ходе выполнения программы микропроцессор 80386SX за один раз выбирает 16-разрядную команду из ячеек памяти с нормальной последовательностью. В большинстве случаев при выполнении программы используется чередование. Если же системе необходимы только 8-разрядные данные, то сомнительно, что чередование адресов памяти сократит число тактов ожидания.
970
Глава 17
Время доступа, предоставляемое системой чередования, показанной на рис. 17.7, при использовании тактовой частоты 16 МГц увеличено с 69 до 112 нс. Если же частоту увеличить до 20 МГц, то для памяти с чередованием адресов потребуется 89,6 нс, в то время как стандартные схемы сопряжения с памятью без чередования адресов для доступа к памяти предоставляют только 48 нс. При этой более высокой тактовой частоте динамические элементы памяти со временем доступа 80 нс при использовании системы с чередованием адресов работают верно и без тактов ожидания. Если при этом случаются обращения к одной и той же секции памяти, то тогда в цикл памяти будут добавлены такты ожидания.
Система ввода-вывода
Система ввода-вывода микропроцессора 80386 такая же, как и в системе на базе микропроцессоров семейства 8086. При изолированном вводе-выводе процессор адресуется к области в 64 Кбайт пространства ввода-вывода (диапазон адресов FFFFH—0000Н). В такой системе ввода-вывода для передачи данных между микропроцессором и устройствами ввода-вывода используются специальные команды in и out. Адрес порта ввода-вывода располагается на линиях А15—А2 шины адреса. Для выборки байта, слова или двойного слова данных системы ввода-вывода используются сигналы разрешения байта ВЕЗ —ВЕО. При реализации отображаемой системы ввода-вывода объем ячеек ввода-вывода может доходить до 4 Гбайт. При этом для передачи данных между микропроцессором и устройствами ввода-вывода может использоваться любая команда перемещения данных из памяти в процессор, поскольку в данном случае любое устройство ввода-вывода рассматривается как ЗУ. Поскольку в защищенном режиме микропроцессором 80386 обеспечивается схема защиты системы ввода-вывода, то почти все системы, построенные с его использованием, применяют изолированный ввод-вывод.
На рис. 17.8 приведена карта изолированной системы ввода-вывода для микропроцессора 80386.
Рис. 17.8. Карта изолированной системы ввода-вывода для микропроцессора 80386.
Здесь 64К адресов используются для адресации к различным 8-разрядным ячейкам системы ввода-вывода, разделенных на 4 банка. Ячейки ввода-вывода имеют адреса в диапазоне от 0000Н до FFFFH
Микропроцессоры 80386 и 80486 971
В отличие от карты системы ввода-вывода прежних микропроцессоров Intel, имеющих 16-разрядную организацию, микропроцессор 80386 использует полную 32-разрядную систему ввода-вывода с разделением на четыре банка. Это аналогично организации системы памяти, которая также разделена на четыре банка. Большинство передач ввода-вывода являются 8-разрядными, поскольку для передачи буквенноцифровых данных между микропроцессором, принтером и клавиатурой часто используется 7-разрядный ASCII-код. Такое положение дел может измениться, если 16-разрядный буквенно-цифровой код Unicode станет общепринятым и заменит код ASCII. В последнее время все большее распространение получают 16- и 32-раз-рядные устройства ввода-вывода, которые в сравнении с 8-разрядными передачами безусловно увеличат скорость передачи данных между ними и микропроцессором.
Устройства системы ввода-вывода адресуются в диапазоне 0000Н—FFFFH. Часть карты портов ввода-вывода предназначается для арифметического сопроцессора 80387. При дешифрировании пространства ввода-вывода очень важно учитывать номера портов сопроцессора. В адресном пространстве ввода-вывода область 00F8H—00FFH зарезервирована для использования сопроцессором, но для упрощения дешифрации адресов при обращении к сопроцессору микропроцессор 80386 дополнительно выставляет единицу на линию А31 шины адреса. Таким образом, сопроцессор 80387 использует следующие адреса ввода-вывода 8OOOOOF8H—800000FFH. Арифметический сопроцессор 80287, предназначенный для использования с микропроцессором 80286, применяет стандартные адреса системы ввода-вывода 00F8H—00FFH. Поскольку для выбора устройства ввода-вывода обычно дешифрируются только линии А15—А2 шины адреса, то следует учитывать, что сопроцессор не будет активизирован при обращении к порту 000F8H--00FFH, пока не будет дешифрирована также и адресная линия А31. Это не создает никакой проблемы, поскольку фактически порты 00F8H—00FFH не используются для какой-либо другой цели.
Система ввода-вывода микропроцессора 80386 имеет только одну новую особенность, связанную с добавлением информации об уровне привилегий, определяемым битовой картой разрешения ввода-вывода (I/O permission bitmap), хранящейся в конце сегмента состояния задачи TSS (task state segment), при работе микропроцессора 80386 в защищенном режиме работы. Инструкции ввода-вывода, выполняемые в защищенном режиме, являются привилегированными. Несанкционированная попытка выполнения таких инструкций вызывает прерывание (тип 13, общее нарушение защиты). Подобная особенность добавлена для того, чтобы запретить доступ к системе ввода-вывода в многопользовательской операционкой среде. Защита системы ввода-вывода, связанная с уровнями привилегий задач, является расширением защищенного режима работы.
Сигналы, управляющие памятью и вводом-выводом
Память и система ввода-вывода управляются отдельными сигналами. Сигнал М/10 на одноименном выводе микропроцессора указывает на обращение к памяти (M/IO - 1) или на обращение к портам ввода-вывода (М/Ю = 0). В дополнение к сигналу М/Ю должна быть указана и выполняемая операция по передаче данных, а именно операция чтения или записи. Таким сигналом является сигнал W/R , который при операции чтения имеет низкий логический уровень, а при записи — высокий. Кроме того, сигнал ADS, выдаваемый в начале цикла шины, используется,
972
Глава 17
в частности, для определения действительности управляющих сигналов М/Ю и W/R. Это является незначительным отличием процессора 80386 от предыдущих микропроцессоров Intel, которые не использовали сигнал ADS.
На рис. 17.9 приведена простейшая схема, формирующая четыре системных управляющих сигнала для памяти и устройств ввода-вывода. Обратите внимание, что два из них MRDC и MWTC формируются для управления памятью, а остальные два IORC и IOWC — для управления устройствами ввода-вывода. Эти сигналы совместимы с сигналами управления памятью и системой ввода-вывода предыдущих микропроцессоров Intel.
W/R
М/Ю
ADS
IORC iowc
MRDC МОТС
Рис. 17.9. Простейшая схема формирования сигналов управления памятью и устройствами ввода-вывода, предназначенная для микропроцессоров 80386, 80486 и Pentium
Временные диаграммы
Знание временных соотношений очень важно для понимания сопряжения памяти и устройств ввода-вывода с микропроцессором 80386. На рис. 17.10 показана временная диаграмма цикла чтения памяти без использования конвейерной адресации. Обратите внимание, что временная диаграмма начинается с входного тактирующего сигнала CLK2, а цикл шины состоит из четырех периодов этих тактовых импульсов.
Любой цикл шины состоит из двух тактов Т! и Т2, каждый из которых состоит из двух периодов тактирующих сигналов. Обратите внимание, что время доступа к данным, показанное на рис. 17.10 в виде интервала времени, обозначено цифрой 3. Процессор с тактовой частотой 16 МГц предоставляет памяти 78 нс времени доступа к данным, при котором в режим работы без конвейерной адресации не требуется введение тактов оукидания. Для выбора режима без конвейерной адресации на вывод NA микропроцессора необходимо подать сигнал высокого логического уровня.
На рис. I7.ll приведена временная диаграмма цикла чтения из памяти при работе микропроцессора 80386 в режиме конвейерной адресации. Обратите внимание на то, что памяти в этом случае для доступа к данным предоставляется дополнительное время, поскольку адрес данных выставляется на шину адреса еще до завершения предыдущего цикла. Конвейерная адресация инициируется посредством подачи на вывод NA микропроцессора сигнала низкого логического уровня и использования защелок для фиксирования адреса. Импульс, подаваемый на защелки адреса, посту-
Микропроцессоры 80386 и 80486
973
Время 1:
Время 2:
Время 3:
33 МГц_______25 МГц_______20 МГц______16 МГц
4-15 нс	4-21 нс	4-30 нс	4-36 нс
5 нс	7 нс	11 нс	11 нс
46 нс	52 нс	59 нс	78 нс
Рис. 17.10. Временная диаграмма цикла чтения памяти микропроцессора 80386 без использования конвейерной адресации
Рис. 17.11. Временная диаграмма цикла чтения для микропроцессора 80386 при использовании конвейерной адресации
974
Глава 17
пает с вывода процессора ADS. В системе с использованием конвейерной адресации кроме защелок должно также использоваться и чередование банков памяти. В некоторых приложениях успешно использовалось даже минимальное количество чередующихся банков, равное двум или четырем.
Обратите внимание, что адрес при конвейерной адресации появляется почти на один такт раньше того времени, когда он выставляется на шину при обычной адресации. Это предоставляет микропроцессору 80386, работающему на тактовой частоте 16 МГц, дополнительно 62,5 нс при обращении к памяти. Таким образом, время, предоставляемое памяти для доступа к данным в системе без конвейерной обработки, составляет 78 нс, а в системе с конвейерной адресацией уже 140,5 нс. Преимущества системы с конвейерной адресацией заключаются в том, что не требуется добавлять в циклы шины (во многие, но не во все), такты ожидания и то, что к микропроцессору могут подключаться менее быстродействующие ЗУ. К недостаткам же можно отнести то, что для использования конвейерной адресации необходимо дополнительно применять еще и чередование банков памяти, которое требует дополнительной схемы, а время от времени и введения тактов ожидания в цикл шины.
Такты ожидания
Такты ожидания необходимы в том случае, если значение времени доступа к памяти у ЗУ больше в сравнении со временем, предоставляемым микропроцессором 80386 для доступа к памяти. Так, в системе на процессоре с тактовой частотой 33 МГц и без использования режима конвейерной адресации время, предоставляемое для доступа к памяти, составляет 46 нс. В настоящее время не существует элементов динамической памяти со временем доступа равным 46 нс. Таким образом, при использовании динамического ОЗУ в цикл шины должны вводиться такты ожидания, в частности один такт для динамического ОЗУ со временем доступа 60 нс, или же два такта ожидания при использовании элементов постоянной памяти типа EPROM со временем доступа 100 нс. Следует заметить, что такие такты ожидания формируются на системной плате и не могут быть удалены.
Сигнал READY , поступающий на одноименный вывод микропроцессора, регулирует введение тактов ожидания в циклы шины. Вывод READY микропроцессора 80386 является динамическим входом, который должен активизироваться при готовности устройства во время каждого цикла шины. На рис. 17.12 показано два цикла шины: один без тактов ожидания, а второй цикл с одним тактом ожидания. Обратите внимание на то, как сигнал READY управляет тактами ожидания.
Проверка сигнала готовности READY осуществляется в конце второго и возможно последующих тактов цикла шины, чтобы определить, что это за такт: Т2 или TW. Если в это время сигнал READY имеет низкий логический уровень, то это конец цикла, или, иначе, выполняется такт Т2. Если же сигнал READY в это время имеет высокий логический уровень, то это — такт TW и микропроцессор продолжает тестировать вывод READY , чтобы определить на нем сигнал низкого логического уровня и тем самым такт завершения цикла шины. В системе без использования конвейерной адресации и после того, как сигнал ADS принимает высокий логический уровень, в цикл памяти добавляется такт ожидания, но только в том случае,
Микропроцессоры 80386 и 80486
975
если в этом такте сигнал READY будет иметь высокий логический уровень. Чтобы сформировать сигнал READY . нужно после снятия сигнала ADS, т. е. перевода его на высокий логический уровень, подсчитать положительные фронты тактовых сигналов CLK2. При этом для ввода 0 тактов ожидания сигнал READY устанавливается (становится низкого логического уровня) сразу же после завершения первого периода тактовых импульсов CLK2. Для ввода одного такта ожидания сигнал READY должен сохранять высокий логический уровень не менее двух периодов тактовых сигналов. Если же гребуется ввести большее количество тактов ожидания, то перед установкой сигнала READY должна быть добавлена соответствующая задержка времени. Все это позволяет вводить в цикл шины любое число тактов ожидания.
Рис. 17.12. Временная диаграмма цикла памяти без и с одним тактом ожидания для микропроцессора 80386 без применения им конвейерной адресации
На рис. 17.13 показана схема формирования сигнала READY для добавления в цикл памяти от 0 до 3 тактов ожидания в зависимости от типа памяти.
В данном примере схема формирует сигнал READY , посредством которого в цикл памяти вставляется один такт ожидания для динамической памяти и два такта ожидания для постоянной памяти типа EPROM. Восьмиразрядный регистр сдвига 74F164 сбрасывается в состояние 00000000, когда сигнал ADS имеет низкий, а сигнал D/С высокий логический уровень. После снятия сигнала ADS (перехода его на высокий логический уровень) регистр сдвига начинает выполнять сдвиг информации. В ходе этого сдвига разряды регистра сдвига заполняются логической единицей, начиная с младшего разряда (вывод QA) в направлении к старшему (вывод QH). Четыре вывода регистра сдвига, сигналы 0 Waits—3 Waits, поступают на вход мультиплексора, который и формирует сигнал READY низкого логического уровня с различной задержкой во времени в зависимости от состояния сигналов Select_EPROM и Select_DRAM.
976
Глава 17
Рис. 17.13. Схема, формирующая сигнал готовности READY (а) и предназначенная для добавления в цикл памяти одного такта ожидания для динамического ОЗУ и два такта для постоянной памяти типа EPROM, а также соответствующая временная диаграмма (б)
17.2. Специальные регистры микропроцессора 80386
В микропроцессоре 80386 присутствует новая серия регистров для управления, отладки и тестирования программы, которых ранее в микропроцессорах Intel не было. Управляющие регистры CR3—CRO (control register) хранят признаки состояния про
Микропроцессоры 80386 и 80486
977
цессора, регистры DR7—DRO (debug register) предназначены для отладки, а регистры TR7 и TR6 (test register) используются для тестирования страничной переадресации и кэширования.
Управляющие регистры
В микропроцессоре 80386, дополнительно к регистру флагов EFLAGS и указателю инструкций EIP, имеются и другие управляющие регистры. Управляющий регистр CRO (control register) идентичен регистру состояния машины MSW (machine status word) микропроцессора 80286, за исключением того, что он 32-разрядный, а не 16-разрядный регистр. Дополнительными управляющими регистрами являются CR1, CR2 и CR3.
На рис. 17.14 показана структура управляющих регистров микропроцессора 80386.
MSW
р G	000000000000000	00000000000		Е Т	Т S	Е М	м р	р Е
Не используется								
Линейный адрес, по которому был получен отказ страницы памяти								
Базовый адрес таблицы каталога страниц			000000000000					
Рис. 17.14. Структура управляющих регистров микропроцессора 80386
Управляющий регистр CR1 в микропроцессоре 80386 не используется, однако зарезервирован для будущих изделий. Управляющий регистр CR2 фиксирует линейный адрес, по которому был получен последний отказ страницы памяти. Наконец, управляющий регистр CR3 фиксирует базовый адрес таблицы страниц. Младшие 12 разрядов с 0 по 11 из 32-разрядного регистра содержат нули и объединяются с остальными разрядами регистра, чтобы определить начало таблицы страниц размером 4К.
Регистр CR0 имеет ряд специальных управляющих битов, которые в микропроцессоре 80386 определяются следующим образом:
□	PG
Бит PG (paging enable) предназначен для выбора преобразования таблицы страниц из линейных адресов в физические адреса при PG = 1. Страничная переадресация памяти позволяет присваивать линейному адресу любую физическую ячейку памяти.
□	ЕТ
Бит ЕТ (extension type) является индикатором поддержки инструкций математического сопроцессора. Если ЕТ = 0, то выбран сопроцессор 80287, а если ЕТ = 1, то сопроцессор 80387. Этот бит был добавлен, потому что при появлении про
978
Глава 17
цессора 80386 еще не был доступен сопроцессор 80387. В большинстве систем бит ЕТ установлен, указывая, что в системе имеется сопроцессор 80387.
□	TS
Бит TS (task switch) указывает, что микропроцессор выполнил переключение задач (изменение содержимого регистра задачи TR в защищенном режиме устанавливает бит TS). Если бит TS установлен, то команда цифрового сопроцессора приводит к прерыванию типа 7 (сопроцессор не доступен).
□	ЕМ
Бит ЕМ (emulate coprocessor) устанавливается для вызова прерывания типа 7 при попытке выполнения каждой ESC-команды, т. е. команды, относящейся к сопроцессору. Это часто используется для программной эмуляции сопроцессора. Эмуляция снижает стоимость системы, но для выполнения эмулированных команд сопроцессора часто требуется больше времени, примерно где-то в 100 раз.
□	МР
Бит MP (monitor coprocessor) устанавливается для вызова прерывания типа 7 при выполнении каждой команды wait, когда установлен бит TS.
□	РЕ
Бит РЕ (protection enable) устанавливается, чтобы перевести микропроцессор 80386 в защищенный режим. Он может также сбрасываться, чтобы начать довольно длинную последовательность инструкций переключения в реальный режим работы. В микропроцессоре 80286 этот бит может только устанавливаться. Микропроцессор 80286 не способен переходить обратно в реальный режим работы без выполнения аппаратного сброса, что исключает его использование в большинстве систем, использующих защищенный режим.
Регистры отладки и тестирования
На рис. 17.15 показан набор регистров отладки и тестирования.
Первые четыре регистра отладки программы содержат 32-разрядные линейные адреса точек останова. Линейный адрес (linear address) является 32-разрядным адресом, формируемым микропроцессором путем сложения базового адреса сегмента с эффективным адресом, и который может совпадать или не совпадать с физическим адресом, в зависимости от отсутствия или наличия блока страничной грансляции адресов. Адреса точек останова, которые могут определять команду или элемент данных, постоянно сравниваются с адресами, формируемыми программой. При совпадении адресов микропроцессор выполняет прерывание тип 1 (ловушка (trap) или прерывание отладки), а регистры DR6 и DR7 позволяют обработчику прерывания определить его причину. Эта особенность является гораздо расширенной версией базового прерывания при особой ситуации или трассировки, которые предоставляло прерывание типа 1 в прежних микропроцессорах Intel. Адреса точек останова очень полезны при отладке неисправного программного обеспечения. Управляющие поля регистров DR6 и DR7 определяются следующим образом:
□	ВТ
Если бит ВТ установлен, то прерывание отладки вызвано переключением задачи.
Микропроцессоры 80386 и 80486
979
31	16 15	О
Если бит BS установлен, то прерывание отладки вызвано битом трассировки TF (пошагового режима) регистра флагов.
a bd
Если бит BD установлен, то прерывание отладки вызвано любой попыткой обращения к регистру отладки при установленном бите GD. Разряд GD защищает доступ к регистрам отладки программы.
□	вз-во
Указывают, какой из четырех адресов точек останова, находящихся в соответствующих регистрах DRO—DR3, вызвал прерывание отладки.
□	LEN3-LEN0
Каждое из четырех 2-разрядных полей LEN3—LENO относится к соответствующим линейным адресам точек останова, хранящихся в регистрах DRO—DR3. Любое из этих полей определяет доступную часть линейного адреса точки останова, причем в случае содержимого в поле равного коду 00 определяется байт, при 01 — слово (2 байта) и при значении 11 — двойное слово (4 байта). Код 10 не используется.
a RW3-RW0
Каждое из четырех полей RW (read/write) считывания/записи относится к соответствующим линейным адресам точек останова, хранящихся в регистрах DR0— DR3. Поле RW устанавливает причину, вызвавшую обращение к адресу точки останова: 00— выборка инструкции, 01 — запись данных в память, И — чтение или запись данных памяти. По значению этого поля прерывание типа 1 классифицируется в случае выборки инструкции как отказ (fault), который обрабатыва
980
Глава 17
ется до выполнения инструкции, или в случае обращения к данным как ловушка (trap) — обрабатывается после передачи данных.
□	GD
Если бит GD установлен, то предотвращается любое обращение (считывание или запись) к регистру отладки посредством генерирования прерывания отладки. Этот бит автоматически сбрасывается в течение обработки прерывания отладки, и поэтому эти регистры отладки при необходимости могут быть прочитаны или модифицированы.
□	GE
Если бит GE установлен, то он определяет глобальный адрес точки останова для любого из четырех регистров отладки DR3—DR0. Переключение задач на биты GE не влияет.
□	LE
Если бит LE установлен, то он определяет локальный адрес точки останова для любого из четырех регистров отладки DR3—DR0. При переключении задач биты автоматически сбрасываются.
Регистры тестирования TR6 и TR7 используются для проверки буфера процесса трансляции адреса, иначе TLB (translation look-aside buffer). Буфер TLB использует блок страничной трансляции адресов в микропроцессоре 80386 и представляет собой четырехканальный наборно-ассоциативный кэш на 32 строки таблиц трансляции. Буфер TLB сокращает число считываний из памяти необходимых для просмотра адресов в таблицах преобразования страниц. Буфер TLB фиксирует 32 наиболее общих введенных данных из таблицы страниц и сверяется с регистрами тестирования TR6 и TR7.
Регистр тестирования TR6 фиксирует линейный адрес буфера TLB, а регистр TR7 — физический адрес буфера TLB.
Для записи данных в буфер TLB, выполните следующие действия:
1. Запишите в регистр TR7 требуемый физический адрес, значения в бит PL и поле REP.
2. Запишите в регистр TR6 линейный адрес, убедившись, что бит С = 0.
Для считывания данных из буфера TLB:
1. Запишите в регистр TR6 линейный адрес, убедившись, что бит С = 1.
2. Выполните считывание из обоих регистров тестирования: TR6 и TR7. Если бит PL регистра TR7 показывает удачное обращение, тогда нужные значения TR6 и TR7 показывают содержимое буфера TLB.
Биты и поля регистров тестирования TR6 и TR7 указывают на следующие состояния:
П V
Показывает, что данные в буфере TLB действительны.
П D
Показывает, что данные в буфере TLB неправильные или "запорченные".
□ U
Бит пользователя U (user) буфера TLB.
Микропроцессоры 80386 и 80486 981
□	W
Показывает, что пространство, адресуемое данными буфера TLB, перезаписывалось.
□	С
Управляющий бит разрешает запись (С = 0) или немедленный просмотр (С = 1) буфера TLB.
□	PL
Показывает удачное обращение к буферу TLB, если бит PL = 1.
□	REP
Определяет, какой блок буфера TLB записан.
Некоторые более подробные сведения о функционировании буфера TLB можно почерпнуть, обратившись к разделу, посвященному управлению памятью, и блоку страничной трансляции адресов.
17.3. Управление памятью
Блок управления памятью, иначе MMU (me тогу-man age me nt unit), в микропроцессоре 80386 аналогичен одноименному блоку микропроцессора 80286, за исключением того, что в микропроцессоре 80386 имеется блок страничной трансляции адресов (paging unit), которого не было в микропроцессоре 80286. Блок управления памятью (MMU) выполняет задачу по преобразованию линейных адресов на выходе из программы в физические адреса, с помощью которых осуществляется доступ к любой физической ячейке системы памяти. Микропроцессор 80386 использует механизм страничной трансляции для преобразования любого логического адреса в любой физический адрес. Следовательно, даже когда программа получает доступ к ячейке памяти A0000H, с размещенной в ней командой, то реальный физический адрес при разрешенной страничной трансляции может быть Ю0000Н или каким-либо другим. Эта особенность позволяет использовать в микропроцессоре 80386 любую программу, написанную для функционирования по определенным линейным адресам, поскольку каждый линейный адрес может стать любым физическим адресом. Прежние микропроцессоры Intel не обладали такой гибкостью. Страничная трансляция адресов используется совместно с DOS для перераспределения памяти микропроцессоров 80386 и 80486 в адреса старше FFFFFH и в пространство между несколькими ПЗУ в диапазоне адресов D0000—DFFFFH, а также и другие имеющиеся области. Свободные области памяти между несколькими ПЗУ называются блоками верхней памяти или UMB (upper memory blocks), а область выше FFFFFH — как расширенная память (extended memory).
Дескрипторы и селекторы
Перед тем как перейти к обсуждению блока страничной трансляции адресов, рассмотрим дескрипторы и селекторы микропроцессора 80386. Микропроцессор 80386 использует дескрипторы во многом таким же образом, как и микропроцессор 80286. Дескриптор в обоих микропроцессорах — это последовательность из восьми байтов, которая содержит информацию о сегменте памяти и о его расположении. Селектор
982
Глава 17
(содержимое сегментного регистра) используется для идентификации дескриптора, заданного в таблице дескрипторов. Основное отличие между микропроцессорами 80286 и 80386 состоит в том, что последний имеет два дополнительных селектора (FS и GS), и для микропроцессора 80386 определены два самых старших байта дескриптора. Другое отличие состоит в том, что дескрипторы микропроцессора 80386 используют 32-разрядный базовый адрес сегмента и 20-разрядное поле предела (limit) сегмента вместо 24-разрядного базового адреса и 16-разрядного поля предела сегмента, имеющихся в микропроцессоре 80286.
Микропроцессор 80286 адресуется к области памяти размером 16 Мбайт за счет своего 24-разрядного базового адреса и имеет протяженность сегмента в 64 Кбайт благодаря 16-разрядному полю предела. Микропроцессор 80386 за счет 32-разрядного базового адреса адресуется к области памяти в 4 Гбайт, а размер сегмента определяется благодаря 20-разрядному полю предела, который используется двумя разными способами. Бит гранулярности G (granularity) дескриптора или, иначе, бит дробности определяет единицу измерения для размера сегмента: при G = 0, размер задается в байтах, а если G = 1, то — в страницах по 4К. Таким образом, размер сегмента при 20-разрядном поле предела может составить соответственно 1 Мбайт или 4 Гбайт.
Бит гранулярности G появился в дескрипторе, начиная с микропроцессора 80386. Если бит G = 0, то сохраняемое в поле предела значение трактуется непосредственно, как предельный размер сегмента, позволяющий иметь доступ к любой области ОООООН—FFFFFG сегмента емкостью в 1 Мбайт. Если же бит G == 1, то сохраняемое в поле предела число интерпретируется как 00000XXXH—FFFFFXXXH, где XXX имеет любую величину между 000Н и FFFH. Таким образом обеспечивается доступ к размеру сегмента от 0 байт до 4 Гбайт участками по 4 Кбайт. Значение предела, равное 00001Н, указывает на то, что предельный размер сектора составляет 4 Кбайт, когда бит G = 1 или же 1 байт, когда бит G - 0. Примером может служить сегмент, начинающийся с физического адреса ЮООООООН. Для значения предела 00001Н и бита G = 0 данный сегмент начинается в ЮООООООН и заканчивается в 10000001Н. Если же бит G = 1 при этом же значении предела (00001Н), то сегмент начинается в ячейке Ю0000000Н и заканчивается в 10001 FFFH.
На рис. 17.16 показано, как микропроцессор 80386 адресуется к сегменту памяти в защищенном режиме, используя селектор и дескриптор. Обратите внимание, что приведенная адресация идентична со способом адресации сегмента микропроцессором 80286. Разница состоит в размере доступного для микропроцессора 80386 сегмента. Старшие 13 разрядов (биты 15—3) селектора используются для выбора дескриптора из таблицы дескрипторов. Бит индикатора таблицы TI (table indicator) (бит 2 селектора) указывает на тип таблицы дескрипторов: локальную, если бит TI = 1, или глобальную, если бит TI = 0. Младшие два бита RPL (requested privilege level) (биты 1—0) селектора определяют запрашиваемый уровень привилегий для доступа к сектору.
Поскольку селектор использует 13-разрядный код для доступа к дескриптору, то каждая таблица (локальная или глобальная) содержит не более 8192 дескриптора. Поскольку возможный размер сегмента для микропроцессора 80386 достигает 4 Гбайт, и единовременно можно получить доступ к 16 384 сегментам, используя две таблицы дескрипторов. Все это позволяет микропроцессору 80386 иметь поддержку виртуальной памяти объемом до 64 Тбайт (1 Тбайт = 1024 Мбайт). Разумеется, что реально может существовать система памяти емкостью только до 4 Гбайт. Если же для программы в какой-то момент времени потребуется память более 4 Гбайт, то
Микропроцессоры 80386 и 80486 983
требуемые данные могут подкачиваться в систему памяти с дисковода или какого-либо другого накопителя большого объема.
Рис. 17.16. Адресация в защищенном режиме с использованием сегментного регистра в качестве селектора
Микропроцессор 80386 использует таблицы дескрипторов для глобальных (GDT) и локальных (LDT) дескрипторов. Третья таблица дескрипторов используется дескрипторами прерываний (IDT) или вентилями (gates). Первые шесть байт дескриптора микропроцессора 80386 такие же, как в микропроцессоре 80286, что обеспечивает программную совместимость с ним снизу вверх. Два старших байта дескриптора микропроцессора 80286 были зарезервированы и содержали значение ООН. Дескрипторы для микропроцессоров 80286 и 80386 показаны на рис. 17.17.
Дескриптор для микропроцессора 80286	Дескриптор для микропроцессора 80386
Зарезервировано	
Права доступа	База(В23-В16)
База(В15-В0)	
Предел (L15-L0)	
База (В31-В24)	г n n v G D 0 l (L19-L16)
. Права доступа	База(В23-В16)
База(В15-В0)	
Предел (L15-L0)	
Рис. 17.17. Дескрипторы для микропроцессоров 80286 и 80386
Дескриптор микропроцессора 80386 содержит 32-разрядный базовый адрес, 20-раз-рядное поле предела сегмента и бит гранулярности G, определяющий множитель предела сегмента (I или 4К раз) или, иначе, в каких единицах задан предел: в байтах (G = 0) или страницах по 4К (G = I). Далее представлено назначение полей дескриптора микропроцессора 80386:
□	База (В31-В0)
Поле База (Base) определяет базовый (начальный) 32-разрядный адрес сегмента в физическом 4 Гбайтном адресном пространстве микропроцессора 80386.
□	Предел (L19—L0)
Поле Предел (Limit) определяет предельный размер сегмента в байтах, если бит гранулярности G = 0, или в страницах по 4К, если G = 1. Это позволяет иметь
984
Глава 17
любой размер сегмента от 1 байта до 1 Мбайт, если бит G = 0 или от 4 Кбайт до 1 Гбайт, если бит G = 1. Следует напомнить, что предел указывает на последний байт в сегменте.
□	Права доступа
Поле Права доступа (Access rights) определяет уровень привилегий и другую информацию относительно сегмента. Этот байт различен для разных типов дескрипторов и конкретизируется для каждого из них.
□	G
Бит гранулярности G (granularity) выбирает множитель 1 или 4К для поля предела сегмента. Если бит G = 0, то множитель равен 1, если бит G = 0, то множитель равен 4К.
□	D
Бит D (default size) определяет разрядность используемых операндов и регистров по умолчанию. Если D = 0, тогда 16 бит, как в микропроцессоре 80286; если D = 1, то 32 бит, как в микропроцессоре 80386. Этот бит определяет, требуются ли префиксы к 32-разрядным данным и индексным регистрам. Если D = 0, тогда требуется префикс для доступа к 32-разрядным регистрам и для использования 32-разрядных указателей. Если D = 1, тогда префикс требуется для доступа к 16-разрядным регистрам и для 16-разрядных указателей. Атрибуты USE16 и USE32, используемые с директивой segment в языке ассемблера, управляют установкой бита D. Реальный режим работы всегда предполагает, что регистры 16-разрядные, поэтому к любой команде, адресуемой 32-разрядным регистром или указателем, должен применяться префикс.
П AVL
Бит AVL (available) доступен для операционной системы и может использоваться ею, по необходимости. Он не применяется и не анализируется процессором и предназначен для использования прикладными программами.
Имеются две разновидности дескрипторов: дескриптор сегмента кода и данных, а также дескриптор системных сегментов. Первый дескриптор определяет данные, стек и сегменты кода. Дескриптор системных сегментов предназначен для хранения информации о таблицах системы, задачах и вентилях.
Дескрипторы сегмента кода и данных
На рис. 17.18 показан дескриптор сегмента кода и данных. Этот дескриптор подходит для общей формы, показанной на рис. 17.17, однако в данном случае расписано поле прав доступа, чтобы показать, каким образом дескриптор описывает данные, стек или сегмент кода. Бит 4 байта прав доступа определяет тип дескриптора. При установленном бите (S = 1) это дескриптор данных и сегмента кода, при сброшенном бите (S = 0) — дескриптор системного сегмента. Следует отметить, что используемые для этих битов обозначения в разных печатных материалах Intel могут отличаться, но они выполняют одни и те же задачи.
Далее приведено описание битов поля прав доступа:
П Р
Установленный бит Р (present) указывает о наличии сегмента в памяти. Если этот бит сброшен (Р = 0) и осуществляется доступ к сегменту посредством дескрип
Микропроцессоры 80386 и 80486
985
тора, то выполняется прерывание типа 11 (сегмент отсутствует). Это прерывание указывает, что выполнен доступ к сегменту, которого нет в системе.
□	DPL
Биты DPL (descriptor privilege level) устанавливают уровни привилегий дескриптора, при этом значение 00 соответствует наивысшему уровню привилегии, а значение И — низшему уровню. Эти биты используются для защиты доступа к сегментам. Если осуществляется доступ к сегменту с текущим уровнем привилегии, который ниже (число больше), заданный битами DPL, то происходит прерывание нарушения уровня привилегий. Уровни привилегий используются в многопользовательских системах для предотвращения несанкционированного доступа к области системной памяти.
Дескриптор для микропроцессора 80386
База(В31-В24)	г п л 0 Пред60 G D 0 l (L19-L16)
Р DPL S Е X RW А	База(В23-В16)
База(В15-В0)	
Предел (L15-L0)	
Рис. 17.18. Формат дескриптора сегмента кода и данных микропроцессора 80386
П S
Бит S (segment) обозначает дескриптор сегмента кода и данных при установленном бите (S = 1) или дескриптор системного сегмента при сброшенном (S = 0).
П Е
Бит Е (executable) определяет тип сегмента. Сброшенный бит (Е = 0) указывает на сегмент данных (стека), а установленный (Е = 1) на сегмент кода. Бит Е также определяет функцию следующих двух битов (X и RW) байта прав доступа.
П X
Если бит Е сброшен (Е = 0), тогда бит X (expansion) указывает направление расширения для сегмента данных. Если X = 0, то сегмент расширяется вверх (в сторону старших адресов), как в сегменте данных; если X = 1, то сегмент расширяется вниз (в сторону младших адресов), как в стековом сегменте. Если бит Е установлен (Е = 1), тогда бит X указывает: игнорируется ли уровень привилегий сегмента кода (X = 0) или соблюдается (X = 1).
П RW
Если бит Е сброшен (Е = 0), тогда бит RW (readable/writeable) указывает, что сегмент может записываться (RW = 1) или не может записываться (RW = 0). Если бит Е установлен (Е = 1), тогда бит RW указывает, что сегмент кода может читаться (RW = 1) или не может читаться (RW = 0).
П А
Бит A (accessed) устанавливается при каждом доступе микропроцессора к сегменту. Иногда он применяется операционной системой для отслеживания сегментов,
986
Глава 17
к которым были или не были обращения за последнее время, и соответственно предпринять какие-либо действия.
Дескриптор системных сегментов
Дескриптор системных сегментов представлен на рис. 17.19. Имеется 16 возможных типов дескрипторов системы (табл. 17.1), которые задаются с помощью поля дескриптора Туре. Обратите внимание, что они не все используются в микропроцессоре 80386. Некоторые типы определены для микропроцессора 80286, чтобы обеспечить совместимость программного обеспечения процессора 80286 с микропроцессором 80386; некоторые из этих типов являются новыми и уникальными для микропроцессора 80386, а другие типы еще не определены и зарезервированы для будущих изделий Intel.
Дескриптор для микропроцессора 80386
Байт прав доступа —►
База(В31-В24)				G	0	0	0	Предел (L19-L16)
Р	DPL	0	Руре;	База(В23-В16)				
База(В15-В0)								
Предел (L15-L0)								
Рис. 17.19. Общий формат дескриптора системного сегмента для микропроцессора 80386
Таблица 17.1. Типы системного дескриптора микропроцессора 80386
Значение поля Туре	Назначение дескриптора
0000	Недействительный
0001	Доступный сегмент состояния задачи 80286 (Available TSS)
0010	Локальная таблица дескрипторов (LDT)
0011	Занятый сегмент состояния задачи 80286 (Busy TSS)
0100	Вентиль вызова 80286 (Call gate)
0101	Вентиль задач 80286 или 80386 (Task gate)
0110	Вентиль прерываний 80286 (Interrupt gate)
0111	Вентиль ловушки 80286 (Trap gate)
1000	Недействительный
1001	Доступный сегмент состояния задачи 80386 (Available TSS)
1010	Зарезервировано
1011	Занятый сегмент состояния задачи 80386 (Busy TSS)
1100	Вентиль вызова 80386 (Call gate)
1101	Зарезервировано
, 1110	Вентиль прерываний 80386 (Interrupt gate)
1111	Вентиль ловушки 80386 (Trap gate)
Микропроцессоры 80386 и 80486
987
Таблицы дескрипторов
Таблицы дескрипторов определяют все сегменты, используемые в микропроцессоре 80386 при работе в защищенном режиме. Имеется три типа таблиц: глобальная таблица дескрипторов GDT (global descriptor table), локальная таблица дескрипторов LDT (local descriptor table) и таблица дескрипторов прерываний IDT (interrupt descriptor table). Доступ к этим таблицам осуществляется с помощью соответствующих регистров: регистра глобальной таблицы дескрипторов GDTR (global descriptor table register), регистра локальной таблицы дескрипторов LDTR (local descriptor table register) и регистра таблицы дескрипторов прерываний IDTR (interrupt descriptor table register). Для загрузки этих регистров используются следующие три привилегированные команды: lgdt, lldt и lidt соответственно.
Таблица дескрипторов представляет собой массив данных переменного размера, каждый элемент которой содержит 8-байтный дескриптор. Каждая таблица локальных и глобальных дескрипторов имеет до 8192 элементов. Таблица дескрипторов прерываний содержит до 256 входных элементов. Выбор дескриптора в локальной или глобальной таблице дескрипторов осуществляется посредством 13-битного поля Индекс (Index) селектора, хранящегося в регистре сегмента (рис. 17.20). Бит индикатора таблицы TI (table indicator) (бит 2 селектора) выбирает локальную (TI = 1) или глобальную (Т1 = 0) таблицу дескрипторов, а младшие два бита RPL (requested privilege level) селектора определяют запрашиваемый уровень привилегий для доступа к сектору.
При размещении нового селектора в регистр сегмента микропроцессор 80386 получает доступ к одной из таблиц дескрипторов и автоматически загружает дескриптор в программно-недоступный кэш-дескрипторов сегментного регистра.
15	3 2 1 0
Индекс	TI	RF	
Сегментный регистр
Рис. 17.20. Формат селектора в защищенном режиме
Если селектор в сегментном регистре остается неизменным, то никаких дополнительных доступов к таблице дескрипторов не требуется. Операция выборки нового дескриптора из таблицы дескрипторов является программно-невидимой, поскольку микропроцессор выполняет это каждый раз автоматически при изменении содержимого сегментного регистра в защищенном режиме.
На рис. 17.21 показан пример доступа к глобальной таблице дескрипторов GDT посредством сегментного регистра DS.
В этой таблице имеется, например, четыре элемента. Первый — это нулевой дескриптор. Заметим, что дескриптор 0 (нуль-дескриптор) зарезервирован и не используется для доступа к памяти. Другие элементы таблицы адресуют различные сегменты системы памяти в защищенном режиме микропроцессора 80386. На данном примере (см. рис. 17.21) регистр сегмента данных DS содержит значение 0008Н. Такое содержимое регистра означает, что селектор посредством поля Индекс (Index) выбирает дескриптор 1 в глобальной таблице дескрипторов (TI = 0), а запрашиваемый уровень привилегий равен 00 (RPL = 00). Этот дескриптор располагается на восемь
988
Глава 17
байт выше базового адреса глобальной таблицы дескрипторов. Дескриптор 1, расположенный в этой ячейке памяти, получает доступ к сегменту с базовым адресом ООЮООООН и значением предела сегмента равного 000FFH. Таким образом, дескриптор определяет сегмент в диапазоне адресов ООЮООООН—001000FFH, именно в этих ячейках памяти располагается сегмент данных DS (data segment). При доступе к данным вне этих границ происходит прерывание.
Система
памяти
FFFFFFFF
00100100
001000FF
00100000
000FFFFF
00000000
Рис. 17.21. Использование регистра сегмента данных DS для выбора дескриптора из глобальной таблицы дескрипторов. В этом примере регистр DS получает доступ к ячейкам памяти ООЮООООН—001000FFH в качестве сегмента данных
Ъкальная таблица дескрипторов LDT получает доступ таким же образом, как и глобальная таблица GDT. Единственным отличием в процедуре доступа к памяти шляется то, что разряд Т1 очищается в случае использования таблицы GDT и уста-швливается при использовании таблицы LDT. Другое отличие можно заметить при эассмотрении регистров GDTR и LDTR. Регистр GDTR содержит базовый адрес лобальной таблицы дескрипторов и ее предельное значение. Регистр LDTR содер-кит только 16-разрядный селектор. Содержимое регистра LDTR адресуется к деск->иптору системного сегмента с типом 0010 (поле Туре = 0010), который содержит газовый адрес и предельное значение локальной таблицы дескрипторов. Такая схема 1редусматривает одну глобальную таблицу, доступную всем задачам, и допускает множество локальных таблиц (одну или более) для каждой задачи, если это необхо
Микропроцессоры 80386 и 80486
989
димо. Глобальные дескрипторы определяют память для системы, тогда как локальные дескрипторы определяют память для приложений или задач.
Таблица дескрипторов прерываний IDT, подобно таблице GDT, адресуется с помощью базового адреса и предельного значения таблицы, хранящегося в соответствующем регистре IDTR. Основное отличие между таблицами GDT и IDT состоит в том, что таблица IDT содержит только вентили прерываний. Таблицы GDT и LDT хранят дескрипторы сегментов и дескрипторы системных сегментов, но никогда не содержат вентили прерывания.
На рис. 17.22 показан дескриптор вентиля — особая конфигурация системного деск риптора, описанного ранее. Различные типы дескриптора вентиля показаны в приведенной ранее табл. 17.1. Обратите внимание, что дескриптор вентиля содержит 32-разрядный относительный адрес смещения, число слов в поле Word count и селектор. 32-разрядный относительный адрес смещения указывает на ячейку процедуры обслуживания прерывания или другие процедуры. Поле Word count указывает на количество переданных слов из стека вызовов в стек процедуры, получаемой доступ от вентиля вызова. Такая особенность передачи данных из стека вызовов является полезной при выполнении программ, написанных на языках высокого уровня, таких как С или C++. Следует заметить, что поле Word count в вентиле прерываний не используется. Селектор применяется для указания ячейки сегмента состояния задачи TSS (task state segment) в таблице GDT или LDT, если это локальная процедура.
Дескриптор вентиля для микропроцессора 80386
Байт прав доступа —►
Смещение (031-016)							
Р	DPL	0	ТУР®;	0	0	0	Word count (С4-С0)
Селектор							
Смещение^О! 5-00)							
Рис. 17.22. Дескриптор вентиля для микропроцессора 80386
При получении доступа к вентилю содержимое селектора загружается в регистр задач TR (task register), что приводит к переключению задачи. Принятие вентилем содержимого зависит от привилегии и уровней приоритета. Команда возврата ret завершает процедуру вентиля вызова, а команда возврата из обработчика прерываний iret прекращает процедуру вентиля прерываний. Задачи получают доступ к процедурам, как правило, по команде call или int, где команда вызова процедуры адресует вентиль вызова в таблице дескрипторов, а команда вызова прерывания адресует дескриптор прерываний.
Разница между прерываниями в реальном режиме и прерываниями в защищенном режиме состоит в том, что таблица векторов прерываний в защищенном режиме является таблица IDT. Таблица IDT все еще содержит до 256 уровней прерываний, но доступ к каждому уровню производится через вентиль прерываний вместо вектора прерываний. Следовательно, прерывание под типовым номером 2 располагается в дескрипторе 2 таблицы IDT на 16 позиций выше ее базового адреса. Это также означает, что первые 1 Кбайт памяти больше не содержат векторов прерываний, как
990
Глава 17
это было в реальном режиме, поскольку таблица IDT может размещаться в любой ячейке памяти.
Сегмент состояния задачи TSS
Дескриптор сегмента состояния задачи TSS (task state segment) содержит информацию об адресе ячейки, размере и уровне привилегий сегмента состояния задачи, как и любой другой дескриптор. Разница состоит в том, что сегмент TSS, описываемый дескриптором сегмента состояния задачи TSS, не содержит данных или программного кода. Он содержит состояние задачи и связи между задачами, поскольку' задачи могут быть вложенными (одна задача может вызывать другую, которая в свою очередь может вызывать третью и т. д.). Дескриптор TSS адресуется регистром задач TR (task register), который в свою очередь загружается командой ltr. Кроме того, содержимое регистра задач TR изменяется, когда программа в защищенном режиме выполняет команду дальнего перехода jump или команду вызова call. Команда ltr используется при начальном доступе к задаче во время инициализации системы. После инициализации обычно для переключения задач используются команды jump или call. В большинстве случаев для инициации новой задачи используется команда CALL.
Сегмент состояния задачи TSS показан на рис. 17.23. Можно видеть, что сегмент состояния задачи представляет собой чрезмерно огромную область памяти, содержащую много различных видов информации. Первое слово сегмента TSS обозначено как BACK LINK и представляет собой обратную ссылку на предыдущую задачу. Это, по сути, селектор, который используется при возврате с помощью команд ret или iret в предыдущий сектор состояния задачи TSS, посредством загрузки этого селектора обратной связи в регистр задач TR. Следующее слово должно содержать нуль.
Двойные слова со второго по седьмое содержат величины регистра указателя стека ESP и регистра сегмента стека ESS для соответствующих уровней привилегий с нулевого по второй. При передачах управления с помощью команд jmp или call новый указатель стека загружается в регистры ES и ESP, а предыдущий помещается в этот новый стек. Это необходимо на случай прерывания текущей задачи и возврата к исходному уровню привилегированности путем восстановления его из стека. Восьмое слово (смещение 1СН) содержит значение регистра CR3, который хранит базовый адрес таблицы каталога страниц для предыдущего состояния. Таким образом, он может быть восстановлен при работающем механизме страничной переадресации. Содержимое последующих 17 двойных слов соответствует образам регистров процессора. Поскольку каждая задача имеет связанный с ней сегмент состояния задачи TSS, все данные о состоянии машины (все регистры) для задачи сохраняются в этих ячейках памяти. Последнее слово BIT_MAP_OFFSET (начальный номер 66Н) содержит базовый адрес карты разрешения ввода-вывода.
Карта разрешения ввода-вывода (I/O permission bit map) позволяет сегменту состояния задачи TSS блокировать операции ввода-вывода к запрещенным адресам порта ввода-вывода посредством прерывания, связанного с отказом разрешения ввода-вывода. Прерывание отказа разрешения ввода-вывода имеет номер 13, т. е. прерывание нарушения защиты. Базовый адрес карты разрешения ввода-вывода — это относительный адрес от начала сегмента состояния задачи TSS. Такая организация позволяет использовать одну и ту же карту разрешения ввода-вывода для многих сегментов состояния задач.
Микропроцессоры 80386 и 80486
991
Права доступа	Предел TSS
База	
Программно-невидимая ....часть[югистра...
Регистр задачи
TR Селектор
15	О
31	16	15	0
0000000000000000	|	BACK LINK
ESP0	
0000000000000000	I	sso
ESP1	
0000000000000000	|	SS1
ESP2	
0000000000000000	|	SS2
CR3	
EIP	
EFLAGS	
ЕАХ	
ЕСХ	
EDX	
ЕВХ	
ESP	
ЕВР	
ESI	
EDI	
0000000000000000	ES
0000000000000000	CS
0000000000000000	SS
0000000000000000	DS
0000000000000000	FS
0000000000000000	GS
0000000000000000	LDT
BIT_MAP_OFFSET(-5:0)	0000000000000000 | T
о TSS BASE 4 8 С 10 ' 14 18 1С=
_ Стек для CPL 0,1,2
20
24
28 2C
30
34
38
3C
40
44
48 4C
50
54
58 5C
60
Доступная область
			
31	24	23	16	15	8	7	0
63	56	55	48	47	40	39	32
95	88	87	80	79	72	71	64
			96
			
65407 65439 65471	Карта раз вврда-в (ПО ОДНО1 на кажды портов ввцс	решения ывода му биту |й адрес 1а-вывода)	—
65503			65472
65535			65504
			"FFH"
Состояние - текущей задачи
DEBUG TRAP BIT
BIT_MAP_OFFSET
OFFSET + С
OFFSET+ 10
OFFSET+ 1FEC
OFFSET + 1FF0
OFFSET + 1FF4
OFFSET + 1FF8
OFFSET+ 1FFC
OFFSET + 2000
J TSS LIMIT = OFFSET + 2000H
Дескриптор сегмента состояния задачи (TSS) 31 микропроцессора 80386 (в GDT)	о
	База сегмента 15...0						Предел сегмента 15..0				
	База 31..24	G	1	0	0	Предел 19.16	Р	DPL _1_	0	TYPE _L_LL_	База 23..16
Туре = 9: Доступный сегмент состояния задачи МП 80386 (Available TSS)
Type = В: Занятый сегмент состояния задачи МП 80386 (Busy TSS)
Примечание. Значение BIT_MAP_OFFSET должно быть равно DFFFH
Рис. 17.23. Дескриптор сегмента состояния задачи TSS
992
Глава 17
Каждая карта разрешения ввода-вывода имеет протяженность в 64 Кбит (8 Кбайт), начиная от относительного адреса, указываемого базовым адресом карты разрешения ввода-вывода (BIT_MAP_OFFSET). Эта карта имеет по одному биту на каждый адрес портов ввода-вывода. Первый байт карты содержит биты разрешения для портов ввода-вывода 0000Н—0007Н, причем младший бит соответствует порту 0000Н, а старший — 0007Н. Такая очередность продолжается до самого последнего порта FFFFH, записанного в старшем бите последнего байта карты разрешения ввода-вывода. Если текущий уровень привилегии задачи CPL (current privilege level) меньше или равен уровню привилегий операций ввода-вывода, определяемого полем 1OPL (I/O privilege level) регистра флагов, то никаких ограничений на операции ввода-вывода не накладывается. Если же текущий уровень привилегии задачи CPL больше уровня привилегии операции ввода-вывода, то инструкции ввода-вывода могут выполняться только по адресам портов, для которых биты в карте разрешения ввода-вывода имеют значение логического нуля. Во всех остальных случаях попытки обращения к портам вызывают прерывание. В настоящее время только Windows NT использует карту разрешения ввода-вывода для запрещения доступа к портам ввода-вывода в зависимости от приложения или пользователя.
Для рассмотрения операции по переключению задачи, требующей только 17 мкс, можно перечислить следующие этапы:
1.	Вентиль содержит адрес процедуры или ячейку для перехода при переключении задачи. Он также содержит номер селектора дескриптора сегмента состояния задачи TSS и число слов, передаваемых от вызывающей программы в область стека пользователя для передачи параметров.
2.	Селектор из вентиля загружается в регистр задач TR. Этот этап выполняется по командам call или jump, которые указывают на сегмент состояния задачи TSS или дескриптор вентиля задачи в таблице GDT или LDT.
3.	Регистр задач TR выбирает соответствующий сегмент состояния задачи TSS.
4.	Текущее состояние сохраняется в текущем сегменте состояния задачи, а в процессор загружается состояние новой задачи (все регистры) из нового сегмента состояния задачи, к которому получен доступ и в котором сохраняется селектор сегмента TSS предыдущей задачи (BACK LINK). После этого начинается выполнение новой задачи.
Возврат из задачи производится следующим образом:
1. Текущее состояние микропроцессора сохраняется в текущем сегменте состояния задачи.
2. Селектор обратной связи BACK LINK загружается в регистр задачи TR для получения доступа к предыдущему сегменту состояния задачи с тем, чтобы вернуться к предыдущему состоянию машины и восстановить микропроцессор в исходное состояние.
Следует заметить, что возврат управления задаче, вызвавшей текущую задачу, осуществляется с помощью команды iret.
17.4. Переход в защищенный режим
Для выполнения надлежащим образом переключения микропроцессора 80386 из реального режима в защищенный режим необходимо выполнить несколько этапов.
Микропроцессоры 80386 и 80486 993
Переход в реальный режим работы осуществляется после аппаратного сброса или после сброса бита РЕ (protect enable) в управляющем регистре CR0. Переход в защищенный режим выполняется установкой бита РЕ в регистре CR0. Однако перед установкой бита РЕ необходимо осуществить еще ряд операций. Таким образом, для перехода из реального режима в защищенный режим следует выполнить следующие шаги:
1.	Инициализировать таблицу дескрипторов прерываний IDT, чтобы она содержала правильные вентили прерываний минимум для первых 32 типовых номеров прерываний. Таблица дескрипторов прерываний IDT может содержать (и часто содержит) до 256 8-байтных вентилей прерываний, определяющих все 256 типов прерываний.
2.	Инициализировать глобальную таблицу дескрипторов GDT, чтобы она имела нуль в дескрипторе 0 (нуль-дескрипторе) и достоверные дескрипторы минимум для одного сегмента кода, одного сегмента стека и одного сегмента данных.
3.	Перейти в защищенный режим работы посредством установки бита РЕ в регистре CR0.
4.	Выполнить инструкцию внутрисегментного (ближнего) перехода jmp, для очистки очереди внутренних команд, декодированных в реальном режиме, и загрузить регистр задачи TR базовым дескриптором сегмента состояния задач TSS.
5.	Загрузить все селекторы данных (сегментные регистры) исходными значениями селекторов.
Теперь микропроцессор 80386 будет работать в защищенном режиме с использованием сегментных дескрипторов, которые определены в таблицах GDT и IDT.
На рис. 17.24 показана карта памяти системы в защищенном режиме после использования последовательности шагов 1—5.
FFFFFFFF
FFFFFFF0
Сброс программы
Сегмент кода и данных
Глобальные дескрипторы
Дескрипторы прерываний
00000100
00000000
Рис. 17.24. Карта размещения информации в памяти для примера 17.1
Программа для этой задачи приведена в примере 17.1. Данная система содержит один дескриптор сегмента данных и один дескриптор сегмента кода со значением предела сегмента равного 4 Гбайт для каждого. Возможен простейший способ перевода системы в защищенный режим: загрузить все сегментные регистры (кроме ре-
32 Зак 384
994
Глава 17
гистра CS) таким же дескриптором сегмента данных из таблицы GDT. Устанавливают наивысший уровень привилегий равный 00. Такая система наиболее часто используется в том случае, когда один пользователь получает доступ к микропроцессору и запрашивает всю область памяти. Приведенная программа предназначена для системы, которая не использует DOS. Далее в этом разделе показано, как перейти в защищенный режим из окружения DOS. Обратите внимание, что приведенная в примере 17.1 программа предназначается для автономной системы, построенной на базе микропроцессора 80386ЕХ, а не для использования в персональном компьютере.
Пример 17.1. Программа настройки системы для перехода в защищенный режим
.MODEL SMALL .386Р
0000	.DATA
0000 0040 [ IDT1 DD 64 DUP (?)	; область памяти для 32 векторов
00000000
]
9
; Глобальная таблица дескрипторов
9
0100	DESCO DQ 0	; очистка нуль-дескриптора
0000000000000000
; Дескриптор сегмента кода
0108	FFFF	DESC1	DW	0FFFFH	предел сегмента = 4 Гбайт
010А	0000		DW	0	базовый адрес = 00000000Н
010С	0000		DW	0	
010Е	9Е		DB	9ЕН	сегмент кода
010F	8F		DB	8FH	бит G = 1
ОНО	00		DB	0	
		9 ; Дескриптор		сегмента данных	
0111	FFFF	DESC2	DW	0FFFFH	предел сегмента = 4 Гбайт
0113	0000		DW	0	базовый адрес = 00000000Н
0115	0000		DW	0	
0117	92		DB	92Н	сегмент данных
0118	8F		DB	8FH	бит G = 1
0119	00		DB	0	
; Данные таблицы дескрипторов прерываний IDT
011А	00FF	IDT	DW	0FFH	; установить предел FFH
ОНО	00000000	IDTA	DD	0	
; Данные глобальной таблицы дескрипторов GDT
0120 0017	GDT DW 17Н	; установить предел 17Н
Микропроцессоры 80386 и 80486
995
0122	00000000	GDTA	DD	0
0000		.CODE		
		MAK32	MACRO	SEG,OFF	; получить линейный адрес
			MOV	ЕАХ, 0
			MOV	ЕВХ, 0
			MOV	АХ,SEG
			MOV	BX,OFF
			SHL	ЕАХ, 4
			ADD	ЕАХ,ЕВХ
			ENDM	
		.STARTUP		
			MAK32	DS,OFFSET IDT1
0028	66| АЗ 011С R		MOV	IDTA,EAX	; сохранить адрес таблицы IDT
			MAK32	DS,OFFSET DESCO
0044	66| АЗ 0122 R		MOV	GDTA,ЕАХ	; сохранить адрес таблицы GDT
0048	В9 0020		MOV	СХ, 32
004В	BF 0000 F		MOV	DI,OFFSET IDT1
004Е	BE 0000		MOV	SI,0
0051	В8 0000		MOV	АХ, 0
0054	8Е СО		MOV	ES,AX
		.REPEAT		; настроить первые 32 прерывания
			MAK32	ES:[SI+2],ES:[SI]
0070	89 05		MOV	[DI],АХ
0072	66| Cl Е8	10	SHR	ЕАХ,16
0076	89 45 06		MOV	[DI+6], АХ
0079	С7 45 02	0008	MOV	WORD PTR [DI+2],8
007Е	С7 45 04	8F00	MOV	WORD PTR [DI+4],8F00H
0083	83 С7 08		ADD	DI, 8
0086	83 Сб 04		ADD	SI,4
		.UNTILCXZ		
008В	OF 01 IE	ОНА R	LIDT	FWORD PTR IDT ; загрузить таблицу IDT
0090	OF 01 16	0120 R	LGDT	FWORD PTR GDT ; загрузить таблицу GDT
0095	OF 20 CO		MOV	EAX,CR0	; установить бит PE
0098	66| 83 C8	01	OR	EAX, 1
009С	OF 22 CO		MOV	CR0,EAX
009F	EB 00		JMP	START	; инструкция ближнего перехода
00А1		START:		
00А1	B8 0010		MOV	AX, ЮН	; установить селектор 2
00А4	8E D8		MOV	DS, АХ
00А6	8E CO		MOV	ES,AX
00А8	8E DO		MOV	SS,AX
00AA	8E E8		MOV	GS,AX
00 АС	8E EO		MOV	FS,AX
ООАЕ	66| BC FFFFF000		MOV	ESP,0FFFFF000H
; Теперь в защищенном режиме.
END
996
Глава 17
В более сложных системах этапы инициализации системы в защищенном режиме являются более запутанными. Для комплексных систем, часто со многими пользователями, регистры загружаются с использованием сегмента состояния задачи TSS. Далее приводится последовательность действий, которую требуется выполнить, чтобы перевести микропроцессор 80386 в защищенный режим для более сложной системы с использованием переключения задач.
1.	Инициализировать таблицу дескрипторов прерываний IDT, чтобы она обращалась к достоверным дескрипторам прерываний (не менее 32 дескрипторов) таблицы IDT.
2.	Инициализировать глобальную таблицу дескрипторов GDT, чтобы она содержала не менее двух дескрипторов сегмента состояния задачи TSS, начальный сегмент кода и сегмент данных, необходимые для исходной задачи.
3.	Инициализировать регистр задачи TR так, чтобы он указывал правильный сегмент состояния задачи TSS. Текущие регистры, при переключении исходной задачи и обращении к новому сегменту состояния задачи TSS, запоминаются в исходном сегменте TSS.
4.	Перейти в защищенный режим посредством выполнения инструкции внутрисегментного (ближнего) перехода jmp, которая очищает очередь инструкций, декодированных в реальном режиме. Загрузить регистр TR значением селектора, указывающий на текущий сегмент состояния задачи TSS.
5.	Загрузите регистр TR с помощью команды дальнего перехода, так чтобы получить доступ к новому сегменту TSS и сохранить текущее состояние.
После этого микропроцессор 80386 будет работать в защищенном режиме под управлением первой задачи.
В примере 17.2 приводится программа, необходимая для инициализации системы и перехода в защищенный режим с использованием переключения задач. Исходная задача системы работает с наивысшим уровнем защиты (00) и управляет всей операционной средой микропроцессора 80386. Во многих случаях она используется для начальной загрузки (load) программного обеспечения, которое предоставляет многим пользователям доступ к системе в многопользовательском режиме.
Пример 17.2. Программа инициализации системы и перехода в защищенный режим при использовании переключения задач
.MODEL SMALL
.386Р
0000 0008		.STACK .DATA DESC	800H STRUC	
0000	0000	LIM_L	DW	0
0002	0000	BAS_L	DW	0
0004	00	BAS_M	DB	0
0005	00	ACCESS	DB	0
0006	00	LIM_M	DB	0
0007	00	BAS_H	DB	0
		DESC	ENDS	
; определить структуру дескриптора
Микропроцессоры 80386 и 80486
997
0068	TSS	STRUC
0000 0000	BACK-L	DW	0
0002 0000		DW	0
0004 00000000	ESP0	DD	0
0008 0000	SSO	DW	0
000А 0000		DW	0
000С 00000000	ESP1	DD	0
0010 0000	SS1	DW	0
0012 0000		DW	0
0014 00000000	ESP2	DD	0
0018 0000	SS2	DW	0
001А 0000		DW	0
001С 00000000	CCR3	DD	0
0020 00000000	EIP	DD	0
0024 00000000	TFALGS	DD	0
0028 00000000	ЕЕАХ	DD	0
002С 00000000	ЕЕСХ	DD	0
0030 00000000	EEDX	DD	0
0034 00000000	ЕЕВХ	DD	0
0038 00000000	EESP	DD	0
003С 00000000	ЕЕВР	DD	0
0040 00000000	EESI	DD	0
0044 00000000	EEDI	DD	0
0048 0020	EES	DW	2 OH
004А 0000		DW	0
004С 0018	ECS	DW	18H
004Е 0000		DW	0
0050 0020	ESS	DW	2 OH
0052 0000		DW	0
0054 0020	EDS	DW	2 OH
0056 0000		DW	0
0058 0020	EFS	DW	2 OH
005А 0000		DW	0
005С 0020	EGS	DW	2 OH
005Е 0000		DW	0
0060 0000	ELDT	DW	0
0062 0000		DW	0
0064 0000		DW	0
0066 0000	BITM	DW	0
	TSS	ENDS
0000 0000 0000	TSS1	TSS	<>
00000000		
0000 0000	00000000	
0000 0000	00000000	
0000 0000	00000000	
00000000	00000000	
00000000	00000000	
00000000	00000000	
00000000	00000000	
00000000	00000000	
; определить структуру сегмента TSS
; состояние задачи 1
998
Глава 17
0020 0000 0018 0000 0020 0000 0020 0000 0020 0000 0020 0000 0000 0000 0000 0000
0068 0000 0000 TSS2 TSS <>	; состояние задачи 2
00000000 0000 0000 00000000 0000 0000 00000000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0020	0000	0018
0000	0020	0000
0020	0000	0020
0000	0020	0000
0000	0000	0000
0000
00D0 0040 [ IDT1 DD 64 DUP (?)	; область памяти для 32 векторов
00000000 ]
; Глобальная таблица дескрипторов
01D0	0000 0000 00 GDT0 DESC <>	; 00 00 00			: очистить нуль-дескриптор	
01D8	0000 0028 00 TG1 85 00 00	DESC	<0,28H,0,85H,0,0>	;	: вентиль задачи 1	
01Е0	0000 0030 00 TG2 85 00 00	DESC	<0,ЗОН,0,85H,0,0>	;	 вентиль задачи 2	
01Е8	FFFF 0000 00 ACS 9А CF 00	DESC	<-l,0,0,9AH,0CFH, 0> i	: сегмент кода (4 Гбайт)	
01F0	FFFF 0000 00 DS1 92 CF 00	DESC	<-l,0,0,92H,0CFH,0> ;	: сегмент данных (4	Гбайт)
01F8	FFFF 0000 00 TS1 89 CF 00	DESC	<-l,0,0,89H,0CFH,0> ;	! доступный сегмент	TSS1
0200	FFFF 0000 00 TS2 89 CF 00	DESC	<-l,0,0,89H,OCFH,0> i	: доступный сегмент	TSS2
0208	2000 [	IOBP 00	DB	2000H DUP (0)	; разрешить все операции		ввода-вывода
]
; Данные таблицы дескрипторов прерываний IDT
2208 00FF	IDT DW 0FFH	; установить предел FFH
Микропроцессоры 80386 и 80486
999
220А	00000000 IDTA	DD	0
	;GDT table data	
220Е	0017	GDT	DW	17H	; установить предел 17H
2210	00000000 GDTA	DD	0
0000	.CODE	
	MAK32	MACRO	SEG,OFF	;	получить	линейный	адрес MOV	EAX,0 MOV	EBX,0 MOV	AX,SEG MOV	BX,OFF SHL	EAX,4 ADD	EAX,EBX ENDM
	MAKD .STARTUP	MACRO TSS,DES	; сохранить базовый адрес PUSH	EAX MOV	EBX,0 MOV	BX,OFFSET TSS ADD	EAX,EBX MOV	DES.BAS_L,AX SHR	EAX,16 MOV	DES.BAS_M, AL MOV	DES.BAS_H,AH POP	EAX ENDM MAK32 DS,OFFSET IDT1
0028	66| АЗ 220A R	MOV	IDTA,EAX	; сохранить адрес таблицы IDT MAK32 DS,OFFSET GDT0
0044	66| A3 2210 R	MOV	GDTA,EAX	; сохранить адрес таблицы GDT
0048	B9 0020	MOV	CX,32
004В	BF 00D0 R	MOV	DI,OFFSET IDT1
004Е	BE 0000	MOV	SI,0
0051	B8 0000	MOV	AX,0
0054	8E CO	MOV	ES,AX .REPEAT	; настроить первые 32 прерывания MAK32 ES:[SI+2],ES:[SI]
0070	89 05	MOV	[DI],AX
0072	66| Cl E8 10	SHR	EAX,16
0076	89 45 06	MOV	[DI+6],AX
0079	C7 45 02 0008	MOV	WORD PTR [DI+2],8
007Е	C7 45 04 8F00	MOV	WORD PTR [DI+4],8F00H
0083	83 C7 08	ADD	DI,8
0086	83 C6 04	ADD	SI,4 .UNTILCXZ
008В	B8 0208 R	MOV	AX,OFFSET IOBP ; настроить карту разрешения ввода-
008Е	A3 0066 R	MOV	TSS1.BITM,AX	; вывода (I/O permission bitmap)
0091	АЗ OOCE R	MOV	TSS2.BITM,AX MAK32 CS,OFFSET TASK1 ; получить адрес задачи 1
1000
Глава 17
00 AC	66| A3 0088 R	MOV	TSS2.EIP,EAX	; сохранить его в сегменте задачи 2
		MAKD	TSS1,TS1	
		MAKD	TSS2,TS2	
00EC	OF 01 IE 2208 R	LIDT	FWORD PTR IDT	; загрузить таблицу IDT
00F1	OF 01 16 220E R	LGDT	FWORD PTR GDT	; загрузить таблицу GDT
00F6	OF 20 CO	MOV	EAX,CR0	; установить бит РЕ
00F9	66| 83 C8 01	OR	EAX, 1	
00FD	OF 22 CO	MOV	CR0,EAX	
0100	EB 00	JMP	START	; инструкция ближнего перехода
0102	START:			
0102	B8 0008	MOV	AX, 8	; адрес сегмента TSS1
0105	OF 00 D8	LTR	AX	
0108	B8 0010	MOV	AX,10H	
010B	FF E0	JMP	AX	; переход в сегмент TSS2
	; Теперь	в защищенном режиме i		выполняется задача 1.
010D	TASK1:			
END
Оба рассмотренных примера (пример 17.1 и 17.2) не пригодны для функционирования на персональном компьютере. Среда персонального компьютера требует использования или драйвера VCPI (virtual control program interface), поддерживаемого в DOS драйвером HIMEM.SYS, или драйвера DPMI (DOS protected mode interface), поддерживаемого Windows для оболочки DOS. В примере 17.3 показан порядок перехода в защищенный режим работы с использованием DPMI и дальнейшим отображением любой области памяти. Это включает и участок расширенной памяти или любой другой. Данное DOS-приложение позволяет отображать любую ячейку памяти в шестнадцатеричном формате на мониторе. Сюда входят ячейки выше 1 Мбайта запоминающей системы.
Пример 17.3. Программа перехода в защищенный режим с помощью DPMI	|
и отображения любой области памяти	*	|
; Программа, которая отображает содержание любой области памяти ; включая и расширенную память.
; **★ Синтаксис командной строки ***
; EDUMP XXXX,YYYY ; где ХХХХ — начальный адрес, a YYYY — конечный. ; Примечание: Эта программа должна быть запущена из Windows.
.MODEL SMALL .386 .STACK 1024	; область стека 1024 байт
0000	.DATA
0000 00000000	ENTRY DD	?	; точка входа DPMI
0004 00000000	EXIT DD	?	; точка выхода DPMI
Микропроцессоры 80386 и 80486
1001
0008	00000000	FIRST DD	?	; первый адрес
ОООС 0010	00000000 0000	LAST1 DD MSIZE DW		; последний адрес ; память, необходимая для DPMI
0012	0D	ОА	ОА	50	61 72	61	6D	65	74 65	72	20	65	72 72	6F	72	2Е	24	ERR1 DB	13,10,10,	'Parameter error.$'
0026	0D ОА ОА 44 50 4D 49 20 6Е 6F 74 20 70 72 65 73 65 6Е 74 2Е 24	ERR2 DB	13,10,10,	'DPMI not present.$'
003В	0D ОА ОА 4Е 6F 74 20 65 6Е 6F 75 67 68 20 72 65 61 6С 20 6D 65 6D 6F 72 79 2Е 24	ERR3 DB	13,10,10,	'Not enough real memory.$'
0056	0D ОА ОА 43 6F 75 6С 64 20 6Е 6F 74 20 6D 6F 76 65 20 74 6F 20 70 72 6F 74 65 63 74 65 64 20 6D 6F 64 65 2Е 24	ERR4 DB	13,10,10,	'Could not move to protected mode.$
007В	0D ОА ОА 43 61 6Е 6Е 6F 74 20 61 6С 6С 6F 63 61 74 65 20 73 65 6С 65 63 74 6F 72 2Е 24	ERR5 DB	13,10,10,	'Cannot allocate selector.$' **
0098	0D ОА ОА 43 61 6Е 6Е 6F 74 20 75 73 65 20 62 61 73 65 20 61 64 64 72 65 73 73 2Е 24	ERR6 DB	13,10,10,	'Cannot use base address.$'
00В4 00D5	0D ОА ОА 43 61 6Е 6Е 6F 74 20 61 6С 6С 6F 63 61 74 65 20 36 34 4В 20 74 6F 20 6С 69 6D 69 74 2Е 24 0D ОА 24	ERR7 DB CRLF DB	13,10,10, 13,10,'$'	'Cannot allocate 64K to limit.$'
00D8	50 72 65 73 73 20 61 6Е 79 20 6В 65 79 2Е 2Е 2Е 24	MES1 DB	'Press any key...$'	
1002
Глава 17
; Таблица регистров, сохраняемых для DPMI-функции 0300Н
00Е9	= 00Е9	ARRAY EQU		THIS BYTE		
00Е9	00000000	REDI	DD	0	9	EDI
00ED	00000000	RES I	DD	0	9	ESI
00F1	00000000	REBP	DD	0	9	EBP
00F5	00000000		DD	0	9	резерв
00F9	00000000	REBX	DD	0	9	EBX
00FD	00000000	REDX	DD	0	9	EDX
0101	00000000	RECX	DD	0	9	ECX
0105	00000000	REAX	DD	0	r	EAX
0109	0000	RFLAG	DW	0	9	регистр флагов
010В	0000	RES	DW	0	9	ES
010D	0000	RDS	DW	0	9	DS
010F	0000	RFS	DW	0	9	FS
0111	0000	RGS	DW	0	9	GS
0113	0000	RIP	DW	0	9	IP
0115	0000	RCS	DW	0	9	CS
0117	0000	RSP	DW	0	9	SP
0119	0000	RSS	DW	0	9	SS
0000			.CODE			
			.STARTUP			
0010	8С СО		MOV	AX, ES		
0012	8С DB		MOV	BX, DS	9	найти размер программы и данных
0014	2В D8		SUB	BX,AX		
0016	8В С4		MOV	AX, SP	9	найти размер стека
0018	Cl Е8 04		SHR	AX, 4		
001В	40		INC	AX		
001С	03 D8		ADD	BX,AX	9	ВХ = длина в параграфах
001Е	В4 4А		MOV	АН, 4 AH		
0020	CD 21		INT	21H	9	модифицировать размер блока памяти
0022	Е8 00D1		CALL	GETDA	9	получить информацию командной строки
0025	73 0А		JNC	MAIN1	9	перейти, если параметр годный
0027	В4 09		MOV	AH, 9		ошибочный параметр
0029	ВА 0012 R		MOV	DX,OFFSET	ERR1	
002С	CD 21		INT	21H		
002Е	Е9 00AA		JMP	MAINE	9	выйти в DOS
0031		MAIN1:				
0031	Е8 00AB		CALL	ISDPMI	9	DPMI загружен?
0034	72 ОА		JC	MAIN2	9	перейти, если DPMI имеется
0036	В4 09		MOV	AH, 9		
0038	ВА 0026 R		MOV	DX,OFFSET	ERR2	
003В	CD 21		INT	21H	9	вывод сообщения о том, что DPMI нет
003D	Е9 009В		JMP	MAINE	9	выйти в DOS
0040		MAIN2:				
0040	В8 0000		MOV	AX, 0	9	указать 0 для необходимой памяти
0043	83 ЗЕ 0010	R 00	CMP	MSIZE,0		
0048	74 F6		JE	MAIN2	9	если DPMI не нуждается в памяти
004А	8В 1Е 0010	R	MOV	BX,MSIZE	9	получить величину
Микропроцессоры 80386 и 80486
1003
004Е	В4	48	MOV	АН,48H		
0050	CD	21	INT	21H	f	выделить блок памяти для DPMI
0052	73	09	JNC	MAIN3		
0054	В4	09	MOV	AH, 9		если недостаточно реальной памяти
0056	ВА	003В R	MOV	DX,OFFSET	ERR3	
0059	CD	21	INT	21H		
005В	ЕВ	7Е	JMP	MAINE		выйти в DOS
005D			MAIN3:			
005D	8Е	СО	MOV	ES,AX		
005F	В8	0000	MOV	AX, 0	/	приложение 16-битное
0062	FF	1Е 0000 R	CALL	DS:ENTRY	9	перейти в защищенный режим
0066	73	09	JNC	MAIN4		
0068	В4	09	MOV	AH, 9		если переход неудачен
ООбА	ВА	0056 R	MOV	DX,OFFSET	ERR4	
006D	CD	21	INT	21H		
006F	ЕВ	6А	JMP	MAINE		выйти в DOS
; Защищенный режим
0071			MAIN4			
0071	В8	0000		MOV	AX,0000H	;	 получить локальный селектор
0074	В9	0001		MOV	CX, 1	;	 необходим только один
0077	CD	31		INT	31H	
0079	72	48		JC	MAIN7	;	 перейти, если ошибка
007В	8В	D8		MOV	BX,AX	;	 сохранить селектор
007D	8Е	СО		MOV	ES,AX	;	 загрузить регистр ES селектором
007F	В8	0007		MOV	AX,0007H	;	 установить базовый адрес сегмента
0082	8В	0Е 000А R		MOV	CX,WORD PTR	FIRST+2
0086	8В	16 0008 R		MOV	DX,WORD PTR	FIRST
008А	CD	31		INT	31H	
008С	72	3D		JC	MAIN8	;	 перейти, если ошибка
008Е	В8	0008		MOV	AX,0008H	
0091	В9	0000		MOV	CX,0	
0094	ВА	FFFF		MOV	DX, 0FFFFH ;	установить предел сегмента до 64К
0097	CD	31		INT	31H	
0099	72	38		JC	MAIN9	перейти, если ошибка
009В	В9	0018		MOV	CX,24	загрузить число линий
009Е	BE	0000		MOV	SI,0	загрузить смещение
00А1			MAIN5			
00А1	Е8	00F4		CALL	DADDR	показать адрес, если нужно
00А4	Е8	ООСЕ		CALL	DDATA	показать данные
00А7	46			INC	SI	указать на следующие данные
00А8	66|	А1 0008 R		MOV	EAX,FIRST ;	проверить на конечный адрес
00 АС	66|	ЗВ 06 ооос	R	CMP	EAX,LAST1	
00В1	74	07		JE	MAIN 6	перейти, если адрес конечный
00B3	66 |	FF 06 0008	R	INC	FIRST	
00В8	ЕВ	Е7		JMP	MAIN5	
00BA			MAIN6			
00BA	В8	0001		MOV	AX,0001H	освободить дескриптор из таблицы LDT
00BD	8С	СЗ		MOV	BX,ES	
1004
Глава 17
OOBF	CD 31	INT 31Н
00С1 оосз	ЕВ 18	JMP MAINE	; выйти в DOS MAIN7:
оосз	ВА 007В R	MOV DX,OFFSET ERR5
00С6	Е8 0096	CALL DISPS	; показать, что селектор не распределить
00С9 оосв	ЕВ 10	JMP MAINE	; выйти в DOS MAIN8:
оосв	ВА 0098 R	MOV DX,OFFSET ERR6
ООСЕ	Е8 008Е	CALL DISPS	; нельзя использовать базовый адрес
OOD1 00D3	ЕВ Е7	JMP MAIN6	; освободить дескриптор MAIN9:
00D3	ВА 00В4 R	MOV DX,OFFSET ERR7
00D6	Е8 0086	CALL DISPS	; нельзя распределить предел в 64 Кбайт
00D9 00DB 00DF	ЕВ DF	JMP MAIN6	; освободить дескриптор MAINE: .EXIT ; Процедура ISDPMI проверяет на присутствие DPMI. ; *** выходные параметры *** ;	флаг переноса CF = 1; если имеется DPMI ;	флаг переноса CF = 0; если DPMI нет ISDPMI PROC NEAR
00DF	В8 1687	MOV AX,1687H	; получить состояние DPMI
00Е2	CD 2F	INT 2FH
00Е4	ОВ СО	OR AX,AX
00Е6	75 0D	JNZ ISDPMI1	; переход, если DPMI нет
00Е8	89 36 0010 R	MOV MSIZE,SI	; сохранить необходимый объем памяти
ООЕС	89 ЗЕ 0000 R	MOV WORD PTR ENTRY,DI
OOFO 00F4 00F5 00F5 00F6	8С 06 0002 R F9 СЗ	MOV WORD PTR ENTRY+2,ES STC ISDPMI1: RET ISDPMI ENDP f ; Процедура GETDA извлекает параметры командной строки ; для памяти, показывая их в шестнадцатеричном виде. ; FIRST = первый адрес из командной строки ; LAST1 = последний адрес из командной строки ; *** возвращаемые параметры *** ;	флаг переноса CF = 1, если ошибка ;	флаг переноса CF = 0, если ошибки нет
00F6		GETDA PROC	NEAR
00F6	1Е	PUSH	DS
00F7	06	PUSH	ES
00F8	1F	POP	DS
Микропроцессоры 80386 и 80486
1005
00F9	07	POP	ES	; поменять содержимое регистра ES с DS
00FA	BE 0081	MOV	SI,81H	; адрес командной строки в регистр SI
00FD	GETDA1			
00FD	АС	LODSB		; прочитать байт командной строки
00FE	ЗС 20	СМР	AL,' '	; пропустить пробелы
0100	74 FB	JE	GETDA1	; переход, если пробел
0102	ЗС 0D	СМР	AL, 13	
0104	74 1Е	JE	GETDA3	; переход, если ошибка ввода
0106	4Е	DEC	SI	: уменьшить значение регистра SI
0107	GETDA2			
0107	Е8 0020	CALL	GETNU	;	: получить первый символ
010А	ЗС 2С	CMP	AL,','	
010С	75 16	JNE	GETDA3	; если не запятая, то ошибка
010Е	66| 26: 89 16 0008 R	MOV	ES:FIRST,EDX	
0114	Е8 0013	CALL	GETNU	: получить второй символ
0117	ЗС 0D	CMP	AL, 13	
0119	75 09	JNE	GETDA3	: переход, если ошибка
011В	66| 26: 89 16 000С R	MOV	ES:LAST1, EDX	
0121	F8	CLC		; не указывать на ошибку
0122	ЕВ 01	JMP	GETDA4	;	г и выйти из процедуры
0124	GETDA3			
0124	F9	STC		: указать на ошибку
0125	GETDA4			
0125	1Е	PUSH	DS	г поменять содержимое регистра ES с DS
0126	06	PUSH	ES	
0127	1F	POP	DS	
0128	07	POP	ES	
0129	СЗ	RET		
012А	GETDA ENDP			
	Z ; Процедура		GETNU, извлекающая*число из командной строки	
; и завершающаяся с ним в регистре EDX и с последним символом ; строки в регистре AL как разделитель.
012А	GETNU	PROC NEAR
012А	66| ВА 00000000	MOV EDX,0	; очистить регистр результата
0130	GETNU1	
0130	АС	LODSB	; получить символ из командной строки
		.IF AL >= 'а' && AL <= ' z'
0139	2С 20	SUB AL,20H ; перейти на верхний регистр
		.ENDIF
013В	2С 30	SUB AL,'О'	; преобразовать из ASCII
013D	72 12	JB GETNU2	; переход, если не число
		.IF AL > 9	; преобразовать А-F из ASCII
0143	2С 07	SUB AL,7
		.ENDIF
0145	ЗС 0F	CMP AL,0FH
0147	77 08	JA GETNU2	; переход, если не 0—F
0149	66| Cl Е2 04	SHL EDX,4
1006
Глава 17
014D 014F 0151 0151 0154	02 DO ЕВ DF 8А 44 FF СЗ	ADD JMP GETNU2: MOV RET	DL,AL GETNU1 AL,[SI-1]	; добавить символ в регистр EDX ; получить следующий символ ; получить разделитель
0155		GETNU ENDP		
		; Процедура	DISPC, отображающая найденный в регистре AL	
		; ASCII-символ.		
		. *** используется ***		
		;	прерывание INT21H		
0155		DISPC PROC	NEAR	
0155	52	PUSH	DX	
0156	8А DO	MOV	DL, AL	
0158	В4 06	MOV	AH, 6	
015А	Е8 0084	CALL	INT21H	; выполнить DOS-прерывание INT 21Н
015D	5А	POP	DX	
015Е	СЗ	RET		
015F		DISPC ENDP		
		z ; Процедура	DISPS, отображающая строку символов из	
		; защищенного режима, адресуемую регистрами DS:EDX.		
		; *** используется ★★★		
		;	процедура DISPC		
015F		9 DISPS PROC	NEAR	
015F	66| 81 Е2	0000FFFF AND	EDX,0FFFFH	
0166	67& 8А 02	MOV	AL, [EDX]	; получить символ
0169	ЗС 24	CMP	AL,'$'	; проверить на конец строки
016В	74 07	JE	DISP1	; переход, если конец
016D	66| 42	INC	EDX	; получить адрес следующего символа
016F	Е8 FFE3	CALL	DISPC	; показать символ
0172	ЕВ ЕВ	JMP	DISPS	; повторять до конца строки
0174		DISP1:		
0174	СЗ	RET		
0175		DISPS ENDP		
0175
; Процедура DDATA, отображающая байт данных, расположенный по ; адресу, указанному в регистрах ES:SI.
; Байт сопровождается одним пробелом.
; *** используются ***
; процедуры DIP и DISPC
DDATA PROC NEAR
Микропроцессоры 80386 и 80486
1007
0175	26	8А 04	MOV	AL,ES:[SI]	; получить байт
0178	СО	Е8 04	SHR	AL, 4	
017В	Е8	ооос	CALL	DIP	; отобразить первый символ
017Е	26	8А 04	MOV	AL,ES:[SI]	; получить байт
0181	Е8	0006	CALL	DIP	; отобразить второй символ
0184	ВО	20	MOV	AL,' '	; вывести пробел
0186	Е8	FFCC	CALL	DISPC	
0189	СЗ		RET		
018А			DDATA ENDP		
; Процедура DIP, отображающая правый (младший) полубайт,
018А	; обнаруженный в регистре AL, как шестнадцатеричный символ ; *** используется *** ;	процедура DISPC	
	DIP	PROC NEAR
018А 24 0F		AND AL,OFH	; получить правый полубайт
018С 04 30 0192 04 07		ADD AL,ЗОН	; преобразовать в ASCII .IF AL > 39H	; если A-F ADD AL,7 .ENDIF
0194 Е8 FFBE 0197 СЗ 0198	DIP	CALL DISPC	; отобразить символ RET ENDP
; Процедура DADDR, отображающая обнаруженный шестнадцатеричный ; адрес в DS:FIRST, если он является границей параграфа.
	; *** используются ** ;	процедуры DIP, 1	DISPS,	DISPC и прерывание INT21H
0198	DADDR PROC NEAR		
0198	66| Al 0008 R	MOV EAX,FIRST		; получить адрес
019C	A8 OF	TEST AL,OFH		; логически сравнить с XXXXXXX0
019E	75 40	JNZ DADDR4		; если нет, то адрес не отображать
01A0	BA 00D5 R	MOV DX,OFFSET	CRLF	
01 A3	E8 FFB9	CALL DISPS		; отобразить символы CR и LF
01A6	49	DEC CX		; уменьшить счетчик строк
01A7	75 18	JNZ DADDR2		; переход, если не конец страницы
01A9	BA 00D8 R	MOV DX,OFFSET	MES1	; если конец страницы
01 AC	E8 FFB0	CALL DISPS		; вывести сообщение "Press any key"
01AF	DADDR1:		
01AF	B4 06	MOV AH,6	; получить символ с клавиатуры, без эхо	
01B1	B2 FF	MOV DL,0FFH		
01B3	E8 002B	CALL INT21H		; выполнить DOS-прерывание INT 21Н
01B6	74 F7	JZ DADDR1		; переход, если ничего не напечатано
01B8	BA 00D5 R	MOV DX,OFFSET	CRLF	
1008
Глава 17
01ВВ	E8 FFA1			CALL DISPS			; отобразить символы CR и LF
О1ВЕ 01C1 O1C1 01C2 01C5 01CA 01CA O1CE O1DO 01D3 01D5 01D6 01D8 O1DB 01DD O1EO O1EO	B9 0018 51 B9 0008 661 8B 66| Cl 8A C2 E8 FFB7 E2 F5 59 ВО ЗА E8 FF7A BO 20 E8 FF75 C3	16 C2	0008 04	DADDR2 R DADDR3 DADDR4	MOV PUSH MOV MOV ROL MOV CALL LOOP POP MOV CALL MOV CALL RET	CX,24 CX CX, 8 EDX, FIRST EDX, 4 AL,DL DIP DADDR3 CX AL,' DIS PC AL, ' ' DISPC	; сбросить счетчик строк ; сохранить счетчик строк в стеке ; загрузить в счетчик 8 ; получить адрес ; вывести символ ; повторить 8 раз ; вернуть из стека счетчик строк ; вывести двоеточие ; вывести пробел
O1E1			DADDR ENDP				
				; Процедура ; реального		INT21H, получающая доступ к DOS-инструкции режима INT 21Н с сохранением параметров.	
O1E1				INT21H	PROC	NEAR	
O1E1 01E5 01EA 01EF O1F4 01F9 01FE 0203 0204 0205 0208 0209 020C 020F 0212 0213 0214 0217 0219 021A 021D 021E 021F 0224 0229	66! A3 661 89 66| 89 66| 89 66| 89 66| 89 66| 89 9C 58 A3 0109 06 B8 0300 BB 0021 B9 0000 IE 07 BF 00E9 CD 31 07 Al 0109 50 9D 661 8B 661 8B 66| 8B	0105 R IE 00F9 OE 0101 16 OOFD 36 OOED ЗЕ 00E9 2E 00F1 R R R ЗЕ 00E9 36 OOED 2E 00F1		R R R R R R R R R	MOV REAX,EAX MOV REBX,EBX MOV RECX,ECX MOV REDX,EDX MOV REST,ESI MOV REDI,EDI MOV REBP,EBP PUSHF POP AX MOV RFLAG,AX PUSH ES MOV AX,0300H MOV BX,21H MOV CX,0 PUSH DS POP ES MOV DI,OFFSET INT 31H POP ES MOV AX,RFLAG PUSH AX POPF MOV EDI,REDI MOV ESI,RESI MOV EBP,REBP		; сохранить регистры ; выполнить DOS-прерывание INT 21Н ARRAY ; восстановить регистры
Микропроцессоры 80386 и 80486
1009
022Е	66|	А1 0105 R	MOV	E AX, RE AX
0232	66|	8В IE 00F9 R	MOV	EBX,REBX
0237	66|	8В 0Е 0101 R	MOV	ECX,RECX
023С	661	8В 16 00FD R	MOV	EDX,REDX
0241	СЗ		RET	
0242
INT21H ENDP
END
Обратите внимание, что вызов функции DOS int21h должен выполняться иначе чем обычно при работе в защищенном режиме. Процедура вызова DOS-прерывания INT 21Н находится в конце примера 17.3. Поскольку она очень протяженная и занимает много времени, то следует пытаться убрать прерывания DOS из приложения Windows. Наилучший способ разработки программного обеспечения для Windows является использование языка С или C++ с включением ассемблера для трудных задач.
17.5. Режим
виртуального микропроцессора 8086
Режим виртуального микропроцессора 8086 является специальным режимом работы, который до сих пор не рассматривался. Данный специальный режим, являющийся особым состоянием задачи защищенного режима, который разработан таким образом, чтобы многочисленные приложения реального режима микропроцессора 8086 могли выполняться одновременно. Персональный компьютер работает в этом режиме для приложений DOS. На рис. 17.25 показана карта памяти с двумя приложениями микропроцессора 8086, выполняемыми на микропроцессоре 80386 с использованием режима виртуального 8086.
Рис. 17.25. Карта памяти микропроцессора 80386, работающего в режиме виртуального 8086 с двумя резидентными задачами микропроцессора 8086
Если операционная система позволяет выполнять многочисленные приложения, то это обычно делается посредством метода, называемого методом квантования времени
1010
Глава 17
(time-slicing). Операционная система назначает определенный квант времени для каждой задачи. К примеру, операционная система при выполнении трех задач может назначить для каждой из них по 1 мс. Это означает, что после каждой миллисекунды производится переключение на следующую задачу. Подобным образом все задачи получают долю времени на использование микропроцессора, что в итоге позволяет системе выполнять одновременно более одной задачи. Время выполнения задачи можно регулировать, чтобы предоставить любой задаче определенный процент времени на обслуживание микропроцессором.
Система, которая может использовать данный метод, — это, например, спулер печати. Спулер печати может функционировать в одном разделе DOS и иметь 10% времени на доступ к процессору. Это позволяет системе выполнять печать с использованием спулера печати, но это не особо сказывается на производительности системы ввиду использования для этого только 10% системного времени.
Главное отличие между защищенным режимом микропроцессора 80386 и режимом виртуального микропроцессора 8086 состоит в способе интерпретации микропроцессором сегментных регистров. Сегментные регистры микропроцессора в режиме виртуального 8086 используются, как и в реальном режиме: для получения линейного адреса содержимое сегментного регистра сдвигается влево на четыре разряда и суммируется со смещением, указанном в эффективном адресе. Полученный таким образом адрес имеет возможность обращаться к области памяти в 1 Мбайт в диапазоне адресов ОООООН—FFFFFH. Доступ к режиму виртуального 8086 в большинстве случаев осуществляется с использованием страничной трансляции адресов, механизм которой объясняется в следующем разделе главы. Посредством страничной трансляции адресов программа все также получает доступ к памяти ограниченной объемом не более 1 Мбайта, но несмотря на это, этот 1 Мбайт памяти может отображаться в любую область физической памяти размером до 4 Гбайт.
Вход в режим виртуального 8086 осуществляется с помощью установки бита VM в регистре флагов EFLAG. Этот бит можно установить, если выполнить команду iret при текущем уровне привилегии задачи CPL = 0, и в том случае, когда образ регистра флагов EFLAG сохранен в стеке с установленным битом VM. Этот бит невозможно установить иначе. Попытка получить доступ к адресу памяти выше границы в 1 Мбайт приводит к прерыванию с типом 13 (общее нарушение защиты).
Режим виртуального 8086 может применяться для совместного использования памяти одного микропроцессора многими пользователями таким образом, чтобы каждый пользователь имел свой раздел DOS. Например, первому пользователю могут быть отведены адреса 0010000Н—01FFFFFH, второму пользователю — 0020000Н— 02FFFFFH и т. д. Системное программное обеспечение, располагаемое в ячейках памяти 00000000Н—000FFFFFH, может затем распределять микропроцессор между пользователями, переключаясь от одного к другому для выполнения программ. Подобным образом один микропроцессор может совместно использоваться многими пользователями.
17.6. Страничное управление памятью
Механизм страничной трансляции адресов позволяет размешать любой линейный (логический) адрес, формируемый программой, в любую физическую страницу памяти. Логическая страница памяти (logical memory page) — это страница, адресуемая
Микропроцессоры 80386 и 80486
1011
селектором и эффективным адресом (смещением) в реальном или защищенном режиме работы. Физическая страница памяти (physical memory page) — это страница, действительно находящаяся в какой-нибудь области физической памяти. Например, логическую ячейку памяти с адресом 20000Н можно отобразить в физической ячейке памяти с адресом 30000Н или любой другой ячейке с использованием блока страничной трансляции адресов. Это означает, что команда, получающая доступ к ячейке с адресом 20000Н, фактически имеет доступ к ячейке с адресом 30000Н.
Каждая страница памяти микропроцессора 80386 имеет протяженность в 4 Кбайт. Страничная организация памяти позволяет размещать программное обеспечение системы по любому физическому адресу при помощи механизма страничной трансляции адресов. Для преобразования адреса страницы используются три компонента: каталог страниц (page directory), таблица страниц (page table) и реальная физическая страница памяти. Следует отметить, что специальный драйвер расширенной памяти EMM386.EXE использует механизм страничной трансляции адресов для эмулирования дополнительной (expanded) памяти в расширенной памяти (extended), а также для формирования свободных блоков верхней памяти UMB (upper memory block).
Каталог страниц
Каталог страниц содержит до 1024 строки, каждая из которых содержит 20 старших разрядов адреса таблицы преобразования страниц. Каждая таблица преобразования страниц преобразует логический адрес в физический адрес. Каталог страниц хранится в памяти и адресуется с помощью управляющего регистра CR3 (см. рис. 17.14). Регистр CR3 содержит базовый адрес каталога страниц, который начинается на любой 4-Кбайтной границе системы памяти. Чтобы задать исходные значения регистра CR3 для страничного преобразования, используется инструкция mov CR3,reg. Каждый раздел DOS в системе, применяющей режим виртуального микропроцессора 8086, должен иметь свой каталог страниц.
Каталог страниц содержит до 1024 строк, каждая размером 4 байта. Сам каталог страниц занимает страницу памяти размером 4 Кбайта. Каждая строка каталога страниц (рис. 17.26) выбирается с помощью старших 10 разрядов линейного адреса памяти.
12 11 10 9876543 2	1	0
Адрес таблицы страниц (А31-А12)
Зарезервировано
Рис. 17.26. Строка каталога страниц
Адрес таблицы страниц (А32—А12), находящийся в строке каталога страниц, адресует таблицу страниц преобразований также размером 4 Кбайта. Для полного перевода линейного адреса в физический адрес требуются 1024 таблицы страниц размером 4 Кбайта каждая, плюс каталог страниц емкостью также в 4 Кбайта. При такой схеме преобразования адреса необходимо 4 Мбайта плюс 4 Кбайта памяти. Только наиболее крупные операционные системы поддерживают такой размер памяти для преобразования адресов. Большинство операционных систем преобразуют только первые 16 Мбайт системы памяти, если преобразование страниц разрешено. К та
1012
Глава 17
ким относится и операционная система Windows. Для такого преобразования требуются всего четыре строки каталога страниц (16 байт) и четыре полные таблицы страниц (16 Кбайт).
Каждый из битов строки каталога страниц, которые показаны на рис. 17.26, выполняет следующие функции:
□	D
Бит D (dirty) неопределен для строки каталога страниц микропроцессора 80386 и предусмотрен для использования операционной системой.
□	А
Бит A (accessed) является признаком доступа, который устанавливается, когда микропроцессор получает доступ при любой операции (чтение или запись) со строкой каталога страниц.
□	R/WhU/S
Оба бита R/W (read/write) (запись/считывание) и U/S (user/supervisor) (пользова-тель/супервизор) используются в схеме защиты страниц. Права доступа к странице при уровне привилегии 3 (пользовательский) в зависимости от этих битов показаны в табл. 17.2. Для супервизора (supervisor) соответствуют другие уровни привилегии 0, 1 и 2, которые предоставляют супервизору полные права (разрешается чтение или запись) при доступе к странице.
□	Р
Бит присутствия Р (present) указывает, если он установлен (Р = 1), что данную строку можно использовать для преобразования адреса. Если бит сброшен (Р = 0), то строка не может использоваться для преобразования адреса. Строка со сброшенным битом может использоваться для других целей, например, для указания на то, что в настоящее время страница сохранена на диске.
Таблица 17.2. Права доступа к странице при уровне привилегии 3 в зависимости от состояния битов II/S и R/W
U/S	R/W	Права доступа к странице при уровне привилегии 3 (уровень привилегии пользователя)
0	0	Нет
0	1	Нет
1	0	Только чтение
1	1	Чтение или запись
Таблица страниц
Таблица страниц содержит 1024 базовых физических адресов страницы, получивших доступ для преобразования линейного адреса в физический адрес. Каждая таблица страниц преобразует секцию 4М логической памяти в 4М физической памяти. Формат строки таблицы страниц такой же, как и для строки каталога страниц (см. рис. 17.26). Главное отличие состоит в том, что строка каталога страниц содержит базовый физический адрес таблицы страниц, тогда как строка таблицы страниц
Микропроцессоры 80386 и 80486
1013
содержит базовый физический адрес страницы физической памяти размером 4 Кбайта. Другое отличие связано с битом D, который не действует в строке каталога страниц, но указывает, что страница была записана в строке таблицы страниц.
На рис. 17.27 показан механизм страничной трансляции адресов в микропроцессоре 80386.
Линейный адрес
Примечание:
1. Приведенные интервалы адресов в каталоге стрениц и таблице страниц только лишь выбираются показанными частями линейного адреса, но не определяют их содержимое
2. Адреса (ХХХХХ), приведенные в 4-Кбайтной странице памяти, выбираются посредством содержимого строки таблицы страниц
Рис. 17.27. Преобразование линейного адреса 00C03FFCH в адрес физической памяти. Значение ХХХХХ определяется строкой таблицы страниц (здесь не показано)
На рисунке линейный адрес 00C03FFCH (формируемый программой) преобразуется с помощью механизма страничной трансляции адресов в физический адрес XXXXXFFCH. Механизм страничной трансляции адресов функционирует следующим образом:
I.	Базовый физический адрес каталога страниц размером 4 Кбайта запоминается в регистре CR3. Этот адрес часто называют корневым адресом (root address). Единовременно в системе может находиться только один каталог страниц. В режиме виртуального микропроцессора 8086 каждая задача имеет свой каталог страниц, что позволяет распределять различные области физической памяти для разных виртуальных задач микропроцессора 8086.
2.	Старшие 10 разрядов линейного адреса (разряды 31—22) применяются в механизме страничной трансляции адресов для выбора строки из каталога страниц.
1014
Глава 17
3.	Таблица страниц адресуется строкой, сохраненной в каталоге страниц. В каждой строке содержится базовый адрес таблицы страниц. Таким образом, имеется возможность выбора до 1024 таблиц страниц при полностью заполненной системе.
4.	Строка выбранной таблицы страниц адресуется следующими 10 разрядами линейного адреса (разрядами 21 — 12).
5.	Строка таблицы страниц содержит реальный базовый физический адрес страницы памяти размером в 4 Кбайта.
6.	Младшие 12 разрядов линейного адреса (разряды 11—0) выбирают конкретную ячейку из выбранной страницы памяти.
Механизм страничной трансляции адресов позволяет любому линейному адресу назначать любую ячейку физической памяти. Предположим, например, что линейный адрес 20000000Н выбирает программа, но такая ячейка памяти отсутствует в системе физической памяти. Программа адресует логическую страницу размером 4 Кбайта с адресами 20000000Н—20000FFFH. Поскольку такая секция физической памяти отсутствует, то операционная система может присвоить для этого диапазона логических адресов существующую страницу физической памяти, такую, например, как 12000000Н—12000FFFH.
В процессе преобразования адресов старшие 10 разрядов линейного адреса выбирают строку 200Н каталога страниц. Эта строка каталога страниц содержит базовый адрес таблицы страниц для линейных адресов 20000000Н—203FFFFFH. Разряды линейного адреса (21 — 12) выбирают строку в этой таблице страниц, которой соответствует страница памяти размером 4 Кбайта. В нашем примере для линейных адресов 2000000Н—20000FFH в таблице страниц выбирается первая нулевая строка (строка 0). В данном примере первая строка содержит физический адрес реальной страницы памяти или страницы в диапазоне адресов 12000000Н— 12000FFFH.
Возьмем, например, типичную компьютерную систему на базе DOS. Карта памяти системы представлена на рис. 17.28.
Рис. 17.28. Карта размещения информации в памяти АТ-компьютера
Микропроцессоры 80386 и 80486
1015
Обратите внимание, что на карте имеются неиспользуемые области памяти, которые могут быть разделены на страницы, предоставляя больше памяти прикладной программе реального режима DOS. Стандартная система памяти DOS начинается с адреса ОООООН и продолжается до адреса 9FFFFH, что составляет память в 640 Кбайт. Выше стандартной памяти находится область верхней памяти, выделенная для видеокарт, дисковых карт и системы BIOS ROM. В этом примере область памяти А0000—AFFFFH сразу же после стандартной памяти (выше адреса 9FFFFH) не задействована. Этот участок памяти может использоваться DOS, чтобы вся область памяти прикладных программ составляла 704К вместо 640К. Будьте осторожны при использовании такой области с адресами A0000H—AFFFFH для дополнительного ОЗУ, поскольку этот участок часто задействован видеокартой для графики.
Эта же область памяти может быть использована для отображения в ней расширенной памяти с адресами 102000Н—11 FFFFH. Программа для выполнения этого преобразования и инициализации каталога страниц, а также таблиц страниц, необходимых для настройки памяти, приведена в примере 17.4. Обратите внимание, что эта процедура инициализирует каталог страниц, таблицу страниц и загружает регистр CR3. Она не предназначена для перевода микропроцессора в защищенный режим, а только для разрешения страничного преобразования адресов. Следует заметить, что страничная трансляция функционирует в реальном режиме.
Пример 17,4. Программа перераспределения областей памяти
.MODEL SMALL
.386Р
0000	.DATA ; Каталог страниц		
0000	00000004	PDIR	DD	4
0004	Г ; Таблица страниц 0 0400 [	TAB0 DD	1024 DUP (?)		
0000 0010	00000000 ] .CODE .STARTUP 66| В8 00000000	MOV		EAX, 0
0016	8С С8	MOV	AX,CS
0018	66| Cl Е0 04	SHL	EAX, 4
001С	66| 05 00000004 R	ADD	EAX,OFFSET TAB0
0022	66| 25 FFFFF000	AND	EAX,0FFFFF000H
0028	66| 83 СО 07	ADD	EAX, 7
002С	66| АЗ 0000 R	MOV	PDIR,EAX
0030	В9 0100	MOV	CX,256
0033	BF 0004 R	MOV	DI,OFFSET TAB0
0036	8С D8	MOV	AX, DS
0038	8Е СО	MOV	ES,AX
003А	66| В8 00000007	MOV	EAX, 7
адрес таблицы страниц 0
1016
Глава 17
	.REPEAT	; перераспределить область памяти
0040	66| АВ 0042 66| 05 00001000 004А 66| В8 00102007 0050 В9 0010	STOSD ADD	ЕАХ,4096 .UNTILCXZ MOV	ЕАХ,0102007H MOV	CX,16 .REPEAT	; 00000H-09FFFH в 00000H-09FFFH ; перераспределить область памяти
0053	66| АВ 0055 66| 05 00001000 005D 66| В8 00000000 0063 8С D8 0065 66| Cl Е0 04	STOSD ADD	EAX,4096 .UNTILCXZ MOV	EAX, 0 MOV	AX, DS SHL	EAX, 4	; 0A000H-0AFFFH в 102000H-11FFFFH
0069 66| 05 00000000 R	ADD	EAX,OFFSET PDIR	; загрузить регистр CR3
006F 0F 22 D8	MOV	CR3,EAX	; адресом каталога страниц
; Дополнительная часть программы,
; перераспределяющая другие области памяти
end
17.7. Микропроцессор 80486
Микропроцессор 80486 является устройством с высокой степенью интеграции, содержащим более 1,2 млн транзисторов. Схема, располагаемая внутри этого устройства, содержит блок управления памятью MMU (memory-management unit), высокопроизводительный, совместимый с 80387, математический сопроцессор и быстродействующую кэш-память первого уровня емкостью 8 Кбайт и полностью 32-разрядный микропроцессор, который совместим с микропроцессором 80386 снизу вверх. Наиболее распространенными микропроцессорами 80486 были устройства с частотой: 25, 33, 50, 66 и 100 МГц. Следует заметить, что внешняя тактовая частота не делилась, как это было в случае микропроцессора 80386, а умножалась на коэффициент, который для разных моделей составлял 1, 2, 2,5 и даже 3. Стандартными значениями внешней тактовой частоты являлись 25, 33, 40 и 50 МГц. Поэтому микропроцессор с тактовой частотой 66 МГц имел коэффициент умножения 2, а версия на 100 МГц — 3 при одной и той же внешней частоте 33 МГц. В 1990 г. фирма Intel в журнале Computer Design представляла версию микропроцессора 80486 на 100 МГц (без удвоения внешней тактовой частоты), но она так и не была выпущена. Фирма ADM (Advanced Micro Devices) изготовила версию на 40 МГц, которая также имеется в вариантах на 80 МГц (с коэффициентом умножения 2) и 120 МГц (с коэффициентом умножения 3). Микропроцессоры 80486 выпускались в версиях 80486DX или 80486SX. Единственное различие между этими устройствами состояло в том, что микропроцессор 80486SX не имел цифрового сопроцессора, что, безусловно, снижало его стоимость. Для этого микропроцессора мог быть использован, выпускающийся в виде отдельного устройства, математический сопроцессор 80487SX.
В этом разделе поясняются различия между микропроцессорами 80486 и 80386. Этих отличий немного, и они должны быть осмыслены. Наиболее заметные из них касаются системы кэш-памяти и генератора паритета.
Микропроцессоры 80386 и 80486
1017
Схема расположения
выводов микропроцессоров 80486DX и 80486SX
На рис. 17.29 показана схема расположения выводов микропроцессора 80486DX, в корпусе PGA на 168 выводов.
S	А27 О	А26 О	А23 О	NC О	А14 О	VSS О	А12 О	VSS О	VSS О	VSS О	VSS О	VSS О	А10 О	VSS О	А6 О	А4 О	ADS# О
	А28	А25	VCC	VSS	А18	VCC	А15	VCC	VCC	VCC	VCC	А11	А8	VCC	АЗ	BLAST# NC	
к	О	О	О	О	О	О	О	О	О	О	О	О	О	О	О	О	о
	А31	VSS	А17	А19	А21	А24	А22	А20	А16	А13	А9	А5	А7	А2	BREQ PLOCK#PCHK#		
U	О	О	О	О	О	О	О	О	О	О	О	О	О	О	О	о	О
D	D0	А29	АЗО												HLDA	VCC	VSS
Г	О	О	О												О	О	О
KJ	D2	D1	DP0												LOCK#	M/10#	W/R#
	О	О	О												О	О	О
м	VSS	VCC	D4												D/C#	VCC	VSS
	О	О	О												О	О	О
1	VSS	D6	D7												PWT	VCC	VSS
L	О	О	О												О	О	О
к	VSS	VCC	D14												BE0#	VCC	VSS
	О	О	О												О	о	о
J	VCC	D5	D16				Микропроцессор 80486								BE2#	BE1#	PCD
	О	О	О												О	О	о
|-|	VSS	D3	DP2				(Вид со стороны выводов)								BRDY#	VCC	VSS
	О	О	О												О	О	О
Q	VSS	VCC	D12												NC	VCC	VSS
	О	О	О												О	О	О
F	DP1	D8	D15												KEN#	RDY#	ВЕЗ#
	О	О	О												О	О	О
Е	VSS	VCC	D10												HOLD	VCC	VSS
	О	О	О												О	О	О
□	D9	D13	D17												A20M#	BS8#	BOFF#
	О	О	О												О	О	О
с	D11	D18	CLK	VCC	VCC	D27	D26	D28	D30	NC	NC	NC	NC	FERR#FLUSH# RESET			BS16#
	О	О	О	О	О	О	о	О	О	О	**о	О	О	О	О	О	О
в	D19	D21	VSS	VSS	VSS	D25	VCC	D31	VCC	NC	VCC	NC	NC	NC	NMI	NC	EADS#
	О	О	О	О	О	О	о	О	О	О	О	О	О	О	О	О	О
д	D20	D22	NC	D23	DP3	D24	VSS	D29	VSS	NC	VSS	NC	NC	NC	IGNNE#	INTR	AHOLD
	\о	О	О	О	О	О	о	О	О	О	О	О	О	О	О	О	О
	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17
Рис. 17.29. Схема расположения выводов микропроцессора 80486
Микропроцессор 80486SX также упакован в корпус PGA на 168 выводов (здесь не показан из-за существующих нескольких отличий). Следует отметить, что вывод В15 в микропроцессоре 80486DX является выводом сигнала немаскируемого прерывания NMI, а в микропроцессоре 80486SX этот же сигнал подведен к выводу А15. К другим отличиям относятся следующие: вывод А15 соответствует сигналу IGNNE в микропроцессоре 80486DX (в микропроцессоре 80486SX он отсутствует), вывод С14 соответствует сигналу FERR в микропроцессоре 80486DX, к выводам В15 и С14 микропроцессора 80486SX ничего не подключено.
Для нормальной работы микропроцессора 80486 все его выводы Vcc и Vss при подключении микропроцессора должны быть подсоединены к источнику питания. Ис
1018
Глава 17
точник питания для микропроцессора с частотой 33 МГц должен обеспечивать напряжение 5,0 В ± 10% с током в нагрузке 1,2 А. Среднее значение питающего тока для микропроцессора с частотой 33 МГц составляет около 650 мА. Фирма Intel также выпустила версию процессора с частотой 100 МГц при коэффициенте умножения равного 3 с напряжением питания 3,3 В, для которой требуется средний питающий ток 500 мА. Выходы с сигналами низкого логического уровня допускают ток до 4,0 мА, а выводы с сигналами высокого логического уровня — до 1,0 мА. Если же требуются большие токи, а случается достаточно часто, то тогда микропроцессор 80486 должен быть буферизован. На рис. 17.30 показана схема буферизированной системы на базе микропроцессора 80486DX. В приведенной схеме буферизованы только шина адреса, данных и сигналы паритета шины данных.
Назначение сигналов и выводов
□	А31-А2
На выводах А31—А2 (address) при нормальной работе процессора формируется адрес при обращении к памяти и устройствам ввода-вывода. Линии А31—А4, если не определяют адрес строки внутренней кэш-памяти, то используются микропроцессором.
□	А20М
Сигнал А20М (address bit 20 mask) предназначен для маскирования бита А20 ограничивая адрес диапазоном 000FFFFFH—00000000Н, осуществляя тем самым программную совместимость с микропроцессором 8086. Это позволяет обеспечить функционирование системы памяти подобно системе памяти микропроцессора 8086 емкостью до 1 Мбайт.
□	ADS
Сигнал на выводе ADS (address data strobe) при низком логическом уровне идентифицирует адресный цикл, обозначая, что адресная шина содержит действительный адрес памяти.
□	AHOLD
Входной сигнал AHOLD (address hold) переводит выводы шины адреса микропроцессора в состояние высокого импеданса. Остальные шины остаются в активном состоянии. Сигнал часто используется другим мастером (контроллером) шины, чтобы получить доступ к шине адреса для аннулирования строк внутренней кэш-памяти.
□	ВЁЗ —ВЁ0
Сигналы ВЕЗ — ВЕО (byte enable) на одноименных выходных выводах указывают на используемые байты шины данных при передаче информации между микропроцессором, памятью и пространством ввода-вывода. Сигнал ВЕЗ разрешает старший байт D31—D24, ВЕ2 байт D23—D16, ВЕ1 байт D15—D8, а ВЕО разрешает младший байт D7—D0.
□	BLAST
Выходной сигнал последней передачи пакетного цикла BLAST (burst last) показывает, что следующий сигнал BRDY вызовет завершение пакетного цикла.
Рис. 17.30. Микропроцессор 80486 с буферизированными шинами адреса, данных и сигналами паритета данных
Микропроцессоры 80386 и 80486______________________1019
1020
Глава 17
□	BOFF
Сигнал BOFF (back off), поступающий на одноименный вывод микропроцессора, переводит его шины в состояние высокого импеданса во время следующего цикла шины. Микропроцессор сохраняет это состояние шин до тех пор, пока на выводе BOFF не установится сигнал высокого логического уровня.
□	BRDY
Сигнал BRDY (burst ready) используется для подачи микропроцессору сигнала о завершении пакетного цикла. Если одновременно с этим сигналом либо раньше приходит сигнал RDY , то сигнал BRDY игнорируется и процессор прекращает данный пакетный цикл, завершая транзакцию обычными циклами.
□	BREQ
Выходной сигнал BREQ (bus request) указывает, что микропроцессор 80486 сформировал внутренний запрос на доступ к шине.
□	BS8
Сигнал BS8 (bus size 8), поступающий от внешних устройств на одноименный вывод микропроцессора 80486, указывает ему о разрядности их шины данных равной одному байту (8 бит).
□	BS16
Сигнал BS16 (bus size 16), поступающий от внешних устройств на одноименный вывод микропроцессора 80486, указывает ему о разрядности их шины данных равной двум байтам (16 бит).
□	CLK
Вывод CLK (clock) предназначен для подачи на него внешнего сигнала синхронизации микропроцессора 80486.
□	D31-D0
Выводы двунаправленной шины данных (data) предназначены для передачи данных между микропроцессором, памятью и системой ввода-вывода. Кроме того, во время цикла подтверждения прерывания младший байт шины данных D7—D0 используется для приема номера вектора прерывания.
□	D/C
Выходной сигнал на выводе D/C (data/control) указывает на выполняемый текущий тип цикла шины: передачу данных или управляющий цикл (см. табл. 17.3).
□	DP3-DP0
Двунаправленные выводы DP3—DPO (data parity) битов паритета шины данных обеспечивают проверку паритета данных при операциях записи/считывания. При обнаружении ошибки паритета во время операции чтения на выводе РСНК появляется сигнал низкого логического уровня, который и указывает на наличие ошибки паритета. Если в системе контроль паритета данных не используется, то на эти выводы через резисторы, в зависимости от напряжения питания микропроцессора, следует подать напряжение +5,0 В или 3,3 В.
Микропроцессоры 80386 и 80486
1021
□	EADS _______
Сигнал EADS (external address strobe), поступающий на одноименный вывод микропроцессора, используется вместе с сигналом AHOLD, чтобы сигнализировать об использовании внешнего адреса при выполнении цикла аннулирования строки внутренней кэш-памяти (cache invalidation cycle).
□	FERR 
Выходной сигнал на выводе FERR (floating point error) указывает на то, что математический сопроцессор обнаружил сбойную ситуацию. Сигнал используется для сохранения совместимости с программным обеспечением DOS.
□	FLUSH
Сигнал низкого логического уровня, поступающий на вывод FLUSH (cache flush), производит очистку содержимого внутренней кэш-памяти микропроцессора емкостью в 8 Кбайт.
□	HLDA
Выходной сигнал высокого логического уровня на выводе HLDA (hold acknowledge) указывает на то, что сигнал запроса управления шиной, поступающий на вывод HOLD, является активным, и что микропроцессор перевел свои шины в состояние высокого импеданса.
□	HOLD
Сигнал высокого логического уровня, поступающий на вывод HOLD, запрашивает предоставления устройству управления локальной шиной для выполнения им передач в режиме DMA. Установка сигнала приводит к тому, что шины адреса, данных и управления переводятся в состояние высокого импеданса, а после подтверждения предоставления управления локальной шиной с помощью сигнала HLDA, сигнал HOLD снимается.
□	IGNNE
Входной сигнал IGNNE (ignore numeric error) на одноименном выводе приводит к тому, что математический сопроцессор игнорирует ошибки и продолжает обработку данных. Этот сигнал не влияет на состояние сигнала на выводе FERR .
□	INTR
Сигнал высокого логического уровня, поступающий на вывод INTR (interrupt request), используется для запроса маскируемого прерывания, как и во всех других микропроцессорах семейства.
□	KEN
Сигнал низкого логического уровня, поступающий на вывод KEN (cache enable), разрешает выполнение сохранения данных текущего цикла шины во внутренней кэш-памяти.
□	LOCK
Выходной сигнал низкого логического уровня на выводе LOCK (bus lock) является сигналом монополизации процессором управления шиной. Сигнал активизируется при выполнении команды с префиксом LOCK.
1022
Глава 17
□	М/Ю
Высокий логический уровень сигнала на выводе М/Ю (memory/IO) указывает на обращение к памяти (или останов), а низкий — на обращение к портам ввода-вывода или подтверждение прерывания. Он также объединяется с сигналом W/R для генерации управляющих сигналов чтения/записи для памяти или устройств ввода-вы вода.
□	NMI
Сигнал высокого логического уровня, поступающий на вывод NMI (non-maskable interrupt) запрашивает немаскируемое прерывание типа 2.
□	PCD
Выходной сигнал на выводе PCD (page cache disable) запрещения кэширования страницы отражает состояние бита PCD регистра CR3, строки таблицы страниц (page tables) или каталога страниц (page directory).
□	PCHK 
Сигнал низкого логического уровня на выводе PCHK (parity check) указывает на ошибку, выявленную проверкой паритета, при считывании на битов паритета данных на выводах DP3—DP0.
□	PLOCK
Выходной сигнал псевдоблокировки на выводе PLOCK (pseudo-lock) указывает на то, что для выполнения текущей операции требуется более одного цикла шины. Этот сигнал устанавливается для операций арифметического сопроцессора при обращении к 64- или 80-разрядным данным памяти.
□	PWT
Выходной сигнал кэширования страницы с использованием алгоритма сквозной записи на выводе PWT (page write through) указывает на состояние бита PWT регистра CR3, строки таблицы страниц или каталога страниц.
□	RDY
Сигнал готовности низкого логического уровня, поступающий на вывод RDY (ready), указывает на завершение обычного (не пакетного) цикла шины. Сигнал RDY должен быть принят микропроцессором, иначе процессор вводит такты ожидания в цикл шины до тех пор, пока не получит этот сигнал.
□	RESET
Входной сигнал аппаратного сброса, поступивший на одноименный вывод RESET, выполняет инициализацию микропроцессора 80486. В табл. 17.4 показано влияние входного сигнала RESET на микропроцессор 80486.
□	W/R
Выходной сигнал на одноименном выводе микропроцессора W/R (write/read) указывает на тип текущего цикла шины: чтение или запись.
Микропроцессоры 80386 и 80486
1023
Таблица 17.3. Идентификация цикла шины			
м/io	D/C	W/R	Тип цикла шины
0	0	0	Подтверждение прерывания (INTA)
0	0	1	Если ВЕ2 = 0 — останов (Halt), если ВЕО =0 — отключение (Shutdown)
0	1	0	Чтение порта (IORD)
0	1	1	Запись в порт (IOWR )
1	0	0	Выборка кода (MEMRD )
1	0	1	Зарезервировано
1	1	0	Чтение памяти (MEMRD )
1	1	1	Запись в память (MEMWR )
Таблица 17.4. Влияние сигнала RESET
Регистр	Начальное значение с выполнением самотестирования	Начальное значение без выполнения самотестирования
ЕАХ	оооооооон	?
EDX	00000400Н + ID*	00000400Н + ID*
EFLAGS	00000002Н	00000002Н
EIP	0000FFF0H	0000FFF0H
ES	ООООН	ООООН
CS	F000H	F000H
DS	ООООН	ООООН
SS	ООООН	ООООН
FS	ООООН	ООООН
GS	ООООН	ООООН
IDTR	База = 0, предел = 3FFH	База = 0, предел = 3FFH
CR0	6000001 ОН	6000001 ОН
DR7	ООООООООН	ООООООООН
* Регистр DH содержит идентификатор типа процессора Intel (03 — 80386, 04 — 80486, 05 — Pentium, 06 — Pentium Pro—Pentium 4), а регистр DL — номер модели процессора (revision ID).
1024
Глава 17
Базовая архитектура микропроцессора 80486
Архитектура микропроцессора 80486DX почти идентична микропроцессору 80386. Внутри микропроцессора 80486DX (дополнительно к архитектуре микропроцессора 80386) имеются математический сопроцессор и кэш-память первого уровня емкостью 8 Кбайт. Микропроцессор 80486SX почти идентичен микропроцессору 80386 с кэш-памятью на 8 Кбайт, но без математического сопроцессора. На рис. 17.31 представлена базовая внутренняя структура микропроцессора 80486.
Сегментные регистры
Указатель инструкций 31___________16 15____________0
|	| IP "~| EIP
Регистр флагов
|	| FLAGS EFLAGS
Рис. 17.31. Внутренняя программная модель микропроцессора 80486
Если ее сравнивать с архитектурой микропроцессора 80386, то никакого различия можно не заметить. Наиболее существенным отличием между микропроцессорами 80486 и 80386 является то, что почти половина команд микропроцессора 80486 выполняется за один тактовый период вместо двух периодов, которые требуются микропроцессору 80386 для выполнения аналогичных команд.
Микропроцессор 80486, как и 80386, имеет восемь 32-разрядных регистров общего назначения: ЕАХ. ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР и ESP. Эти регистры могут использоваться как 8-, 16- или 32-разрядные регистры данных или для адресации к системе памяти. 16-разрядные регистры представляют собой такой же набор, как и в микропроцессоре 80286, и им присвоены наименования: АХ, ВХ, СХ, DX, SI, DI,
Микропроцессоры 80386 и 80486
1025
ВР и SP. К 8-разрядным регистрам относятся следующие регистры: АН, AL, ВН, BL, CH, CL, DH и DL.
Кроме регистров общего назначения, микропроцессор 80486 содержит также аналогичные, как и в микропроцессоре 80386, сегментные регистры, к которым относятся регистры CS, SS, DS, ES, FS и GS.
16-разрядный указатель инструкций IP (instruction pointer) содержит смещение следующей исполняемой инструкции относительно базы сегмента кодов, который содержит регистр CS, адресуясь к 1 Мбайт памяти, а при 32-разрядной адресации, в случае использования расширенного регистра указателя инструкций EIP (extended instruction pointer) для адресации к 4 Гбайтам памяти. В защищенном режиме сегментные регистры хранят селекторы, аналогично тому, как это было в микропроцессорах 80286 и 80386.
Микропроцессор 80486, как впрочем и микропроцессор 80386, имеет, кроме того, регистр глобальной таблицы дескрипторов GDTR (global descriptor table register), регистр локальной таблицы дескрипторов LDTR (local descriptor table register) и регистр таблицы дескрипторов прерываний IDTR (interrupt descriptor table register), a также блок управления памятью MMU (memory management unit). Несмотря на то, что эти регистры не показаны на рис. 17.31, они имеются в микропроцессоре 80486. Блок управления памятью MMU и блок страничной организации рассмотрены в этой главе, ранее.
Расширенный регистр флагов EFLAGS (extended flags) показан на рис. 17.32. Младшие разряды регистра выполняют такую же функцию, как и в других процессорах семейства. Единственно новый флаг контроля выравнивания AC (alignment check) в случае его установки используется для генерации прерывания типа 17 при исполнении программ с уровнем привилегий 3 и при обращении к операнду, не выровненному по соответствующей границе (2, 4 или 8 байт). Для эффективной и правильной работы программного обеспечения необходимо, чтобы слово или двойное слово сохранялось в пределах соответствующих границ.
Флаги (FLAGS) I----------*----’----1
332222222222111 11 111 11 1 098 765432 1098765432 109876543210
Зарезервировано	А С	V М	R F	0	N Т	ЮР ( L I	3 D - F	I F	Т F	S F	Z F	0	А F	0	Р F	1	С F
Флаг контроля выравнивания (ALIGNMENT CHECK)
Флаг виртуального режима (VIRTUAL MODE)
Флаг возобновления (RESUME FLAG)
Флаг вложенной задачи (NESTED TASK FLAG)
Уровень привилегий ввода-вывода (I/O PRIVILEGE LEVEL)-
Флаг переполнения (OVERFLOW)
Флаг направления (DIRECTION FLAG) --  - - 
Флаг управления прерываниями (INTERRUPT ENABLE) —
Т	флаг переноса (CARRY FLAG)
।------Флаг паритета (PARITY FLAG)
	Флаг дополнительного переноса (AUXILIARY CARRY)
Флаг нулевого результата (ZERO FLAG)
---------------Флаг	знака (SIGN FLAG)
— - - 11 - -— Флаг трассировки (SIGN FLAG)
Примечание:
Зарезервированные биты соответствуют логическому нулю - не устанавливаются
Рис. 17.32. Регистр флагов EFLAG микропроцессора 80486
Система памяти микропроцессора 80486
Система памяти микропроцессора 80486 идентична с микропроцессором 80386.
Микропроцессор 80486 имеет возможность адресоваться к памяти емкостью 4 Гбайт
33 Зак. 384
1026
Глава 17
в диапазоне адресов от ООООООООН до FFFFFFFFH. Основное изменение в системе памяти относится к использованию внутри микропроцессора 80486 кэш-памяти емкостью 8 Кбайт, которая ускоряет выполнение команд и получение данных. Другим дополнением является встроенный в микропроцессор блок проверки/генератора паритета.
Блок проверки/генератора паритета
Контроль паритета часто используется для определения безошибочности считывания данных из ячейки памяти. Чтобы облегчить этот процесс, фирма Intel объединила внутренний генератор/детектор контроля паритета. Биты паритета генерируется микропроцессором 80486 во время каждого цикла записи. Паритет генерируется при проверке на четность, и каждый бит паритета сопровождает соответствующий байт данных, сохраняемый в памяти. Биты паритета появляются на двунаправленных выводах DPO—DP3 микропроцессора. Они обычно запоминаются в памяти во время каждого цикла записи и считываются из памяти во время цикла чтения.
При считывании данных микропроцессор выполняет контроль паритета и формирует на выводе РСНК сигнал ошибки паритета при ее наличии. Ошибка, выявленная контролем по четности, никак не влияет на работу микропроцессора до тех пор, пока пользователь не организует прерывание при появлении сигнала РСНК. В компьютерных системах на базе DOS прерывания достаточно часто используются для сигнализации об ошибке, выявленной контролем паритета. На рис. 17.33 показана организация системы памяти микропроцессора 80486, которая запоминает, помимо данных, соответствующий бит паритета.
Следует отметить, что такая система памяти аналогична с памятью микропроцессора 80386, за исключением запоминания бита паритета. Если же контроль паритета не используется, то фирма Intel рекомендует на выводы DPO—DP3 через резисторы подать напряжение +5,0 В.
Рис. 17.33. Организация системы памяти микропроцессора 80486, использующая биты паритета
Микропроцессоры 80386 и 80486
1027
Кэш-память
Система кэш-памяти запоминает данные, используемые программой, а также сами команды программ. Кэш имеет 4-канальную наборно-ассоциативную архитектуру, которая состоит из 128 наборов из 4 строк размером по 16 байт каждая. Кэш-память использует метод сквозной записи (write through). Такой метод предполагает на одну модификацию данных две операции записи: одну в основную память, а другую в кэш-память. Когда процессор обращается за командой или данными, то вначале проверяется их наличие в кэш-памяти. При наличии нужной информации отмечается кэш-попадание (cache hit), и обмен происходит быстро. Если же требуемая информация отсутствует в кэш-памяти, то отмечается кэш-промах (cache miss), и она выбирается из основной памяти и одновременно заносится в кэш. Это приводит к выполнению многих обычно используемых в программе команд за один период тактовых импульсов. Единственное замедление наблюдается только в случае заполнения микропроцессором строки в кэш-памяти. Помимо команд в кэш-памяти запоминаются также и данные, но это оказывает меньшее влияние на скорость выполнения программы, поскольку обращение к данным происходит не так часто, как ко многим частям программы.
Управляющий регистр CR0 используется для управления кэш-памятью с помощью двух новых битов, которых нет в микропроцессоре 80386 (рис. 17.34).
31	24 23	16 15	8 7	0
р G	С D	N W											А М		W р											N Е	Е Т	т S	Е М	м р	р Е
Рис. 17.34. Управляющий регистр CR0 микропроцессора 80486
Бит запрещения кэш-памяти CD (cache disable) и бит управления сквозной записью NW (no write-through) являются новыми для микропроцессора 80486 и используются для управления внутренней кэш-памяти емкостью на 8 Кбайт. Если бит CD имеет уровень логической единицы (CD = 1), то все операции кэш-памяти запрещены. Такое состояние бита используется только для отладки программ, а обычно этот бит остается очищенным (CD = 0). Бит NW используется для запрещения операций сквозной записи в кэш. Как и в случае с битом CD, сквозная запись в кэш запрещается только для тестирования. При нормальном режиме работы при выполнении программ оба эти бита должны быть очищены (CD = 0 и NW = 0).
Поскольку кэш является новым компонентом, введенным в микропроцессор 80486, и заполнение его, как правило, происходит самым быстрым способом — пакетным циклом, то необходимо детальное его рассмотрение. Для заполнения 16-байтной строки внутренней кэш-памяти микропроцессор 80486 должен получить четыре 32-разрядных числа из системы памяти. Заполнение строки осуществляется пакетным циклом. Пакетный цикл (burst cycle) — это специальный цикл, оптимизированный для операций обмена внутренней кэш-памяти с оперативной памятью, где четыре 32-разрядных числа выбираются из системы памяти за пять периодов тактовых импульсов. Такой цикл обмена предполагает, что скорость памяти является достаточной, и такты ожидания не требуются. При тактовой частоте микропроцессора 80486 равной 33 МГц пакетный цикл позволяет заполнить строку кэш за 167 нс, что является очень эффективным, если учитывать, что обычная операция считывания из 32-разрядной памяти без использования пакетного цикла требует два периода тактовых импульсов, т. е. примерно 61 нс.
1028
Глава 17
Временная диаграмма чтения памяти
На рис. 17.35 показана временная диаграмма чтения памяти для микропроцессора 80486 без использования пакетной операции обмена с памятью. Обратите внимание, что для передачи данных используются два периода тактовых импульсов.
Рис. 17.35. Временная диаграмма цикла чтения памяти без использования пакетного обмена для микропроцессора 80486
В течение первого такта TI выставляется на шину адрес памяти и формируется стробирующий сигнал ADS, а в период такта Т2 осуществляется передача данных между памятью и микропроцессором. Обратите внимание, что сигнал готовности RDY низкого логического уровня должен поступить на одноименный вывод микропроцессора для осуществления передачи данных и завершения цикла шины. Время доступа к памяти без использования пакетного обмена с памятью определяется продолжительностью двух периодов тактовых импульсов за вычетом времени появления действительного адреса и времени установки данных на соответствующих шинах. Для микропроцессора 80486 с частотой 20 МГц два периода тактовых импульсов составляют 100 нс, время установки адреса — 28 нс, а для установки данных требуется 6 нс. Таким образом, время доступа к памяти при передаче данных без пакетного режима составляет: 100 нс - 28 нс - 6 нс или 66 нс. Конечно, если учесть время на дешифрацию адреса и время задержек, то время доступа к памяти будет даже меньше. Следует учесть, что при использовании микропроцессора 80486 с большей тактовой частотой время доступа к памяти будет еще меньше.
Микропроцессоры 80486 с тактовой частотой 33, 66 и 100 МГц получают доступ к шине данных при использовании одинаковой внешней тактовой частоты равной 33 МГц. Другими словами, микропроцессор внутри работает на частоте 100 МГц (при коэффициенте умножения равного 3), а системная шина функционирует с частотой внешней тактовой частоты 33 МГц. Следует учесть, что время доступа к памя
Микропроцессоры 80386 и 80486
1029
ти при передаче данных без использования пакетных циклов для процессора с системной шиной, работающей на частоте 33 МГц, составляет 60 нс — 24 нс = 36 нс. Очевидно, что в этом случае для операций со стандартными динамическими элементами памяти потребуются такты ожидания.
На рис. 17.36 показана временная диаграмма для заполнения строки кэш-памяти четырьмя 32-разрядными данными с использованием режима пакетной передачи.
Рис. 17.36. Пакетный цикл чтения четырех двойных слов данных за пять периодов тактовых импульсов
Обратите внимание на то, что старшие разряды адреса А31—А4 устанавливаются во время периода Т1 и остаются неизменными в течение всего пакетного цикла передачи. Изменяются только разряды А2 и АЗ и сигналы ВЕЗ —ВЕО в течение каждого из четырех последующих периодов Т2 после Т1, чтобы адресоваться к четырем последовательным 32-разрядным данным системы памяти. Как уже упоминалось, для заполнения строки кэш-памяти пакетными данными из четырех двойных слов требуется только пять периодов тактовых импульсов (один Т1 и четыре Т2). Таким образом для микропроцессора 80486 с тактовой частотой 20 МГц время доступа к памяти для второго и последующих двойных слов составляет 50 нс — 28 нс — 5 нс или всего 17 нс при условии отсутствия задержек в системе. Следовательно, для того чтобы использовать режим пакетной передачи данных, требуется быстродействующая память. Так как время доступа к памяти у самых лучших элементов динамической памяти составляет около 40 нс, то для цикла пакетной передачи данных требуется использование статических элементов памяти. В системе с частотой 33 МГц предоставляемое время доступа к памяти составляет 30 нс — 19 нс — 5 нс или 6 нс для второго и последующих байтов. При использовании внешнего счетчика вместо адресных разрядов А2 и АЗ можно исключить 19 нс, и предоставляемое время доступа к памяти составит 30 нс - 5 нс или 25 нс, что достаточно даже для самого медленного статического элемента памяти, подключаемого к системе в качестве кэш. Данную схему, при использовании с системой кэш на элементах статической памяти, часто называют кэшем синхронного пакетного режима (synchronous burst mode
1030
Глава 17
cache). Обратите внимание, что подтверждение пакетной передачи данных осуществляется с помощью сигнала BRDY вместо сигнала RDY, который используется при стандартной передаче данных.
Управление памятью микропроцессора 80486
Микропроцессор 80486 имеет такую же систему управления памятью, как и микропроцессор 80386. Она включает блок страничного управления памятью, который выполняет преобразование (трансляцию) линейного адреса в физический блоками (страницами) размером по 4 Кбайт. Типы дескрипторов микропроцессора 80486 такие же, как и для микропроцессора 80386. Единственным отличием между системами управления памятью микропроцессоров 80486 и 80386 является некоторое различие в страничном управлении памятью.
Система страничного управления памятью микропроцессора 80486 может запрещать кэширование памяти для преобразуемых страниц памяти, тогда как микропроцессор 80386 этой возможностью не обладает. На рис. 17.37 показана строка каталога страниц или строка таблицы страниц, которые имеют одинаковый формат.
31	12	11	10	9	8 7 6 5 4	3	2	1 О
Адрес таблицы страниц или собственно страницы	Биты ОС	0	0	D	А	PCD	PW1	U/S	R/W	Р
Рис. 17.37. Строка каталога страниц или строка таблицы страниц микропроцессора 80486
Если сравнить формат этих строк с соответствующими строками микропроцессора 80386, то можно заметить два новых управляющих бита — PWT и PCD. Бит PWT (page write-through) определяет алгоритм записи при кэшировании, а бит PCD (page cache disable) запрещает кэширование для обслуживаемых страниц.
Бит PWT управляет работой внешней кэш-памяти при- записи; он не оказывает влияние на запись внутреннего кэша. Логический уровень данного бита можно обнаружить на одноименном выводе микропроцессора 80486. Будучи выведен на внешний вывод микропроцессора, этот бит может использоваться для управления политикой сквозной записи внешней кэш-памяти.
Бит PCD управляет внутрикристальной кэш-памятью. При PCD = 0 внутренняя кэш-память разрешена. Обратите внимание, что в бите 4 строки таблицы страниц для микропроцессора 80386, соответствующем биту PCD для процессора 80486, постоянно имеется значение логического 0, что разрешает кэширование. При PCD = 1 внутренняя кэш-память запрещена. Следует учесть, что кэширование будет запрещено независимо от состояния уровня сигнала KEN и битов CD и NW управляющего регистра CR0.
Тестовые регистры кэш-памяти
Хотя в этом разделе не рассматриваются программы, здесь представлены тестовые регистры кэш-памяти, чтобы продемонстрировать использование этих регистров в программном обеспечении микропроцессора 80486. Тестовыми регистрами кэш
Микропроцессоры 80386 и 80486
1031
памяти микропроцессора 80486 являются: регистр данных внутренней кэш-памяти TR3, тестовый регистр состояния кэш-памяти TR4 и управляющий регистр тестированием кэш-памяти TR5, которых нет в микропроцессоре 80386. Эти три регистра показаны на рис. 17.38.
Данные внутренней кэш-памяти
TR3
31
11 10 9 876543210
Тег	V*	LRU (чтение)	Достоверность (чтение)	
11 10
4 3 2 1 0
	Выбор набора	Ent	Con
V* - бит достоверности
Рис. 17.38. Тестовые регистры кэш-памяти микропроцессора 80486
Регистр данных кэш-памяти TR3 используется для доступа к буферу при заполнении кэш для проверки операции записи или чтения буфера для проверки операции считывания. Этот регистр является как бы окном во внутреннюю кэш-память микропроцессора 80486 емкостью 8 Кбайт, и используется для ее тестирования. Для заполнения или чтения 128-разрядной строки кэш-памяти регистр TR3 должен записываться или считываться четыре раза.
Содержимое поля Выбор набора (set select) в регистре TR5 определяет, в какой набор внутренней кэш-памяти будет осуществляться запись или считывание с помощью регистра TR3. Это 7-разрядное поле позволяет выбирать один из 128 наборов. Поле Ent (entry) регистра TR5 предназначено для выбора 16-байтной строки кэш-памяти из набора или 32-разрядную ячейку в буфере при заполнении/чтении. Управляющие поле Con (control) регистра TR5 разрешает операции заполнения или чтения буфера (Con = 00), задает выполнение операции записи в кэш-память (Con = 01), определяет выполнение операции чтения из кэш-памяти (Con = 10) или очишают кэш (Con = 11).
Тестовый регистр состояния кэш-памяти TR4 сохраняет тег (признак) кэш-памяти, биты LRU (least recently used) и бит достоверности V (valid). Перед операцией записи в кэш в этот регистр загружается тег и бит достоверности. Прочие биты регистра TR4 не влияют на запись в кэш. При тестовой операции считывания из кэш регистр TR4 содержит тег, бит достоверности, биты LRU и четыре бита достоверности для набора, к которому выполнялся доступ. Следует заметить, что бит достоверности V
1032
Глава 17
при считывании из кэш-памяти содержит копию одного из четырех битов достоверности (битов с 3 по 6).
Тестирование кэш-памяти производится при каждом аппаратном сбросе микропроцессора, если на вывод AHOLD поступает сигнал высокого логического уровня в течение двух периодов тактовых импульсов перед снятием сигнала RESET, т. е. когда он станет низкого логического уровня. Это позволяет микропроцессору 80486 полностью проверить себя с использованием встроенного теста BIST (built-in selftest). Тест BIST использует регистры TR3, TR4 и TR5 для полной проверки внутренней кэш-памяти. Результат проверки сохраняется в регистре ЕАХ. Если содержимое регистра ЕАХ равно нулю, то микропроцессор, сопроцессор и кэш-память прошли тестирование успешно. Значение регистра ЕАХ может проверяться после сброса микропроцессора в исходное состояние на предмет определения ошибки. В большинстве случаев прямой доступ к тестовым регистрам не используется, пока пользователь не пожелает провести собственное тестирование кэш-памяти или буфера TLB.
Итоги
□	Микропроцессор 80386 является усовершенствованной версией микропроцессора 80286 и включает в себя расширенный блок управления памятью для обеспечения страничного управления памятью. Микропроцессор 80386 также включает 32-разрядные расширенные регистры и 32-разрядные шины адреса и данных. Упрощенная версия 32-разрядного микропроцессора 80386DX, а именно микропроцессор 80386SX имеет 16-разрядную шину данных и 24-разрядную шину адреса. Микропроцессор 80386ЕХ — это завершенный однокристальный персональный компьютер АТ-типа.
□	Микропроцессор 80386 имеет возможность доступа к физической памяти емкостью до 4 Гбайт, к которой можно адресоваться, используя виртуальную память объемом 64 Тбайт. Память микропроцессора 80386 является 32-разрядной, адресуемой байтами, словами или двойными словами.
□	Микропроцессор 80386, при работе в режиме конвейерной адресации, выдает для системы памяти адрес следующей команды или данных до завершения выполнения обмена данными предыдущего цикла. Это предоставляет системе памяти возможность делать выборку следующей команды или данных до завершения действия текущей команды. Таким образом, увеличивается время доступа к памяти, что позволяет уменьшить число тактов ожидания, вводимых медленными устройствами за счет более раннего начала выполнения дешифрации адреса устройством памяти или ввода-вывода.
□	Система кэш-памяти сокращает время доступа к часто используемым данным, поскольку они хранятся в полупроводниковой быстродействующей памяти. Если же данные записываются в память, то они также записываются и в кэш, таким образом, большая часть текущих данных всегда имеется в кэше. Такая политика записи данных в кэш-память носит название сквозной записью (write through).
□	Структура системы ввода-вывода микропроцессора 80386 почти идентична с микропроцессором 80286, за исключением возможности запрета на операции ввода-вывода для задач с определенным уровнем привилегий при работе микро
Микропроцессоры 80386 и 80486
1033
процессора 80386 в защищенном режиме посредством карты разрешения ввода-вывода (I/O permission bit map), хранящейся в сегменте состояния задачи TSS.
□	Набор регистров микропроцессора 80386 содержит расширенные версии регистров, используемых в микропроцессоре 80286. Эти расширенные регистры включают: ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, EBP, ESP, EIP и EFLAGS. Кроме того, добавлены еще два дополнительных сегментных регистра: FS и GS. Управляющие регистры CR3—CRO (control register) хранят признаки состояния процессора, а регистры отладки DR7—DRO (debug register) предназначены для отладки программ.
□	Набор команд микропроцессора 80386 дополнен командами, которые способны адресоваться к набору 32-разрядных расширенных регистров. Модернизация также включает дополнительные режимы адресации, позволяющие любому расширенному регистру обращаться к данным памяти. Масштабирование добавлено для того, чтобы умножать содержимое индексного регистра на множитель 1, 2, 4 или 8, указываемый в коде инструкции. Добавлены некоторые новые команды для следующих типов команд: пересылки данных, команд работы со стеком, обработки бит, операций сдвига и строковых операций.
□	Таблица векторов прерываний микропроцессора 80386 расширена за счет дополнительных предварительно определяемых прерываний. Дополнительные прерывания используются с системой управления памятью.
□	Менеджер памяти микропроцессора 80386 такой же, как в микропроцессоре 80286, за исключением того, что блок управления памятью MMU формирует 32-разрядные физические адреса вместо 24-разрядных. Блок управления памятью микропроцессора 80386 поддерживает страничную трансляцию адресов памяти.
□	После аппаратного сброса микропроцессор 80386 работает в реальном режиме (режим 8086). Реальный режим позволяет микропроцессору адресоваться к данным в первом мегабайте памяти. В защищенном режиме микропроцессор способен адресовать до 4 Гбайт физической памяти.^
□	Дескриптор — это структура данных размером 8 байт, которая определяет порядок использования микропроцессором сегмента кода или сегмента данных. Дескриптор выбирается селектором, находящимся в одном из сегментных регистров. Дескрипторы используются только в защищенном режиме работы.
□	Управление памятью осуществляется рядом дескрипторов, находящихся в таблицах дескрипторов. Для облегчения процесса управления памятью микропроцессор 80386 использует три таблицы дескрипторов: глобальную таблицу дескрипторов GDT, локальную таблицу дескрипторов LDT и таблицу дескрипторов прерываний IDT. Каждая из таблиц GDT и LDT содержит до 8192 дескрипторов; таблица IDT хранит до 256 дескрипторов. Таблицы GDT и LDT описывают сегмент кода и данных, а также задач. Таблица IDT может содержать описания до 256 прерываний посредством дескрипторов вентилей прерываний.
□	Сегмент состояния задачи TSS содержит информацию о текущей и предыдущей задаче. В конце сегмента TSS располагается карта разрешения ввода-вывода (I/O permission bit mat), которая разрешает или запрещает использование адресов портов ввода-вывода с помощью соответствующих им битов карты.
□	Механизм страничной трансляции адресов памяти позволяет отображать любую логическую страницу памяти размером 4 Кбайта на любую страницу физической
1034
Глава 17
памяти такого же размера. Например, посредством механизма страничной трансляции адресов ячейке памяти с адресом 00A00000H можно сопоставить ячейку с адресом A0000000H. Каталог страниц и таблицы страниц используется для присвоения любому физическому адресу любого линейного адреса. Механизм страничной трансляции адресов памяти может использоваться в защищенном режиме или режиме виртуального микропроцессора 8086.
□	Микропроцессор 80486 является усовершенствованной версией микропроцессора 80386. Он содержит встроенную кэш-память емкостью 8 Кбайт, арифметический сопроцессор аналогичный 80387, а также способен выполнять несколько команд за один такт.
□	Микропроцессор 80486 имеет расширенную систему команд. Новые команды могут управлять внутренней кэш-памятью. Они позволяют осуществлять прибавление (xadd) и сравнение (cmpxchg) и обмен байтов внутри регистра (bswap). Микропроцессор 80486, кроме этих нескольких дополнительных команд, на 100% совместим снизу вверх с микропроцессором 80386 и сопроцессором 80387.
О Новая особенность микропроцессора 80486 заключается в наличии встроенного самоконтроля, а именно внутреннего теста BIST (built-in self-test). Этот тест начинает выполняться во время аппаратного сброса процессора. В ходе теста проверяется микропроцессор, сопроцессор и кэш-память, а регистр ЕАХ сохраняет признак результата тестирования. Если микропроцессор 80486 успешно завершает тест, то регистр ЕАХ содержит нуль.
□	Для проверки кэш-памяти в микропроцессор 80486 добавлены дополнительные тестовые регистры. К новым тестовым регистрам относятся: регистр данных кэш-памяти TR3, регистр состояния кэш-памяти TR4 и управляющий тестированием регистр TR5. Обычно эти регистры используются крайне редко, однако они задействуются тестом встроенного самоконтроля BIST.
Контрольные вопросы и задания
1.	Микропроцессор 80386 при работе в защищенном режиме адресует_байт физической
памяти.
2.	Микропроцессор 80386 посредством блока управления памятью MMU адресует_байт
виртуальной памяти
3.	Опишите различия между микропроцессорами 80386DX и 80386SX.
4.	Изобразите карту памяти микропроцессора 80386 при работе в:
а)	защищенном режиме,
б)	реальном режиме.
5.	Какой ток может обеспечить микропроцессор 80386 на выходных выводах? Сравните эти токи с токами выходных выводов микропроцессора 8086.
6.	Опишите систему памяти микропроцессора 80386 и объясните назначение и функционирование сигналов для выбора банков памяти.
7.	Объясните принцип действия аппаратного сброса микропроцессора 80386 и значение на его линиях адреса при этом.
8.	Объясните, каким образом конвейерная адресация продлевает время доступа к памяти для многих обращений к памяти в микропроцессорной системе 80386.
9.	Кратко опишите действие системы кэш-памяти.
Микропроцессоры 80386 и 80486 1035
10.	Адреса портов ввода-вывода в микропроцессоре 80386 начинаются с адреса  и распространяются до адреса системы ввода-вывода.
11.	Какие порты ввода-вывода осуществляют передачу данных между микропроцессором 80386 и сопроцессором 80387?
12.	Сравните и назовите отличия между памятью, а также выводами системы ввода-вывода микропроцессора 80386 с предыдущими типами микропроцессоров.
13.	Какая частота подается на вывод CLK2, если микропроцессор 80386 работает с частотой 20 МГц?
14.	Какое назначение вывода BS16 в микропроцессоре 80386?
15.	Какие два дополнительные сегментные регистры имеются в программной модели микропроцессора 80386, которых нет в микропроцессоре 8086?
16.	Перечислите расширенные регистры микропроцессора 80386.
17.	Назовите каждый бит регистра флагов микропроцессора 80386 и охарактеризуйте их назначение.
18.	Опишите каждый управляющей регистр (CR0, CR1, CR2 и CR3) микропроцессора 80386.
19.	Объясните назначение каждого регистра отладки микропроцессора 80386.
20.	С каким типом прерывания связаны регистры отладки?
21.	Опишите действие команды сканирования бит в источнике в прямом направлении (см. главу 5).
22.	Опишите действие команды сканирования бит в источнике в обратном направлении (см. главу 5).
23.	Опишите действия команды SHRD (см. главу 5).
24.	Напишите команду для доступа к данным сегмента FS в ячейке, косвенно адресуемой с помощью регистра DI. Команда должна сохранить содержимое регистра ЕАХ в этой ячейке памяти.
25.	Что представляет собой масштабируемая индексная адресация?
26.	Является ли разрешенной следующая команда: MOV ах, [ЕВХ+ЕСХ]?
27.	Объясните, каким образом следующие команды вычисляют адрес памяти:
a)	ADD [ЕВХ=87'ЕСХ] , AL
б)	MOV DATA[EAX+EBX],СХ
В)	SUB ЕАХ,DATA
Г) MOV ЕСХ, [ЕВХ]
28.	Какое назначение прерывания, имеющего тип 7?
29.	Какой номер вектора прерываний имеет прерывание, связанное с защитой нарушения уровня привилегий?
30.	В чем заключается двойное прерывание по ошибке?
31.	Что определяет векторы прерываний, если прерывание происходит в защищенном режиме работы?
32.	Что представляет собой дескриптор?
33.	Что представляет собой селектор?
34.	Каким образом селектор выбирает локальную таблицу дескрипторов LDT?
35.	Какой регистр используется для адресации глобальной таблицы дескрипторов GDT?
36.	Сколько глобальных дескрипторов может быть в таблице GDT?
37.	Объясните, каким образом микропроцессор 80386 может адресовать область виртуальной памяти объемом до 64 Тбайт, когда физическая память содержит только 4 Гбайт памяти.
1036
Глава 17
38.	В чем заключается разница между дескриптором сегмента кода и данных и дескриптором системных сегментов?
39.	Что представляет собой сегмент состояния задачи TSS?
40.	Каким образом адресуется сегмент TSS?
41.	Опишите порядок перехода микропроцессора 80386 из реального режима в защищенный режим.
42.	Опишите порядок перехода микропроцессора 80386 из защищенного режима в реальный режим.
43.	Что представляет собой режим виртуального 8086 в микропроцессоре 80386?
44.	Каким образом микропроцессор 80386 адресуется к каталогу страниц?
45.	Сколько байт содержит страница памяти?
46.	Объясните порядок преобразования блоком страничной трансляции адресов микропроцессора 80386 линейного адреса памяти D0000000H в физический адрес C0000000H.
47.	Какие существуют отличия между микропроцессорами 80386 и 80486?
48.	Какое назначение имеет входной вывод FLUSH в микропроцессоре 80486?
49.	Сравните набор регистров микропроцессоров 80386 и 80486.
50.	В чем состоит различие регистра флагов микропроцессора 80486 при сопоставлении с микропроцессором 80386?
51.	Какие выводы микропроцессора 80486 используются для контроля паритета данных?
52.	Для безошибочного считывания данных микропроцессор 80486 при контроле паритета использует проверку на.
53.	Кэш-память внутри микропроцессора 80486 имеет емкость____Кбайт.
54.	Строка кэш заполняется считыванием байт из системы памяти.
55.	Что представляет собой пакетный цикл в микропроцессоре 80486?
56.	Дайте определение для кэш-памяти термину сквозная запись.
57.	Что представляет собой BIST?
58.	Можно ли программно запретить кэширование памяти микропроцессора 80486? Объясните свой ответ.
59.	Объясните действие команды XADD ЕВХ, EDX.
60.	Команда CMPXCHG CL,AL сравнивает содержимое регистра CL и регистра AL. Что еще происходит при выполнении этой команды?
61.	Сравните команду invd с командой wbinvd.
62.	Какое назначение имеет бит PCD в строке каталога страниц или в строке таблицы страниц микропроцессора 80486?
63.	Оказывает ли влияние бит PWT в строке каталога страниц или в строке таблицы страниц на внутреннюю кэш-память микропроцессора 80486?
ГЛАВА 18
Микропроцессоры Pentium и Pentium Pro
Введение
Микропроцессор Pentium обладает модернизированной архитектурой, которая была в микропроцессоре 80486. Изменения включают: улучшенную структуру кэшпамяти, большую разрядность шины данных, более быстродействующий цифровой сопроцессор, процессор содержит два параллельно работающих конвейера обработки, реализован интерфейс построения двухпроцессорных систем и добавлена логика предсказания ветвления. Кэш-память первого уровня (Level I) процессора Pentium состоит из двух частей по 8 Кбайт в каждой: одна — для кэширования данных, а другая — для команд. Разрядность шины данных увеличена с 32 до 64 разрядов. Цифровой сопроцессор функционирует в пять раз быстрее, чем цифровой сопроцессор микропроцессора 80486. Процессор содержит два параллельно работающих конвейера обработки, благодаря чему он часто выполняет одновременно две команды. Наконец, логика предсказания ветвления позволяет программам выполнять условные переходы более эффективно. Следует заметить, что эти изменения дополнительно встроены в процессор Pentium, что делает программное обеспечение совместимым снизу вверх со всеми предыдущими микропроцессорами Intel 80x86. Последнее существенное усовершенствование микропроцессора Pentium связано с добавлением команд ММХ.
**
Микропроцессор Pentium Pro является более бысгродействующей версией микропроцессора Pentium. Он имеет усовершенствованную внутреннюю архитектуру, которая способна планировать выполнение до пяти команд, и более быстрый блок вычислений с плавающей запятой. Кроме того, микропроцессор Pentium Pro содержит кэш-память второго уровня (Level 2) объемом 256 или 512 Кбайт, дополнительно к кэш-памяти первого уровня (Level 1) объемом 16 Кбайт (8 Кбайт для данных и 8 Кбайт для команд). Микропроцессор Pentium Pro содержат в себе схему коррекции ошибок ЕСС (error correction circuitry), которая может исправлять ошибку в одном разряде и указывать на ошибку в двух разрядах. Также добавленные четыре дополнительные адресные строки, которые предоставляют микропроцессору Pentium Pro прямо адресоваться к огромному объему физической памяти равному 64 Гбайтам.
Назначение главы
После завершения ознакомления с этой главой вы сможете:
□	сопоставить микропроцессоры Pentium и Pentium Pro с микропроцессорами 80386 и 80486;
1038
Глава 18
□	описать организацию и 64-разрядной интерфейс системы памяти микропроцессора Pentium;
□	выделить изменения в блоке управления памятью и блоке страничной трансляции адресов при сопоставлении с микропроцессорами 80386 и 80486;
□	описать новые команды микропроцессора Pentium;
□	объяснить, каким образом два суперскалярных блока параллельно работающих конвейеров обработки увеличивают производительность микропроцессора Pentium;
□	описать принцип работы логики предсказания ветвления;
□	подробно описать усовершенствования микропроцессора Pentium Pro при сопоставлении с микропроцессором Pentium;
□	объяснить, каким образом функционирует архитектура динамического исполнения команд в микропроцессоре Pentium Pro.
18.1. Микропроцессор Pentium
Перед тем как использовать в системе микропроцессор Pentium или другой тип микропроцессора, следует понять функциональное назначение каждого его вывода. На рис. 18.1 представлено условное графическое обозначение микропроцессора Pentium, который выпускался в 273-контактном корпусе PGA (pin grid array). В процессе производства сменяли друг друга три поколения процессоров Pentium. Кроме того, можно было выделить еще две разновидности микропроцессоров Pentium: полнофункциональный (full-blown) микропроцессор Pentium и процессор Pentium версии Р24Т, иначе называемый Pentium OverDrive. Процессор Pentium OverDrive (Р24Т) содержал 32-разрядную шину данных и имел количество и расположение контактов, совместимое с микропроцессорами 80486.
Кроме того, микропроцессор Pentium OverDrive (Р24Т) поставлялся со встроенным вентилятором охлаждения.
Наиболее заметным отличием в схеме расположения выводов микропроцессора Pentium при сравнении с предыдущими микропроцессорами 80486 является наличие 64-разрядной шины данных вместо 32-разрядной, что естественно требовало большую физическую площадь корпуса процессора.
Для работы первых версий микропроцессоров Pentium, как и для более ранних версий микропроцессоров семейства Intel, требовалось питание +5,0 В. Средний ток питания для версии Pentium с тактовой частотой 66 МГц составляет 3,3 и 2,91 А для процессора с частотой 60 МГц. Рассеиваемая мощность этих микропроцессоров, ввиду значительных токов, составляет соответственно: 13 и 11,9 Вт. Процессоры второго поколения Pentium (90 МГц и выше) имели напряжение питания 3,3 В и соответственно меньший ток потребления. Для охлаждения микропроцессора Pentium требуется хороший теплоотвод и большой поток воздуха для охлаждения. Микропроцессор Pentium имеет много выводов для подключения питания Vcc и Vss, которые для нормальной работы, в зависимости от версии процессора, должны быть подсоединены к напряжению +5,0 или +3,3 В и на "землю”. Некоторые выводы микропроцессора обозначены как N/C (no connection) и не должны никуда подсоединяться. Последние версии процессоров Pentium были усовершенствованы
Микропроцессоры Pentium и Pentium Pro
1039
Pentium
ради
A3 A4
A5 A6
A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31
A20M ADS AHOLD AP APCHK
BEO BE1 BE2 ВЕЗ BE4 BE5 BE6 BE7
BOFF BP2 BP3 BRDY BREQ
ВТО BT1 BT2 ВТЗ
BUSCHK CACHE
>CLK D/C EADS EWBE FERR FLUSH FRCMC HIT HITM IBT HLDA HOLD INTR NMI LOCK IERR IGNNE INIT RESET INV IU IV PMO/BPO PM1/BP1 PWT TCK TDI TDO TMS
DO D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20 D21 D22 D23 D24 D25 D26 D27 D28 D29 D30 D31 D32 D33 D34 D35 D36 D37 D38 D39 D40 D41 D42 D43 D44 D45 D46 D47 D48 D49 D50 D51 D52 D53 D54 D55 D56 D57 D58 D59 D60 D61 D62 D63 PCHK DPO DP1 DP2 DP3 DP4 DP5 DP6 DP7
W/R M/IO KEN
NA PCD PEN PRDY R/S SCYC SMI SMIACT TRST WB/WT
Рис. 18.1. Условное графическое обозначение микропроцессора Pentium
1040
Глава 18
с целью снижения рассеиваемой ими мощности. Например, микропроцессор Pentium с тактовой частотой 233 МГц имел ток потребления 3,4 А, в то время как более ранние версии процессора с частотой 66 МГц потребляли почти такой же ток 3,3 А.
Каждый выходной вывод микропроцессора Pentium способен обеспечить ток 4,0 мА для сигналов низкого и 2,0 мА для сигналов высокого логического уровня. Это свидетельствует о повышении тока возбуждения по сравнению с током 2,0 мА на выходных выводах предыдущих микропроцессоров 8086, 8088 и 80286. Входной ток для каждого входного вывода процессора составляет 15 мкА, что представляет небольшую нагрузку для внешних цепей. В некоторых системах, кроме самых элементарных, такие значения токов требуют применения буферов на шинах микропроцессора.
Далее приводится назначение выводов и соответствующих сигналов процессора:
□	А20М
Входной сигнал А20М (address А20 mask) на одноименном выводе в реальном режиме указывает микропроцессору Pentium на необходимость маскирования бита А20 физического адреса для эмуляции адресного пространства процессора 8086 при использовании драйвера HIMEM.SYS.
□	A31-A3
Двунаправленные выводы адресной шины А31—АЗ (address) адресуют любую ячейку физической памяти объемом до 4 Гбайт (512М х 64 бит) микропроцессора Pentium. Обратите внимание, что линии адреса АО, А1 и А2 дешифрируются внутри процессора в сигналы разрешения байтов ВЕ7 --BE0, которые выбирают какой-либо или все восемь байт 64-разрядной памяти.
□	ADS
Выходной сигнал ADS (address status) активизируется каждый раз на одноименном выводе процессора, когда он выставляет действительный адрес памяти или системы ввода-вывода при выполнении цикла шины. Этот сигнал объединяется с сигналами W/R и М/10, для формирования сигналов считывания и записи, которые имеются в микропроцессорных системах на базе процессоров 8086—80286.
□	AHOLD
Вводной сигнал на одноименном выводе AHOLD (address hold) используется для запроса доступа к внутренней шине адреса процессора от другого контроллера шины.
□	АР
Двунаправленный вывод АР (address parity) является контрольным битом паритета шины адреса и используется при проверке на четность адреса в случае обмена с памятью и системой ввода-вывода. Сигнал на выводе АР также должен активизироваться с информацией о проверке на четность во всех циклах опроса (inquire cycle) в одном и том же периоде тактовых импульсов с сигналом EADS .
3 АРСНК	_______
Выходной сигнал активизируется на одноименном выводе АРСНК (address parity check), если микропроцессор Pentium обнаруживает ошибку паритета адреса.
Микропроцессоры Pentium и Pentium Pro
1041
□	BE7-BE0
Сигналы разрешения байтов ВЕ7 — ВЕО (byte enable) указывают на используемые байты шины данных в данном цикле шины. Может быть выбран байт, слово, двойное слово или учетверенное слово данных. Эти сигналы формируются внутри микропроцессора из линий адреса АО, А1 и А2.
□	BOFF
Входной сигнал BOFF (back-off), поступающий на одноименный вывод процессора, аннулирует все невыполненные циклы и переводит шины микропроцессора Pentium в состояние с высокого импеданса. После снятия сигнала BOFF микропроцессор Pentium возобновляет выполнение аннулированных шинных циклов.
□	ВР[3:2] и РМ/ВР[1:0]
Выводные сигналы ВРЗ—ВРО (breakpoint) на соответствующих выводах указывают на попадание в точку останова при программировании отладочных регистров для проверки совпадений. Выходные сигналы РМ1—РМО (performance monitoring) указывают на установку разрядов мониторинга производительности процессора в управляющих регистрах в режиме отладки программы.
□	BRDY 
Входной сигнал на выводе BRDY (burst ready) указывает микропроцессору Pentium, что внешняя система направила данные на шину или получила их с выводов шины данных. Этот сигнал используется для введения тактов ожидания в циклы шины микропроцессора Pentium.
□	BREQ
Выходной сигнал на выводе BREQ (bus request) указывает на то, что процессор Pentium сформировал запрос доступа к шине.
□	втз-вто
Выходные сигналы ВТЗ—ВТО (branch trace) представляют собой сигналы трассировки, причем биты 2—0 предназначены для указания линейного адреса ветви и бит 3 для указания размера операнда по умолчанию. Эти сигналы используются в течение выполнения специального цикла шины, сообщающего о трассе ветвления.
□	BUSCHK
Сигнал, поступающий на вывод BUSCHK (bus check), позволяет системе сообщать процессору Pentium о неудачном завершении цикла шины.
□	CACHE
Выходной сигнал на выводе CACHE (cache) указывает, что микропроцессор Pentium в текущем цикле кэширует данные. Сигнал является признаком выполнения и завершения процессором пакетного цикла.
□	CLK
Вывод CLK (clock) предназначен для подачи на него внешнего сигнала синхронизации процессора, т. е. рабочей тактовой частоты. Например, для функциони
1042
Глава 18
рования микропроцессора Pentium с частотой 66 МГц на этот вывод следует подать синхросигналы с частотой 66 МГц.
a D63-D0
Двунаправленные выводы D63—DO (data bus) шины данных предназначенные для передачи байта, слова, двойного слова и учетверенных слов данных между микропроцессором, памятью и системой ввода-вывода.
□	D/C
Выходной сигнал на одноименном выводе D/C (data/control) указывает, что при высоком логическом уровне сигнала выполняется цикл по передаче данных памяти или системы ввода-вывода, либо осуществляется цикл выборки кода, цикл останова или подтверждения прерывания при низком логическом уровне сигнала.
О DP7-DP0
Выходные сигналы DP7—DPO (data parity) представляют собой биты паритета соответствующих восьми байт шины данных микропроцессора Pentium.
□	EADS	_____
Внешний сигнал, поступающий на одноименный вывод EADS (external address status), указывает, что на шине присутствует действительный адрес для цикла опроса (inquire cycle).
□	EWBE
Внешний сигнал, поступающий на одноименный вывод EWBE (external write buffer empty), указывает, что внешние буферы отложенной записи пусты. Если сигнал имеет высокий логический уровень, то цикл записи будет задержан, предоставляя возможность внешним буферам выгрузить свои данные на шину.
□	FERR	_____
Выходной согнал FERR (floating point error) является сигналом ошибки математического сопроцессора и используется для запроса прерывания по ошибке сопроцессора.
□	FLUSH
Входной сигнал, поступающий на одноименный вывод FLUSH (flush cache), используется для очистки всех строк внутренней кэш-памяти, а после ее завершения выполняется специальный цикл подтверждения окончания очистки. Если этот сигнал активизируется во время операции аппаратного сброса процессора, то микропроцессор Pentium переходит в режим тестирования.
□	FRCMC
Входной сигнал FRCMC (functional redundancy check master/check) воспринимается только во время аппаратного сброса процессора, чтобы конфигурировать микропроцессор Pentium в режиме мастер (1) или в проверочном режиме (0).
□	ШТ
Выходной сигнал HIT (snoop hit) показывает, что внутренний кэш имеет достоверные данные (указывает на кэш-попадание) в результате выполнения цикла опроса.
Микропроцессоры Pentium и Pentium Pro
1043
□	HITM	______
Выходной сигнал HITM (hit modified) показывает, что цикл опроса обнаружил измененную строку кэш. Этот сигнал используется для запрета доступа других контроллерам шины обращаться к этим данным до тех пор, пока строка кэш не будет записана в память.
□	HOLD
Входной сигнал Hold (hold request), поступающий от другого контроллера, является сигналом запроса на управление локальной шиной в режиме DMA.
□	HLDA
Выходной сигнал на одноименном выводе HLDA (hold acknowledge) указывает, что микропроцессор подтверждает предоставление управления локальной шиной другому контроллеру.
□	IBT
Выходной сигнал трассировки IBT (instruction branch taken) указывает на то, что микропроцессор приступил к выполнению ветви команд.
□	IERR 
Выходной сигнал на одноименном выводе IERR (internal error) показывает, что микропроцессор выявил внутреннюю ошибку паритета или ошибку контроля с введением избыточности.
□	IGNNE
Входной сигнал, поступающий на вывод IGNNE (ignore numeric error), предназначен для игнорирования микропроцессором Pentium ошибки математического сопроцессора.
a init
Входной сигнал, поступающий на вывод INJT (initialization), осуществляет аппаратный сброс процессора без инициализации кэш-памяти, буферов обратной записи и регистров сопроцессора. Это "мягкая" инициализация, которая не может применяться для аппаратного сброса микропроцессора после включения питания вместо сигнала RESET.
□	INTR
Входной сигнал, поступающий на вывод INTR (internipt request) от внешней схемы, применяется для запроса прерывания процессора.
□	INV
Входной сигнал INV (invalidation) определяет состояние строки кэш после опроса.
□	Ш
Выходной сигнал трассировки IU (U-pipe instruction complete) указывает на завершение команды в U-конвейере обработки.
□	IV
Выходной сигнал трассировки IV (V-pipe instmction complete) указывает на завершение команды в V-конвейере обработки.
1044
Глава 18
□	KEN 
Выходной сигнал, поступающий на одноименный вывод KEN (cache enable), предназначен для разрешения внутреннего кэширования памяти, к которой происходит обращение в текущем цикле.
□	LOCK 
Выходной сигнал LOCK (bus lock) является сигналом монополизации управления шиной, который вырабатывается на время выполнения инструкции по префиксу lock и автоматически при выполнении инструкции xchg.
□	м/io	_
Высокий логический уровень выходного сигнала М/Ю (memory/IO) указывает на обращение к памяти или останов, а низкий логический уровень на обращение к портам ввода-вывода или при подтверждении прерывания. Во время операций ввода-вывода 16-разрядный адрес системы ввода-вывода находится на выводах А15—АЗ шины адреса.
□	NA
Входной сигнал, поступающий на вывод NA (next address), указывает, что внешняя система памяти готова принять следующий адрес до завершения текущей передачи данных.
□	NMI
Входной сигнал NMI (non-maskable internipt) предназначен для запроса немаскируемого прерывания, как и на предыдущих версиях микропроцессоров.
□	PCD
Выходной сигнал на одноименном выводе PCD (page cache disable) указывает, что кэширование страницы запрещено, и который отображает состояние бита PCD регистра CR3, в строке каталога страниц или таблицы страниц.
□	РСНК
Выходной сигнал РСНК (parity check) сигнализирует об ошибке паритета, выявленной контролем по четности при считывании данных из памяти или устройств ввода-вы вода.
□	PEN
Входной сигнал, поступающий на одноименный вывод PEN (parity enable), разрешает прерывание или исключение в случае возникновения ошибки паритета в текущем цикле чтения.
□	PRDY
Выходной сигнал на выводе PRDY (probe ready) указывает на готовность зонда, используемого аппаратными средствами отладки.
□	PWT
Выходной сигнал на выводе PWT (page write-through) указывает на кэширование страницы с использованием алгоритма сквозной записи, и который отображает состояние бита PWT в регистре CR3, в строке каталога страниц или таблицы страниц.
Микропроцессоры Pentium и Pentium Pro 1045
□	R/S
Входной сигнал на этом выводе R/S (run/stop) предусмотрен для использования с портом отладки Intel и вызывает прерывание процессора.
□	RESET
Входной сигнал RESET вызывает аппаратный сброс процессора Pentium и переводит его на выполнение программы с ячейки памяти FFFFFFFOH. Выполняется конфигурирование процессора, инициализация регистров, очистка кэша. Если по окончании действия сигнала активен сигнал INIT, то процессор выполняет BIST. Pentium переходит в реальный режим, а старшие 12 разрядов адреса содержат высокий логический уровень (FFFH) до момента выполнения команды дальнего безусловного перехода (jmp) или команды дальнего вызова подпрограмм (call). Это обеспечивает совместимость с предыдущими версиями микропроцессоров. Состояние микропроцессора Pentium после выполнения аппаратного сброса показано в табл. 18.1.
□	SCYC
Выходной сигнал SCYC (split cycle) является индикатором сблокированного невыровненного цикла шины.
□	SMI
Входной сигнал SMI (system management interrupt) переводит микропроцессор Pentium в режим системного управления SMM (system management mode).
□	SMIACT 
Выходной сигнал на одноименном выводе SMIACT (system management interrupt active) показывает, что Pentium функционирует в режиме системного управления SMM (system management mode).
□	тск
Входной сигнал, поступающий на вывод ТСК (test clock), является сигналом синхронизации при тестировании по стандарту IEEE 1149.1 Boundary Scan или, иначе, интерфейсу JTAG (joint test automation group).
□	TDI
Входной вывод TDI (test data input) используется для подачи на него входных данных, синхронизируемых сигналом ТСК, при тестировании микропроцессора Pentium по интерфейсу JTAG.
□	TDO
Выходной вывод TDO (test data output) используется для получения тестовых данных и команд интерфейса JTAG, выдвигающихся из микропроцессора Pentium по синхронизирующему сигналу ТСК.
□	TMS
Входной сигнал, поступающий на вывод TMS (test mode select) предназначен для выбора режима тестирования JTAG.
□	TRST	_____
Входной сигнал, поступающий на одноименный вывод TRST (test reset), предназначен для сброса логики тестового порта ТАР (test access port).
1046
Глава 18
□	W/R
Выходной сигнал на одноименном выводе W/R (write/read) указывает на тип шинного цикла: цикл записи при высоком логическом уровне, а цикл чтения при низком логическом уровне сигнала.
□	WB/WT	____
Входной сигнал на выводе WB/WT (write-back/write-through) позволяет выбирать алгоритм записи при кэшировании данных микропроцессора Pentium.
Таблица 18.1. Состояние микропроцессора Pentium после аппаратного сброса
Регистр	Значение регистра после сигнала RESET	Значение регистра после сигнала RESET и теста BIST
ЕАХ	0	0 (если тест пройден)
EDX	0500ХХХХН	0500ХХХХН
EBX, ЕСХ, ESP, EBP, ESI и EDI	0	0
EFLAGS	2	2
EIP	0000FFF0H	0000FFF0H
CS	F000H	F000H
DS, ES, FS, GS и SS	0	0
GDTR и TSS	0	0
CRO	6000001 OH	6000001 ОН
CR2, CR3 и CR4	0	0
DRO—DR3	0	О
DR6	FFFFOFFOH	FFFFOFFOH
DR7	00000400H	00000400Н
Система памяти
Шина адреса микропроцессора Pentium позволяет адресовать 4 Гбайт физической памяти, как и в микропроцессорах 80386DX и 80486. Разница заключается в разрядности шины данных памяти процессоров. Микропроцессор Pentium использует 64-разрядную шину данных памяти, состоящую из восьми банков по 512 Мбайт данных, в каждом. На рис. 18.2 представлена организация системы физической памяти микропроцессора Pentium.
Система памяти микропроцессора Pentium разделена на 8 банков, каждый из которых содержит байт данных с битом паритета. Микропроцессор Pentium, подобно микропроцессору 80486, использует внутреннюю генерацию сигнала паритета и логику проверки достоверности информации шины данных системы памяти. Следует заметить, что в большинстве систем, построенных на процессоре Pentium, не используют контроль паритета, но он доступен.
Микропроцессоры Pentium и Pentium Pro 1047
Память, имеющая 64-разрядную шину данных, является наиболее подходящей для данных с плавающей точкой удвоенной точности. Следует напомнить, что число с плавающей точкой удвоенной точности является 64-разрядным. Микропроцессор Pentium, благодаря переходу на 64-разрядную шину данных, способен извлекать данные с плавающей точкой за один цикл чтения, вместо двух, как это было в микропроцессоре 80486. За счет этого производительность микропроцессора Pentium выше, чем у микропроцессора 80486. Система памяти, как и в предыдущих микропроцессорах Intel, адресуется байтами: от байта ООООООООН до байта FFFFFFFFH.
Выбор банков памяти осуществляется при помощи сигналов разрешения байтов ВЕ7—ВЕО (byte enable). Такая организация памяти позволяет микропроцессору Pentium получать доступ к любому одиночному байту, слову, двойному слову или учетверенным словам за один цикл обмена данными памяти. Как и для предыдущей логике выбора памяти, для записи в систему памяти необходимо сформировать восемь отдельных стробов записи.
Новая особенность, добавленная в микропроцессор Pentium, заключается в его возможности в ходе выполнения отдельных операций контролировать и формировать бит паритета для шины адреса (А31—А5). Вывод АР обеспечивает систему информацией о паритете адреса, а вывод АРСНК указывает на ошибку паритета шины адреса. Микропроцессор Pentium сам не предпринимает никаких действий при ошибке паритета, он только указывает на ее наличие. Ошибку оценивает система и она же должна принимать при необходимости соответствующие меры (вызвать прерывание процессора).
Каким же образом 32-разрядная система памяти подключается к 64-разрядному микропроцессору Pentium? Микропроцессор Pentium может работать с 32-разрядной системой памяти, но используя мультиплексор для преобразования 64-разрядной шины данных в 32-разрядную шину. На рис. 18.3 показан набор из восьми двунаправленных шинных формирователей 74F245, которые применяются для преобразования 64-разрядной шины данных микропроцессора Pentium в 32-разрядную шину данных памяти. При использовании такой схемы необходимо быть внимательным, поскольку программное обеспечение может получать доступ к двойному слову, которое пересекает границу между нижней и верхней частями шины данных. Все двойные слова должны находиться в пределах границ двойных слов. Следует заметить, что граница двойного слова — это адрес, кратный 4.
1048
Глава 18
Шина данных Pentium D63-D32-
Шина данных-Pentium D31-D0
ВЕЗ
ВЕ1
W/R
Рис. 18.3. Схема формирования 32-разрядной шины данных памяти из 64-разрядной шины данных микропроцессора Pentium
вШина данных "памяти D31-D0
Система ввода-вывода
Система ввода-вывода микропроцессора Pentium полностью совместима с предыдущими микропроцессорами Intel. Номер порта ввода-вывода появляется на адресных линиях А15—АЗ вместе с соответствующими сигналами разрешения байтов, используемых для выбора действительных банков памяти при передаче данных системы ввода-вывода.
Начиная с микропроцессора 80386, привилегированная информация о системе ввода-вывода (карта разрешения ввода-вывода) во время работы микропроцессора Pentium в защищенном режиме добавлена в сегмент состояния задачи TSS. Следует напомнить, что это позволяет избирательно запрещать или разрешать доступ к портам ввода-вывода. При несанкционированном обращении к заблокированному пор
Микропроцессоры Pentium и Pentium Pro	1049
ту ввода-вывода микропроцессор Pentium формирует прерывание типа 13 для сигнализации о нарушении защиты системы ввода-вывода.
Синхронизация системы
Как и для любого микропроцессора, чтобы разобраться с интерфейсом процессора, прежде всего необходимо уяснить все сигналы синхронизации системы. Часть представленного текста описывает работу микропроцессора Pentium посредством временных диаграмм и показывает, как можно определить время доступа к памяти.
Базовый неконвейерный цикл обращения к памяти микропроцессора Pentium состоит из двух тактов: Т1 и Т2 (рис. 18.4). Из временной диаграммы видно, что процессор Pentium с тактовой частотой 66 МГц способен передавать данные памяти со скоростью 33 млн передач в секунду. Это, разумеется, при условии, что память может работать с такой скоростью.
Рис. 18.4. Цикл чтения памяти без использования конвейерной адресации для микропроцессора Pentium
Кроме того, из временной диаграммы видно, что адрес считается эффективным, если в момент положительного фронта синхронизирующего импульса (конец такта TI) установлен сигнал ADS. Практически одновременно с установкой адреса формируется сигнал W/R , определяющий тип шинного цикла: записи или чтения.
Во время такта TI микропроцессор выдает адрес, а также сигналы ADS, W/R и М/Ю. Чтобы надлежащим образом квалифицировать сигнал W/R и сформировать соответствующие сигналы MRDC и MWTC, можно использовать триггер, чтобы сформировать сигнал W/R. После триггера подключается 4-разрядный двухвходовой мультиплексор типа 74F257 для генерации сигналов управления памяти и ввода-вывода. На рис. 18.5 представлена схема генерации управляющих сигналов для памяти и системы ввода-вывода микропроцессора Pentium.
1050
Глава 18
Vcc
74F257
Рис. 18.5. Схема генерации управляющих сигналов для памяти и системы ввода-вывода
Во время такта Т2 производится выборка данных в момент положительного фронта тактового импульса. Время установки данных до момента их выборки составляет 3,8 нс, а время снятия после фиксации — 2,0 нс. Это означает, что окно времени, в течение которого данные выставлены на шину, равно примерно 5,8 нс. Максимальная задержка появления адреса на соответствующей шине после начала такта Т1 составляет 8,0 нс. Это означает, что для вычисления времени доступа к памяти для микропроцессора Pentium, работающего с частотой 66 МГц, следует из времени двух тактов синхронизации, равного 30,3 нс (два периода тактовых импульсов), вычесть время задержки появления адреса 8,0 нс и время установки данных 3,8 нс. Таким образом, время доступа к памяти без тактов ожидания составляет: 30,3 — 8,0 — 3,8 или 18,5 нс. Этого времени достаточно для доступа к статическим элементам памяти, но вряд ли хватит для доступа к динамическим элементам без введения тактов ожидания. Обычно на статических элементах памяти выполняется внешний кэш второго уровня.
Такты ожиданий в шинный цикл микропроцессора Pentium вводятся в зависимости от входного сигнала BRDY. Сигнал BRDY должен быть установлен до завершения такта Т2, в противном случае в шинный цикл дополнительно вводятся такты ожидания Т2. На рис. 18.6 представлена временная диаграмма с четырьмя тактами ожидания при работе процессора с медленнодействующей памятью.
Смысл добавления тактов ожидания в шинный цикл заключается в увеличении времени, предоставляемого памяти для доступа к данным. В приведенной временной диаграмме время доступа увеличено таким образом, чтобы в системе можно было использовать память на стандартных динамических элементах, имеющих время доступа 60 нс. Обратите внимание, что для этого требуется добавить четыре такта ожидания по 15,15 нс (один период тактовых импульсов) для увеличения времени доступа до 79,1 нс. Это время является достаточным для функционирования системы, имеющей динамическое ОЗУ и любой дешифратор адреса.
Сигнал BRDY это синхронный сигнал, формируемый с использованием системных тактовых сигналов CLK. На рис. 18.7 приведена схема, которая может использоваться для формирования сигнала BRDY, и, в принципе, позволяет добавлять во вре
Микропроцессоры Pentium и Pentium Pro
1051
менную диаграмму микропроцессора Pentium любое число тактов ожидания. Если вы помните, то для микропроцессора 80386 тоже рассматривалась аналогичная схема (см. рис. 17.13, а). В данном случае для формирования сигнала BRDY также используется задержка сигнала ADS с помощью сдвигового регистра 74F164, но уже на 0—7 периодов тактовых сигналов CLK. Необходимое число тактов ожидания выбирается мультиплексором 74F151, имеющим 8 входов и 1 выход. В этом примере мультиплексор с помощью управляющих входов А, В и С выбирает выход QE сдвигового регистра, соответствующий четырем тактам ожидания (4W).
	I Т1	(Ожидание) 1 Т2	(Ожидание) 1	Т2	(Ожидание) I Т2	(Ожидание) 1 Т2	।	Т2 ।
CLK 	у		_У1	\	/ I ।	ч \	/ । ।	ч \	/ । ।	ч \	/| ।	। ।	।	\	/| 1 ।
Адрес		i	I	i	। ।	i
		। ।	। ।	।	। । । ।	1 1
ADS		j /	1 ।	1 ।	1	1 ।	।	1 1
W/R		। । । t	। । । 1	। I । 1	। । । । । । 1 1	1 1 I 1
		1 1 1	1 1 1	1 1 1	1	1 1	1 1	1	1
		1 1 1 1	1 1 1 1	1 1 1 1	1	1 1	1 1	1 1	1	1 1
BRDY		1 1 1	i । I	i । ।	i	i i	i i	i	1
Рис. 18.6. Временная диаграмма цикла чтения с введенными четырьмя тактами ожидания и со временем доступа к памяти равного 79,1 нс
BRDY
Рис. 18.7. Схема формирования четырех тактов ожидания посредством задержки сигнала ADS
Более эффективное считывание данных из памяти осуществляется при помощи конвейеризованного пакетного цикла чтения. В одном таком цикле в течение пяти тактовых периодов процессор Pentium способен передать четыре 64-разрядных чис
1052
Глава 18
ла. При пакетном цикле чтения без тактов ожидания необходимо, чтобы система памяти могла передавать данные каждые 15,15 нс для процессора, работающего с частотой 66 МГц. При наличии кэш второго уровня такая скорость передачи не вызовет проблем, до тех пор, пока данные будут считываться из кэш. Если же данные в кэш будут отсутствовать, то необходимо будет обратиться к динамической памяти, которая потребует введения тактов ожидания, что в свою очередь приведет к снижению скорости передачи. На рис. 18.8 представлен пакетной цикл чтения без тактов ожидания для процессора Pentium. Следует заметить, что для предоставления памяти большего времени на выполнения операций в пакетный цикл также при необходимости могут быть добавлены такты ожидания.
Рис. 18.8. Пакетный цикл чтения, в результате которого осуществляется передача четырех 64-разрядных данных между системой памяти и микропроцессором Pentium
Логика предсказания ветвления
Микропроцессор Pentium использует логику предсказания ветвления, чтобы снизить необходимое для выполнения ветвления время, которое связано с внутренними задержками. Эти задержки минимизируются, поскольку блок предвыборки при встрече команды ветвления (в данном случае только вероятной) микропроцессор начинает предварительно выбирать команду, на которую должен произойти переход. Процессор Pentium выполняет упреждающую обработку переходов, используя буфер адресов переходов ВТВ, иначе называемый как целевой буфер переходов (branch target buffer), и два буфера предварительной выборки. Один буфер применяется для предварительной выборки команды в предположении, что перехода нет, а другой выполняет предвыборку команд, используя содержимое буфера ВТВ, которое было запомнено при первом переходе. Буфер ВТВ может хранить до 256 результатов переходов, что позволяет прогнозировать вложенные циклы. Затем инструкции из буферов предвыборки загружаются в кэш команд, чтобы при возникновении ветвления необходимые команды уже имелись в наличии и позволили бы выполнить ветвление за один такт. При ошибочном предсказании перехода конвейеры команд обнуляются, и предвыборка команд начинается заново. Тогда, либо при какой-либо другой ошибке в логике предсказания ветвления для выполнения операции ветвления потребуется три дополнительных периода синхронизации. Однако в большинстве случаев предсказание ветвления является правильным и никаких задержек не происходит.
Микропроцессоры Pentium и Pentium Pro
1053
Структура кэш-памяти
Кэш-память микропроцессора Pentium изменена по сравнению с кэш-памятью микропроцессора 80486. Микропроцессор Pentium содержит два раздельных блока кэшпамяти по 8 Кбайт каждый вместо одного, как это было в микропроцессоре 80486. Имеется кэш-память данных и кэш-память команд. Кэш команд содержит только команды, а кэш данных содержит данные, используемые командами.
Микропроцессор 80486 с унифицированной кэш-памятью при выполнении программы, перерабатывая большое количество данных, быстро заполнял кэш и тем самым оставлял мало места для команд. Поэтому скорость выполнения программы микропроцессора 80486 часто замедлялась. Такого в микропроцессоре Pentium не происходит, поскольку имеется два отдельных блока кэш-памяти.
Суперскалярная архитектура
Микропроцессор Pentium, в отличие от процессора 80486, имеет суперскалярную архитектуру, состоящую из трех операционных блоков. Один блок выполняет команды с плавающей точкой (сопроцессор), а два другие блока (U-конвейер и V-koh-вейер), работая параллельно, выполняют команды над целочисленными данными. Это означает, что одновременно можно исполнять три команды. Например, команда fadd st,st(2), команда mov еах, юн и команда mov ebx, 12н могут выполняться одновременно, поскольку ни одна из этих команд не зависит друг от друга. Команда fadd st,st(2) выполняется сопроцессором, команда mov еах, юн выполняется U-конвейером, а команда mov евх,12н — V-конвейером. Поскольку сопроцессор используется также для выполнения MMX-команд, разумеется, при их наличии, то микропроцессор Pentium одновременно может выполнять две команды над целочисленными данными и одну ММХ-команду.
Программное обеспечение должно составляться с учетом этой особенности путем просмотра всех команд программы с дальнейшим их вероятным изменением в том случае, если возможна замена или разделение зависимых команд на независимые. В результате, такие изменения могут повышать скорость выполнения некоторых программ до 40%. Поэтому следует убедиться, что новая компилирующая программа или какой-либо другой пакет прикладных программ, применяемый вами, использует преимущества новой суперскалярной архитектуры микропроцессора Pentium.
18.2. Специальные регистры микропроцессора Pentium
Микропроцессор Pentium является, по существу, таким же микропроцессором, как 80386 и 80486, за исключением введения некоторых дополнительных функций и изменений в набор управляющих регистров. В этом разделе освещаются различия в структуре управляющих регистров и регистра флагов микропроцессора Pentium и микропроцессоров 80386 и 80486.
Управляющие регистры
На рис. 18.9 показан формат управляющих регистров для микропроцессора Pentium. Обратите внимание, что в набор управляющих регистров добавлен новый управ-
1054
Глава 18
ляющий регистр CR4. В данном разделе текста объясняются только новые компоненты в управляющих регистрах микропроцессора Pentium. Формат управляющих регистров
Рис. 18.9. Формат управляющих регистров микропроцессора Pentium
□ CD
Бит CD (cache disable) регистра CR0 управляет внутренней кэш-памятью процессора. Если CD = I, то кэш запрещен и не заполняется новыми данными по промахам при обращении в кэш, но продолжает функционировать при удачном обращении в кэш-память. Если CD = 0, то микропроцессор работает как обычно — промахи вынуждают кэш заполняться новыми данными. Этого бита не было в процессоре 80386, но он появился в 80486.
□	NW
Бит NW (not write-through) регистра CR0 выбирает режим работы для данных кэш-памяти. Если бит NW = I, то для кэш-памяти данных запрещается сквозная запись. Этого бита не было в процессоре 80386, он стал использоваться, начиная с процессора 80486.
□	AM
Бит AM (alignment mask) регистра CR0 позволяет выполнять контроль выравнивания, если он установлен, и запрещает этот контроль, если он очищен. Контроль выравнивания выполняется только в защищенном режиме, когда бит AM установлен, установлен флаг АС, а уровень привилегий имеет значение 3 (режим пользователя). Бит стал использоваться, начиная с процессора 80486.
□	WP
Если бит WP (write protect) регистра CR0 установлен, то он защищает от записи страницы уровня пользователя при доступе в режиме супервизора. Если этот бит очищен, то страницы уровня пользователя, предназначенные только для чтения, могут быть затерты записью процессом супервизора. Этого бита не было в процессоре 80386, но он появился, начиная с микропроцессора 80486.
□	NE
При установленном бите NE (numeric error) регистра CR0 разрешается стандартный механизм сообщений об ошибках при операциях сопроцессора. Если бит
Микропроцессоры Pentium и Pentium Pro
1055
NE = 1, то вывод FERR активизируется при ошибке сопроцессора. Если бит NE = 0, то любая ошибка сопроцессора игнорируется. Этот бит стал использоваться, начиная с процессора 80486.
□	PCD
Бит PCD (page cache disable) регистра CR3 запрещает кэширование страниц. Состояние этого бита устанавливается в зависимости от состояния одноименного вывода микропроцессора. Этот бит стал использоваться, начиная с процессора 80486.
□	PWT
Состояние бита PWT (page write-through) регистра CR3 устанавливается в зависимости от состояния одноименного вывода микропроцессора во время циклов шины, не работающих со страницами (например, циклов квитирования прерывания), когда подкачка страниц разрешена. Если подкачка страниц запрещена, то состояние этого бита устанавливается в любых циклах шины. Этого бита не было в процессоре 80386, но он появился, начиная с микропроцессора 80486.
□	VME
Бит VME (virtual mode extension) регистра CR4 разрешает поддержку флага виртуального прерывания в защищенном режиме. Если бит VME = 0, то поддержка виртуального прерывания запрещается.
□	PVI
Бит PVI (protected mode virtual interrupt) регистра CR4 разрешает использование флага виртуального прерывания в защищенном режиме.
□	TSD
Бит TSD (time stamp disable) регистра CR4 управляет командой rdtsc.
П DE
Бит DE (debugging extension) регистра CR4, если он установлен, то попытки обращения к регистрам DR4 и DR5 вызывают исключение недопустимого кода операции, если же бит сброшен, то разрешает использовать регистры DR4 и DR5 для установки контрольных точек останова при обращении к портам ввода-вывода.
□	PSE
Бит PSE (page size extension) регистра CR4, если он установлен, разрешается использовать страницы памяти размером по 4 Мбайта, если же он сброшен, то используются стандартные страницы по 4 Кбайта.
□	MCE
Бит MCE (machine check enable) регистра CR4, если он установлен, то разрешается исключение машинного контроля (аппаратной проверки), возникающее, когда блок внутреннего контроля операций внутри чипа или на шине обнаруживает ошибку, если же бит MCE сброшен, то это исключение запрещается.
Микропроцессор Pentium в сравнении с микропроцессором 80486 имеет новые особенности, которые управляются с помощью битов регистра CR4, а в сравнении с процессором 80386 содержит еще несколько битов и в регистре CR0. Эти новые опции разъясняются в последующих разделах текста.
1056
Глава 18
Регистр флагов EFLAG
Расширенный регистр флагов EFLAG (extended flag register) в микропроцессоре Pentium немного видоизменен. На рис. 18.10 показано содержимое регистра EFLAG. Обратите внимание, что в этот регистр процессора Pentium добавлены три новых флага (бита) по сравнению с микропроцессором 80486.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
Примечание: Неиспользуемые биты регистра флагов зарезервированы для возможного использования в будущих версиях процессоров.
Рис. 18.10. Формат регистра EFLAG микропроцессора Pentium
□	ID
Бит ID (identification flag) используется командой идентификации процессора cpuid для тестирования. Если программа может устанавливать и сбрасывать флаг ID, то процессор поддерживает команду cpui6.
□	VIP
Бит VIP (virtual interrupt pending) указывает, что виртуальное прерывание задерживается. Системное программное обеспечение устанавливает этот флаг, если требуется отложить обработку прерывания. Используется совместно с VIF.
П VIF
Бит VIF (virtual interrupt) — это виртуальный флаг прерывания, который является виртуальным образом флага IF и используется совместно с флагом VIР.
Следует отметить, что флаг AC (alignment check), указывающий на состояние бита AM в управляющем регистре CR0, был добавлен еще в микропроцессоре 80486.
Встроенный самоконтроль
Встроенный тест самоконтроля BIST (built-in self-test) выполняется после включения питания посредством установки сигнала высокого логического уровня на вывод INIT, в то время как сигнал на выводе RESET изменяется с высокого на низкий логический уровень. Тест BIST проверяет 70% внутренней структуры микропроцессора Pentium примерно за 150 мкс. По завершению проверки встроенного самоконтроля микропроцессор Pentium сообщает результат в регистре ЕАХ. Если ЕАХ = 0, то самоконтроль пройден и микропроцессор Pentium готов к работе. Если же бит ЕАХ содержит любой другой показатель, то микропроцессор функционирует неправильно и неисправен.
18.3.	Управление памятью микропроцессора Pentium
Блок управления памятью MMU (memory-management unit) в микропроцессоре Pentium совместим снизу вверх с микропроцессорами 80386 и 80486. В микропро
Микропроцессоры Pentium и Pentium Pro 1057
цессоре Pentium многие функции прежних микропроцессоров, по существу, не изменены. Основные изменения коснулись блока страничной трансляции адресов (paging unit) и связаны с введением нового режима системного управления SMM (system management mode).
Блок страничной трансляции адресов
Механизм страничной трансляции адресов функционирует со страницами памяти размером 4 Кбайта или новым расширенным значением размера страниц памяти микропроцессора Pentium равного 4 Мбайтам. Размер структуры таблиц страничного преобразования, как описано в главах 1 и 17, может быть большим в системах с большой памятью. Следует напомнить, что микропроцессору для полного перераз-биения памяти размером 4 Гбайта на страницы требуется объем памяти несколько больший, чем 4 Мбайт только для одной таблицы страниц. В микропроцессоре Pentium, с новой 4-мегабайтной страничной организацией, количество элементов страничной трансляции сокращено до одного каталога страниц. Новый размер страниц, равный 4 Мбайт, выбирается с помощью бита PSE, расположенного в регистре CR4.
Основное отличие в страничной трансляции при размере страниц 4 Кбайта и 4 Мбайта заключается в том, что теперь в линейном адресе не содержится части адреса, определяющей строку в таблице страниц, поскольку таковой не имеется. На рис. 18.11 представлена система трансляции адресов при размере страницы 4 Мбайта микропроцессора Pentium. Обратите внимание на способ использования линейного адреса в этой схеме трансляции. Следует отметить, что старшие 10 разрядов линейного адреса выбирают строку в каталоге страниц, как это было, когда страница была размером 4 Кбайта. Разница состоит в том, что здесь нет таблиц страниц. Вместо этого, каталог страниц адресует страницу памяти размером 4 Мбайта.
Линейный адрес
01000002
01000001
01000000
Рис. 18.11. Схема преобразования линейного адреса 00200001Н в адрес ячейки физической памяти 01000001Н, расположенной на странице размером 4 Мбайт. Обратите внимание, что вттриведенной схеме таблицы страниц отсутствуют
34 Зак. 384
1058
Глава 18
Режим системного управления SMM
Режим системного управления SMM (system management mode) такого же уровня, как защищенный, реальный и виртуальный режимы работы, но он предусматривается для функционирования в качестве менеджера. Режим SMM не предназначен для использования его как приложения или элемента системного уровня. Он предназначен для системных функций высокого уровня, таких как управление режимом электропитания и обеспечение безопасности, которые большинство микропроцессоров Pentium используют во время работы.
Доступ к режиму SMM осуществляется с помощью нового внешнего аппаратного прерывания, сигнал запроса которого подается на вывод SMI (system management interrupt) микропроцессора Pentium. При активизации этого прерывания процессор сохраняет свой контекст — содержимое почти всех своих регистров — в специальной памяти называемой ОЗУ системного управления, или SMRAM (system management RAM), и начинает выполнять программное обеспечение, расположенное в этой же области памяти. Сигнал SMI для процессора является запросом прерывания с наивысшим приоритетом. Вызываемое им прерывание запрещает все прерывания, которые обычно обрабатываются приложениями пользователя и операционной системой. Возврат из SMM-прерывания осуществляется с помощью новой команды rsm, которая помещается в конце обработчика прерывания и предназначена для восстановления контекста процессора из памяти SMRAM и возвращения в режим работы программы в точке прерывания.
SMM-прерывание обращается к программному обеспечению, первоначально размещенному по адресу 38000Н, используя следующие значения регистров: CS = 3000Н и EIP = 8000Н. Исходное состояние базового адреса памяти SMRAM может быть программно изменено, используя переход в любую ячейку в пределах 1 Мбайта. Режим работы, аналогичный адресации памяти в реальном режиме, вводится SMM-прерыванием, но он отличается тем, что режим SMM позволяет микропроцессору Pentium интерпретировать систему памяти как однородную систему объемом 4 Гбайта, вместо адресации в пределах 1 Мбайта.
SMM-прерывание, кроме выполнения программного обеспечения, которое начинается с адреса 38000Н, также записывает состояние микропроцессора Pentium в так называемом дампе записи (dump record). Дамп записи находится в диапазоне адресов 3FFA8H—3FFFFH с резервируемой Intel областью 3FE00H—3FFF7H. Дамп записи позволяет системе, построенной на базе микропроцессора Pentium, вводить режим ожидания (sleep mode) и возобновлять программу в точке прерывания. Такая организация требует подачи питания на память SMRAM в период ожидания. Многие компактные компьютеры типа laptop имеют отдельную батарейку для питания памяти SMRAM на протяжении нескольких часов в режиме ожидания. В табл. 18.2 перечисляется содержимое дампа записи.
Авторестарт инструкции halt (halt auto restart) и рестарт ловушки ввода-вывода (I/O trap restarts) используются в режиме SMM при активизации команды rsm. Эти данные позволяют команде rsm вернуться к инструкции останова halt или инструкции ввода-вывода. Если инструкция останова или инструкция ввода-вывода не действуют с вводом режима SMM, тогда команда rsm перезагружает состояние машины из дампа записи и возвращает процессор в точку прерывания.
Микропроцессоры Pentium и Pentium Pro 1059
Таблица 18.2. Содержимое дампа записи для режима SMM микропроцессора Pentium
Смещение	Регистр
FFFCH	CR0
FFF8H	CR3
FFF4H	EFLAGS
FFF0H	EIP
FFECH	EDS
FFE8H	ES!
FFE4H	EBP
FFE0H	ESP
FFDCH	EBX
FFD8H	EDX
FFD4H	ECX
FFD0H	EAX
FFCCH	DR6
FFC8H	DR7
FFC4H	TR
FFC0H	LDTR
FFBCH	GR
FFB8H	FS
FFB4H	DS
FFB0H	SS
FFACH	CS
FFA8H	ES
FF04H—FFA7H	Резерв
FF02H	Авторестарт инструкции halt
FF00H	Рестарт ловушки ввода-вывода
FEFCH	Идентификатор версии SMM
FEF8H	Состояние базы дампа
FEOOH—FEF7H	Резерв
Примечание: Смещения адреса первоначально располагаются относительно базового адреса 00003000Н.
Режим SMM может использоваться системой перед тем, как разместить операционную систему в памяти. Он также может использоваться периодически для управления системой, при условии не занятия области памяти 38000Н—3FFFFH под про-
1060
Глава 18
граммное обеспечение. Если система перемещает память SMRAM перед стандартной загрузкой операционной системы, то ее можно использовать дополнительно со стандартной системой памяти.
Базовый адрес памяти SMRAM режима SMM изменяется посредством замены значения в регистре базового адреса состояния дампа (ячейки 3FEF8H—3F3FBH) после первого SMM-прерывания. При выполнении команды rsm, которая обратно передает управление прерванной системе, новое значение из этих ячеек изменяет базовый адрес SMM-прерывания для всего последующего использования. Например, если базовый адрес содержимого дампа изменяется на 000Е8000Н, то все последующие SMM-прерывания микропроцессора Pentium будут использовать ячейки Е8000Н— EFFFFH для дампа записи. Эти адреса совместимы с DOS и Windows.
18.4.	Новые команды микропроцессора Pentium
Микропроцессор Pentium имеет только одну новую команду для работы со стандартным программным обеспечением системы; остальные новые команды добавлены для режима системного управления SMM, идентификации процессора и некоторые другие системные команды. В табл. 18.3 перечислены новые команды, которые добавлены в набор команд микропроцессора Pentium.
	Таблица 18.3. Новые команды микропроцессора Pentium
Команда	Функция
CMPXCHG8B	Сравнивает и обменивает 8 байт содержимого регистров EDX:EAX с приемником команды
CPUID	Возвращает идентификационный код микропроцессора (CPU)
RDTSC	Считывает из счетчика тактов процессора TSC
RDMSR	Считывает из специфического регистра для модели — регистра MSR
WRMSR	Записывает в специфический регистр для модели — регистр MSR
RSM	Возврат из прерывания системного управления SMM
Команда cmpxchgsb является расширенной командой cmpxchg, дополненной в набор команд микропроцессора 80486. Команда cmpxchgsb сравнивает 64-разрядное число, хранимое в регистровой паре EDX и ЕАХ с содержимым 64-разрядной ячейки памяти или регистровой парой, указанной приемником команды. Например, команда cmpxchgsb datai сравнивает 8 байт содержимого ячейки памяти DATA1 с 64-раз-рядным числом, хранящимся в регистрах EDX и ЕАХ. Если содержимое ячейки DATA1 равно содержимому регистровой пары EDX:EAX, тогда хранимое в этой паре регистров 64-разрядное число запоминается в ячейке памяти DATA1. Если же они не равны, то содержимое ячейки DATA1 копируется в регистры EDX:EAX. Обратите внимание, что флаг нулевого результата ZF после выполнения команды cmpxchgsb устанавливается, если содержимое регистров EDX:EAX было равно содержимому ячейки DATA1 или сбрасывается в противном случае.
Микропроцессоры Pentium и Pentium Pro 1061
Команда cpuid считывает код идентификации центрального процессора и другую информацию из микропроцессора Pentium. В табл. 18.4 показана различная информация, возвращаемая командой cpuid в зависимости от значения регистра ЕАХ. Для выполнения команды cpuid вначале необходимо загрузить регистр ЕАХ, а затем выполнить команду cpuid. Возвращаемая и помещаемая в регистры информация представлена в таблице.
Таблица 18.4. Выполнение команды cpuid
Значение регистра ЕАХ до выполнения команды	Результат выполнения команды cpuid
0	ЕАХ = 1 для всех микропроцессоров Pentium
0	EBX:EDX:ECX = идентификация производителя процессора
1	ЕАХ (биты 3—0) = модификация процессора (stepping ID)
1	ЕАХ (биты 7—4) = модель
1	ЕАХ (биты 11—8) = семейство
1	ЕАХ (биты 13—12) = тип
1	ЕАХ (биты 31—14) = зарезервированы и равны нулю
1	EDX (бит 0) = процессор содержит сопроцессор (FPU)
1	EDX (бит 1) = поддержка улучшенного режима виртуального микропроцессора 8086
1	EDX (бит 2) = процессор поддерживает точки останова для ввода-вывода
1	EDX (бит 3) = процессор поддерживает расширенный размер страниц 4 Мбайта
1	EDX (бит 4) = поддержка счетчика TSC
1	EDX (бит 5) = поддержка регистра MSR
1	EDX (бит 6) = зарезервирован
1	EDX (бит 7) = поддержка бита MCE в регистре CR4
1	EDX (бит 8) = поддержка команды cmpxchgsb
1	EDX (бит 9) = микропроцессор с питанием 3,3 В
1	EDX (биты 10—31) = зарезервированы
Если регистр ЕАХ перед выполнением команды cpuid имеет значение 0, то микропроцессор возвращает обратно в трех своих регистрах EBX, EDX и ЕСХ 12-битную строку — идентификатор производителя. Например, Intel Pentium возвращает строку "Genuinelntel" с ASCII-кодом "Genu" в регистре ЕВХ, с ASCII-кодом "inel" в регистре EDX и с ASCII-кодом "ntel" в регистре ЕСХ. Кроме того, регистр EDX возвращает информацию, если в регистр ЕАХ перед выполнением команды cpuid загружается 1.
В примере 18.1 приведена короткая программа, которая с помощью команды cpuid считывает информацию о производителе процессора. Затем эта информация ото-
1062
Глава 18
бражаися на видеоэкране с использованием макроса DISP. Следует отметить, что представленная программа работает с микропроцессором Pentium или любой другой версией процессора Pentium, имеющейся на рынке. Кроме того, программа функционирует с микропроцессором Pentium Pro и последними версиями микропроцессора 80486.
Пример 18.1. Программа для вывода на видеоэкран информации о производителе процессора
	.MODEL TINY .586
0000	.CODE DISP MACRO MOV	AH, 2 MOV	DL,BL INT	21H SHR	EBX,8 ENDM .STARTUP
0100	66| В8	00000000	MOV	ЕАХ,0 0106	OF А2	CPUID 0108	66| 52	PUSH	EDX DISP DISP DISP DISP 0132 66| 5B	POP	EBX DISP DISP DISP DISP	
015C 66| 8B D9	MOV EBX,ECX DISP DISP DISP DISP
.EXIT
END
; разрешить команды Pentium
; макрос вывода символов на видеоэкран
; идентифицировать процессор Pentium
; отобразить первые 4 символа
; отобразить следующие 4 символа
; отобразить последние 4 символа
Команда rdtsc считывает из счетчика тактов процессора TSC (time stamp counter) в регистровую пару EDX:EAX. Этот счетчик подсчитывает число тактовых импульсов центрального процессора с момента его последней перезагрузки, при которой счетчик TSC был инициализирован на неизвестное значение. Поскольку счетчик является 64-разрядным, то микропроцессор с частотой 100 МГц может накапливать счет немногим более чем 5800 лет до своего переполнения. Команда rdtsc функционирует только в реальном режиме или в защищенном режиме, но с нулевым уровнем привилегий. Если вы используете оболочку DOS из Windows или работаете с модулем управления памятью, то эта команда не будет функционировать, и будет создавать ошибку общей защиты. Операционная система Windows применяет нулевой уровень привилегий, для которого используется максимальная защита.
Микропроцессоры Pentium и Pentium Pro
1063
В примере 18.2 показана последовательность макрокоманд, подсчитывающая продолжительность событий в микросекундах. Счетчик TSC микропроцессора Pentium используется для фиксации продолжительности событий, а истекшее время в микросекундах возвращается в регистре ЕАХ. Следует заметить, что в макрос объединяются три параметра. Первый параметр передает адрес ячейки памяти из четырех слов, которая используется для хранения отображения в системе памяти тактов процессора. Убедитесь, что такой формат данных определен директивой dq. Другой параметр передает тактовую частоту микропроцессора Pentium, представленную в мегагерцах, в макрос и определяет: относится ли она к началу тактирования или к возврату истекшего времени. Если последний параметр START, то начинается тактирование; если же он READ, то истекшее время в микросекундах возвращается в регистре ЕАХ. Обратите внимание, что этот макрос может использоваться только в реальном режиме или в защищенном режиме, но только с нулевым уровнем привилегий.
Пример 18.2. Макрос подсчета событий
EVENT MACRO	WHERE,	,SPEED,OPER
PUSH	EDX	; сохранить содержимое регистров
PUSH	ECX	
IFIDN	<OPER>,	,<START>
	RDTSC	; считать из счетчика тактов процессора
	MOV	DWORD PTR WHERE,ЕАХ	; сохранить текущее значение счетчика
	MOV	DWORD PTR WHERE+4,EDX
ENDIF		
IFIDN	<OPER>,	<READ>
	RDTSC	; считать из счетчика тактов процессора
	SUB	ЕАХ,DWORD PTR WHERE	; сравнить с сохраненным значением
	SBB	EDX,DWORD PTR WHERE+4
	MOV	ЕСХ,SPEED	преобразовать в микросекунды
	DIV	ЕСХ
ENDIF		
POP	ECX	
POP	EDX	
ENDM		
Команды rdmsr и wrmsr позволяют считывать или записывать модельно-специфические регистры. Модельно-специфические регистры (model-specific registers) процессора Pentium являются уникальными и используются для трассировки программы, проверки производительности, тестирования и проверки машинных ошибок. Обе представленные команды используют регистр ЕСХ для передачи в микропроцессор номера регистра и используют пару регистров EDX:EAX для 64-разрядной операции чтения или записи. Следует заметить, что адресами модельно-специфических регистров являются адреса ОН—13Н. В табл. 18.5 показан перечень конкретных модельно-специфических регистров процессора Pentium и их содержимое. Эти регистры, как и для команды rdtsc, работают только в реальном режиме или в защищенном режиме, но нулевым уровнем привилегий.
1064
Глава 18
Таблица 18.5. Модельно-специфические регистры процессора Pentium
Номер регистра (содержимое регистра ЕСХ)	Разрядность	Функция
ООН	64 разряда	Машинная проверка адреса исключения
01Н	5 разрядов	Машинная проверка типа исключений
02Н	14 разрядов	Тестовый регистр TR1 контроля паритета
ОЗН	—	—
04Н	4 разряда	Конечные биты кэш-команд — регистр TR2
05Н	32 разряда	Данные внутреннего кэша — регистр TR3
06Н	32 разряда	Тестирование состояния кэша (тег) — регистр TR4
07Н	15 разрядов	Управление тестированием кэша — регистр TR5
08Н	32 разряда	Управление буфером TLB — регистр TR6
09Н	32 разряда	Данные буфера TLB — регистр TR7
ОАН	—	—
ОВН	32 разряда	Тег буфера ВТВ — регистр TR9
ОСН	32 разряда	Значение буфера — регистр TR10
0DH	12 разрядов	Управление буфером ВТВ — регистр TR11
ОЕН	10 разрядов	Управление новыми архитектурными возможностями регистр TR12
0FH	—	—
ЮН	64 разряда	Счетчик TSC (может записываться)
11Н	26 разрядов	Управление и выбор счетчика событий
12Н	40 разрядов	Счетчик событий CTR0
13Н	40 разрядов	Счетчик событий CTR1
Никогда не применяйте команд rdmsr или wrmsr, предварительно не определив содержимое регистра ЕСХ. Если содержимое регистра ЕСХ перед использованием этих команд было равно нулю, то возвращаемая величина в паре регистров EDX:EAX является адресом исключения для машинной проверки. Если содержимое регистра ЕСХ равно единице, то величина относится к типу исключения машинной проверки; если ЕСХ = ОЕН, то реализуется доступ к регистру TR12. Обратите внимание, что эти регистры являются внутренними и предназначены для внутреннего тестирования. Содержимое этих регистров относится к собственности корпорации Intel и поэтому не должно использоваться при стандартном программировании.
Команда rsm для вывода процессора из режима системного управления SMM. Режим системного управления рассмотрен в разд. 18.3 этой главы.
Микропроцессоры Pentium и Pentium Pro
1065
18.5.	Микропроцессор Pentium Pro
Перед тем как использовать в системе этот или любой другой микропроцессор, необходимо понять назначение каждого его вывода. В этом разделе главы описывается работа каждого вывода вместе с внешней системой памяти и устройствами ввода-вывода микропроцессора Pentium Pro.
На рис. 18.12 представлено условное графическое обозначение микропроцессора Pentium Pro, который упакован в корпус PGA (pin grid array) с 387 выводами. Существовало две версии микропроцессора Pentium Pro, отличающиеся объемом кэш второго уровня: одна версия с кэшэм на 256 Кбайт, а другая — на 512 Кбайт. При сравнении схемы расположения выводов микропроцессора Pentium Pro со схемой предыдущих версий Pentium видна существенная разница, которая заключается, прежде всего, в 36-разрядной адресной шине, позволяющей адресовать 64 Гбайт физической памяти. Такой объем памяти предусмотрен для использования в будущем, поскольку ни одна из существующих систем не содержит даже приблизительно такой памяти.
Для функционирования микропроцессора Pentium Pro, как и для большинства последних версий микропроцессора Pentium, требуется один источник питания +3,3 или 2,7 В. Максимальный питающий ток для версии Pentium Pro на 150 МГц составляет 9,9 А и рассеиваемой мощностью 26,7 Вт. В настоящее время для охлаждения микропроцессора Pentium Pro требуется хороший теплоотвод с большим потоком воздуха. Соединения Vcc и Vss микропроцессора Pentium Pro, как и у микропроцессора Pentium, должны подключаться соответствующей операцией. Микропроцессор Pentium Pro имеет: первичные выводы VCCP (primary Vcc), которые подсоединяются к +3,1 В; вторичные выводы VCCS (secondary Vcc), которые подсоединяются к +3,3 В, и стандартные выводы Vcc5 (standard Vcc), которые подсоединяются к +5,0 В.
Каждый выходной вывод микропроцессора Pentium Pro способен обеспечить обильный ток 48,0 мА нулевого логического уровня. Это представляет значительное увеличение тока возбуждения, в сравнении в 2,0 мА на выходных выводах предыдущего микропроцессора. Каждый входной вывод имеет малую нагрузку, требующей ток только 15 мкА. Поскольку ток возбуждения в 48,0 мА имеется на каждом выходе, то только для очень больших систем потребуются буферные схемы шин.
Внутренняя структура микропроцессора Pentium Pro
Структура микропроцессора Pentium Pro отличается от структуры предыдущих микропроцессоров. Прежние микропроцессоры имели операционный блок и блок шинного интерфейса с буферизацией небольшой кэш-памяти операционного блока для блока шинного интерфейса. В последующих микропроцессорах эта структура была модифицирована, но модификации были только дополнительными каскадами внутри микропроцессоров. Архитектура микропроцессора Pentium также является модификацией, но более существенной, чем предыдущие микропроцессоры. На рис. 18.3 показана блок-схема внутренней структуры микропроцессора Pentium Pro.
Системные шины, связывающие память и ввод-вывод, соединяются с внутренним кэш уровня 2, который часто находится на главной плате в большинстве других микропроцессорных систем. Кэш-память уровня 2 в микропроцессоре Pentium Pro
1066
Глава 18
Q5
S1
N3
L7 Л J5 J3 G1
J7 G3
L9 G7
Е1 ЕЗ
АЕЗ
АЕ9
U1
U7
U5 АС5 W3 АА1
АА47 Y45 U39
С9 АСЗ АА7
Y41 АС47
АЕ5~
АЗ		DO
А4		D1
А5		D2
А6		D3
А7		D4
А8		D5
А9		D8
А10		D7
А11		D8
А12		D9
А13		D10
А14		D11
А15		D12
А16		D13
А17		D14
А18		D15
А19		D18
А20		D17
А21		D18
А22		D19
А23		D20
А24		D21
А25 А26	PENTIUM PRO	D22 D23
А27		D24
А28		D25
А29		D26
АЗО		D27
А31		D28
А32		D29
АЗЗ		D30
А34		D31
А35		D32
		D33
ADS		D34
AERR		D35
АРО		D36
АР1		D37
> BCLK		D38
BERR		D39
BINIT		D40
BNR		D41
ВР2		D42
ВРЗ		D43
ВРМО		D44
ВРМ1		D45
BPR1		D46
BR0		D47
BR1		D48
BR2		D49
BR3		D50
CPUPRES		D51
DEFER		D52
		D53
DEP0		D54
DEP1		D55
DEP2		D58
DEP3		D57
DEP4		D58
DEP5		D59
DEP6		D60
DEP7		D61
		D62
DRDY		D63
FERR FLUSH		PICCLK
FRCERR		PICDO
HIT		PICD1
HITM		PLL1
IERR		PLL2
IGNNE		PRDY
INIT		PREQ
LINTO/INTR LINT1/NMI		PWRGOOD
LOCK		REQO
RESET		REQ1
RP		REQ2
RSO		REQ3
RS1		REQ4
RS2		
RSP		STPCLK
SMI		TCK
TRDY		TDI
UP		TDO
A20M		THERTRIP
		TMS TRST
С31
СЗЗ
А41
А37
С37
С43 С45 ~54Т
С47 Е39 Е41 ~Ё45~
Е43 Е47
J45
J43
N47
N41
S47
S43 U47 U45 ЗГ
W47 S39 U43 W45
Y47 W43
АА43 АА41 АЕ41 С19 ~С?3~
Y39 АА45
W9
W7
W5
А5
А13
С13
А17
С15
Рис. 18.12. Схема расположения выводов микропроцессора Pentium Pro
Микропроцессоры Pentium и Pentium Pro
1067
Внешняя системная шина
Рис. 18.13. Внутренняя структура микропроцессора Pentium Pro
имеет или 256, или 512 Кбайт. Интегрирование кэш-памяти уровня 2 ускоряет обработку и уменьшает количество компонентов в системе.
Блок шинного интерфейса BIU (bus interface unit) управляет доступом к системным шинам посредством кэш-памяти второго уровня, так же как и в большинстве других микропроцессоров. Отличие состоит в том, что кэш-память второго уровня, как уже было сказано ранее, интегрирована в процессор. Блок шинного интерфейса формирует адрес памяти и управляющие сигналы, передает и осуществляет выборку данных или команд соответственно для кэш-памяти данных или команд первого уров
1068 Глава 18
ня. Каждый такой кэш имеет емкость 8 Кбайт, но она может быть увеличена в будущих версиях микропроцессора. Прежние версии микропроцессоров Intel, кроме процессора Pentium, содержали унифицированную кэш-память, которая была предназначена как для команд, так и для данных. Реализация отдельных кэш улучшает работу процессора, поскольку программы с переработкой большого количества информации больше не заполняют кэш данными.
Кэш команд соединяется с блоком выборки и дешифрации команд IFDU (instruction fetch and decode unit). Этот блок содержит три отдельных дешифратора команд, которые одновременно дешифрируют три команды. Выходные сигналы этих трех дешифраторов, после дешифрирования, поступают в пул инструкций (instruction pool) и находятся там, пока их не выберут блок диспетчеризации и исполнения инструкций, иначе DEU (dispatch and execute unit), или блок завершения и удаления инструкций RU (retire unit). Также в блоке выборки и дешифрации команд IFDU имеется логика предсказания ветвления, которая подготавливает кодовую последовательность, содержащую условные команды перехода. Логика предсказания ветвления, при определении условного перехода, пытается определить следующую команду в процессе выполнения программы.
После дешифрирования команды поступают в пул инструкций, где они удерживаются для обработки. Пул инструкций представляет собой ассоциативное запоминающее устройство, емкость которого корпорация Intel никогда в литературе не указывает.
Блок диспетчеризации и исполнения инструкций, иначе DEU (dispatch and execute unit), извлекает дешифрированные команды из пула инструкций и затем выполняет их. Внутренняя структура блока DEU показана на рис. 18.14. Обратите внимание, что этот блок содержит три блока исполнения инструкций: два блока целочисленных вычислений и один блок для выполнения операций с плавающей точкой. Это означает, что микропроцессор Pentium Pro одновременно может обрабатывать две целочисленные команды и одну команду с плавающей точкой.
Пул инструкций
Рис. 18.14. Блок диспетчеризации и исполнения инструкций микропроцессора Pentium Pro
Микропроцессоры Pentium и Pentium Pro 1069
Микропроцессор Pentium также имеет три блока исполнения инструкций, но несколько другой архитектуры, поскольку микропроцессор Pentium не имеет ни блока перехода, ни блока формирования адреса, как микропроцессор Pentium Pro. Резервирующая станция RS (reservation station) может одновременно распределять до пяти событий для исполнения и обрабатывать четыре. Следует отметить, что два компонента резервирующей станции RS, которые на рис. 18.14 не показаны, соединены с одним из блоков формирования адреса.
И наконец, последним не названным блоком внутренней структуры микропроцессора Pentium Pro является блок завершения и удаления инструкций RU (retire unit). Этот блок проверяет пул инструкций и удаляет дешифрированные инструкции, которые уже выполнены. Блок завершения и удаления инструкций RU может удалять три дешифрированные команды за один тактовый импульс.
Назначение сигналов и выводов процессора
Количество выводов в микропроцессоре Pentium Pro увеличено до 387 в сравнении с 237 выводами процессора Pentium. Далее следует описание выводов и соответствующих сигналов микропроцессора Pentium Pro:
а А20М
Входной сигнал, поступающий на вывод А20М (address А20 mask), является сигналом маскирования бита А20 физического адреса для эмуляции адресного пространства процессора 8086 в реальном режиме при использовании драйвера HIMEM.SYS.
a A35-A3
Двунаправленные выводы шины адреса А35 —АЗ (address) предназначены для адресации любой ячейки 1Г х 64 системы памяти микропроцессора Pentium Pro.
a ADS
Двунаправленный сигнал строба адреса ADS (address strobe) активизируется, когда микропроцессор Pentium Pro выдает действительный адрес памяти или устройств ввода-вывода.
а API—АРО
Двунаправленные сигналы паритета адреса API — APO (address parity) обеспечивают проверку на четность адреса всей инициируемой микропроцессором Pentium Pro памяти или при обмене с устройствами ввода-вывода. Выход АРО обеспечивает контроль по четности для выводов адреса А23—АЗ, а выход API для соединений А35—А24.
a aszi - aszo
Входные сигналы ASZI — ASZO (address size) предназначены для выбора доступного размера памяти. В табл. 18.6 показан доступный размер памяти, определяемый комбинацией этих двух сигналов микропроцессора Pentium Pro.
□ BCLK
Входной сигнал BCLK (bus clock) определяет рабочую частоту микропроцессора Pentium Pro. Например, если частота сигнала BCLK составляет 66 МГц, то рабо
1070
Глава 18
чая частота ядра процессора, определяемая коэффициентом умножения, может иметь различные значения, показанные в табл. 18.7. Частота сигнала BLCK тактирует системную шину процессора и равна ее частоте.
Таблица 18.6. Размер доступной памяти, определяемый выводами ASZ1 — ASZ0
ASZ1	ASZ0	Размер памяти
0	0	0—4 Гбайт
0	1	4—64 Гбайт
1	X	Зарезервировано
Таблица 18.7. Сигнал BCLK и его влияние на частоту ядра микропроцессора Pentium Pro
			 	 Частота ядра				Частота ядра
LINT1/NMI	LINTO/INTR	IGNNE	А20М	Коэфф.	процессора при	процессора при
					BCLK = 50 МГц	BCLK = 66 МГц
0	0	0	0	2	100 МГц	133 МГц
0	0	0	1	4	200 МГц	266 МГц
0	0	1	0	3	150 МГц	200 МГц
0	0	1	1	5	250 МГц	333 МГц
0	1	0	0	5/2	125 МГц	166 МГц
0	1	0	1	9/2	225 МГц	300 МГц
0	1	1	0	7/2	175 МГц	233 МГц
0	1	1	1	11/2	275 МГц	366 МГц
1	1	1	1	2	100 МГц	133 МГц
□	BERR
Двунаправленный сигнал BERR (bus error) указывает на неисправимую ошибку шины или поступает от внешнего устройства и предназначен для вызова прерывания машинной проверки или немаскируемого прерывания.
□	BINIT
Двунаправленный сигнал инициализации шины BINIT (bus initialization) активизируется с включением питания для инициализации шинной системы.
□	BNR
Двунаправленный сигнал BNR (block next request) используется для останова мультипроцессорной системы.
□	ВРЗ, ВР2
Выходные сигналы процессора ВРЗ и ВР2 (break point) указывают на попадание микропроцессора Pentium Pro в контрольные точки останова.
Микропроцессоры Pentium и Pentium Pro
1071
□	BPM1-BPM0
Выходные сигналы BPM1 — BPMO (break point monitor) указывают на попадание в точку останова или срабатывание счетчиков, используемых для мониторинга производительности процессора Pentium Pro.
□	BPRI 
Входной сигнал, поступающий на одноименный вывод BPRI (bus priority request), вынуждает микропроцессор прекратить запросы на доступ к шине.
□	BR3-BR0
Входные сигналы запроса шины, поступающие на одноименные выводы BR3 — BRO (bus request), позволяют нескольким микропроцессорам Pentium Pro совместно использовать одну и ту же системную шину. Эти выводы соединяются с линиями шины BREQ3 —BREQO (bus request) для запроса доступа к системной шине.
□	D63-D0	____ _
Двунаправленные выводы D63 —DO (data) предназначены для передачи байтов, слов, двойных слов или учетверенных слов данных между микропроцессором, памятью и системой ввода-вывода.
□	DBSY
Сигнал DBSY (data bus busy) указывает, что шина данных занята передачей данных.
□	DEFER 
Входной сигнал, поступающий на одноименный вывод DEFER (defer), указывает, что в период фазы отслеживания исходный порядок выполнения транзакций не гарантируется.
□	DEN	_2_
Сигнал разрешения отложенного ответа DEN (defer enable) активизируется на втором этапе фазы запроса шины.
□	РЕР7-РЁР0 
Сигналы DEP7 — DEPO (data bus ЕСС protection) обеспечивают корректирующим ЕСС-кодом для исправления ошибок в одном разряде и обнаружения ошибки в двух разрядах шины данных.
□	FERR 
Сигнал ошибки математического сопроцессора FERR (floating-point error), аналогичный сигналу ERROR сопроцессора 80387, указывающий, что ошибку допустил внутренний сопроцессор.
□	FLUSH 
Входной сигнал FLUSH (flush cache) вынуждает внутреннюю кэш-память очи-стить все строки. Если этот сигнал активен во время действия сигнала RESET, то микропроцессор Pentium Pro переходит в режим тестирования.
1072 Глава 18
□	FRCERR
Сигнал ошибки после проверки функциональной избыточности FRCERR (functional redundancy check error), которая выполняется проверочным процессором при парной конфигурации двух микропроцессоров Pentium Pro. Два процессора могут быть конфигурированы как один логический, т. е. как функционально избыточная пара master/checker.
о шт_________
Сигнал HIT (hit) показывает, что внутренний кэш содержит действительные данные (кэш-попадание) в режиме опроса.
□	HITM
Сигнал HITM (hit modified) указывает на кэш-попадание в модифицированную строку в цикле опроса. Этот сигнал используется для запрета доступа к этим данным другим контроллерам шины, пока строка кэш не будет записана в память.
□	IERR 
Выходной сигнал IERR (internal error) показывает, что микропроцессор Pentium Pro обнаружил внутреннюю ошибку четности или ошибку функциональной избыточности.
□	IGNNE
Входной сигнал, поступающий на одноименный вывод IGNNE (ignore numeric error), вынуждает микропроцессор Pentium Pro игнорировать ошибку математического сопроцессора.
□	INIT
Входной сигнал, поступающий на одноименный вывод INIT (initialization), осуществляет "мягкую" инициализацию процессора, без затрагивания содержимого кэш-памяти, буферов обратной записи и регистров математического сопроцессора. Этот сигнал не может использоваться для аппаратного сброса микропроцессора после включения питания вместо сигнала RESET.
□	INTR
Входной сигнал INTR (internipt request) используется внешней схемой для запроса прерывания.
□	LINT1 —LINT0
Входные сигналы локальных контроллеров АР1С (advanced peripheral internipt controller), поступающие на выводы LINT1—LINTO (local internipt), функционируют как сигналы NMI и INTR соответственно, при условии, что работа APIC запрещена, или же во время действия сигнала RESET, когда работа APIC разрешена, сигналы используются для конфигурирования умножения частоты.
□	LOCK
Выходной сигнал LOCK (bus lock) является сигналом монополизации управления шиной, который вырабатывается на время выполнения инструкции по префиксу lock и автоматически при выполнении инструкции xchg.
Микропроцессоры Pentium и Pentium Pro 1073
□	NMI
Входной сигнал, поступающий на вывод NMI (non-maskable interrupt), как и в предыдущих версиях микропроцессора, является сигналом запроса немаскируемого прерывания.
□	PICCLK
Входной сигнал, поступающий на вывод PICCLK (clock signal), используется для синхронизации шины APIC.
□	PICD1-PICD0
Двунаправленная последовательная шина обмена сообщениями APIC на выводах PICD1—PICDO (APIC data) используется для передачи двунаправленных последовательных сообщений между микропроцессорами Pentium Pro.
□	PWRGOOD
Входной сигнал исправности питания, поступающий на вывод PWRGOOD (power good), устанавливается на высокий логический уровень после стабилизации электропитания и синхронизации.
□	REQ4-REQ0
Сигналы REQ4 — REQO (request) выдаются текущим владельцем шины и определяют тип операции для передачи данных, как это показано в табл. 18.8 и 18.9.
Таблица 18.8. Функция сигналов запроса в первом периоде тактовых импульсов					
					
REQ4	REQ3	REQ2	REQ1	REQ0	Функция
0	0	0	0	0	Отложенный отклик
0	0	0	0	1	Резерв
0	1	0	0	0	** Случай 1*
0	1	0	0	1	Случай 2*
1	0	0	0	0	Чтение из устройств ввода-вывода
1	0	0	0	1	Запись в устройства ввода-вывода
X	X	0	1	0	Чтение из памяти
X	X	0	1	1	Запись в память
X	X	1	0	0	Чтение кода из памяти
X	X	1	1	0	Чтение данных из памяти
X	X	1	X	1	Запись в память
* Для определения кодов этих сигналов во втором периоде тактовых импульсов обратитесь к табл. 18.9.
□ RESET
Входной сигнал аппаратного сброса RESET (reset) осуществляет инициализацию микропроцессора Pentium Pro, переводя его на выполнение программы, начиная
1074
Глава 18
с ячейки FFFFFFFOH. Микропроцессор переходит в реальный режим работы, а 12 старших адресных выводов сохраняют высокий логический уровень (FFFH) до выполнения дальнего перехода или дальнего вызова. Это сделано для обеспечения совместимости с предыдущими микропроцессорами.
Таблица 18.9. Сигналы запроса применительно случаев 1 и 2 табл. 18.8 во время второго периода тактовых импульсов
Случай	REQ4	REQ3	REQ2	REQ1	REQ0	Функция
1	X	X	X	0	0	Подтверждение прерывания
1	X	X	X	0	1	Специальные транзакции
1	X	X	X	1	X	Резерв
2	X	X	X	0	0	Сообщение трассировки ветвления
2	X	X	X	0	1	Резерв
2	X	X	X	1	X	Резерв
□	RP _	____  
Сигнал RP (request parity) обеспечивает линии ADS и REQ4 — REQ0 битом паритета для защиты этих линий от ошибок.
□	RS2-RS0
Входные сигналы, поступающие на выводы RS2 —RSO (response status), предназначаются для выполнения микропроцессором Pentium Pro функций, перечисленных в табл. 18.10. Сигналы управляются агентом, отвечающим за завершение текущей транзакции.
Таблица 18.10. Реакция микропроцессора Pentium Pro на коды сигналов RS2 —RS0
RS2	RS1	RS0	Функция	нггм	DEFER
0	0	0	Состояние незанятости	X	X
0	0	1	Повтор	0	1
0	1	0	Задержка	0	1
0	1	1	Зарезервирована	0	1
1	0	0	Устойчивый отказ	X	X
1	0	1	Нормальная транзакция (без данных)	0	0
1	1	0	Неявная обратная запись	1	X
1	1	1	Нормальная транзакция (с данными)	0	0
□ RSP
Входной сигнал RSP (response parity) является битом паритета для сигналов RS2 — RS0 поступает от внешнего контролирующего устройства.
Микропроцессоры Pentium и Pentium Pro
1075
□ SMI
Входной сигнал, поступающий на одноименный вывод SMI (system management interrupt), переводит микропроцессор Pentium Pro в режим системного управления SMM.
П SMMEM
Сигнал SMMEM (system memory-management mode) устанавливается всякий раз при выполнении микропроцессором Pentium Pro прерывания в режиме системного управления.
П SPCLK
Сигнал SPCLK (split lock) становится низкого логического уровня для обозначения передачи, содержащей четыре сблокированных транзакции.
П STPCLK
Низкий логический уровень входного сигнала, поступающего на одноименный вывод STPCLK (stop clock), переводит микропроцессор Pentium Pro в режим Stop Grant с пониженным потреблением электроэнергии.
п тск
Входной сигнал, поступающий на одноименный вывод ТСК (testability clock), является входом синхронизации шины тестирования в соответствии со стандартом IEEE 1149.1 Boundary Scan Architecture (он же интерфейс JTAG).
П TDI
Входной сигнал, поступающий на одноименный вывод TDI (test data), используется как вход последовательных данных для тестового интерфейса стандарта IEEE 1149.1 Boundary Scan Architecture (или иначе интерфейса JTAG), синхронизируемых сигналом ТСК.
П TDO
Выходной сигнал с вывода TDO (test data output) используется для получения последовательных данных и команд из тестового интерфейса стандарта IEEE 1149.1 Boundary Scan Architecture (или иначе интерфейса JTAG), синхронизируемых сигналом ТСК.
П TMS
Входной сигнал, поступающий на одноименный вывод TMS (test mode select), управляет работой микропроцессора Pentium Pro в режиме тестирования согласно интерфейсу стандарта IEEE 1149.1 Boundary Scan Architecture (или иначе интерфейсу JTAG).
П TRDY	_____
Входной сигнал, поступающий на одноименный вывод TRDY (target ready), которым целевое устройство указывает на готовность приема данных к записи или неявной обратной записи.
Система памяти
Емкость системы памяти микропроцессора Pentium Pro составляет 4 Гбайт, как и в микропроцессорах 80386DX—Pentium, однако имеется возможность для доступа к
1076
Глава 18
памяти емкостью до 64 Гбайт посредством дополнительных адресных линий А35— А32. Чтобы адресоваться к памяти, имеющей организацию из восьми банков по 8 Гбайт данных в каждом, микропроцессор Pentium Pro использует 64-разрядную шину данных. Обратите внимание, что дополнительная память разрешается с помощью бита 5 управляющего регистра CR4, и она становится доступной только при разрешенной страничной переадресации памяти, страница которой равна 2 Мбайта. Также учтите, что страничная переадресация памяти в 2 Мбайта является новой для микропроцессора Pentium Pro, и которая предоставляет доступ к памяти свыше 4 Гбайт. Более подробно страничная организация памяти микропроцессора Pentium Pro рассмотрена в этой главе, далее. Организация физической памяти микропроцессора Pentium Pro представлена на рис. 18.15.
Система памяти микропроцессора Pentium Pro разделена на восемь банков, каждый из которых содержит байт данных с контрольным разрядом четности. Следует заметить, что в большинстве систем на базе микропроцессора Pentium и Pentium Pro контрольный разряд четности не применялся. Микропроцессор Pentium Pro, как и микропроцессоры 80486 и Pentium, используют внутреннее формирование сигнала четности и контролирующую логику информации шины данных системы памяти. Память, имеющая 64-разрядную шину данных, является удобной для данных с плавающей точкой удвоенной точности. Следует напомнить, что число с плавающей точкой удвоенной точности является 64-разрядным. Система памяти, как и в предыдущих микропроцессорах Intel, адресуется байтами, начиная с байта, имеющего адрес 00000000Н и заканчивая байтом с адресом FFFFFFFFH.
Выбор того или иного байта памяти осуществляется сигналами разрешения байтов ВЕ7 — ВЕО. Эти сигналы микропроцессора Pentium Pro присутствуют на части адресной шины (А15 —А8) во время второго такта в цикле обращения к памяти или устройствам ввода-вывода. Сигналы разрешения байтов получают с шины адреса, для того чтобы можно было выбрать соответствующие банки памяти. Отдельные банки памяти предоставляют микропроцессору Pentium Pro возможность доступа либо к одному байту, слову, двойному слову или же учетверенному слову за один цикл передачи данных памяти. Как и в предыдущей логике выбора памяти, часто формируется восемь отдельных стробирующих импульсов записи в память. Следует
Микропроцессоры Pentium и Pentium Pro
1077
заметить, что информация для записи в память поступает по шине данных от микропроцессора во время второй фазы цикла обращения к памяти или устройствам ввода-вывода.
Новой дополнительной возможностью микропроцессоров Pentium и Pentium Pro является их способность при определенных операциях проверять и формировать биты паритета для шины адреса. Вывод АР процессора Pentium или выводы API — APO процессора Pentium Pro обеспечивают систему информацией о паритете шины адреса, а вывод АРСНК (Pentium) и выводы API — APO (Pentium Pro) указывают на ошибку при проверке паритета. При обнаружении ошибки паритета адреса, сам микропроцессор Pentium Pro не предпринимает никаких действий. Ошибку должна оценить система, и она же должна, если необходимо, предпринять соответствующее действие (прерывание).
Новым элементом микропроцессора Pentium Pro является встроенная схема обнаружения и коррекции ошибок ЕСС (error correction circuit), которая позволяет исправлять одинарную ошибку в одном из разрядов и обнаруживать двойную. Чтобы обнаруживать и исправлять ошибки, системе памяти необходима дополнительная память для хранения 8-разрядного числа, которое должно сохраняться с каждым значением 64-разрядных данных. Эти дополнительные восемь разрядов используются для хранения кода коррекции ошибок ЕСС (error-correction code), который позволяет микропроцессору Pentium Pro автоматически исправлять одинарную ошибку. Модуль памяти с организацией 1М х 64 представляет собой синхронное динамическое ОЗУ (SDRAM) без поддержки ЕСС, а модуль 1М х 72 — аналогичное ОЗУ, но с поддержкой ЕСС. Код коррекции ошибок ЕСС является более надежным, чем старая схема контроля по четности, которая редко используется в современных системах. Единственным недостатком схемы ЕСС является более дорогое 72-разрядное синхронное динамическое ОЗУ.
Система ввода-вывода
Система ввода-вывода микропроцессора Pentium Pro полностью совместима с прежними микропроцессорами Intel. Адреса портов ввода-вывода появляются на линиях адреса А15—АЗ с сигналами разрешения байтов, используемых при выборе банков памяти при передаче данных ввода-вывода.
Начиная с микропроцессора 80386, информация о привилегиях доступа к системе ввода-вывода добавляется в сегмент состояния задачи TSS, а точнее в карту разрешения ввода-вывода (I/O permission bitmap), когда микропроцессор работает в защищенном режиме. Следует напомнить, что эта карта позволяет избирательно запрещать доступ к портам ввода-вывода. При попытке получения доступа к запрещенному порту ввода-вывода микропроцессор Pentium Pro генерирует прерывание типа 13 (общее нарушение защиты), чтобы сигнализировать о нарушении привилегий системы ввода-вывода.
Синхронизация системы
Как и для любого микропроцессора, чтобы реализовать сопряжение микропроцессора с системой, необходимо понять сигналы синхронизации. В этом разделе текста
1078
Глава 18
посредством временных диаграмм детально рассматривается работа микропроцессора Pentium Pro и показывается, как определить время доступа к памяти.
Цикл обращения к памяти микропроцессора Pentium Pro состоит из двух частей: фазы адреса и фазы данных. В течение адресной фазы микропроцессор Pentium Pro выставляет адрес (Т1) памяти или системы ввода-вывода, а также управляющие сигналы (Т2), которые также передаются по линиям шины адреса. Управляющие сигналы включают: сигналы ATTR7 — ATTR0 (передаются по линиям А31—А24), сигналы DID7 —DIDO (А23 —А16), сигналы разрешения использования байтов ВЕ7 — ВЕО (А15 —А8) и сигналы расширенных функций EXF4 —EXFO (А7 — АЗ). На рис. 18.16 приведена временная диаграмма обмена данными. Тип цикла памяти появляется на выводах REQ4 — REQ0 . Во время фазы данных производится выборка или же запись в память 64-разрядных чисел. Эта операция является самой распространенной, поскольку данные из основной памяти переносятся между внутренней кэш-памятью обратной записи емкостью 256 или 512 Кбайт и оперативной памятью. Такие операции записи байта, слова или двойного слова, так же как и передачи данных системы ввода-вывода, используют сигналы выбора байтов и в фазе передачи данных применяют только один такт Т2. Из временной диаграммы (рис. 18.16) видно, что микропроцессор Pentium Pro с частотой 66 МГц способен выполнять 33 млн обращений к памяти в секунду. Это, разумеется, в предположении, что память может работать с такой скоростью.
Рис. 18.16. Временная диаграмма микропроцессора Pentium Pro
Время установки данных до начала переднего фронта импульса синхронизации составляет 5,0 нс, время фиксации данных после фронта составляет 1,5 нс. Таким образом, окно данных составляет 6,5 нс. Адрес на шине появляется с максимальной задержкой, не превышающей 8,0 нс после начала такта Т1. Это означает, что микропроцессору Pentium Pro, работающему на частоте 66 МГц, для доступа к памяти требуется: 30,3 нс (два периода синхронизации), минус время задержки адреса 8,0 нс и минус время установки данных 5,0 нс. Таким образом, время доступа к памяти без тактов ожидания составляет: 30,3 ~ 8,0 - 5,0 или 17,3 нс. Этого времени достаточно для доступа к элементам статической памяти (SRAM), но не для любого элемента динамической памяти (DRAM) без введения в цикл шины тактов ожидания.
Микропроцессоры Pentium и Pentium Pro 1079
Такты ожидания добавляются в цикл шины посредством сигналов, поступающих на управляющий вывод TRDY микропроцессора Pentium Pro. Сигнал TRDY низкого логического уровня к концу такта Т2 должен поступить на одноименный вывод микропроцессора, иначе в цикл шины будут вводиться дополнительные такты Т2. Следует заметить, что для динамического ОЗУ (DRAM) со временем доступа 70 нс требуется введение четырех тактов ожидания Т2 по 15,15 нс каждый (один период тактовых импульсов). Этого времени будет достаточно для функционирования в системе динамического ОЗУ. Поскольку необходимое время доступа к элементам постоянной памяти EPROM составляет около 100 нс, то для такой памяти требуется семь тактов ожидания.
18.6. Специальные особенности микропроцессора Pentium Pro
Микропроцессор Pentium Pro, по существу, является таким же микропроцессором, как 80386, 80486 и Pentium, за исключением некоторых дополнительных особенностей и изменений в наборе управляющих регистров. В этом разделе рассматриваются различия в структуре одного из управляющих регистров CR4 и регистра флагов микропроцессора Pentium Pro и процессора 80386.
Управляющий регистр CR4
На рис. 18.17 показан формат управляющего регистра CR4 микропроцессора Pentium Pro. Обратите внимание на то, что регистр CR4 имеет два новых управляющих бита: РАЕ (бит 5) и PGE (бит 7), которые добавлены в этот управляющий регистр и рассмотрены в этом разделе текста.
31	7	6543210
	PGE	MCE	РАЕ	PSE	DE	TSD	PVI	VME
Рис. 18.17. Новый управляющий регистр CR4 микропроцессора Pentium Pro
Для сравнения следует обратиться к рассмотренному ранее рис. 18.9. Далее следует описание битов управляющего регистра CR4 микропроцессора Pentium Pro.
П УМЕ
Бит VME (virtual mode extension) регистра CR4 разрешает поддержку флага виртуального прерывания в защищенном режиме. Если бит VME = 0, то поддержка виртуального прерывания запрещается.
П PV1
Бит PVI (protected mode virtual interrupt) регистра CR4 разрешает использование флага виртуального прерывания в защищенном режиме.
П TSD
Бит TSD (time stamp disable) регистра CR4 управляет командой rdtsc.
1080
Глава 18
□	DE
Бит DE (debugging extension) регистра CR4, если он установлен, то попытки обращения к регистрам DR4 и DR5 вызывают исключение недопустимого кода операции, если же бит сброшен, то разрешает использовать регистры DR4 и DR5 для установки контрольных точек останова при обращении к портам ввода-вывода.
□	PSE
Бит PSE (page size extension) регистра CR4, если он установлен, разрешается использовать страницы памяти размером по 2 Мбайта (в микропроцессоре Pentium разрешается страница 4 Мбайта), если же он сброшен, то используются стандартные страницы по 4 Кбайта.
□	РАЕ
Бит расширения физического адреса РАЕ (page address extension), если он установлен, разрешается дополнительно использовать адресные линии А35—А32 при разрешении нового режима страничной адресации микропроцессора Pentium Pro, управляемого битом PSE.
П MCE
Бит MCE (machine check enable) регистра CR4, если он установлен, то разрешается исключение машинного контроля (аппаратной проверки), возникающее, когда блок внутреннего контроля операций внутри чипа или на шине обнаруживает ошибку, если же бит MCE сброшен, то это исключение запрещается.
□	PGE
Бит PGE (page global enable), если он установлен, то разрешается использование глобальных страниц, доступных всем пользователям. Перед установкой этого бита необходимо сначала разрешить страничное преобразование, т. е. установить бит PG, находящийся в регистре CR0.
Итоги
П Микропроцессор Pentium является почти идентичным с прежними микропроцессорами 80386 и 80486. Основные изменения коснулись внутренней архитектуры микропроцессора Pentium, которая включает две отдельные части кэш-памяти для команд и данных и два параллельно работающих конвейера обработки. Кроме того, микропроцессор Pentium работает на большей тактовой частоте (66 МГц).
□	Средний ток питания микропроцессора Pentium с тактовой частотой 66 МГц составляет 3,3 и 2,91 А для процессора с частотой 60 МГц. Источник питания должен иметь напряжение +5,0 В с отклонением ±5%. Для микропроцессоров Pentium следующих поколений требуется источник питания с напряжением 3,3 или 2,7 В.
□	Шина данных микропроцессора Pentium является 64-разрядной и содержит восемь 8-байтных банков памяти, которые выбираются с помощью сигналов разрешения байтов ВЕ7 — ВЕО .
Микропроцессоры Pentium и Pentium Pro
1081
□	Время доступа к памяти микропроцессора Pentium с частотой 66 МГц в цикле шины без тактов ожидания составляет 18,5 нс. Во многих случаях для такого достаточно короткого времени доступа к памяти необходимы такты ожидания, которые вводятся в цикл шины посредством сигналов, подаваемых на вывод BRDY микропроцессора Pentium.
□	Суперскалярная архитектура микропроцессора Pentium содержит три независимых блока обработки: процессор с плавающей точкой, а также два блока обработки, названных корпорацией Intel как U- и V-конвейер.
□	Структура кэш-памяти микропроцессора Pentium модифицирована и включает два отдельных блока кэш-памяти: кэш команд (8К х 8 бит) и кэш данных (8К х 8 бит). Кэш данных может работать в двух режимах: как кэш со сквозной записью, так и как кэш с обратной записью.
□	В микропроцессор Pentium добавлен новый режим системного управления SMM (system management mode). Доступ к режиму SMM осуществляется с помощью нового внешнего аппаратного прерывания, сигнал запроса которого подается на вывод SMI . В ответ на сигнал SMI микропроцессор Pentium начинает выполнять программу обработки прерывания, начиная с адреса 38000Н.
□	К новым командам процессора Pentium относятся: cmpxchgs, rsm, rdmsr, wrmsr и cpuid. Команда cmpxchgs аналогична команде cmpxchg микропроцессора 80486, но оперирует с 64-разрядными числами. Команда rsm возвращает из состояния прерывания системного управления SMM. Команды rdmsr и wrmsr считывают или записывают данные в специфический регистр для модели — регистр MSR. Команда cpuid считывает идентификационный код микропроцессора (CPU) Pentium.
□	Встроенный самоконтроль BIST (built-in self-test) осуществляет тестирование микропроцессора при включении питания. Обычно после включения питания активизируется сигнал RESET микропроцессора Pentium. Тест BIST выполняется при высоком логическом уровне сигнал^ INIT во время спада сигнала RESET. При успешном прохождении теста BIST микропроцессор помещает в регистр ЕАХ значение ООООООООН.
□	Еще одна модификация коснулась блока страничной трансляции адресов (paging unit), в результате которой стало возможным использовать страницы памяти размером 4 Мбайта вместо стандартных страниц по 4 Кбайта. Это осуществляется за счет использования 1024 строк каталога страниц для адресации страниц по 4 Мбайт в каждой.
□	Микропроцессор Pentium Pro является улучшенной версией микропроцессора Pentium, который содержит не только кэш первого уровня, имеющегося и в микропроцессоре Pentium, но также и кэш второго уровня (Level 2) емкостью 256 или 512 Кбайт, который ранее обычно находился на системных или, иначе, материнских платах персональных компьютеров.
□	Микропроцессор Pentium Pro использует такую же тактовую частоту шины, равную 66 МГц, как и микропроцессоры Pentium и 80486. Однако, используя внутренний генератор для умножения частоты шины на разные коэффициенты (от 2 до 5,5), ядро процессора может работать на соответствующей большей тактовой частоте.
1082
Глава 18
О Единственное существенное отличие программного обеспечения между микропроцессором Pentium Pro и прежними микропроцессорами состоит в добавлении в его набор команд fcmov и cmov.
□ Единственным существенным отличием аппаратного обеспечения микропроцессора Pentium Pro и предыдущих микропроцессоров состоит в возможности работы его со страницами размером 2 Мбайта, а также в добавлении четырех адресных линий, которые предоставляют доступ к адресному пространству памяти в 64 Гбайта.
□ В микропроцессор Pentium Pro добавлен код коррекции ошибок ЕСС (error correction code), с помощью которого имеется возможность исправлять одинарную ошибку в одном из разрядов данных и обнаруживать двойную.
Контрольные вопросы и задания
1.	Какой объем памяти доступен микропроцессору Pentium?
2.	Какой объем памяти доступен микропроцессору Pentium Pro?
3.	Разрядность шины данных памяти микропроцессора Pentium составляет бит.
4.	Какое назначение имеют выводы DP7—DP0 микропроцессора Pentium?
5.	Какой синхронизирующий сигнал подается на вывод CLK микропроцессора Pentium, если он работает с частотой 66 МГц?
6.	Какое назначение имеет вывод BRDY микропроцессора Pentium?
7.	Какое назначение имеет вывод АР микропроцессора Pentium?
8.	Сколько времени на доступ к памяти (без тактов ожидания в цикле шины) предоставляется микропроцессору Pentium, работающему с частотой 66 МГц?
9.	Какой вывод микропроцессора Pentium используется для ввода в цикл шины тактов ожидания?
10.	Такт ожидания — это дополнительный такт, добавляемый в цикл шины.
11.	Объясните, каким образом два блока обработки целых чисел позволяют микропроцессору Pentium одновременно выполнять две независимые команды.
12.	Какую кэш-память и какого размера имеет микропроцессор Pentium?
13.	Какой размер окна выборки данных имеет микропроцессор Pentium при операциях считывания из памяти?
14.	Может ли микропроцессор Pentium выполнять три команды одновременно?
15.	Какое назначение имеет вывод SMI микропроцессоров Pentium и Pentium Pro?
16.	Что представляет собой режим системного управления SMM микропроцессора Pentium и Pentium Pro?
17.	Каким образом осуществляется выход из режима системного управления SMM?
18.	С какого адреса микропроцессор Pentium начинает выполнять программу обработки SMM-прерывания в ответ на сигнал SMI ?
19.	Каким образом можно изменить адрес дампа записи для режима системного управления SMM?
20.	Объясните принцип действия команды CMPXCHG8B.
21.	Какая информация возвращается в регистр ЕАХ после выполнения команды cpuid с исходным значением в регистре ЕАХ равным нулю?
Микропроцессоры Pentium и Pentium Pro 1083
22.	Какие новые биты добавлены в регистр флагов микропроцессора Pentium?
23.	Какой новый управляющий регистр добавлен в микропроцессор Pentium?
24.	Опишите, каким образом микропроцессор Pentium получает доступ к страницам памяти размером в 4 Мбайта?
25.	Объясните принцип работы счетчика тактов процессора TSC (time stamp counter) и его использование.
26.	Сравните микропроцессоры Pentium и Pentium Pro.
27.	Каким образом микропроцессор Pentium Pro формирует сигналы разрешения байтов?
28.	Сколько имеется адресных линий в системе, построенной на микропроцессоре Pentium Pro?
29.	Какие имеются изменения в регистре CR4 микропроцессора Pentium Pro и для чего они сделаны?
30.	Сравните время доступа к памяти в системах Pentium и Pentium Pro.
31.	Что такое ЕСС?
32.	Какой тип модуля на синхронных динамических элементах SDRAM следует покупать, чтобы использовать ЕСС?
ГЛАВА 1 9
Микропроцессоры Pentium II,
Pentium III и Pentium 4
Введение
Микропроцессоры Pentium II, Pentium III и Pentium 4, с появлением микропроцессора Itanium1 от фирмы Intel, могут, по существу, свидетельствовать об окончании эволюции 32-разрядной архитектуры. Микропроцессор Itanium имеет уже 64-раз-рядную архитектуру. Микропроцессоры Pentium II, Pentium III и Pentium 4 являются только лишь расширениями архитектуры Pentium Pro с некоторыми отличиями. Наиболее заметным отличием является то, что внутренняя кэш-память второго уровня процессора Pentium Pro вынесена из кристалла микропроцессора Pentium II. К другому значительному изменению относится то, что микропроцессор Pentium II не является интегральной микросхемой, размещенной в одном корпусе. Вместо этого, микропроцессор Pentium II выполнен на печатной плате, помещенной в специальный картридж, на которой установлен кристалл ядра процессора и несколько кристаллов кэш-памяти второго уровня. На этой же плате, кроме того, имеется печатный краевой разъем, на который выведена системная шина процессора. Производилось несколько различных вариантов микропроцессора Pentium II. Например, микропроцессор Celeron, представляющий собой упрощенную версию микропроцессора Pentium И, не имел кэш-память второго уровня. Напротив, микропроцессор Хеоп являлся улучшенной версией микропроцессора Pentium II, в котором объем кэш-памяти был увеличен до 2 Мбайт.
Первые микропроцессоры Pentium III, аналогично микропроцессору Pentium II, монтировались в картридже. Более поздние версии, такие как Coppermine, снова исполняются в виде отдельной ИС, выпускаемой в корпусе типа PGA (370 выводов). Микропроцессор Pentium III Coppermine, как и микропроцессор Pentium Pro, имеет внутреннюю кэш-память двух уровней. Микропроцессор Pentium 4 выполнен в виде отдельной БИС, помещенной в корпус типа PGA, имеющий 421 вывод. Кроме того, микропроцессор Pentium 4 использует транзисторы, имеющие меньшие физические размеры, что делает его более компактным и более скоростным, чем микропроцессор Pentium III. Корпорацией Intel на данный момент времени выпущены версии Pentium 4, которые работают на частотах свыше 2 ГГц с будущим возможным предельным значением до 10 ГГц.
1 Itanium, Celeron, Хеоп — зарегистрированные торговые марки Intel Corporation.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1085
Назначение главы
После завершения ознакомления с этой главой, вы сможете:
□	сопоставить микропроцессоры Pentium II, Pentium III и Pentium 4 с прежними микропроцессорами фирмы Intel;
□	объяснить, каким образом особенности архитектуры микропроцессоров Pentium II, Pentim III и Pentium 4 улучшают быстродействие системы;
□	объяснить, как изменилась базовая архитектура компьютерной системы за счет использования микропроцессоров Pentium II, Pentium III и Pentium 4;
□	подробно описать изменения при выполнении команды cpuid;
□	описать принцип действия команд sysenter и sysexit;
□	Описать принцип действия команд fxsave и fxrstor.
19.1. Микропроцессор Pentium II
Перед тем как использовать в системе микропроцессор Pentium II или любой другой микропроцессор, следует понять функциональное назначение каждого его вывода. В данном разделе главы достаточно подробно описывается назначение каждого вывода микропроцессора Pentium II при работе с внешней системой памяти и системой ввода-вывода.
На рис. 19.1 показана схема разъема Slot 1 для микропроцессора Pentium II и сигналы, используемые для интерфейса микропроцессора с внешним набором микросхем — чипсетом.
На рис. 19.2 показана упрощенная блок-схема компонентов, размещенных в картридже микропроцессора Pentium II, а также местоположение картриджа микропроцессора Pentium II и организация шин в типовой системе, построенной на базе этого микропроцессора.
Разъем Slot 1 микропроцессора имеет 242 вывода. Микропроцессор Pentium II выполнен на печатной плате в отличие от предыдущих микропроцессоров корпорации Intel, которые были выполнены в виде отдельных интегральных схем. Кэш-память первого уровня (Level 1) имеет емкость 32 Кбайта, как в микропроцессоре Pentium Pro, но кэш-память второго уровня (Level 2) больше не интегрирована внутри ядра микропроцессора. Фирма Intel изменила архитектуру таким образом, что кэшпамять второго уровня стала располагаться очень близко, но все же вне ядра микропроцессора. Это изменение делает микропроцессор менее дорогим, и в то же время позволяет эффективно функционировать кэш-память второго уровня. Кэш-память второго уровня микропроцессора Pentium II работает на частоте равной половине частоты синхронизации микропроцессора, в отличие от 66 МГц в случае микропроцессора Pentium. Например, в микропроцессоре Pentium II с тактовой частотой равной 400 МГц кэш-память второго уровня работает на частоте 200 МГц. Было выпущено три версии микропроцессора Pentium II. Первая версия — это полнофункциональный микропроцессор Pentium II, которым является Pentium II, предназначенный для установки в разъем Slot 1. Другая версия — это процессор Celeron, который аналогичен микропроцессору Pentium II, за исключением кэш-памяти второго уровня, которая отсутствовала на плате микропроцессора. Кэш-память второго
1086
Глава 19
Рис. 19.1. Схема расположения выводов разъема Slot 1
Микропроцессоры Pentium II, Pentium III и Pentium 4
1087
* Скорость работы шины равна 1/2 или скорости работы ядра процессора для микропроцессоров Хеоп а)
Рис. 19.2. Структура картриджа микропроцессора Pentium II (а) и структура системы, построенной на его базе (б)
уровня системы Celeron могла быть размещена на системной плате компьютера и функционировала с частотой системной шины равной 66 МГц. Самой последней версией микропроцессора Pentium II является процессор Хеоп, который благодаря использованию кэш-памяти второго уровня на 512 Кбайт, 1 или 2 Мбайта представляет существенное улучшение быстродействия по отношению к микропроцессору Pentium II. Кроме увеличения объема кэш-память второго уровня процессора Хеоп функционировала на тактовой частоте микропроцессора. Так, например, кэшпамять второго уровня процессора Хеоп с тактовой частотой 400 МГц работает на частоте 400 МГц, что в два раза больше, чем в случае со стандартным микропроцессором Pentium II, имеющим такую же тактовую частоту. Для установки процессоров Хеоп был предназначен разъем Slot 2.
1088
Глава 19
Для первых версий микропроцессора Pentium II требовалось питание 5,0 и 3,3 В и источник питания с регулируемым напряжением. Напряжение источника регулировалось от 3,5 до 1,8 В. Среднее значение питающего тока составляло 14,2—8,4 А в зависимости от рабочей тактовой частоты и напряжения микропроцессора Pentium II. Поскольку значения тока потребления имеют такие значительные величины, то соответственно и рассеиваемая мощность процессора достаточно велика. Поэтому для охлаждения микропроцессора Pentium II необходим хороший теплоотвод со значительным воздушным потоком. В картридже процессора Pentium II для этого имеется специальная теплоотводящая пластина, к которой может быть присоединен радиатор и вентилятор. Последние версии микропроцессора Pentium II улучшены, с целью уменьшения рассеяния мощности.
Каждый выходной вывод картриджа микропроцессора Pentium II при сигнале низкою логического уровня способен обеспечивать ток не менее 36 мА. Однако некоторые выходные управляющие сигналы имеют значение тока около 14 мА. Другим изменением микропроцессора Pentium II является то, что его выходы имеют транзисторы с открытым стоком, и для надлежащего их функционирования требуются внешние нагрузочные резисторы.
Далее приводится назначение выводов и соответствующих сигналов микропроцессора Pentium II.
□	А20М
Входной сигнал А20М (address А20 mask) на одноименном выводе в реальном режиме указывает микропроцессору Pentium II на необходимость маскирования бита А20 физического адреса для эмуляции адресного пространства процессора 8086 при использовании драйвера HIMEM.SYS.
П A35-A3
Двунаправленные выводы адресной шины А35 —АЗ (address) с активным низким логическим уровнем сигнала адресуют любую ячейку системы памяти микропроцессора Pentium II. Обратите внимание, что линии адреса АО, А1 и А2 дешифрируются внутри процессора в сигналы разрешения байтов ВЕ7 —ВЕО, которые формируются набором микросхем или, иначе, чипсетом для выбора любого или всех восьми байтов 64-разрядной памяти.
□	ADS
Двунаправленный сигнал стробирования адреса ADS (address strobe) на одноименном выводе микропроцессора активизируется инициатором обмена, когда он выставляет действительный адрес памяти или системы ввода-вывода при выполнении цикла шины.
□	AERR
Двунаправленный сигнал AERR (address error) указывает на ошибку паритета на шине адреса.
□	API—АРО
Двунаправленные сигналы паритета адреса API — APO (address parity) обеспечивают проверку на четность адреса всей инициируемой- микропроцессором Pentium Pro памяти или при обмене с устройствами ввода-вывода. Выход АРО
Микропроцессоры Pentium II, Pentium III и Pentium 4 1089
обеспечивает контроль по четности для выводов адреса А23—АЗ, а выход API для соединений А35--А24.
□	BCLK
Входной сигнал синхронизации шины BCLK (bus clock) предназначен для установки частоты синхронизации системной шины. В микропроцессоре Pentium II она составляет 66 или 100 МГц.
□	BERR 
Двунаправленный сигнал BERR (bus error) на одноименном выводе устанавливается для индикации ошибки шины.
□	BINT
Двунаправленный сигнал инициализации шины BINT (bus initialization) активизируется при включении питания для инициализации шины. Этот ввод указывает на появление ошибки в шине и на необходимость проведения повторной инициализации системы.
□	BNR
Двунаправленный сигнал BNR (block next request) является запросом блокировки следующей транзакции. Вводится любым агентом шины как запрос на приостановку, когда он не может воспринять следующую транзакцию.
□	ВРЗ-ВР2
Сигналы процессора ВРЗ и ВР2 (break point) указывают на попадание микропроцессора в контрольные точки останова.
□	ВРМ1-ВРМ0
Выходные сигналы ВРМ1 — ВРМО (break point monitor) указывают на попадание в точку останова или срабатывание счетчиков, используемых для мониторинга производительности процессора.
□	BPRI	____
Входной сигнал, поступающий на одноименный вывод BPRI (bus priority request), используется для арбитража запросов на владение шиной.
□	BR1-BR0
Сигналы запроса шины на одноименных выводах BRI —BRO (bus request) указывают на то, что микропроцессор сформировал запрос шины. Во время инициализации вывод BR0 должен быть активным.
□	BSEL
Вывод BSEL (bus select) в микропроцессоре Pentium II не используется и должен быть соединен с шиной GND для правильного функционирования процессора.
□	D63-D0	___ _
Двунаправленные выводы D63 —DO (data) предназначены для передачи байтов, слов, двойных слов или учетверенных слов данных между микропроцессором, памятью и системой ввода-вывода.
35 Зак 384
1090
Глава 19
□	DEFER 
Входной сигнал, поступающий на одноименный вывод DEFER, указывает на то, что система не может завершить цикл шины.
О DEP7 - DEP0
Сигналы DEP7 — DEPO (data bus ЕСС protection) являются дополнительными сигналами защиты шины д^ных ЕСС-кодом.
□	DRDY
Двунаправленный сигнал bKDY (data ready) является сигналом готовности данных. Устанавливается историком данных для указания на наличие достоверных данных на шине.
□	EMI
Вывод EMI (electro-magnetic interference) предназначен для устранения генерирования и влияния электромагнитных помех на микропроцессор Pentium II и должен быть подключен к шице GND посредством нуль-резистора (резистора с сопротивлением 0 Ом).
□	FERR
Сигнал ошибки математического сопроцессора FERR (floating-point error), аналогичный сигналу ERROR сопроцессора 80387, указывает, что ошибку допустил внутренний сопроцессор.
П FLUSH
Входной сигнал FLUSH (fliish cache) вынуждает внутреннюю кэш-память очистить все строки. Если этот сигнал активен во время действия сигнала RESET, то микропроцессор Pentium |1 переходит в режим тестирования.
П FRCERR
Сигнал ошибки после проверки функциональной избыточности FRCERR (functional redundancy check srror), которая выполняется проверочным процессором при парной конфигурации двух микропроцессоров Pentium Pro. Два процессора могут быть конфигурированы как один логический, т. е. как функционально избыточная пара master/checker. Проверочный процессор сравнивает выходные сигналы основного (проверяемого) процессора с сигналами, генерируемыми им самим при выполнении гех же операций, но без выхода на шину. В случае обнаружения расхождения сигналов вырабатывается данный сигнал ошибки.
□	ШТ _______
Сигнал HIT (hit) показьцает, что внутренний кэш содержит действительные данные (кэш-попадание) в режиме опроса.
□	HITM _______
Сигнал HITM (hit modified) указывает на кэш-попадание в модифицированную строку в цикле опроса. Этот сигнал используется для запрета доступа к этим данным другим контроллерам шины, пока строка кэш не будет записана в память.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1091
□	IERR 
Выходной сигнал IERR (internal error) показывает, что микропроцессор Pentium II обнаружил внутреннюю ошибку или ошибку функциональной избыточности.
□	IGNNE
Входной сигнал, поступающий на одноименный вывод IGNNE (ignore numeric error), вынуждает микропроцессор Pentium II игнорировать ошибку математического сопроцессора, запрещая вырабатывание исключения.
□	1МТ
Входной сигнал, поступающий на одноименный вывод INIT (initialization), осуществляет "мягкую" инициализацию процессора, без затрагивания содержимого кэш-памяти, буферов обратной записи и регистров математического сопроцессора. Этот сигнал не может использоваться для аппаратного сброса микропроцессора после включения питания вместо сигнала RESET.
a INTR
Входной сигнал INTR (interrupt request) используется внешней схемой для запроса прерывания.
□	LINT1-LINT0
Входные сигналы локальных контроллеров APIC (advanced peripheral internipt controller), поступающие на выводы LINT1 — LINTO (local interrupt), функционируют как сигналы NMI и INTR соответственно, при условии, что работа APIC запрещена, или же во время действия сигнала RESET, когда работа APIC разрешена, сигналы используются для конфигурирования умножения частоты. Сигнал NMI (non-maskable interrupt) является сигналом запроса немаскируемого прерывания, как и в предыдущих версиях-микропроцессоров.
□	LOCK
Сигнал LOCK (bus lock) является сигналом монополизации управления шиной, который вырабатывается на время выполнения инструкции по префиксу lock и автоматически при выполнении инструкции xchg.
□	PICCLK
Входной сигнал PICCLK (APIC clock), являющийся сигналом синхронизации шины APIC, должен составлять одну четвертую часть частоты сигнала BLCK.
□	PICD1-PICD0
Двунаправленная последовательная шина обмена сообщениями APIC на выводах PICD1—PICDO (APIC data) используется для передачи двунаправленных последовательных сообщений между микропроцессором Pentium II и шиной APIC.
П РМ1 —РМО
Выходные сигналы РМ1 —РМО (performance monitor) используются при проверке производительности микропроцессора Pentium II.
1092
Глава 19
□	PRDY
Выходной сигнал PRDY (probe ready) указывает на готовность зонда в режиме зондирования (probe mode), используемого аппаратными средствами отладки.
□	PREQ
Входной сигнал PREQ (probe request), поступающий на одноименный вывод микропроцессора, используется для запроса зонда на отладочную операцию.
□	PWRGOOD
Входной сигнал исправности питания PWRGOOD (power good) указывает на то, что в системе имеется стабильное рабочее напряжение питания.
□	REQ4-REQ0
Двунаправленные сигналы запроса команды REQ4 — REQO (request command) передаются текущим владельцем шины для определения типа активной транзакции.
□	RESET
Входной сигнал сброса процессора RESET (reset), поступающий на одноименный вывод, инициализирует микропроцессор Pentium II, переводя его на выполнение программы с ячейки памяти FFFFFFFOH или 000FFFF0. Разряды А35— А32 шины адреса во время операции аппаратного сброса процессора принимают значение низкого логического уровня. Микропроцессор Pentium II переходит в реальный режим работы, и его 12 старших разрядов адреса сохраняют высокий логический уровень до выполнения дальнего перехода или дальнего вызова. Этим достигается совместимость этого процессора с прежними микропроцессорами. Состояние микропроцессора Pentium II после аппаратного сброса показано в табл. 19.1.
Таблица 19.1. Состояние микропроцессора Pentium II после выполнения аппаратного сброса
Регистр	Значение регистра после сигнала RESET#	Значение регистра после сигнала RESET# и теста BIST
ЕАХ	0	0
EDX	0500ХХХХН	0500ХХХХН
ЕВХ, ЕСХ, ESP, EBP, ESI и EDI	0	0
EFLAGS	2	2
EIP	0000FFF0H	0000FFF0H
CS	F000H	F000H
DS, ES, FS, GS и SS	0	0
GDTR и TSS	0	0
CRO	6000001 ОН	6000001 ОН
CR2, CR3 и CR4	0	0
Микропроцессоры Pentium II, Pentium III и Pentium 4
1093
Таблица 19.1 (окончание)		
Регистр	Значение регистра после сигнала RESET#	Значение регистра после сигнала RESET# и теста BIST
DRO—DR3	0	0
DR6	FFFFOFFOH	FFFFOFFOH
DR7	00000400Н	00000400Н
□	RP	_
Двунаправленный сигнал паритета запроса RP (request parity) используется для контроля запроса и обеспечивает защиту линий ADS и REQ4 — REQ0 .
□	RS2-RS0
Входные сигналы запроса состояния ответчика RS2 —RSO (response status), управляемые агентом, ответственным за завершение текущей транзакции, предназначаются для запроса состояния процессора Pentium II.
П RSP
Входной сигнал RSP (response parity), поступающий на одноименный вывод процессора, является битом паритета для сигналов запроса состояния процессора RS2-RS0.
П SLOTOCC
Низкий логический уровень выходного сигнала SLOTOCC (slot occupied) на одноименном выводе микропроцессора указывает о наличии процессора Pentium II или фиктивного терминатора в процессорном слоте.
П SLP
Входной сигнал SLP (sleep), поступающий на одноименный вывод микропроцессора Pentium II, переводит его из состояния Stop Grant с малым потреблением электроэнергии в состояние Sleep (спящий режим).
□	SMI
Входной сигнал, поступающий на одноименный вывод SMI (system management interrupt), переводит микропроцессор Pentium II в режим системного управления SMM.
П STPCLK
Низкий логический уровень входного сигнала, поступающего на одноименный вывод STPCLK (stop clock), переводит микропроцессор Pentium II в режим Stop Grant с пониженным потреблением электроэнергии.
п ТСК
Входной сигнал ТСК (test clock), поступающий на одноименный вывод микропроцессора Pentium II, предназначен для синхронизации шины тестирования в соответствии со стандартом IEEE 1149.1 Boundary Scan или, иначе, интерфейсу JTAG (joint test automation group).
1094
Глава 19
a tdi
Входной вывод TDI (test data input) используется для подачи на него входных данных, синхронизируемых сигналом ТСК, при тестировании микропроцессора Pentium II по интерфейсу JTAG.
□	ТОО
Выходной вывод TDO (test data output) используется для получения тестовых данных и команд интерфейса JTAG, выдвигающихся из микропроцессора Pentium II по синхронизирующему сигналу ТСК.
□	TESTHI
Входной вывод TESTHI (test high) для правильного функционирования микропроцессора Pentium II должен подключаться к источнику с напряжением +2,5 В через резистор 1 — 10 кОм.
□	THERMTRIP ________________
Выходной сигнал THERMTRIP (thermal trip) является сигналом останова процессора по перегреву. Сигнал имеет низкий логический уровень, если температура микропроцессора Pentium II превышает 130 °C. Данный сигнал может быть сброшен только сигналом RESET после снижения температуры ниже этого порога.
□	TMS
Входной сигнал TMS (test mode select), поступающий на одноименный вывод микропроцессора Pentium II, предназначен для выбора режима тестирования JTAG.
□	TRDY
Входной сигнал TRDY (target ready), поступающий на одноименный вывод микропроцессора и которым целевое устройство указывает на готовность приема данных к записи или неявной обратной записи.
□	VID4-VID0
Выходные сигналы VID4 —VIDO (voltage ID) на одноименных выводах микропроцессора Pentium II предназначены для автоматической установки уровня питающего напряжения. Источник питания в зависимости от состояния этих выводов должен подавать на микропроцессор Pentium II соответствующее напряжение, как это указано в табл. 19.2.
Таблица 19.2. Напряжение, которое должно подаваться с блока питания на вывод Vcc микропроцессора Pentium II в соответствии с состоянием его выводов VID
VID4	VID3	VID2	VID1	VIDO	Vcc
0	0	0	0	0	2,05 В
0	0	0	0	1	2,00 В
0	0	0	1	0	1,95 В
0	0	0	1	1	1,90 В
0	0	1	0	0	1,85 В
Микропроцессоры Pentium II, Pentium III и Pentium 4
1095
Таблица 19.2 (окончание)
VID4	VID3	VID2	VID1	VIDO	Vcc
0	0	1	0	1	1,80 В
0	0	1	1	0	—
0	0	1	1	1	—
0	1	0	0	0	—
0	1	0	0	1	—
0	1	0	1	0	—
0	1	0	1	1	—
0	1	1	0	0	—
0	1	1	0	1	—
0	1	1	1	0	—
0	1	1	1	1	—
1	0	0	0	0	3,5 В
1	0	0	0	1	3,4 В
1	0	0	1	0	3,3 В
1	0	0	1	1	3,2 В
1	0	1	0	0	3,1 В
1	0	1	0	1	3,0 В
1	0	1	1	0	2,9 В
1	0	1	1^	1	2,8 В
1	1	0	'о	0	2,7 В
1	1	0	0	1	2,6 В
1	1	0	1	0	2,5 В
1	1	0	1	1	2,4 В
1	1	1	0	0	2,3 В
1	1	1	0	1	2,2 В
1	1	1	1	0	2,1 В
1	1	1	1	1	—
Система памяти
Емкость системы памяти микропроцессора Pentium II, как и у микропроцессора Pentium Pro, может составлять 64 Гбайта. Оба микропроцессора адресуют 64-разряд-ную систему памяти с использованием 36-разрядной шины адреса. Большинство систем применяют память, построенную на микросхемах синхронной динамической
1096
Глава 19
памяти типа SDRAM (synchronous DRAM) и работающую на частоте 66 и 100 МГц. Время рабочего цикла микросхемы SDRAM в системе с тактовой частотой системной шины 66 МГц составляет 10 нс, а в системе с частотой 100 МГц — 8 нс. Подключение системы памяти к чипсету (набору микросхем) в этой главе не показано. Организация 64-разрядной системы памяти без ЕСС представлена в главе 18.
Система памяти микропроцессора Pentium II поделена на восемь или девять банков, в каждый из которых имеет один байт данных. Банк, при использовании девяти байтов, содержит код коррекции ошибок ЕСС (error-correction code). Микропроцессор Pentium II, подобно микропроцессорам 80486—Pentium Pro, использует внутреннее формирование сигнала четности и контролирующую логику для информации шины данных системы памяти. Следует заметить, что большинство систем не используют контроль по четности, но такая возможность имеется. Если проверка паритета применяется, то каждый банк памяти содержит девять битов. 64-разрядная система памяти очень удобна для данных сопроцессора с плавающей точкой удвоенной точности. Следует напомнить, что число с плавающей запятой удвоенной точности является 64-разрядным. Система памяти, как и в микропроцессоре Pentium Pro, нумеруется в байтах: начиная с байта 000000000Н и заканчивая байтом FFFFFFFFFH. Обратите внимание на то, что никакой из существующих чипсетов (наборов микросхем) не поддерживает более 1 Гбайта2 системы памяти, поэтому дополнительные адресные соединения предназначаются для будущего. На рис. 19.3 приведен пример карты памяти системы на базе микропроцессора Pentium II с использованием порта AGP (accelerated graphics port) для подключения видеоплаты.
Карта памяти для системы Pentium II аналогична карте, приведенной в предыдущих главах, за исключением того, что имеются области памяти, используемые для порта AGP. Область памяти, относящаяся к порту AGP, позволяет видеоплате и программе Windows получать доступ к видеоинформации в линейном адресном пространстве. Эта область отличается от 128-килобайтного окна в области DOS, предназначенного для стандартной VGA-видеокарты. Преимущество состоит в более быстром обновлении данных, поскольку видеокарте не требуется просматривать страницы посредством области 128 Кбайт DOS-видеопамяти.
Чипсет (chipset) 440LX или 440ВХ управляет передачей данных (разрядностью в восемь байт) между микропроцессором Pentium II и системой памяти. Чипсет общает-ся с микропроцессором Pentium II посредством пяти сигналов запроса команды REQ4—REQ0 , различные комбинации которых указаны в табл. 19.3. По существу чипсет управляет микропроцессором Pentium II. Это означает отступление от традиционного метода непосредственного соединения микропроцессора Pentium II с памятью.
Микропроцессор Pentium II соединен напрямую только с кэш-памятью, которая расположена на одной плате с ядром процессора Pentium II, помещенной в специальный картридж. Как уже упоминалось, кэш-память микропроцессора Pentium II работает на половинной частоте микропроцессора. Следовательно, кэш-память процессора Pentium II, имеющего тактовую частоту 400 МГц, работает на частоте
2 В настоящее время имеются некоторые чипсеты для микропроцессора Pentium 4, например, VIA Р4ХЗЗЗ, с поддержкой 32 Гбайт памяти. — Ред.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1097
200 МГц. Однако кэш-память микропроцессора Pentium II Хеоп функционирует на частоте микропроцессора. Это означает, что процессор Хеоп с размером кэшпамяти, равным 512 Кбайт, 1 и 2 Мбайта превосходит по рабочим характеристикам стандартный микропроцессор Pentium II.
64 Гбайт
Будущие расширения
4 Гбайт
Область регистров для доступа шины PCI к порту AGP
Область буфера кадров для доступа шины PCI к порту AGP
__Память шины PCI
1 Гбайт
Апертура AGP Текстуры и инструкции
Перераспределяемая память данных порта AGP
— Оперативная память
16 Мбайт
15 Мбайт
1 Мбайт
Дополнительная память шины ISA
Системная область
640 Кбайт
Область приложений
— Стандартная память
0
Рис. 19.3. Карта памяти компьютерной системы на базе микропроцессора Pentium II
1098
Глава 19
Таблица 19.3. Состояние сигналов запроса команды микропроцессора Pentium II
REQ4—REQ0	Наименование команды	Комментарий
00000	Задержанный ответ	Задержанные ответы выдаются для предварительно задержанных транзакций
00001	Зарезервировано	Для использования в будущем
00010	Чтение из памяти и запись	Чтение из памяти DRAM или PCI, запись в DRAM из PCI
00011	Зарезервировано	Для использования в будущем
00100	Чтение кода из памяти	Чтение из памяти
00101	Запись в память	Цикл обратной записи в память
00110	Чтение данных из памяти	Чтение из памяти
00111	Запись в память	Нормальная запись в память
01000	Подтверждение прерывания или специальный цикл	Подтверждение цикла прерывания для шины PCI
01001	Зарезервировано	Для использования в будущем
10000	Чтение из устройства ввода-вывода	Операция считывания из устройства ввода-вывода
10001	Запись в устройство ввода-вывода	Операция записи в устройство ввода-вывода
1 100х	Зарезервировано	Для использования в будущем
Система ввода-вывода
Система ввода-вывода микропроцессора Pentium II полностью совместима с предыдущими микропроцессорами Intel. Номер порта ввода-вывода появляется на адресных линиях А15—АЗ с сигналами разрешения банка, которые выбирают фактические банки памяти, используемые при передачах ввода-вывода. Передачи данных управляются чипсетом, что является отклонением от стандартной архитектуры микропроцессоров до появления Pentium II.
При работе микропроцессора Pentium II в защищенном режиме, начиная с микропроцессора 80386, привилегированная информация ввода-вывода добавляется к сегменту состояния задачи TSS. Напоминаем, что это позволяет избирательно запрещать доступ к портам ввода-вывода. При обращении к запрещенной ячейке ввода-вывода микропроцессор Pentium II генерирует типовое прерывание 13, сигнализируя о нарушении уровня привилегий системы ввода-вывода.
Системная синхронизация
Перед тем как выполнить подключение микропроцессора Pentium Л, как впрочем и любого другого процессора, следует разобраться с его синхронизацией. Поскольку микропроцессор Pentium II управляется чипсетом, то информация о синхронизи-
Микропроцессоры Pentium II, Pentium III и Pentium 4 1099
рующих сигналах между микропроцессором и чипсетом стала собственностью корпорации Intel и поэтому не разглашается.
19.2.	Изменения
в программном обеспечении Pentium II
Основой ядра микропроцессора Pentium II является процессор Pentium Pro. Это означает, что микропроцессоры Pentium II и Pentium Pro, по существу, являются схожими устройствами с точки зрения программного обеспечения. В данном разделе текста приведены различия процессора Pentium II от предыдущих версий процессоров Pentium при выполнении команд: cpuid, sysenter, sysexit, fxsave и fxrstore, которые единственно представляют изменения в программном обеспечении.
Команда CPUID
В табл. 19.4 перечисляется содержимое изменяющихся регистров микропроцессора Pentium II при выполнении команды cpuid. Их содержимое немного отличается от предыдущих версий микропроцессора Pentium.
Таблица 19.4. Команда CPUID
Значение регистра ЕАХ	Выходной регистр	Содержание выходного регистра
0	ЕАХ	Максимальное значение, с которым можно вызвать команду cpuid (для процессора Pentium II — 2)
0	EBX:EDX:ECX	Строка идентификации производителя "Genuinelntel" (ЕВХ = ’’Genu”, EDX = ”inel”, ЕСХ = ntel")
1	ЕАХ	Код идентификации версии процессора (тип, семейство, модель, модификация)
1	ЕВХ	Резерв
1	ЕСХ	Резерв
1	EDX	Список имеющихся расширений базовой архитектуры
2	ЕАХ	Данные кэш-памяти и информация TLB
2	ЕВХ	Данные кэш-памяти и информация TLB
2	ЕСХ	Данные кэш-памяти и информация TLB
2	EDX	Данные кэш-памяти и информация TLB
Информация о версии микропроцессора возвращается в регистре ЕАХ после выполнения команды cpuid при значении регистра ЕАХ равного 1. Идентификатор семейства (family) возвращается в разрядах 11—8 регистра ЕАХ, идентификатор модели (model) — в разрядах 7—4, идентификатор модификации (stepping ID) — в разрядах 3—0.
Идентификатор относится к обновленному номеру процессора. Чем больше значение идентификатора модификации, тем новее версия процессора.
1100
Глава 19
Кроме того, после выполнения команды cpuid при значении регистра ЕАХ равного 1 в регистре EDX возвращается информация о поддерживаемых расширениях. В этом регистре появились новые биты, указывающие на новые особенности микропроцессора Pentium II. Бит 11 — SEP — указывает: поддерживает ли микропроцессор две новые команды быстрого вызова sysenter и sysexit. Бит 23 указывает: поддерживает ли микропроцессор набор команд ММХ, которые уже были приведены ранее в главе 14. Остальные разряды идентичны с разрядами прежних версий микропроцессоров, и подробно не рассматриваются. Бит 16 — PAT (page attribute table) — указывает, поддерживает ли микропроцессор таблицу атрибутов страниц. Бит 17 указывает, поддерживает ли микропроцессор расширение размера страниц, которое имеется в микропроцессорах Pentium Pro и Pentium II. Расширение размера страниц позволяет адресоваться к памяти свыше 4 Гбайт вплоть до 64 Гбайт. Наконец, бит 24 указывает, поддерживаются ли команды быстрого сохранения данных с плавающей точкой и восстановления данных.
Команды SYSENTER w SYSEXIT
Команды sysenter и sysexit используют внедренные в микропроцессор Pentium II средства быстрого вызова. Обратите внимание, что эти команды функционируют только в защищенном режиме и при нулевом уровня привилегий. Программа Windows работает, имея максимальный, т. е. нулевой уровень привилегий, и не предоставляет приложениям доступа к этому уровню привилегий. Таким образом, эти новые команды предназначаются только для ядра операционной системы.
Команда sysenter использует специальные модельно-специфические регистры (MSR — model-specific register) для сохранения их содержимого в регистрах CS, EIP и ESP и для выполнения процедуры быстрого системного вызова. Быстрый вызов отличается от обычного вызова тем, что он не выталкивает адрес возврата из подпрограммы в стек, как это бывает при обычном вызове. В табл. 19.5 показаны модельно-специфические регистры, используемые с командами sysenter и sysexit. Следует отметить, что модельно-специфические регистры MSR считываются с помощью команды rdmsr, а записываются командой wrmsr.
Таблица 19.5. Модельно-специфические регистры, используемые с командами sysenter и sysexit
Имя	Номер регистра	Функция
SYSENTER_CS	174Н	Содержимое регистра по команде sysenter загружается в регистр сегмента кода CS
SYSENTER_ESP	175Н	Содержимое регистра по команде sysenter загружается в регистр сегмента стека ESP
SYSENTER_EIP	176Н	Содержимое регистра по команде sysenter загружается в регистр указатель инструкции EIP
Чтобы использовать команды rdmsr и wrmsr, следует поместить номер MSR-регистра в регистр ЕСХ. Записываемые по команде wrmsr, в указанный с помощью регистра ЕСХ модельно-специфический регистр MSR, данные размещают в пару регистров EDX:EAX. В случае использования команды rdmsr, выполняющей чтение модельноспецифического регистра MSR, указанного с помощью регистра ЕСХ, данные воз
Микропроцессоры Pentium II, Pentium III и Pentium 4
1101
вращаются в этой же паре регистров EDX:EAX. В примере 19.1 показана макропоследовательность, которая может использоваться при программировании для добавления команд: rdtsc, cpuid, rdmsr, wrmsr, sysenter и sysexit. Некоторые из макроопределений также можно получить с сайта фирмы Microsoft в качестве обновления программы ассемблера MASM.
Пример 19.1. Макропоследовательность для добавления шести команд: rdtsc, cpuid, J RDMSR, WRMSR, SYSENTER И SYSEXIT
; Макропоследовательность для добавления команд:
; RDTSC,	CPUID,	RDMSR,	, WRMSR, SYSENTER, и SYSEXIT
RDTSC	MACRO DB ENDM	OFH,	31H
CPUID	MACRO DB ENDM	OFH,	0A2H
RDMSR	MACRO DB ENDM	OFH,	32H
WRMSR	MACRO DB ENDM	OFH,	ЗОН
SYSENTER	MACRO DB ENDM	OFH,	34H	•,
SYSEXIT	MACRO DB ENDM	OFH,	35H
Чтобы применить команду sysenter, вначале вы должны загрузить модельноспецифические регистры MSR адресом входа в систему в регистры SYSENTER_.CS и SYSENTER_EIP. Обычно это адрес вызова операционной системы, такой как Windows или Windows NT. Следует отметить, что эта команда рассматривается в качестве системной команды для доступа к коду или программному обеспечению с максимальным уровнем защиты (ядру операционной системы). Регистр сегмента стека SS загружается величиной, размещаемой в регистре SYSENTER_CS плюс 8. Другими словами, пара селекторов, адресуемых значением селектора SYSENTER_CS, загружается в регистры CS и SS. Величина смещения стека загружается в регистр SYSENTER_ESP.
Команда быстрого возврата из системного вызова sysexit загружает в регистр CS число, равное сумме содержимого регистра SYSENTER_CS плюс 16, а в регистр SS
1102
Глава 19
число, равное сумме содержимого регистра SYSENTER_CS плюс 24. В табл. 19.6 показаны селекторы из таблицы глобальных селекторов, адресуемых посредством регистра SYSENTER_CS. Команда sysexit, кроме загрузки регистра сегмента кода и сегмента стека, передает значение из регистра EDX в регистр EIP и значение из регистра ЕСХ в регистр ESP. Команда sysexit возвращает управление обратно на кольцо защиты, относящееся к приложениям с уровнем привилегии равным 3. Как уже упоминалось, обе команды sysenter и sysexit были разработаны для быстрого системного вызова и соответственно возврата из него для операционных систем Windows и Windows NT.
Таблица 19.6. Селекторы, адресуемые посредством регистра SYSENTER_CS
Селектор	Функция
Содержимое регистра SYSENTER_CS	По команде sysenter это значение загружается в сегмент кода CS
Содержимое регистра SYSENTER_CS плюс 8	По команде sysenter это значение загружается в сегмент стека SS
Содержимое регистра SYSENTER_CS плюс 16	По команде sysexit это значение загружается в сегмент кода CS
Содержимое регистра SYSENTER_CS плюс 24	По команде sysexit это значение загружается в сегмент стека SS
Для того чтобы использовать команды sysenter и sysexit, команда sysenter должна передать системе адрес возврата. Это выполняется посредством загрузки регистра EDX смещением адреса возврата и размещением адреса сегмента в глобальной таблице дескрипторов, расположенной по адресу SYSENTER_CS + 16. Сегмент стека передается посредством загрузки селектора сегмента стека в SYSENTER_CS + 24, а также содержимого регистра ESP в регистр ЕСХ.
Команды FXSAVE v\ FXRSTOR
Двумя новыми добавленными в микропроцессор Pentium II командами являются команды fxsave и FXRSTOR, которые почти идентичны с командами fsave и frstor, которые подробно рассмотрены в главе 14. Основное отличие состоит в том, что команда fxsave предназначается, по существу, для быстрого сохранения состояния сопроцессора MMX-машины, тогда как команда fsave сохраняет состояние сопроцессора и затем инициализирует его аналогично командам finit или fninit. Команда fsave сохраняет все поле тега, а команда fxsave запоминает только достоверные разряды поля тега, которые используются для восстановления поля тега при выполнении команды fxrstor. Это означает, что при запоминании состояния сопроцессора MMX-машины следует применять команду fxsave, иначе — команду fsave. Для новых приложений рекомендуется использовать команды fxsave и fxrstor, а не команды fsave и frstor. Обратите внимание на пример 19.2 с макросом, который позволяет применить команды fxsave и fxrstor в программе. Этот пример предусматривает прямую адресацию памяти с использованием только 32-разрядных относительных адресов.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1103
Пример 19.2. Макрос для использования команд exsave и exrstor
; FXSAVE	and FXRSTOR macros
FXSAVE	MACRO Addr DB	0FH, 0AEH, 6 DD	offset Addr ENDM
FXRSTOR	MACRO Addr DB	0FH, 0AEH, 0EH DD	offset Addr ENDM
19.3.	Микропроцессор Pentium III
Микропроцессор Pentium III является улучшенной версией микропроцессора Pentium II. Несмотря на то, что он более совершенный, чем Pentium II, он все еще базируется на архитектуре процессора Pentium Pro.
Было выпущено две версии микропроцессора Pentium III. Одна версия с кэш-па-мятью емкостью 512 Кбайт смонтирована в картридже, устанавливаемом в разъем Slot 1, а другая версия выпускалась в виде отдельного кристалла с интегрированной в ядро процессора кэш-памятью второго уровня типа Advanced Transfer Cache емкостью 256 Кбайт. Кэш-память второго уровня микропроцессора Pentium III, выпускающегося в картридже, работала на половинной частоте процессора, а кэшпамять версии процессора, изготавливающегося в виде отдельного кристалла, работала уже на тактовой частоте процессора. Увеличение объема кэш с 265 до 512 Кбайт, как показали калибровочные испытания кэш-памяти, улучшают ее рабочие характеристики только лишь на несколько процентов.
Чипсеты
Чипсеты (наборы микросхем), предназначенные для микропроцессора Pentium III, отличаются от чипсетов процессора Pentium II. Для микропроцессора Pentium III были разработаны чипсеты Intel 810, Intel 815 или Intel 820. Наибольшее распространение для работы с микропроцессором Pentium III получил чипсет Intel 815. Имелись чипсеты и других производителей, но у них отмечались проблемы с драйверами для новых периферийных устройств, например для видеокарт. Кроме того, был разработан чипсет Intel 840, предназначенный для многопроцессорных систем на базе микропроцессора Pentium III, но этот чипсет так и не получил распространение.
Шина
Микропроцессор Pentium III с ядром Coppermine, созданный по технологии 0,18 мкм, позволил повысить быстродействие системной шины, увеличив ее тактовую частоту до 100 или 133 МГц. Более скоростная версия процессора соответствен
1104
Глава 19
но позволяет добиться большей производительности при передачах данных между микропроцессором и памятью.
Предположим, что у вас имеется микропроцессор с частотой 1 ГГц, который использует шину памяти, работающую на частоте 133 МГц. Вы можете полагать, что поскольку скорость работы шины памяти будет максимально большой, то это приведет к повышению производительности, и с этим трудно не согласиться. Однако линии соединения между микропроцессором и памятью препятствуют использованию большей частоты для памяти. Если же использовать частоту шины в 200 МГц, то следует осознать, что длина волны при такой частоте составляет 300 000 000/200 000 000 или 3/2 метра. Как известно, размер любой антенны должен составлять 1/4 длины волны. Таким образом, антенна для 200 МГц составляет 14,8" (37,6 см). Поскольку для нас не желательно какое-либо излучение энергии при использовании частоты 200 МГц, поэтому в нашем случае необходимо иметь соединения на печатной плате короче 1/4 длины волны. Практика показывает, что лучше иметь длину соединяющих линий не более 1/10 от 1/4 длины волны. Это означает, что в системе с частотой шины 200 МГц соединяющие линии не должны быть длиннее 1,48" (3,76 см). Для производителя системной платы компьютера такой малый размер линий соединения будет создавать проблему при размещении разъемов для модулей системы памяти, работающей на частоте 200 МГц.
Имеется ли возможность приблизиться или даже превысить частоту работы системы памяти в 200 МГц? Да, если мы разработаем новую технологию для монтажа соединительных линий микропроцессора, чипсета и памяти. В настоящее время память функционирует в режиме пакетной передачи данных, состоящих из четырех 64-разрядных чисел при каждом считывании информации из основной памяти. Пакеты данных по 32 байта считываются в кэш-память. Основной памяти, работающей на частоте 100 МГц, требуются три такта ожидания для получения доступа к первому 64-разрядному числу. Затем следуют три такта обращения к памяти, но уже без тактов ожидания для каждого из трех оставшихся 64-разрядных чисел, что в общем составляет семь тактов шины при обращении к памяти. Таким образом, при этих условиях каждый байт данных считывается за 70 нс/32 = 2,1875 нс, при этом скорость доступа к данным по шине составляет 457 Мбайт/с. Это, конечно, медленнее, чем при тактировании шины в микропроцессоре Pentium 111 с рабочей частотой равной 1 ГГц, но поскольку большинство программ является циклическими и команды сохраняются во внутренней кэш-памяти, то часто возможно приближение к рабочей частоте микропроцессора.
Схема расположения выводов
На рис. 19.4 показана схема расположения выводов версии микропроцессора Pentium III, устанавливаемого в разъем Socket 370. Этот процессор выполнен в корпусе PGA (pin grid array) с матричным расположением 370 штырьковых выводов. Процессор предназначается для работы с одним чипсетом корпорации Intel. Кроме полнофункционального микропроцессора Pentium III имеется также версия процессора Celeron, в котором используется частота синхронизации шины памяти, равная 66 МГц. Кроме того, для серверов производилась версия микропроцессора Pentium III Хеоп, также разработанная корпорацией Intel и имеющая увеличенный объем кэш-памяти.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1105
3	5	7	9	11	13	15	17	19	21	23	25	27	29	31	33	35	37
2	4 В 8	10	12	14	16	16	20	22	24	26	28	30	32	34	36
ooooooooooooooo AB VTT AP1 VTT BPRI DEFER VTT RP TRDY DRDY BRO ADS TR3T TDI TDO oooooooooooooo vss vcc vss vcc vss vcc vss vcc vss vcc vss vcc VSS V1D1
OOOOOOOOOOOOOOO A9 APO VTT A7 REQ4 REQS VTT НГТМ HIT DBSY THRMON THRMDP TCK VIDO VI02 OOOOOOOOOOOOOO A11 VREF6 A14 VTT REQO LOCK VREF7 AERR PWRGO RS2 RSV TMS VCC VSS
OOOOOOOOOOOOOOO VCC VSS VCC VSS VCC VSS VCC _ VSS VCC VSS VCC _ BSEL1 BSELO SMI V1D3 OOOOOOOOOOOOOO A8 A4 BNR REQ1 REQ2 VTT RS1 VCC RSO THERM SLP VCC VSS VCC trip	ООО
INIT STPCLK IGNNE
AN
AM
AL
AK
AH
AG
******
Вид co стороны выводов
3	5	7	9	11	13	15	17	19	21	23	25	27	29	31	33	35	37
2	4	8	8	10	12	14	16	16	20	22	24	26	28	30	32	34	36
Рис. 19.4. Схема расположения выводов микропроцессора Pentium III, выполненного в корпусе PGA
19.4.	Микропроцессор Pentium 4
Самой последней версией процессора с архитектурой микропроцессора Pentium Pro является микропроцессор Pentium 4 от корпорации Intel. Микропроцессор Pentium 4 был выпущен в ноябре 2000 г. и имел тактовую частоту 1,3 ГГц. В настоящее время имеются версии с частотой до 3,6 ГГц. Существует две разновидности микропроцессора: в корпусе PGA с 423 выводами и в корпусе FC-PGA с 478 выводами. Обе версии процессоров используют технологию производства в 0,18 мкм3. Микропроцес
3 В начале 2002 г. на рынке появился микропроцессор Pentium 4 с ядром Northwood, изготовленный по 0,13 мкм технологии. — Ред.
1106
Глава 19
сор Pentium 4, как и прежние версии микропроцессора Pentium, использует для синхронизации шины памяти частоту, равную 100 МГц. Однако, благодаря применению технологии Quard Pumped, передающей по 4 пакета данных за один такт, частота системной шины может достигать 400 МГц. На рис. 19.5 показана схема расположения выводов микропроцессора Pentium 4, выполненного в корпусе PGA с 423 выводами.
Общая	Общая
^синхронизация	синхронизация
\	•	Адрес	;
О \0 О оТо о о о о о о о оо\оо • \о о о	• о	•	о • о • о о
•	о\о о о”б\о ооооооооч о о е\о	о о	о\ о	о	о о о о о	о о\
о • о\о о «/о • оеоеоеое, • О 00/0	000000000'
•	о • о\ о •*. о • о • о • о • о •;
о • о •’ о • о • • о • о • о • о о • о • о • о • • о • о • о • о о • о • о • о • • о • о • о • о о • о • о • о • • о • о • о • о о • о • о • о • • о • о • о • о о • о • о • о • • о • о • о • о о • о • о • о • / • о • о о • О
Микропроцессор Intel® Pentium® 4 вид сверху
Vcc/ Vss
> о о о • о о о ) о • о о о о о г, о о •О О 0/0 »; о е/о ’ — у о о «о о ; о о •о о ; о о о • ; о о .о о ; о о .о о ; о о о” ; о о >о • ; о о •о о ; о о •о о * * ° >0 о ; о • •о о ; о о >• о ; о о
________________«о • Zo О *0 000000000'0000 'ooeloeoeoeoeoeoeo
/О 00'0	0000000000000
oooolooooooooooooo
/о оео/еоеоеоеоеоеоео оооо^оооооооооооооо
Сигналы асинхронной логики GTL или JTAG
J	Данные
/ Синхронизация . О = Питание • = "Земля" GND О = Сигнальные выводы
Рис. 19.5. Схема расположения выводов микропроцессора Pentium 4 в корпусе PGA с 423 выводами
Сопряжение с памятью
Для сопряжения с памятью микропроцессора Pentium 4 обычно используется, разработанный для этого процессора, чипсет Intel 8504. Чипсет Intel 850 обеспечивает
4 Помимо чипсета Intel 850 был разработан чипсет Intel 845, вначале ориентированный на дорогую память RDRAM, а также более распространенный чипсет Intel 865, выпущенный в начале 2003 г. - Ред.
Микропроцессоры Pentium II, Pentium III и Pentium 4
1107
двухканальную шину памяти для сопряжения ее с микропроцессором, причем каждый канал подключается к 32-разрядной части памяти. Совместное использование двух этих каналов составляет 64-разрядный канал сопряжения с микропроцессором. Память из-за двухканальной компоновки должна иметь пару модулей типа RDRAM, работающих на частоте 600 или 800 МГц. Такая организация памяти, по мнению Intel, должна повысить быстродействие памяти в три раза по сравнению с использованием памяти типа PC-100.
Набор регистров
Набор регистров микропроцессора Pentium 4 является почти идентичным со всеми другими версиями микропроцессора Pentium, исключая регистры ММХ, которые разделены от регистров сопроцессора. Кроме того, добавлены восемь 128-разрядных регистров ХММ для использования с командами поточной SIMD-обработки (SIMD — single instruction, multiple data) и расширенными 128-разрядными сдвоенными числами с плавающей точкой. Вы можете рассматривать регистры ХММ как MMX-регистры с удвоенной разрядностью, которые могут хранить пару 64-разрядных чисел с плавающей точкой удвоенной точности или четыре числа с плавающей точкой обычной точности. Регистры ХММ — это MMX-регистры удвоенной разрядности.
Если с сайта фирмы Microsoft5 загрузить новое обновление для ассемблера MASM 6.14, то программы могут транслироваться с использованием обеих команд, как ММХ, так и ХММ. Для трансляции программ с командами ММХ используйте директиву .ммх, а для программ с командами SIMD-обработки — директиву .хмм. В примере 19.3 показана очень простая программа, которая использует команды ММХ для сложения двух 8-байтных чисел.
Следует заметить, что директива .ммх используется для выбора набора команд. Команда movq пересылки учетверенных слов между памятью и регистрами ММХ. Регистры ММХ обозначаются от MM0 до ММ7^.Вы также можете использовать команды ММХ и SIMD в Microsoft Visual С со встроенным ассемблером, если вы загрузите самое последнее обновление с сайта фирмы Microsoft для Visual Studio версии 6.0.
Пример 19.3. Программа для сложения двух 8-байтных чисел с использованием команд ММХ
0000	.MODEL TINY .ММХ .DATA
0000	DATA1 DQ Iffh
00000000000001FF	
0008	DATA2 DQ lOlh
0000000000000101	
5 Обновления для любой версии www.microsoft.com фирмы Microsoft.
ассемблера
MASM 6.XX могут загружаться с сайта
1108
Глава 19
0010		DATA3 DQ ? .CODE .STARTUP
0000	0000000000000000	
0100	9В OF 6F 06 0000 R	MOVQ MM0,DATAl
0106	9В OF 6F 0Е 0008 R	MOVQ MM1,DATA2
оюс	9В OF FC Cl	PADDB MM0,MMl
оно	9В OF 7F 06 0010 R	MOVQ DATA3,MM0
.EXIT
END
Подобным образом программное обеспечение с командами ХММ может использоваться в программе с директивой .хмм. Большинство современных программ используют регистры ХММ и набор команд ХММ для выполнения мультимедийных и других высокоскоростных операций. В примере 19.4 приведена короткая программа, которая иллюстрирует применение нескольких команд ХММ. Эта программа умножает два множества из четырех чисел обычной точности и сохраняет четыре произведения в четырех двойных словах в ячейках, отведенных для переменной ANS. Для получения доступа к восьмеричным словам (128-байтным числам) используется указатель oword ptr. Также обратите внимание на то, что с профилем С используется модель FLAT. Поскольку команды SIMD функционируют только в защищенном режиме работы (модель WIN32), то мы определяем программу в формате модели FLAT. Это означает, что директивы .686 и .хмм должны предшествовать директиве .MODEL.
Пример 19.4<Лример, иллюстрирующий применение нескольких команд ХММ
.686
.ХММ
.MODEL FLAT,С
00000000	.DATA
00000000 3F800000	DATA1 DD 1.0
00000004 40000000	DD 2.0
00000008 40400000	DD 3.0
0000000C 40800000	DD 4.0
00000010 40C9999A	DATA2 DD 6.3
00000014 40933333	DD 4.6
00000018 40900000	DD 4.5
0000001C C0133333	DD -2.3
00000020 00000004 [	ANS DD 4 DUP(?)
00000000	
J 00000000	.CODE
00000000 OF 28 05	MOVAPS XMM0,OWORD PTR DATA1
00000000 R	
00000007 OF 28 0D	MOVAPS XMM1,OWORD PTR.DATA2
00000010 R	
0000000E OF 59 Cl	MULPS	XMM0,XMMl
Микропроцессоры Pentium II, Pentium III и Pentium 4
1109
00000011 OF 29 05 00000020 R
MOVAPS OWORD PTR ANS, XMMO
END
Г иперконвейернаятехнология
Микропроцессор Pentium 4 имеет более развитую конвейерную архитектуру, чем предыдущие версии микропроцессора Pentium. Он организует не только очередь из команд, но также и очередь из микрокоманд, предназначенных для выполнения, в специальной кэш-памяти ядра микропроцессора. Размер специальной кэш-памяти для микрокоманд составляет 12 Кбайт. Эта гиперконвейерная технология направлена исключительно на повышение производительности процессора.
Команда CPUID
Команда cpuid, как и в прежних версиях микропроцессора Pentium, возвращает стандартную информацию о производителе, если выполняется при нулевом значении регистра ЕАХ. Наиболее существенная часть информации о версии процессора возвращается в регистре ЕАХ, при условии, что перед выполнением команды cpuid в этом регистре содержится единица. Менее значимая часть идентификационной информации о поддерживаемых расширениях версии процессора возвращается в регистрах EDX и ЕСХ. Оставшаяся часть идентификационной информации возвращается после повторного выполнения команды cpuid при значении равном 3 в регистре ЕАХ до выполнения команды. Команда cpuid отображается в шестнадцатеричном виде как ХХХХ-ХХХХ-ХХХХ-ХХХХ-ХХХХ-ХХХХ.
В примере 19.5 показан образец кода, который получает идентификационную информацию о серийном номере микропроцессора и запоминает ее в трех двойных словах в памяти. Это программа работает как в реальном, так и в защищенном режиме работы.
Пример 19.5. Программа получения информации о версии микропроцессора
	.MODEL SMALL .686
0000	. DATA
0000	00000000	MOST DD ?
0004	00000000	MID DD ?
0008	00000000	LEAST DD ?
0000	.CODE
	.STARTUP	; чтение информации о микропроцессоре
0010	66| В8 00000001	MOV ЕАХ, 1
0016	OF А2	CPUID
0018	66| АЗ 0000 R	MOV MOST,ЕАХ
001С	66| B8 00000003	MOV ЕАХ,3
0022	OF A2	CPUID
0024	66| 89 16 0004 R MOV MID,EDX
0029	66| 89 0E 0008 R MOV LEAST,ECX
.EXIT
END
1110
Глава 19
Особенности применения микропроцессора Pentium 4
Микропроцессор Pentium 4 использует архитектуру стандарта АТХ, но имеются некоторые особенности, которые следует отметить. Блок питания для микропроцессора Pentium 4 отличается от других блоков питания АТХ. Блок питания микропроцессора Pentium 4 имеет стандартный разъем АТХ, разъем с напряжением 12 В и дополнительный разъем, который выглядит как разъем блока питания АТ. Все эти три разъема для правильного функционирования системы должны быть вставлены в системную плату компьютера, построенного на базе процессора Pentium 4.
Другая особенность системы на базе микропроцессора Pentium 4 связана с конструкцией системной платы. Системная плата для процессора Pentium 4 должна иметь четыре дополнительных конструктивных элемента жесткости. Если они отсутствуют, вы не сможете использовать системную плату для процессора Pentium 4, поскольку невозможно будет подсоединить к ней радиатор микропроцессора.
Блок питания микропроцессора также должен обеспечивать не менее 300 Вт, чтобы управлять дополнительной мощностью в 60—70 Вт, которые требуются микропроцессору. Этот микропроцессор нагревается несколько сильнее, чем предыдущие версии микропроцессора Pentium. Система обычно сообщает о температуре в 48,9 °C, что превышает нормальную температуру работающего микропроцессора Pentium III на 3,9 °C.
Итоги
П Микропроцессор Pentium II отличается от предыдущих микропроцессоров тем, что он вместо оформления в виде интегральной схемы выполнен на печатной плате, размещенной в специальном картридже.
□	Кэш-память второго уровня микропроцессора Pentium II смонтирована на печатной плате внутри картриджа, кроме версии процессора Pentium II Celeron, который не имеет кэш-памяти второго уровня. Тактовая частота кэш-памяти составляет 1/2 частоты микропроцессора Pentium II, кроме версии процессора Pentium II Хеоп, в котором кэш работает на частоте процессора. Все версии микропроцессора Pentium II имеют внутреннюю кэш-память первого уровня емкостью 32 Кбайта.
П Микропроцессор Pentium II является первым микропроцессором корпорации Intel, который управляется контроллером внешней шины. В отличие от прежних версий микропроцессора, которые сами формировали сигналы чтения и записи информации, микропроцессор Pentium II получает эти команды от контроллера внешней шины.
□	Микропроцессор Pentium II работает на частотах от 233 до 450 МГц при частоте синхронизации системной шины 66 или 100 МГц. Объем кэш-памяти второго уровня может составлять 512 Кбайт, 1 или 2 Мбайта. Микропроцессор Pentium II имеет 64-разрядную шину данных и 32-разрядную адресную шину, которые позволяют получать доступ к памяти объемом до 64 Гбайт.
□	Новыми командами, добавленными микропроцессору Pentium II, являются: SYSENTER, SYSEXIT, FXSAVE И FXRSTOR.
Микропроцессоры Pentium II, Pentium III и Pentium 4 1111
□	Команды sysenter и sysexit оптимизированы для получения доступа к операционной системе, имеющей нулевой уровень привилегий, при доступе с уровнем привилегий равным трем. Эти команды функционируют намного быстрее, чем переключатель задачи или даже комбинация вызова и возврата.
□	Команды fxsave и fxrstor оптимизированы для правильного сохранения и соответственно восстановления состояния блока MMX-команд и состояния сопроцессора.
□	Микропроцессор Pentium III представляет дальнейшую расширенную версию процессора, основанного на архитектуре микропроцессора Pentium Pro с добавлением команд поточной SIMD-обработки, которые используют регистры ХММ.
□	Микропроцессор Pentium 4 представляет собой расширенную архитектуру микропроцессора Pentium Pro с модернизациями, которые позволяют функционировать ему на больших тактовых частотах, чем прежде, благодаря применения более современной технологии производства в 0,18 мкм.
□	Микропроцессору Pentium 4 для правильного функционирования в системе требуются модифицированный АТХ блок питания и корпус.
□	Версия ассемблера MASM 6.14, а также Visual Studio 6.0 обеспечивают поддержку новым командам ММХ и SIMD за счет использования применения директив .686, .ММХ И .ХММ.
Контрольные вопросы и задания
1.	Какой объем кэш-памяти первого уровня имеется в микропроцессоре Pentium II?
2.	Какие объемы кэш-памяти второго уровня могут быть в различных версиях микропроцессора Pentium II? Перечислите все версии.
3.	В чем состоит отличие кэш-памяти второго уровня системы, построенной на базе микропроцессора Pentium, от кэш-памяти второго уровня системы, построенной на процессоре Pentium II?
4.	В чем состоит отличие между кэш-памятью второго уровня микропроцессоров Pentium Pro и Pentium II?
5.	Быстродействие кэш-памяти второго уровня микропроцессора Pentium II Хеоп в_раза
выше, чем быстродействие кэш-памяти второго уровня микропроцессора Pentium II (исключая Celeron).
6.	Какой объем памяти может адресовать микропроцессор Pentium II?
7.	Имеется ли микропроцессор Pentium II, выполненный в виде отдельной интегральной микросхемы?
8.	Какое количество выводов имеется в картридже микропроцессора Pentium II?
9.	Какое назначение управляющих сигналов VID?
10.	Что произошло с выводами чтения и записи в микропроцессоре Pentium II?
11.	С какой частотой работает системная шина микропроцессора Pentium И?
12.	Каково время рабочего цикла в микросхемах динамической памяти типа SDRAM, предназначенных для работы в системе, построенной на базе процессора Pentium II и с тактовой частотой системной шины равной 100 МГц?
13.	Какова разрядность памяти микропроцессора Pentium II при использовании кода коррекции ошибок ЕСС?
1112
Глава 19
14.	Какие новые модельно-специфические регистры MSR были добавлены в микропроцессоре Pentium II?
15.	Какая новая идентификационная информация, получаемая с помощью команды cpuid, была добавлена в микропроцессоре Pentium II?
16.	Каким образом адресуются модельно-специфические регистры MSR и какая команда используется для их чтения?
17.	Напишите программу для сохранения значения 12Н в модельно-специфическом регистре с номером 175Н.
18.	Напишите короткую процедуру для определения поддержки микропроцессором команд SYSENTER и SYSEXIT. Ваша процедура должна возвращаться с установленным флагом переноса CF при поддержке команд и со сброшенным флагом в противном случае.
19.	Каким образом при использовании команды sysenter передается обратный адрес на систему?
20.	Каким образом при использовании команды sysexit определяется адрес возврата для возвращения к приложению?
21.	На каком уровне привилегий команда SYSENTER передает управление программному обеспечению?
22.	На каком уровне привилегий команда SYSEXIT передает управление программному обеспечению?
23.	В чем состоит отличие между командами fsave и exsave?
24.	Микропроцессор Pentium III представляет расширенную архитектуру процессора ?
25.	Какие новые команды имеются в микропроцессоре Pentium III, но которых нет в микропроцессоре Pentium Pro?
ПРИЛОЖЕНИЕ 1
Директивы ассемблера, функции DOS и BIOS, управление мышью и интерфейс DPMI
В данном приложении приведены сведения, необходимые для программирования на языке ассемблера MASM версий 5.Ю и 6.Х в операционной системе DOS, касающиеся средств автоматизации программирования на языке ассемблера, моделей памяти, а также функций DOS, BIOS, драйвера мыши и интерфейса защищенного режима DPMI.
Использование инструментальных средств
Ассемблер обрабатывает текстовый файл с программой на языке ассемблера — так называемый исходный текст. Исходный текст подготавливается при помощи любого текстового редактора — отдельного или входящего в интегрированную среду разработки. В дистрибутиве MASM 5.Ю имеется текстовый редактор М.ЕХЕ, a MASM 6.Х поставляется со средой разработки PWB.EXE, которая включает в себя, помимо редактора, справочную систему с описанием операторов и директив языка ассемблера, функций DOS и BIOS.
После создания и редактирования исходного файла с расширением .ASM вызывается транслятор с языка ассемблера. При использовании интегрированной среды разработки трансляция запускается из меню командой Compile. Вызов MASM 6.14 из командной строки DOS и диалог с пользователем показаны в примере П1.1. Обратите внимание, что текст, вводимый пользователем, выделен полужирным.
..................................................................-...............•'..
Пример П1.1. Вызов транслятора MASM 6.14 из командной строки DOS
A>MASM
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981, 1997. All rights reserved.
Source filename [.ASM]:FROG
Object filename [FROG.OBJ]:FROG
List filename [NUL.LST]:FROG
Cross reference [NUL.CRF]:FROG
После успешной трансляции выполняется компоновка, в результате которой генерируется исполняемая программа. Компоновщик преобразует заданные объектные модули в файл с расширением .EXE. Диалог компоновщика в составе MASM 5.10
1114
Приложение 1
показан в примере П1.2. При использовании интегрированной среды разработки компоновщик вызывается после трансляции автоматически, если трансляция запущена командой Build. Отладка также может быть произведена непосредственно в среде разработки. Вызов отладчика Code view из командной строки DOS — cv.
Пример П1.2. Вызов компоновщика в составе MASM 5.10
A:\>LINK
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1983-1988. All rights reserved.
Object modules [,OBJ]:FROG Run file [FROG.EXE]:FROG List file [NUL.MAP]:FROG Libraries [.LIB]:SUBR
При использовании MASM 6.X трансляция и компоновка выполняются одной программой — ML. Пример диалога При вызове программы ML приведен в примере П1.3.
Пример П1.3. Вызов программы ML в составе MASM 6.Х	|
C:\>ML /F1TEST.LST TEST.ASM
Microsoft (R) Macro Assembler Version 6.14.844
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: TEST.ASM
Microsoft (R) Segmented-Executable Linker Version 5.13
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
Object Modules [.OBJ]: TEST.obj/t
Run File [TEST.com]: TEST.com
List File [NUL.MAP]: NUL
Libraries [.LIB]:
Definitions File [NUL.DEF]:
Вызов интегрированной среды разработки Programmer’s Workbench, в составе дистрибутива MASM 6.Х, выполняется командной строкой pwb. Среда разработки позволяет создавать и редактировать исходные тексты, а также транслировать, компоновать и отлаживать исполняемые программы. Работа с исходными текстами выполняется средствами полноэкранного редактора; его окно показано на рис. П1.1.
Модели памяти в ассемблере
Определение модели памяти при помощи директивы .model, приведенной в главе 4, используется во всех примерах программ в книге. Модель памяти определяет состав
Директивы ассемблера, функции DOS и BIOS, управление мышью
1115
Help
File Edit View Search Make Run Options Browse
C:\ASSM\SLOT.ASM
DATA	SEGMENT	33H	; position
POS	DB		
DATA	ENDS		
CODE	SEGMENT	’CODE’	
	ASSUME	CS:CODE,DS:DATA	
PORTA	EQU	40H	;port number
STEP	PROC	FAR	
	MOV	AL,POS	;get position
	CMP	CX.8000H	
	JA	RH	;if right-hand direction
	CMP	CX,0	
	JE	STEPJDUT	;if no steps
STEP1:			
	ROL	AL,1	;step left
	OUT	PORTA,AL	
			
<General Help> <F1=Help> <Alt=Menu>
Рис. П1.1. Окно текстового редактора среды Programmer’s Workbench
macro
00001.001
N
сегментов программы. В табл. П1.1 приведены характеристики всех моделей памяти, доступных в MASM.
Таблица П1.1. Модели памяти
Модель Свойства
Tiny Данные и код расположены в одном сегменте размером до 64 Кбайт. Формат исполняемой программы — .СОМ, со стартовым адресом по смещению 100Н
Small	Один сегмент данных размером до 64 Кбайт и один сегмент кода — до 64 Кбайт
Medium	Один сегмент данных размером до 64 Кбайт и любое число сегментов кода
Compact Один сегмент кода и любое число сегментов данных
Large	Любое количество сегментов кода и данных
Huge	Любое количество сегментов кода и данных, причем сегменты данных могут	быть
больше 64 Кбайт
Flat Данные и код расположены в одном сегменте размером до 512 Кбайт. Эта модель используется, в основном, в операционной системе Windows NT, поддерживается MASM 6.Х
Следует заметить, что при использовании модели Tiny исполняемый файл создается в формате .СОМ. В COM-программах данные и код помещаются в один сегмент, а точка входа всегда находится по смещению 01 ООН. COM-файл загружается в память быстрее ЕХЕ-файла. В большинстве примеров программ принята модель памяти Small, порождающая ЕХЕ-файлы.
Оператор .model вводит директивы для определения сегментов со свойствами, зависящими от выбранной модели памяти. Директивы и свойства сегментов для разных
1116
Приложение 1
моделей памяти приведены в табл. П1.2. Директивы используются для открытия сегментов. Так, например, директива .code отмечает начало сегмента кода (в большинстве моделей имя этого сегмента — text), а директива .data открывает сегмент данных (по имени data, в большинстве моделей). Тип выравнивания задает размещение программного сегмента в памяти по границе слова, двойного слова или 16-байтного параграфа. Тип объединения задает способ объединения одноименных сегментов разных модулей. Класс управляет размещением сегментов в памяти, а группа — объединением сегментов с разными именами1.
Таблица П1.2. Модели памяти и параметры определяемых ими сегментов 1
Модель	Директива	Имя сегмента	Тип выравнивания	Тип объединения	Класс	Группа
Tiny	.CODE	_ТЕХТ	word	PUBLIC	'CODE'	DGROUP
	.FARDATA	FAR—DATA	para	private	'FAR—DATA'	
	.FARDATA?	FAR_BSS	para	private	FAR—BSS	
	.DATA	_DATA	word	PUBLIC	DATA'	DGROUP
	.CONST	CONST	word	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	word	PUBLIC	'BSS'	DGROUP
Small	.CODE	_TEXT	word	PUBLIC	'CODE'	
	.FARDATA	FAR—DATA	para	private	'FAR—DATA'	
	.FARDATA?	FAR_BSS	para	private	'FAR—BSS'	
	.DATA	_DATA	word	PUBLIC	'DATA'	DGROUP
	.CONST	CONST	word	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	word	PUBLIC	'BSS'	DGROUP
	.STACK	STACK	para	STACK	'STACK'	DGROUP
Medium	CODE	name_TEXT	word	PUBLIC	'CODE'	
	.FARDATA	FAR—DATA	para	private	'FAR—DATA'	
	.FARDATA?	FAR—BSS	para	private	'FAR—BSS'	
	.DATA	_DATA	word	PUBLIC	'DATA'	DGROUP
	.CONST	CONST	word	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	word	PUBLIC	'BSS'	DGROUP
	.STACK	STACK	para	STACK	'STACK'	DGROUP
Compact	CODE	_TEXT	word	PUBLIC	'CODE'	
	.FARDATA	FAR—DATA	para	private	'FAR—DATA'	
	.FARDATA?	FAR—BSS	para	private	'FAR—BSS'	
1 Сегменты из разных модулей объединяются компоновщиком, если у них одинаковые имя и класс, а тип объединения — PUBLIC. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью________________1117
				Таблица П1.2		: (окончание)
Модель	Директива	Имя сегмента	Тип выравнивания	Тип объеди нения	Класс	Группа
	.DATA	_DATA	word	PUBLIC	'DATA'	DGROUP
	.CONST	CONST	word	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	word	PUBLIC	'BSS'	DGROUP
	. STACK	STACK	para	STACK	'STACK'	DGROUP
Large или Huge	CODE	name_TEXT	word	PUBLIC	'CODE'	
	.FARDATA	FAR_DATA	para	private	'FAR—DATA'	
	.FARDATA?	FAR-BSS	para	private	'FAR_BSS'	
	.DATA	_DATA	word	PUBLIC	'DATA'	DGROUP
	.CONST	CONST	word	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	word	PUBLIC	'BSS'	DGROUP
	.STACK	STACK	para	STACK	'STACK'	DGROUP
Flat	CODE	_TEXT	dword	PUBLIC	'CODE'	
	.FARDATA	_DATA	dword	PUBLIC	'DATA'	
	.FARDATA?	__BSS	dword	PUBLIC	'FBSS'	
	. DATA	_DATA	dword	PUBLIC	'DATA'	DGROUP
	.CONST	CONST	dword	PUBLIC	'CONST'	DGROUP
	.DATA?	_BSS	dword	PUBLIC	'BSS'	DGROUP
	.STACK	STACK	dword	STACK	'STACK'	DGROUP
Директивы в табл. П1.2, например, .code или .data, используются вместо традиционных директив .segment, в которых должны быть указаны все параметры сегмента — имя, тип выравнивания, тип объединения, класс и группа.
В примере П1.4 приведен вариант программы в модели Small. Эта модель памяти определяет один сегмент данных и один сегмент кода, что достаточно для большинства программ, разрабатываемых на языке ассемблера. Начало сегментов отмечено директивами .data (данные) и .code (код). Для настройки регистра DS на сегмент данных предусмотрена директива .startup, которая также задает точку входа в программу. В этом примере директива .startup не используется, поэтому инструкции для записи сегментного адреса в регистр DS заданы явно, а точка входа (begin) определена в операторе end.
Пример П1.4. Программа в модели памяти Small	ч
Microsoft (R) Macro Assembler Version 6.14.8444
.MODEL SMALL
.STACK 100H
1118
Приложение У,
0000	.DATA
0000 0A 0001 0064 [	FROG DB 10 DATA1 DB 100 DUP (2)
02 ] 0000 0000 B8 — R	.CODE BEGIN: MOV AX,DGROUP	; настройка регистра DS
0003 8E D8 Segments and Name	MOV DS,AX END BEGIN Groups: Size Length Align Combine Class
DGROUP . _DATA .	GROUP 16 Bit 0065 Word Public 'DATA'
STACK .	16 Bit 0100 Para Stack 'STACK'
TEXT	16 Bit 0005 Word Public 'CODE'
Symbols:			
Name	Type	Value	Attr
@CodeSize .	. Number	OOOOh	
@DataSize	. Number	OOOOh	
(^Interface .	Number	OOOOh	
@Модель .	. Number	0002h	
@code .	. Text		_TEXT
@data . .	Text		DGROUP
@fardata?	Text		FAR_BSS
@fardata .	Text		FAR—DATA
@stack .	Text		DGROUP
BEGIN .	. L Near	0000	_TEXT
DATA1 .	. Byte	0001	_DATA
FROG .	Byte	0000	_DATA
О Warnings
О Errors
В примере П1.5 приведена программа в модели памяти Large.
Пример П1.5. Программа в модели памяти Large
Microsoft (R) Macro Assembler Version 6.14.8444
.MODEL LARGE
.STACK 100OH
0000	.FARDATA?
0000 00	FROG DB	?
0001 0064 [ DATA1 DW 100 DUP (?)
0000
]
0000	.CONST
0000 54 68 69 73 20 69 MES1 DB 'This is a character string' •
73 20 61 20 63 68
Директивы ассемблера, функции DOS и BIOS, управление мышью
1119
61 72 61 63 74 65
72 20 73 74 72 69
6Е 67
001А 53 6F 20 69 73 20 MES2 DB 'So is this!'
74 68 69 73 21
0000 0000 ооос 0002 00С8	.DATA DATA2 DW 12	
	[ DATA3 01	DB 200 DUP (1)
0000	J	.CODE
0000	FUNC	PROC FAR
0000 св		RET
0001	FUNC	ENDP
		END FUNC
Segments and Groups:			
Name	Size Length Align	Combine Class	
DGROUP _DATA .	GROUP 16 Bit 00CA Word	Public 'DATA'	
STACK .	. 16 Bit 1000 Para	Stack 'STACK'	
CONST . .	. 16 Bit 0025 Word	Public 'CONST'	Readonly
EXA_TEXT .	16 Bit 0001 Word	Public 'CODE'	
FAR-BSS .	. 16 Bit 00C9 Para	Private ' FAR_BSS	f
_TEXT .	. 16 Bit 0000 Word	Public 'CODE'	
Procedures,	. parameters and locals:		
N a	m e	Type Value	Attr	
FUNC .	P Far 0000	EXA_TEXT Length=	0001 Public
Symbols: Name	Type Value	Attr	
@CodeSize . @DataSize . (^Interface @Модель . @code . .	Number OOOlh Number OOOlh . Number OOOOh Number 0005h Text	EXA_TEXT	
@data . .	Text	DGROUP	
@fardata?	Text	FAR-BSS	
@fardata .	. Text	FAR_DATA	
@stack .	. Text	DGROUP	
DATAI .	Word 0001	FAR_BSS	
DATA2 .	Word 0000	_DATA	
DATA3 .	Byte 0002	_DATA	
FROG .	. Byte 0000	FAR_BSS	
MES1 .	. Byte 0000	CONST	
MES2 .	. Byte 001A	CONST	
0 Warnings
0 Errors
1120
Приложение 1
Вызов функций DOS
При вызове функций DOS номер функции указывается в регистре АН. После установки входных параметров выполняется команда int 21н. В примере П1.6 приведен вариант вызова функции DOS для отображения на дисплее латинской буквы А, в позиции курсора.
Пример П1.6. Вызов функции DOS
0000 В4 Об	MOV	АН, 6	; номер функции
0002 В2 41	MOV	DL, 'А'	; выводимый символ
0004 СВ 21	INT	21Н	; вызов DOS-функции
В табл. П1.3 приведен полный перечень функций DOS, доступных по прерыванию INT 21Н. Заметим, что некоторые функции предполагают задание адреса в формате сегмент:смещение. Например, DS:DI означает, что сегментный адрес находится в регистре DS, а смещение — в DI. Номер функции всегда указывается в регистре АН. Как правило, функции DOS сохраняют значения регистров (кроме тех, что используются для передачи результатов), хотя бывают и исключения.
Таблица Г11.3. Функции DOS
ООН	Завершение программы
При вызове	АН = ООН CS = адрес префикса программного сегмента (PSP)
Пояснение	Возврат в DOS
01Н	Ввод с клавиатуры с эхо
При вызове	АН = 01Н
При возврате	AL = ASCII-код
Пояснение	Если AL = ООН, функцию следует вызывать повторно для чтения расширенного ASCII-кода клавиши. (Расширенные коды ASCII клавиш см. в главе 7 в табл. 7.3)
02Н	Вывод в стандартный выходной поток
При вызове	АН = 02Н DL = ASCII-код для вывода
Пояснение	Вывод на дисплей, если стандартный выходной поток не перенаправлен
ОЗН	Ввод из последовательного порта СОМ1
При вызове	АН = ОЗН
При возврате	AL = ASCII-код, прочитанный из СОМ-порта
Пояснение	Функция считывает байт, принятый СОМ-портом
Директивы ассемблера, функции DOS и BIOS, управление мышью
1121
Таблица П1.3 (продолжение)
04Н	Вывод в последовательный порт СОМ1
При вызове	АН = 04Н DL = символ для передачи через порт СОМ1
Пояснение	Функция передает данные по последовательному каналу связи. Канал, связанный с именем СОМ1, может бьпь переназначен DOS-командой mode
05Н	Вывод в параллельный порт LPT1
При вызове	АН = 05Н DL = ASCII-код для вывода на принтер
Пояснение	Выводит символ из регистра DL на принтер, подключенный к порту LPT1. Логическое имя LPT1 может быть присвоено другому параллельному порту DOS-командой MODE
06Н	Прямой ввод-вывод на консоль
При вызове	АН = 06Н DL = 0FFH или ASCII-код
При возврате	AL = ASCII-код
Пояснение	При вызове значение DL = 0FFH задает ввод с клавиатуры без эхо; при । возврате значение флага ZF = 0 означает, что символ введен и записан в AL. Если при этом AL = 0, чтение следует повторить для получения расширенного ASCII-кода. При входном значении DL <> 0FFH символ из DL выводится на дисплей (устройство CON)
07Н	Прямой ввод с клавиатуры без эхо	'
При вызове	АН = 07Н
При возврате I AL = ASCII-код
Пояснение				 Функция 07Н аналогична функции *01Н, но работает без эхо, и при ее выполнении не проверяется нажатие комбинации клавиш <Ctrl>+<Break>
08Н	Ввод из стандартного устройства ввода без эхо
При вызове	АН = 08Н
При возврате	AL = ASCII-код
Пояснение	Функция 08Н аналогична функции 07Н, но ввод выполняется из стандартного устройства ввода. Этим устройством может быть клавиатура или СОМ-порт. Также функция 08Н проверяет нажатие комбинации клавиш <Ctrl>+<Break>, в отличие от функций 06Н и 07Н. Нажатие <Ctrl>+<Break> вызывает прерывание INT 23Н			
09Н	Вывод строки символов
При вызове	АН = 09Н DS:DX = адрес строки символов
Пояснение	Строка должна завершаться символом $ (24Н), может содержать управляющие символы, такие как возврат каретки (0DH) и перевод строки (ОАН); длина строки не ограничена
36 Зак 384
U22
Приложение 1
	Таблица П1.3 (продолжение)
ОАН	Буферизованный ввод с клавиатуры
При вызове	АН = ОАН DS:DX = адрес буфера ввода
Пояснение	В первом байте буфера задан размер буфера в байтах, до 255. Ввод продолжается до нажатия клавиши <Enter>; при превышении размера буфера подается звуковой сигнал и дальнейший ввод блокируется (разрешено удаление символов или завершение ввода). После выполнения функции ОАН во втором байте буфера записано число введенных символов, не считая возврата каретки. С третьего байта в буфере записаны введенные символы, с завершающим кодом возврата каретки (0DH)
овн	Проверка состояния стандартного устройства ввода
При вызове	АН = ОВН
При возврате	AL = состояние устройства ввода
Пояснение	Функция проверяет наличие символа в стандартном устройстве ввода. На выходе AL = 00 означает, что данных нет, a AL = 0FFH — что данные имеются и могут быть прочитаны, например, функцией 08Н
ОСН	Очистка буфера клавиатуры и выполнение функции ввода
При вызове	АН = ОСН AL = 01H, 06Н, 07Н или ОАН
При возврате	См. описание функций 01Н, 06Н, 07Н и ОАН
Пояснение	Функция удаляет информацию о нажатии клавиш из клавиатурного буфера и выполняет функцию ввода, номер которой задан в регистре AL
0DH	Очистка дисковых буферов
При вызове	АН = 0DH
Пояснение	Очищает дисковые буферы открытых файлов, не закрывая файлы
ОЕН	Смена текущего диска
При вызове	АН = ОЕН DL = номер нового текущего диска
При возврате	AL = общее количество дисков в системе
Пояснение	Номер диска А — ООН, диска В — 01Н, диска С — 02Н и т. д.
0FH	Открытие файла по методу FCB
При вызове	АН = 0FH DS:DX = адрес неоткрытого блока управления файлом (FCB2)
При возврате	AL = ООН, если файл найден AL = 0FFH, если файл не найден
2 FC В — File Control Block. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1123
Таблица П1.3 (продолжение)
Пояснение	Блок управления файлом (FCB) использовался в ранних версиях DOS; больше применять его не рекомендуется. Метод FCB, в отличие от более позднего метода файловых манипуляторов, не позволяет задавать полный путь к файлу. Структура FCB показана на рис. П1.2. Файл может быть открыт, если он существует или создан функцией 16Н
ЮН	Закрытие файла (метод FCB)
При вызове	АН = ЮН DS:DX = адрес открытого блока управления файлом FCB
При возврате	AL = ООН, если файл закрыт AL = 0FFH при ошибке
Пояснение	Ошибки обычно вызваны переполнением диска или неисправностью носителя
11Н	Поиск первого файла с совпадающим именем (метод FCB)
При вызове	АН = 11Н DS:DX = адрес неоткрытого блока управления файлом FCB
При возврате	AL = ООН, если файл найден AL = 0FFH, если файл не найден
Пояснение	Имя искомого файла может содержать метасимволы (? и *). Метасимвол ? задает любой одиночный символ, а *— произвольную последовательность символов
12Н	Поиск следующего файла с совпадающим именем (метод FCB)
При вызове	АН = 12Н DS:DX = адрес неоткрытого FCB, указанного при вызове функции 11Н
При возврате	AL = ООН, если файл найден AL = 0FFH, если файл не найден
Пояснение	Функция вызывается после поиска первого файла с совпадающим именем (т. е. после функции 11Н)
13Н	Стирание файла (метод FCB)
При вызове	АН = 13Н DS:DX = адрес удаляемого блока управления файлом FCB
При возврате	AL = ООН, если файл удален AL = 0FFH при ошибке
Пояснение	Наиболее частая ошибка — неисправность носителя
14Н	Последовательное чтение (метод FCB)
При вызове	АН = 14Н DS:DX = адрес открытого блока управления файлом FCB
1124
Приложение 1
	Таблица П1.3 (продолжение)
При возврате	В регистре AL — код завершения: □	ООН — запись прочитана □	01Н — конец файла (нет прочитанных данных) □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайт)
	□ ОЗН — конец файла (прочитана часть записи размером менее 128 байт)
15H При вызове	Последовательная запись (метод FCB) АН = 15Н DS:DX = адрес открытого блока управления файлом FCB
При возврате	В регистре AL — код завершения: □	ООН — запись успешна □	01Н—диск переполнен □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайг)
16Н	Создание файла (метод FCB)
При вызове	АН = 16Н DS:DX = адрес неоткрытого блока управления файлом FCB
При возврате	AL = ООН, если файл создан AL = 01Н, если диск переполнен
17Н	Переименование файла (метод FCB)
При вызове	АН = 17Н DS:DX = адрес неоткрытого блока управления файлом FCB, с новым именем
	файла
При возврате	AL = ООН, если файл переименован AL = 01Н, если ошибка
Пояснение	Содержимое FCB для этой функции показано на рис. П1.3
19Н	Получение номера текущего диска
При вызове	АН = 19Н
При возврате	AL = номер текущего диска
Пояснение	AL = ООН — диск А, 01Н — диск В и т. д.
1АН	Изменение адреса области данных для обмена с диском — DTA3 >	' л
При вызове	АН = 1АН DS:DX = адрес новой области для обмена с диском
3 DTA — Disk Transfer Area. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1125
Таблица П 1.3 (продолжение)
Пояснение	Область для обмена с диском (DTA) при запуске программы располагается в префиксе программного сегмента (PSP) по смещению 80Н. Область DTA используется DOS во всех файловых операциях по методу FCB, а также при поиске файла функциями 4ЕН и 4FH
1ВН	Получение информации о таблице распределения файлов (FAT4) текущего диска
При вызове	АН = 1ВН
При возврате	AL = количество секторов в кластере DS:BX = адрес дескриптора диска СХ = размер сектора в байтах DX = число кластеров в диске
Пояснение	Формат байта дескриптора диска показан на рис. П1.4. Обратите внимание, что функция изменяет значение регистра DS
1СН	Получение информации о таблице распределения файлов (FAT) произвольного диска
При вызове	АН = 1СН DL = номер диска
При возврате	AL = количество секторов в кластере DS:BX = адрес дескриптора диска СХ = размер сектора в байтах DX = число кластеров в диске
21Н	Чтение с прямым доступом по методу FCB
При вызове	АН = 21Н DS:DX = адрес открытого блока управления файлом FCB
При возврате	В регистре AL — код завершения: □	ООН — запись прочитана □	01Н — конец файла (нет прочитанных данных) □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайт) □	ОЗН — конец файла (прочитана часть записи размером менее 128 байт)
22Н	Запись с прямым доступом по методу FCB	__
При вызове	АН - 22Н DS:DX = адрес открытого блока управления файлом FCB
4 FAT — File Allocation Table. — Пер.
1126
Приложение 1
Таблица П 1.3 (продолжение)
При возврате	В регистре AL — код завершения: □	ООН — запись успешна □	01Н — диск переполнен □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайт)
23Н	Получение информации о размере файла (метод FCB)
При вызове	АН = 23Н DS:DX = адрес открытого блока управления файлом FCB
При возврате	AL = ООН, если файл найден5 AL = 0FFH, если файл не найден
24Н	Установление номера записи для прямого доступа к файлу (метод FCB)
При вызове	АН = 24Н DS:DX = адрес открытого блока управления файлом FCB
Пояснение	Заполняет поле номера записи так, чтобы оно соответствовало полям номера блока и номера записи в блоке
25Н	Изменение вектора прерывания
При вызове	АН = 25Н AL = номер вектора прерывания DS:DX = адрес новой процедуры обработки прерывания
Пояснение	Предполагается, что перед изменением вектора его прежнее значение прочитано функцией 35Н и сохранено в памяти для последующего восстановления
26Н	Создание префикса программного сегмента (PSP6)
При вызове	АН = 26Н DX = сегментный адрес нового префикса программного сегмента PSP
Пояснение	Структура префикса программного сегмента показана на рис. П1.5
27Н	Прямое чтение группы записей (метод FCB)
При вызове	АН = 27Н СХ = число записей DS:DX = адрес открытого блока управления файлом FCB
5 Данные о размере файла сохраняются в FCB. — Пер.
6 PSP — Program Segment Prefix. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1127
	Таблица П1.3 (продолжение)
При возврате	Регистр AL — код завершения: □	ООН — запись прочитана □	01Н — конец файла (нет прочитанных данных) □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайт) □	ОЗН — конец файла (прочитана часть записи размером менее 128 байт) Регистр СХ — число прочитанных записей
28Н	Прямая запись группы записей (метод FCB)
При вызове	АН = 28Н СХ = число записей DS:DX = адрес открытого блока управления файлом FCB
При возврате	В регистре AL — код завершения: □	ООН — запись успешна □	01Н — диск переполнен □	02Н — недостаточный размер DTA (смещение в сегменте DTA превысило 64 Кбайт) СХ — число записанных записей
29Н	Разбор имени файла (метод FCB)
При вызове	АН = 29Н AL = режим разбора ES:DI = указатель области памяти для построения неоткрытого блока управления файлом FCB с именем файла DS:SI = адрес строки файловой спецификации
При возврате	AL — код завершения: □	ООН — метасимволы в файловой спецификации не обнаружены □	01Н — метасимволы обнаружены □	OFFH — недействительное имя устройства DS:SI = указатель первого символа после файловой спецификации ES:DI = адрес блока управления файлом FCB
2АН	Чтение системной даты
При вызове	АН = 2АН			
При возврате	AL = день недели СХ = год (1980-2099) DH = месяц (1-12) DL = число (1 -31)			
Пояснение	Дни недели отсчитываются от воскресенья (ООН); последний (шестой) день — суббота
1128
Приложение 1
	Таблица П1.3 (продолжение)
2ВН	Изменение системной даты
При вызове	АН = 2ВН СХ = год (1980-2099) DH = месяц DL = число
2СН	Чтение системного времени
При вызове	АН = 2СН
При возврате	СН = час (0-23) CL = минуты DH = секунды DL = сотые доли секунды
Пояснение	Формат выходных данных — двоичный. Точность часов — около 1/18 с
2DH	Изменение системного времени
При вызове	АН = 2DH СН = час (0-23) CL = минуты DH = секунды DL = сотые доли секунды
2ЕН	Проверка при записи на диск
При вызове	АН = 2ЕН AL = ООН — отключает проверку при записи
	AL = 01Н — активизирует проверку при записи
Пояснение	По умолчанию проверка отключена
2FH	Получение адреса области данных для обмена с диском (DTA)
При вызове	АН = 2FH
При возврате	ES:BX = адрес текущего DTA
ЗОН	Чтение версии DOS
При вызове	АН = ЗОН
При возврате	AL = номер версии АН = номер модификации
Пояснение	Например, в DOS 3.2 функция ЗОН вернет AL = 3 и АН = 14Н
Директивы ассемблера, функции DOS и BIOS, управление мышью
1129
	Таблица П1.3 (продолжение)
31 н	Завершение программы с сохранением в памяти (TSR7)
При вызове	АН = 31Н AL = код завершения DX = объем резервируемой памяти в параграфах
Пояснение	Размер параграфа составляет 16 байт; код завершения доступен в ВАТ-фай-лах под именем errorlevel
ЗЗН	Управление проверкой нажатия комбинации клавиш <Ctrl>+<Break>
При вызове	АН = ЗЗН AL = ООН — получение информации о текущей установке флага проверки нажатия комбинации клавиш <Ctrl>+<Break> AL = 01Н — изменить установку флага проверки DL = ООН — отключить проверку DL = 01Н — включить проверку
При возврате	DL = текущее состояние флага проверки
34Н	Получение адреса флага занятости DOS (InDOS)
При вызове	АН = 34Н
При возврате	ES:BX = адрес байта с флагом InDOS
Пояснение	Признак InDOS, доступный с DOS 3.2, показывает, занята DOS в данный момент или свободна. При InDOS = ООН — DOS свободна, при 0FFH — занята8
35Н	Чтение вектора прерывания
При вызове	АН = 35Н AL = номер вектора прерывания
При возврате	ES:BX = текущее значение вектора
Пояснение	Функция 35Н используется совместно с функцией 25Н для установки и удаления процедур обработки прерываний
36Н	Определение? размера свободного дискового пространства
При вызове	АН = 36Н DL = номер диска
При возврате	АХ = FFFFH — недопустимый номер диска АХ = число секторов в кластере ВХ = число свободных кластеров
7 TSR — Terminate but Stay Resident. — Пер.
8 Признак In DOS необходимо проверять при каждом вызове функций DOS из процедур обработки внешних прерываний в составе резидентных программ. — Пер.
1130
Приложение 1
Таблица П1.3 (продолжение)
	СХ = число байт в секторе DX = число кластеров в диске
Пояснение	Номер текущего диска — ООН, диска А — 01Н, диска В — 02Н и т. д.
38Н	Получение информации, специфической для страны
При вызове	АН = 38Н AL = ООН — информация о текущей стране AL <> ООН — информация о стране с кодом AL ВХ = 16-битный код страны при AL = 0FFH DS:DX = адрес буфера для записи информации о стране
При возврате	АХ = код ошибки, если С = 1 ВХ = код страны
39Н	Создание каталога
При вызове	АН = 39Н DS:DX = адрес строки ASCIIZ, в которой задан путь к каталогу
При возврате	АХ = код ошибки, если С = 1
ЗАН	Удаление каталога
При вызове	АН = ЗАН DS:DX = адрес строки ASCIIZ, в которой задан путь к каталогу
При возврате	АХ = код ошибки, если С = 1
звн	Смена каталога
При вызове	АН = ЗВН DS:DX = адрес строки ASCIIZ, в которой задан путь к каталогу
При возврате	АХ = код ошибки, если С = 1
ЗСН	Создание файла
При вызове	АН = ЗСН СХ = атрибуты файла DS:DX = адрес строки ASCIIZ9 с именем файла
При возврате	АХ = код ошибки, если флаг С = 1 АХ = файловый манипулятор, если С = 0
9 Строка ASCIIZ — это последовательность ASCII-символов, заканчивающаяся байтом со значением 0 (null-символ). — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1131
Таблица П1.3 (продолжение)
Пояснение	Атрибуты определяются установленными в логическую единицу битами регистра СХ со следующими значениями масок: □	01Н — доступ только на чтение □	02Н — скрытый файл или каталог □	04Н — системный файл □	08Н — метка тома □	ЮН —каталог □	20Н — архивный файл В большинстве случаев при создании файла СХ = 0000Н
3DH	Открытие файла
При вызове	АН = ЗОН AL = режим открытия (код доступа) DS:DX = адрес строки ASCIIZ с именем файла
При возврате	АХ = код ошибки, если CF = 1 АХ = файловый манипулятор, если CF = 0
Пояснение	Код доступа в AL определяет права при доступе к файлу: □	ООН — только чтение □	01Н — только запись □	02Н — и чтение, и запись Права доступа к разделяемому файлу при работе в сети определяются следующими битами AL: □	бит 4 = 1 — запрет чтения-записи □	бит 5 = 1—запрет записи □	бит 6 = 1 — чтение и запись разрешены □	бит 7 = 0 — файл может быть использован заново порожденным процессом □	бит 7 = 1 — файл используется только текущим процессом
ЗЕН	Закрытие файла
При вызове	АН = ЗЕН ВХ = файловый манипулятор		
При возврате	АХ = код ошибки при CF = 1		
3FH	Чтение из файла или устройства		
При вызове	АН = 3FH ВХ = файловый манипулятор СХ = число байт для чтения DS:DX = адрес буфера для сохранения прочитанных данных
1132
Приложение 1
Таблица П 1.3 (продолжение)
При возврате	АХ = код ошибки, если CF = 1 АХ = число прочитанных байт, если CF = 0
40Н	Запись в файл или устройство
При вызове	АН = 40Н ВХ = файловый манипулятор СХ = число байт для записи DS:DX = адрес буфера сданными для записи
При возврате	АХ = код ошибки, если CF = 1 АХ = число записанных байт, если CF = 0
41Н	Стирание файла
При вызове	АН = 41Н DS:DX = адрес строки ASCIIZ с именем файла
При возврате	АХ = код ошибки при CF = 1
42Н	Перемещение указателя чтения-записи в файле
При вызове	АН = 42Н AL = метод перемещения ВХ = файловый манипулятор СХ DX = смещение указателя в байтах
При возврате	АХ = код ошибки, если С = 1 AX.DX = новое значение позиции указателя
Пояснение ।	Метод перемещения определяет точку и направление отсчета смещения: i □	ООН -- от начала файла в прямом направлении □	01Н — от текущей позиции в прямом направлении □	02Н — от конца файла в обратном направлении Смещения хранятся в двойном слове, старшая часть — в регистре СХ или АХ, младшая часть — в регистре DX
43Н	Чтение/запись атрибутов файла
При вызове	АН = 43Н AL = ООН — чтение атрибутов AL - 01Н — запись атрибутов СХ = атрибуты (см. описание функции ЗСН) DS:DX = адрес строки ASCIIZ с именем файла
При возврате	АХ = код ошибки, если С - 1 СХ = слово атрибутов, если С = 0
Директивы ассемблера, функции DOS и BIOS, управление мышью
1133
Таблица П1.3 (продолжение)
44Н	Управление устройством ввода-вывода (IOTCL10)
При вызове	АН = 44Н AL = код подфункции
При возврате	АХ = код ошибки, если С = 1 (см. описание функции 59Н)
Пояснение	Код подфункций в регистре AL: □	ООН = запрос информации об устройстве При вызове: ВХ = дескриптор файла или устройства При возврате: DX = информация об устройстве □	01Н = изменение параметров устройства При вызове: ВХ = дескриптор файла или устройства, DH = 0, DL = параметры При возврате: АХ = код ошибки, если CF = 1 □	02Н = чтение управляющих данных из символьного устройства При вызове: ВХ = дескриптор устройства, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число прочитанных байт □	ОЗН = запись управляющих данных в символьное устройство При вызове: ВХ = дескриптор устройства, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число переданных байт □	04Н = чтение управляющих данных из блочного устройства При вызове: BL = номер диска (0 — текущий диск, 1 — диск А:, 2 — диск В: и т. д.), СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число прочитанных байт □	05Н = запись управляющих данных в блочное устройство При вызове: BL = номер диска, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число переданных байт □	06Н = проверка состояния ввода При вызове: ВХ = дескриптор устройства При возврате: AL = ООН — готово, FFH — не готово □	07Н = проверка состояния вывода При вызове: ВХ = дескриптор устройства При возврате: AL = ООН — готово, FFH — не готово □	08Н = проверить, использует ли блочное устройство съемный носитель При вызове: BL = номер диска При возврате: AL = ООН — да, 01Н — нет
10 IOCTL - I/O Control. - Пер.
1134
Приложение 1
Таблица П1.3 (продолжение)
□	09Н = получить дополнительную информацию о локальном или сетевом устройстве
При вызове: BL = номер диска
При возврате: бит 12 регистра DX установлен, если блочное устройство сетевое
□	ОАН = проверить, принадлежит ли дескриптор файла локальному или сетевому устройству
При вызове: ВХ = дескриптор файла
При возврате: бит 15 регистра DX установлен, то устройство сетевое
□	ОВН = задание числа повторных попыток блокировки при совместном доступе к файлам
При вызове: СХ = счетчик циклов задержки между попытками, dx = число попыток перед вызовом критической ошибки
При возврате: АХ = код ошибки, если С = 1
□	ОСН = поддержка переключений кодовых таблиц
При вызове: ВХ = дескриптор устройства, СН = тип устройства, CL = операция
• тип устройства:
°	0 —	неизвестен
°	1 — СОМ-порт
°	3 — консоль
°	5 — LPT-порт
• операция:
°	CL = 45Н — установить счетчик итераций
°	CL = 4АН — выбрать подготовленную кодовую страницу
°	CL = 4СН — начать подготовку кодовой страницы
°	CL = 4DH — закончить подготовку кодовой страницы
°	CL = 5FH — задать параметры дисплея
°	CL = 65Н — прочитать счетчик итераций
°	CL = 6АН — получить текущую кодовую страницу
°	CL = 6ВН — получить список подготовленных кодовых страниц
°	CL = 7FH — получить информацию о дисплее
□	0DH = операции управления блочными устройствами
При вызове: BL = номер диска, СН = тип устройства, CL = операция, DS:DX = адрес блока параметров
•	тип устройства: 08Н = диск
•	операция:
°	CL = 40Н — установить параметры устройства
°	CL = 41H — запись дорожки
°	CL = 42Н — форматирование дорожки с верификацией
°	CL = 46Н — установить идентификатор носителя
Директивы ассемблера, функции DOS и BIOS, управление мышью
1135
Таблица П1.3 (продолжение)
	п CL = 47Н — установить флаг доступа	
	□ □	п	CL = 60Н — прочитать параметры устройства °	CL = 61Н — чтение дорожки °	CL = 62Н — верификация дорожки °	CL = 66Н — получить идентификатор носителя CL = 67Н — прочесть код доступа ОЕН = выяснить, сколько логических устройств соответствует физическому устройству При вызове: BL = номер диска При возврате: AL = номер последнего логического устройства 0FH = установить логический диск При вызове: BL = номер диска При возврате: AL = номер последнего логического устройства
Пояснение	Код подфункций в регистре AL: □	ООН = запрос информации об устройстве При вызове: ВХ = дескриптор файла или устройства При возврате: DX = информация об устройстве □	01Н = изменение параметров устройства При вызове: ВХ = дескриптор файла или устройства, DH = 0, DL = параметры При возврате: АХ = код ошибки, если CF = 1 □	02Н = чтение управляющих данных из символьного устройства При вызове: ВХ = дескриптор устройства, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число прочитанных байт □	ОЗН = запись управляющих данных в символьное устройство При вызове: ВХ = дескриптор устройства, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число переданных байт □	04Н = чтение управляющих данных из блочного устройства При вызове: BL = номер диска (0 — текущий диск, 1 — диск А:, 2 — диск В: и т. д.), СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число прочитанных байт □	05Н = запись управляющих данных в блочное устройство При вызове: BL = номер диска, СХ = число байт, DS:DX = адрес буфера При возврате: АХ = число переданных байт □	06Н = проверка состояния ввода При вызове: ВХ = дескриптор устройства При возврате: AL = ООН — готово, FFH — не готово	
1136
Приложение 1
Таблица П1.3 (продолжение)
□	07Н = проверка состояния вывода
При вызове. ВХ = дескриптор устройства
При возврате' AL = ООН — готово. FFH — не готово
□	08Н = проверить, использует ли блочное устройство съемный носитель
При вызове: BL = номер диска
При возврате' AL = ООН — да, 01Н -- нет
□	09Н = получить дополнительную информацию о локальном или сетевом устройстве
При вызове: BL = номер диска
При возврате, бит 12 регистра DX установлен, если блочное устройство сетевое
□	ОАН = проверить, принадлежит ли дескриптор файла локальному или сетевому устройству
При вызове' ВХ = дескриптор файла
При возврате: бит 15 регистра DX установлен, то устройство сетевое
□	ОВН = задание числа повторных попыток блокировки при совместном доступе к файлам
При вызове' СХ ~ счетчик циклов задержки между попытками, dx = число попыток перед вызовом критической ошибки
При возврате: АХ = код ошибки, если С = 1
□	ОСН = поддержка переключений кодовых таблиц
При вызове: ВХ = дескриптор устройства, СН = тип устройства, CL = операция
• тип устройства:
° 0 — неизвестен
1 — СОМ-поот
°	3 — консоль
° 5 — LPT-порт
• операция:
°	CL = 45Н — установить счетчик итераций
CL - 4АН — выбрать подготовленную кодовую страницу
CL = 4СН — начать подготовку кодовой страницы
CL = 4DH — закончить подготовку кодовой страницы
п	CL = 5FH — задать параметры дисплея
°	CL = 65Н — прочитать счетчик итераций
°	CL = 6АН — получить текущую кодовую страницу
п	CL = 6ВН — получить список подготовленных кодовых страниц
а	CL = 7FH — получить информацию о дисплее
Директивы ассемблера, функции DOS и BIOS, управление мышью
1137
Таблица П1.3 (продолжение)
I □ ODH = операции управления блочными устройствами
| При вызове: BL ~ номер диска, СН = тип устройства, CL = операция, I DS:DX = адрес блока параметров
|	•	тип устройства: 08Н = диск
I	•	операция.
° CL = ДОН — установить параметры устройства
I	° CL = 41Н — запись дорожки
I	° CL = 42Н — форматирование дорожки с верификацией
° CL = 46Н — установить идентификатор носителя
CL = 47Н — установить флаг доступа
° CL = 60Н — прочитать параметры устройства
i ° CL = 61H — чтение дорожки
° CL = 62Н — верификация дорожки
	с CL = 66Н — получить идентификатор носителя ° CL = 67Н — прочесть код доступа □	ОЕН = выяснить, сколько логических устройств соответствует физическому устройству При вызове' BL = номер диска При возврате: AL = номер последнего логического устройства □	0FH = установить логический диск При вызове: BL = номер диска При возврате: AL = номер последнего логического устройства
45Н	Копирование файлового манипулятора	\ л ' \
При вызове	АН = 45Н ВХ = существующий файловый манипулятор
При возврате	АХ = код ошибки, если CF = 1 АХ = дублированный файловый манипулятор, при CF = 0
46Н	Уравнивание файловых манипуляторов	v ,,‘
При вызове	АН = 46Н ВХ = существующий файловый манипулятор СХ = новый файловый манипулятор
При возврате	АХ = код ошибки, если CF = 1
Пояснение	В отличие от функции 45Н, которая позволяет DOS выбрать подходящий номер нового файлового манипулятора, в функции 46Н этот номер задается пользователем
47Н	Получение информации о текущем каталоге	\
При вызове	АН = 47Н DL = номер диска DS:SI = адрес 64-байтного буфера для записи пути к текущему каталогу
1138
Приложение 1
Таблица П 1.3 (продолжение)
При возврате	Если CF = 0, по адресу DS:SI записан путь к текущему каталогу
Пояснение	Номер диска А — 00, диска В — 01 и т. д.
48Н	Распределение блока памяти
При вызове	АН = 48Н ВХ = размер блока в параграфах
При возврате	Если CF = 0, то в АХ — сегментный адрес блока. Если CF = 1, то в АХ — код ошибки, а в ВХ — размер наибольшего из свободных блоков
49Н	Освобождение выделенного блока памяти
При вызове	АН = 49Н ES = сегментный адрес блока памяти
При возврате	Если CF = 1, то в АХ — код ошибки
4АН	Изменение размера блока памяти
При вызове	АН = 4АН ВХ = новый размер блока в параграфах ES = сегментный адрес блока
При возврате	Если CF = 1, то в АХ — код ошибки, а в ВХ — максимальный размер блока при изменении его размера
4ВН	Загрузка и выполнение программы
При вызове	АН = 4ВН AL = номер подфункции ES.BX = адрес области параметров загрузки DS:DX = адрес строки ASCIIZ с именем программы, включая путь
При возврате	CF = 1 при ошибке
Пояснение	Коды подфункции в AL: □	ООН — загрузка и выполнение программы □	01Н — загрузка без выполнения □	ОЗН — загрузка оверлейной программы □	05Н — выполнение программы Блок параметров загрузки показан на рис. П1.6
ЛСН	Завершение процесса
При вызове	АН = 4СН AL = код завершения
При возврате	Возврат в DOS
Директивы ассемблера, функции DOS и BIOS, управление мышью
1139
	Таблица П1.3 (продолжение)
Пояснение	Возврат управления DOS с кодом ошибки, доступным в ВАТ-файлах DOS под именем errorlevel. Нормальное завершение программы обозначают кодом ООН
4DH	Чтение кода завершения программы
При вызове	АН = 4DH
При возврате	АХ = код завершения
Пояснение	Функция позволяет получить код завершения, сформированный функцией 4СН или 31Н (завершение резидентной программы). Стандартные коды завершения: □	ООН — нормальный выход, без ошибок □	01Н — выход по нажатию комбинации клавиш <Ctrl>+<Break> □	02Н — выход по критической ошибке устройства □	ОЗН — завершение по функции 31Н
4ЕН	Поиск первого файла с совпадающим именем	
При вызове	АН = 4ЕН СХ = атрибуты файла
	DS:DX = адрес строки ASCIIZ с именем файла
При возврате	С = 1, если файл не найден
Пояснение	Первичный поиск файла в текущем или в заданном каталоге. После завершения в DTA записана информация о найденном файле. Содержимое области обмена с диском (DTA) показано на рис. П1.7
4FH	Поиск следующего файла с совпадающим именем
При вызове	АН = 4FH
При возврате	FC = 1, если файл не найден
Пояснение	Вызывается после поиска первого файла функцией 4ЕН
50Н	Установка адреса префикса сегмента программы (PSP)
При вызове	АН = 50Н ВХ = сегментный адрес нового префикса сегмента программы PSP
51Н	Чтение адреса префикса сегмента программы (PSP)
При вызове	АН = 51Н
При возврате	ВХ = сегментный адрес текущего префикса сегмента программы PSP
54Н	Чтение флага проверки записи	4
При вызове	АН = 54Н
При возврате	AL = ООН — проверка при записи отключена AL = 01Н — проверка включена
1140
Приложение 1
	Таблица П1.3 (продолжение)
56Н	Переименование файла
При вызове	АН = 56Н ES:DI = адрес строки ASCIIZ с новым именем файла DS:DX = адрес строки ASCIIZ с текущим именем файла
При возврате	CF = 1 при ошибке
57Н	Чтение/запись даты и времени создания файла
При вызове	АН = 57Н AL = ООН для чтения или 01Н для записи ВХ = файловый манипулятор СХ = новое значение времени DX = новая дата
При возврате	CF = 1 в случае ошибки СХ = время, если CF = 0 DX = дата, если CF = 0
59Н	Получение расширенной информации об ошибке
При вызове	АН = 59Н ВХ = 0000Н для DOS З.Х и выше
При возврате	АХ = код ошибки (0 — нет ошибки) ВН = класс ошибки BL = возможные (рекомендуемые) действия СН = место ошибки
Пояснение	Коды ошибок в регистре АХ: □	0001Н = недействительный номер функции □	0002Н = файл не найден □	0003Н = указанный путь отсутствует □	0004Н = слишком много открытых файлов (нет свободного файлового манипулятора) □	0005Н = доступ запрещен (попытка записи в файл, защищенный от записи) □	0006Н = недействительный файловый манипулятор □	0007Н = разрушен блок управления памятью П 0008Н = недостаточно памяти □	0009Н = неправильный адрес блока памяти □	000AH = недопустимое имя в команде SET П 000BH = неправильный формат П 000CH = неправильный код доступа к файлу
Директивы ассемблера, функции DOS и BIOS, управление мышью________________1141
	Таблица П1.3 (продолжение)
	П OOODH = неправильные данные П ОООЕН — (зарезервировано) П 000FH = ошибка при указании дисковода П 001 ОН = попытка удалить текущий каталог П 0011Н = другое устройство П 0012Н = нет больше подходящих файлов П 001ЗН = попытка записи на диск, защищенный от записи П 0014Н = задан неизвестный идентификатор устройства П 0015Н = диск не готов П 0016Н = неизвестная команда □	0017Н = ошибка контрольной суммы данных □	0018Н = неправильная длина структуры запроса □	0019Н = ошибка позиционирования в файле □	001АН = неизвестный носитель □	001 ВН = сектор не найден □	001 СН = кончилась бумага в принтере □	001DH = ошибка записи П 001 ЕН = ошибка чтения □	001FH = общая (неконкретизированная) ошибка □	0020Н = нарушение условий совместного доступа к файлу □	0021Н = нарушение блокировки файла при совместном доступе □	0022Н = неправильная смена диска I П 0023Н = отсутствует свободный блок управления файлом FCB □	0024Н = переполнение буфера, обеспечивающего совместный доступ к файлу П 0025Н = несовпадение кодовых страниц □	0026Н = не завершена операция "конец файла" □	0027Н = диск переполнен □	0028Н-0031Н — (зарезервировано) □	0032Н = сетевая функция не поддерживается П 0033Н = нет связи с удаленным компьютером □	0034Н = дублирование имени в сети □	0035Н = сетевое имя не найдено □	0036Н = сеть занята П 0037Н = сетевое устройство больше не существует □	0038Н = превышен предел команды NetBIOS □	0039Н = ошибка в аппаратуре сетевого адаптера □	003АН = неправильный ответ из сети
1142
Приложение 1
Таблица П1.3 (продолжение)
□	003ВН = непредусмотренная ошибка сети
□	003СН = несовместимый адаптер на удаленной машине
□	003DH = очередь печати переполнена
□	003ЕН = недостаточно места для печати файла
□	003FH = распечатываемый файл был удален
□	0040Н = было удалено сетевое имя
□	0041Н = сетевой доступ запрещен
□	0042Н = неправильный тип сетевого устройства
□	0043Н = сетевое имя не найдено
□	0044Н = превышен предел сетевого имени
□	0045Н = превышен предел сеанса NetBIOS
□	0046Н = временная пауза
□	0047Н = сетевой запрос отвергнут
□	0048Н = приостановлена печать или переадресация диска
□	0049H-004FH — (зарезервировано)
□	0050Н = файл уже существует
□	0051Н = дублирование блока управления файлом FCB
□	0052Н = невозможно создать дескриптор в каталоге
□	0053Н = сбой обработчика критических ошибок int 24н
□	0054Н = слишком много сетевых переназначений
□	0055Н = двойное переназначение
□	0056Н = неправильный пароль
□	0057Н = неправильный параметр
□	0058Н = ошибка записи в сети
□	0059Н = функция не поддерживается сетью
□	005АН = требуемый компонент системы не установлен
□	0065Н = устройство не выбрано
Классы ошибок в ВН:
□	01Н = недостаточно ресурсов: блоков FCB, памяти и т. д.
□	02Н = временная ситуация
□	ОЗН = нет прав на выполнение действия
□	04Н = внутренняя ошибка DOS
□	05Н = аппаратная ошибка
□	06Н = системная ошибка DOS
□	07Н = ошибка в прикладной программе
□	08Н = файл или объект не найден
□	09Н = неправильный формат файла или объекта
Директивы ассемблера, функции DOS и BIOS, управление мышью________________1143
	Таблица П 1.3 (продолжение)
	П ОАН = файл или объект заблокирован П ОВН = ошибка носителя данных П ОСН = файл или объект уже существует П 0DH = прочие ошибки Коды рекомендуемых действий в BL: П 01Н = немедленная повторная попытка П 02Н = повторная попытка спустя некоторое время П ОЗН = повторное, но правильное действие пользователя П 04Н = выход из программы с выполнением завершающих процедур □ 05Н = выход из программы без выполнения завершающих процедур П 06Н = игнорировать ошибку П 07Н = повтор с вмешательством пользователя Коды места ошибки в СН: П 01Н = источник ошибки неизвестен П 02Н = блочное устройство П ОЗН = сеть П 04Н = символьное устройство, например, принтер П 05Н = ошибка связана с оперативной памятью
5АН	Создание временного файла с уникальным именем
При вызове	АН = 5АН СХ = атрибуты файла DS:DX = адрес ASCIIZ-строки с именем каталога
При возврате	CF = 1 — ошибка АХ = файловый манипулятор, если С = 0
Пояснение	Имя каталога должно заканчиваться символом \. После выполнения функции к исходной строке с именем каталога добавлено имя созданного файла; значение DS:DX не изменяется
5ВН	Создание нового файла с заданным именем	/
При вызове	АН = 5ВН СХ = атрибуты файла DS:DX = адрес строки ASCIIZ с именем файла
При возврате	При ошибке флаг CF = 1 АХ = файловый манипулятор, если CF = 0
Пояснение	Эта функция, доступная начиная с DOS З.Х, в отличие от аналогичной функции ЗСН, не стирает без предупреждения существующий одноименный файл
1144
Приложение 1
	Таблица П 1.3 (продолжение)
5СН	Блокирование/разблокирование доступа к файлу
При вызове	АН = 5СН ВХ = файловый манипулятор CX:DX = смещение блокируемой/разблокируемой области SI:DI = размер области в байтах
При возврате	CF = 1 — ошибка
SDH	Получение расширенной информации об ошибке
При вызове	АН = 5DH AL = ОАН DS:DX = адрес для записи информации об ошибке
Пояснение	Функция доступна начиная с DOS 3.1
5ЕН	Функции сетевой печати
При вызове	АН = 5ЕН AL = ООН (получить сетевое имя) DS:DX = адрес буфера для записи строки ASCIIZ с сетевым именем
При возврате	Если успешно (CF = 0), то CL = номер имени узла в NetBIOS
При вызове	АН = 5ЕН AL = 02Н (установить строку инициализации сетевого принтера) ВХ = индекс принтера в списке переназначений СХ = длина инициализирующей строки DS:DX = адрес строки
При возврате	CF = 1 — ошибка
При вызове	АН = 5ЕН AL = ОЗН (прочитать строку инициализации сетевого принтера) ВХ = индекс принтера в списке переназначений DS:DX = адрес буфера для получения строки
При возврате	Если успешно (CF = 0), то СХ = длина полученной строки
62Н	Чтение адреса PSP
При вызове	АН = 62Н
При возврате	ВХ = адрес PSP текущей программы
Пояснение	Функция поддерживается DOS 3.0 и выше
65Н	Получение расширенной информации, специфической для страны
При вызове	АН = 65Н AL = код подфункции ES:DI = адрес области данных для записи информации
Директивы ассемблера, функции DOS и BIOS, управление мышью 1145
Таблица П1.3 (окончание)
При возврате	CF = 1 — ошибка СХ = объем полученных данных
Пояснение	Функция поддерживается DOS 3.3 и выше
66Н	Получение/установка кодовой страницы
При вызове	АН = 66Н AL = код подфункции ВХ = номер кодовой страницы
При возврате	CF = 1 — ошибка ВХ = код активной страницы DX = код страницы по умолчанию
Пояснение	Подфункция 01Н считывает номер текущей страницы, а подфункция 02Н — изменяет номер
67Н	Изменение максимального количества файловых манипуляторов
При вызове	АН = 67Н ВХ = требуемое количество файловых манипуляторов
При возврате	CF = 1 — ошибка
Пояснение	Функция доступна в DOS 3.3 и выше
68Н	Очистка буфера файла
При вызове	АН = 68Н ВХ = файловый манипулятор
При возврате	Записывает содержимое буфера на диск и обновляет дату и время файла. При ошибке CF = 1.
Пояснение	Функция доступна в DOS 3.3 и выше
6СН	Расширенная функция открытия файла
При вызове	АН = 6СН AL = ООН ВХ = режим открытия СХ = атрибуты файла (если он создается) DX = вариант действия при открытии DS:SI = адрес строки ASCIIZ с именем файла
При возврате	АХ = код ошибки, если С = 1 АХ = файловый манипулятор, если С = 0 СХ = 0001Н — открыт существующий файл СХ = 0002Н — файл создан (не существовал)		
Пояснение	Функция доступна в DOS 4.0 и выше
1146
Приложение 1
Относительный адрес Содержимое
ООН	Идентификатор дисковода
01 н	Имя файла (8 символов)
09Н	Расширение файла (3 символа)
ОСН	Номер текущего блока
ОЕН	Размер записи
ЮН	Размер файла
14Н	Дата создания
16Н	Зарезервировано
20Н	Номер текущей записи
21Н	Относительный номер записи
Рис. П1.2. Содержимое блока управления файлом (FCB)
Относительный адрес Содержимое
ООН	Идентификатор дисковода
01 н	Имя файла (8 символов)
09Н	Расширение файла (3 символа)
ОСН	Номер текущего блока
ОЕН	Размер записи
ЮН	Размер файла
14Н	Дата создания
16Н	Вторичное (новое) имя файла
Рис. П1.3. Содержимое блока управления файлом FCB для функции 17Н
7	6	5	4	3	2	1	0
?	?	?	?	?	?	?	?
Бит 0 = 0, если диск односторонний = 1, если диск двухсторонний
Бит 1=0, если не 8 секторов на дорожке = 1, если 8 секторов на дорожке
Бит 2 = 0, если не сменный
= 1, если сменный
Бит 3 = 0, если гибкий диск
= 1, если жесткий диск
Рис. П1.4. Содержимое байта дескриптора диска *
Директивы ассемблера, функции DOS и BIOS, управление мышью
1147
Относительный адрес	Содержимое
ООН	Прерывание INT 20Н
02Н	Вершина памяти
04Н	Зарезервировано
05Н	Длинный вызов диспетчера функций DOS
06Н	Количество байтов в сегменте программы
ОАН	Адрес завершения программы (смещение)
ОСН	Адрес завершения программы (сегмент)
ОЕН	Адрес выхода по Control-Break (смещение)
ЮН	Адрес выхода по Control-Break (сегмент)
12Н	Адрес обработчика критической ошибки (смещение)
14Н	Адрес обработчика критической ошибки (сегмент)
16Н	Зарезервировано
2СН	Адрес блока среды процесса (сегмент)
2ЕН	Зарезервировано
50Н	Вызов DOS INT21H; RET FAR
52Н	Зарезервировано
5СН	Блок управления файлом 1
6СН	Блок управления файлом 2
80Н	Длина комдндйой строки
81Н	Командная строка
Рис. П1.5. Содержимое префикса программного сегмента (PSP)
(а)	
Относительный адрес	Содержимое
ООН	Адрес блока среды процесса (сегмент)
02Н	Адрес командной строки (смещение)
04Н	Адрес командной строки (сегмент)
06Н	Адрес блока управления файлом 1 (смещение)
08Н	Адрес блока управления файлом 1 (сегмент)
ОАН	Адрес блока управления файлом 2 (сегмент)
ОСН	Адрес блока управления файлом 2 (смещение)
Рис. П1.6. Блок параметров для функции 4ВН — (а) для подфункции ООН (см. продолжение)
1148
Приложение 1
Относительный адрес ООН
02Н
(б)
Содержимое
Адрес сегмента, куда должна быть загружена оверлейная программа
Константа для настройки загрузочного модуля
Рис. П1.6. Блок параметров для функции 4ВН — (6) для подфункции ОЗН
Относительный адрес	Содержимое
15Н	Атрибут файла
16Н	Время создания файла
18Н	Дата создания файла
1АН	Размер файла (младшее слово)
1СН	Размер файла (старшее слово)
1ЕН	Имя файла и расширение
Рис. П1.7. Область обмена с диском (DTA), при поиске файла
Вызов функций BIOS
Наряду с функциями DOS прерывания INT 21Н для управления устройствами ввода-вывода используются функции BIOS. В отличие от функций прерывания INT21H, поддерживаемых операционной системой DOS, функции BIOS хранятся в постоянной памяти. Поэтому вызов функций BIOS не зависит от операционной системы и возможен даже при ее отсутствии.
Прерывание INT ЮН
Прерывание INT ЮН видео-BIOS используется для управления дисплеем. Номер функции записывается перед вызовом команды int юн в регистр АН. Функции видео-BIOS зашиты в постоянную память видеоадаптера, и реализация их в разных адаптерах неодинакова.
Выбор видеорежима
Выбор видеорежима выполняется функцией ООН; код режима указывается в регистре AL. Коды стандартных видеорежимов и соответствующие им параметры изображения приведены в табл. П1.4. Заметим, что адаптеры, отличные от VGA, поддерживают не все видеорежимы, указанные в табл. П1.4.
В примере П1.7 приведена последовательность инструкций для выбора видеорежима ОЗН, доступного при использовании адаптеров CGA, EGA и VGA. Этот режим обеспечивает 16-цветное текстовое изображение; разрешение зависит от типа адаптера.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1149
Таблица П1.4. Коды видеорежимов и параметры изображения
Код режима	Тип	Число столбцов	Число строк	Разрешение	Стандарт	Число цветов
ООН	Текстовый	40	25	320x200	CGA	2
ООН	Текстовый	40	25	320x250	EGA	2
ООН	Текстовый	40	25	360x400	VGA	2
01 н	Текстовый	40	25	320x200	CGA	16
01 н	Текстовый	40	25	320x350	EGA	16
01 н	Текстовый	40	25	360x640	VGA	16
02Н	Текстовый	80	25	640x200	CGA	2
02Н	Текстовый	80	25	640x350	EGA	2
02Н	Текстовый	80	25	720x400	VGA	2
ОЗН	Текстовый	80	25	640x200	CGA	16
ОЗН	Текстовый	80	25	640x350	EGA	16
ОЗН	Текстовый	80	25	720x400	VGA	16
04Н	Графический	80	25	320x200	CGA	4
05Н	Графический	80	25	320x350	CGA	2
06Н	Графический	80	25	640x200	CGA	2
07Н	Текстовый	80	25	720x350	EGA	4
07Н	Текстовый	80	25	720x400	VGA	4
0DH	Графический	80	25	320x200	CGA	16
ОЕН	Графический	80	25	640x200	CGA	16
0FH	Графический	80	25	640x350	EGA	4
ЮН	Графический	80	25	640x350	EGA	16
11Н	Графический	80	30	640x480	VGA	2
12Н	Графический	80	30	640x480	VGA	16
13Н	Графический	40	25	320x200	VGA	256
Пример П1.7. Выбор видеорежима ОЗН
0000 В4 00	MOV АН,0
0002 ВО 03	MOV AL, 3
0004 CD 10	INT ЮН
1150
Приложение 1
Управление курсором и изображением
В табл. П1.5 приведены функции прерывания INT ЮН для управления курсором (поддерживаются всеми адаптерами от CGA до SVGA) и изображением.
	Таблица П1.5. Функции видео-BIOS (INT ЮН)
ООН	Выбор режима изображения
При вызове	АН = ООН AL = код режима изображения
При возврате	Режим изображения изменяется, с очисткой экрана
01Н	Изменение размера курсора
При вызове	АН = 01Н СН = номер начальной строки курсора CL = номер конечной строки курсора
При возврате	Размер курсора изменяется
02Н	Позиционирование курсора
При вызове	АН = 02Н ВН = номер видеостраницы (обычно 0) DH = номер строки (отсчет от 0) DL = номер колонки (отсчет от 0)
При возврате	Курсор перемещается в новую позицию
ОЗН	Чтение координат и размеров курсора
При вызове	АН = ОЗН ВН = номер видеостраницы
При возврате	Размер курсора: П СН = номер начальной строки курсора П CL = номер конечной строки курсора Координаты курсора: П DH = номер строки (отсчет от 0) П DL = номер колонки (отсчет от 0)
04Н	Получение информации о световом пере
При вызове	АН = 04Н (не поддерживается VGA)
При возврате	АН = 0, если световое перо не включено СХ = номер строки для точки ВХ = номер колонки для точки DH = номер строки для символа DL = номер колонки для символа
Директивы ассемблера, функции DOS и BIOS, управление мышью
1151
	Таблица П1.5 (продолжение)
05Н	Выбор активной видеостраницы	/ j
При вызове	АН = 05Н AL = номер видеостраницы
При возврате	Переключает номер видеостраницы в диапазоне: 0—7 — для видеорежимов 0-3, 7 и D 0—3 — для режима Е 0—1 —для режимов F и 10 В видеорежимах 4—6 и 11—13 доступна только страница 0
Пояснение	В большинстве случаев вывод на дисплей выполняется только в страницу 0
06Н	Перемещение изображения вверх	\
При вызове	АН = 06Н AL = число перемещаемых строк (0 очищает экран) ВН = атрибуты цвета для новых строк СН = номер верхней строки области перемещения CL = номер левой колонки области перемещения DH = номер нижней строки области перемещения DL = номер правой колонки области перемещения
При возврате	Перемещает содержимое окна вверх; образующиеся при этом пустые строки заполняются цветом, заданным в регистре ВН
07Н	Перемещение изображения вниз	,	;
При вызове	АН = 07Н AL = число перемещаемых строк (0 очищает экран) ВН = атрибуты цвета для новых строк СН = номер верхней строки области перемещения CL = номер левой колонки области перемещения DH = номер нижней строки области перемещения DL = номер правой колонки области перемещения
При возврате	Перемещает содержимое окна вниз; образующиеся пустые строки заполняются цветом, заданным в ВН
08Н	Чтение символа и атрибутов цвета в позиции курсора
При вызове	АН = 08Н ВН = номер видеостраницы
При возврате	AL = ASCII-код символа АН = атрибуты символа
Пояснение	Курсор не перемещается
1152
Приложение 1
Таблица П1.5 (продолжение)
09Н	Запись символа и атрибутов цвета в позиции курсора
При вызове	АН = 09Н AL = ASCII-код символа ВН = номер видеостраницы BL = атрибуты СХ = счетчик повторов
Пояснение	Символ вместе с атрибутами выводится указанное в СХ число раз; при этом
! позиция курсора не изменяется
ОАН	Запись символа в позиции курсора
При вызове	АН = ОАН AL = ASCII-код символа ВН = номер видеостраницы СХ = счетчик повторов
Пояснение	Символ выводится без изменения текущих атрибутов; позиция курсора не изменяется
0FH	Получение информации о видеорежиме
При вызове	АН = 0FH
При возврате	AL = код текущего режима изображения АН = ширина экрана (число столбцов) ВН = номер активной видеостраницы
ЮН	Установка регистра палитры VGA
При вызове	АН = ЮН AL = ЮН ВХ = номер цвета (0—255) СН = интенсивность зеленого цвета (0—63) CL = интенсивность синего цвета (0—63) DH = интенсивность красного цвета (0—63)
При возврате	Изменяет составляющие цвета для заданной палитры. Первые 16 цветов (0— 15) используются в 16-цветных графических режимах и в текстовом режиме VGA
ЮН	Чтение регистра палитры VGA
При вызове	АН = ЮН AL = 15Н ВХ = номер цвета (0—255)
Директивы ассемблера, функции DOS и BIOS, управление мышью
1153
	Таблица П1.5 (окончание)
При возврате	СН = интенсивность зеленого цвета CL = интенсивность синего цвета DH = интенсивность красного цвета
11Н	Чтение набора символов из постоянной памяти
При вызове	АН = 11Н AL = ЗОН ВН — код набора символов □	2 = набор символов 8 х 14 □	3 = набор символов 8x8 □	4 = расширенный набор символов 8x8 □	5 = набор символов 9 х 14 □	6 = набор символов 8 х 16 □	7 = набор символов 9 х 16
При возврате	СХ = число байт для одного символа DL = число строк для одного символа ES:BP = адрес набора символов
При использовании VESA-совместимых адаптеров — SVGA (super VGA), EVGA (extended VGA) и XVGA (extended VGA) — доступны расширенные видеорежимы VGA. Для выбора расширенного видеорежима прерывание INT ЮН следует вызвать с содержимым регистра АХ = 4F02H (номер функции) и кодом режима в регистре ВХ. Коды режимов и соответствующие параметры изображения приведены в табл. П1.6. Следует заметить, что в поставку большинстваховременных видеоадаптеров входит драйвер WESA.COM или WESA.SYS для поддержки функций стандарта VESA.
Таблица П1.6. Расширенные режимы VGA	
Значение ВХ	Расширенный режим VGA
100Н	256-цветный, 640x400
101Н	256-цветный, 640x480
102Н	16-цветный, 800x600
103Н	256-цветный, 800x600
104Н	16-цветный, 1024x768
105Н	256-цветный, 1024x768
106Н	16-цветный, 1280x1024
107Н	256-цветный, 1280x1024
108Н	Текстовый режим, 80x60
37 Зак. 384
1154
Приложение 1
Таблица П1.6 (окончание)
Значение ВХ	Расширенный режим VGA
ЮЭН	Текстовый режим, 132x25
ЮАН	Текстовый режим, 132x43
ЮВН	Текстовый режим, 132x50
ЮСН	Текстовый режим, 132x60
Прерывание INT11Н
Прерывание INT НН используется для получения сведений об аппаратной конфигурации системы. Перед вызовом прерывания в регистр АХ следует записать число FFFFH; содержимое этого регистра в результате выполнения команды int ин показано рис. П1.8.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О
Р1	Р0		G	S2	S1	S0				D2	D1				
Р1, Р0 — Число установленных параллельных портов
G = 1, если установлен игровой порт
S2, S1, S0 — Число установленных последовательных портов
D2, D1 — Число дисководов гибких дисков
Бит 8 зарезервирован
Рис. П1.8. Содержимое регистра АХ с информацией об оборудовании (после выполнения прерывания INT 11Н)
Прерывание INT 12H
Прерывание INT 12Н позволяет определить объем наличной стандартной памяти в пределах 1 Мбайта. После выполнения инструкции int 12н в регистре АХ будет записано число блоков размером по 1 Кбайту.
Прерывание INT 13Н
Прерывание INT 13Н используется для работы с дискетами и жесткими дисками на низком уровне. Функции прерывания INT 13Н приведены в табл. П1.7, причем номер функции перед вызовом указывается в регистре АН. Следует заметить, что использование функций прямой записи секторов требует внимательности, во избежание разрушения структуры данных на диске.
Таблица П1.7. Функции дискового ввода-вывода прерывания INT 13Н
Код в регистре АН Функция
ООН	Начальная установка
01Н	Чтение информации об ошибке в регистре AL
Директивы ассемблера, функции DOS и BIOS, управление мышью
1155
	Таблица П1.7 (окончание)
Код в регистре АН	Функция
02Н	Чтение секторов
ОЗН	Запись секторов
04Н	Проверка секторов
05Н	Форматирование дорожки
06Н	Форматирование дефектной дорожки
07Н	Разметка диска с указанной дорожки
08Н	Чтение параметров устройства
09Н	Установка параметров жесткого диска
ОАН	Чтение длинного сектора
ОВН	Запись длинного сектора
ОСН	Позиционирование жесткого диска
0DH	Начальная установка жесткого диска
ОЕН	Чтение буфера сектора
0FH	Запись буфера сектора
ЮН	Проверка готовности устройства'
11 н	Позиционирование жесткого диска на дорожку 0
12Н	Диагностика RAM-контроллера
13Н	Диагностика контроллера
14Н	Внутренняя диагностика контроллера
15Н	Определение типа диска
16Н	Опрос сигнала замены дискеты
17Н	Задание типа устройства для разметки
18Н	Задание типа носителя для разметки
19Н	Парковка головок
1АН	Форматирование жесткого диска
Прерывание INT 14Н
Функции прерывания INT 14Н предназначены для работы с последовательными каналами связи, или COM-портами. Как правило, в компьютерах IBM PC имеется два СОМ-порта — С0М1 и COM2; в машинах класса АТ число COM-портов расширено до четырех. Функции прерывания INT 14Н приведены в табл. П1.8.
1156
Приложение 1
Таблица П1.8. Функции прерывания INT 14Н для обслуживания СОМ-порта
Код функции в регистре АН	Функция
ООН	Инициализация последовательного порта
01Н	Передача символа
02Н	Прием символа
ОЗН	Чтение состояния СОМ-порта
04Н	Расширенная функция инициализации последовательного порта
05Н	Расширенная функция управления последовательным портом
Прерывание INT 15Н
Функции прерывания INT 15Н, перечисленные в табл. П1.9, предназначаются для обслуживания разнотипных периферийных устройств. Прерывание INT 15Н также обеспечивает, для процессоров 80286—Pentium 4, переключение в защищенный режим и доступ к расширенной памяти (хотя для этой цели использовать прерывание INT 15Н не рекомендуется).
Код функции в регистре АН	Таблица П1.9. Функции прерывания INT 15Н Функция
ООН	Включение двигателя кассетного устройства
01Н	Выключение двигателя кассетного устройства
02Н	Чтение блоков с кассеты
ОЗН	Запись блоков на кассету
0FH	Прерывание разметки жесткого диска
21Н	Задание области для фиксации ошибок теста при включении питания
80Н	Открыть устройство
81Н	Закрыть устройство
82Н	Завершить программу устройства
83Н	Ожидание события
84Н	Поддержка координатных ручек (джойстик)
85Н	Поддержка клавиши <SysReq>
86Н	Задержка
87Н	Перемещение блока памяти
88Н	Определение объема дополнительной памяти
89Н	Переключение процессора в привилегированный режим
ЭОН	Сообщение о занятости устройства
Директивы ассемблера, функции DOS и BIOS, управление мышью
1157
	Таблица П1.9 (окончание)
Код функции в регистре АН	Функция
91Н	Сообщение о готовности устройства
СОН	Получить параметры модели компьютера
С1Н	Получить сегмент расширения области данных BIOS
С2Н	Интерфейс с устройствами типа "мышь"
СЗН	Разрешение или запрет WatchDog-таймера
С4Н	Выбор программируемых режимов
Прерывание INT 16Н
Функции прерывания INT 16Н, приведенные в табл. П1.10, предназначены для обслуживания клавиатуры. Эти функции неявно вызываются при отработке DOS-функций клавиатурного ввода. Функции прерывания INT 16Н могут быть вызваны напрямую из программы пользователя, минуя функции DOS.
Таблица П1.10. Функции прерывания INT 16Н для обслуживания клавиатуры
Код функции в регистре АН	Функция
ООН	Чтение символа
01Н	Получение информации о наличии символа
02Н	Чтение информации о состоянии управляющих клавиш
ОЗН	Установка частоты автоповтора
04Н	Управление звуковым сигналом
05Н	Запись символа и скан-кода
Прерывание INT 17H
Прерывание INT 17Н предоставляет функции для работы с параллельным портом (LPT1). Функции прерывания INT 17Н приведены в табл. П1.11.
Таблица П1.11. Функции прерывания INT 17Н для обслуживания параллельного порта
Код функции в регистре АН	Функция
ООН	Вывод символа на печать
01Н	Инициализация принтера
02Н	Чтение состояния принтера
1158
Приложение 1
Системная область DOS/BIOS
В табл. Ш. 12 приведены сведения об адресах и назначении данных в системной области памяти DOS/BIOS.
Таблица П1.12. Назначение данных в нижней памяти DOS
Размещение	Назначение
00000Н—002FFH	Таблица векторов прерываний
00300Н—003FFH	Продолжение таблицы векторов и область стека для программы POST
00400Н—00407Н	(тестирование при включении питания) и начального загрузчика Базовые адреса портов СОМ1—COM4
00408Н—0040FH	Базовые адреса портов LPT1—LPT4
0041 ОН—00411Н	Информация об оборудовании, доступная через прерывание INT 11Н
00412Н	(см. рис. П1.8) (Зарезервировано)
00413Н—00414Н	Размер стандартной памяти в Кбайт (от 0 до 640)
00415Н—00416Н	(Зарезервировано)
00417Н	Первый байт состояния управляющих клавиш:
00418Н	□	бит 7 — нажата клавиша <lnsert> □	бит 6 — режим Caps Lock активен □	бит 5 — режим Num Lock активен □	бит 4 — режим Scroll Lock активен □	бит 3 — нажата клавиша <Alt> □	бит 2 — нажата клавиша <Ctrl> □	бит 1 — нажата левая клавиша <Shift> □	бит 0 — нажата правая клавиша <Shift> Второй байт состояния управляющих клавиш:
00419Н	□	бит 7 — нажата клавиша <lnsert> □	бит 6 — нажата клавиша <Caps Lock> □	бит 5 — нажата клавиша <Num Lock> □	бит 4 — нажата клавиша <Scroll Lock> □	бит 3 — нажата клавиша <Pause> □	бит 2 — нажата клавиша <SysReq> □	бит 1 — нажата левая клавиша <Alt> □	бит 0 — нажата правая клавиша <Ctrl> Код, введенный с цифровой клавиатуры при нажатии клавиши <Alt>
0041 АН—0041 ВН	Указатель начала данных в буфере клавиатуры
0041 СН—0041DH	Указатель последних данных в буфере клавиатуры
Директивы ассемблера, функции DOS и BIOS, управление мышью
1159
Таблица П1.12 (продолжение)
Размещение	Назначение
0041 ЕН—0043DH	32-байтный кольцевой буфер клавиатуры
0043ЕН—00448Н	Область данных для управления дисковыми накопителями
00449Н—00466Н	Область данных для управления видеодисплеем
00467Н—0046ВН	(Зарезервировано)
0046СН—0046FH	Счетчик таймера
00470Н	Признак переполнения таймера (при превышении 24 часов)
00471Н	Флаг аварийного завершения11
00472Н—00473Н	Флаг перезагрузки11 12
00474Н—00477Н	Область данных для жестких дисков
00478Н—0047ВН	Тайм-ауты при работе с устройствами LPT1—LPT4
0047СН—0047FH	Тайм-ауты при работе с устройствами СОМ1—COM4
00480Н—00481Н	Смещение (от границы сегмента 40Н) начала данных в буфере клавиатуры
00482Н—00483Н	Смещение (от границы сегмента 40Н) последних данных в буфере клавиатуры
00484Н—0048АН	Данные для управления видеодисплеем
0048ВН—00495Н	Данные для управления жесткими дисками
00496Н	Режим, тип и состояние клавиатуры
00497Н	Состояния индикаторов клавиатуры
00498Н—0049ВН	Дальний указатель пользовательского флага завершения ожидания
0049СН—0049FH	Дальний указатель на счетчик тайм-аута при ожидании
004А0Н	Флаг ожидания при выполнении функции часов реального времени
004А1Н—004А7Н	(Зарезервировано)
004А8Н—004АВН	Указатель области видеопараметров
004АСН—004EFH	(Зарезервировано)
004F0H—004FFH	Область для обмена данными между прикладными программами, так называемая коммуникационная область DOS
00500Н	Состояние вывода копии экрана на принтер
00501Н—00503Н	(Зарезервировано)
00504Н	Номер дисковода при имитации двух дисков на одном устройстве
00505Н—0050FH	(Зарезервировано)			
11 Устанавливается при нажатии комбинации клавиш <Ctrl>+<Brcak>. — Пер.
12 Устанавливается при нажатии комбинации клавиш <Ctrl>+<Alt>+<Delete>. — Пер.
1160
Приложение 1
Таблица П1.12 (окончание)
Размещение	Назначение
0051 ОН—00521Н	Используются ROM BASIC
00522Н—0052FH	Используются DOS при инициализации дисков
00530Н—00533Н	Используются командой mode
00534Н—005FFH	(Зарезервировано)
Функции драйвера мыши
Программный интерфейс с драйвером мыши реализован в DOS прерыванием INT ЗЗН, функции которого приведены в табл. П1.13. Примеры использования функций прерывания INT ЗЗН см. в главе 7.
	Таблица П1.13. Функции прерывания INT ЗЗН
ООН	Начальная установка
При вызове	AL = ООН
При возврате	ВХ = количество кнопок мыши
Пояснение	Начальная установка программных и аппаратных средств поддержки мыши. Результат начальной установки: П номер видеостраницы = 0; П курсор выключен; П текущая позиция курсора — в центре экрана; • П минимальные координаты курсора по вертикали и горизонтали = 0, 0; П максимальные координаты курсора по вертикали и горизонтали равны максимальным значениям координат экрана в текущем видеорежиме, минус единица; П горизонтальное соотношение микки/пиксел = 1/1; П вертикальное соотношение микки/пиксел = 2/1; П порог удвоенной скорости = 64 микки/с; П курсор для графического режима — в виде стрелки; П курсор для текстового режима — в виде инверсного изображения символа; П эмуляция светового пера включена □ маска вызова прерываний = 0
01Н	Сделать курсор видимым
При вызове	AL = 01H
При возврате	Курсор отображается на экране
Директивы ассемблера, функции DOS и BIOS, управление мышью
1161
	Таблица П1.13 (продолжение)
02Н	Скрыть курсор
При вызове	AL = 02Н
При возврате	Курсор исчезает с экрана
Пояснение	Рекомендуется вызывать перед изменением изображения на участке экрана, где находится курсор
ОЗН	Получить состояние мыши
При вызове	AL = ОЗН
При возврате	ВХ = состояния кнопок мыши СХ = горизонтальная координата курсора DX = вертикальная координата курсора
Пояснение	Нулевой бит ВХ отражает состояние левой кнопки, бит 1 — состояние правой кнопки. Единица означает, что кнопка нажата
04Н	Установить курсор в заданную позицию
При вызове	AL = 04Н СХ = позиция по горизонтали DX = позиция по вертикали
05Н	Прочитать счетчик нажатий на кнопку
При вызове	AL = 05Н ВХ = номер кнопки (0 — левая, 1 — правая)
При возврате	АХ = состояние кнопок ВХ = число нажатий кнопки с момента последнего вызова функции СХ = горизонтальная координата курсора при последнем нажатии кнопки DX = вертикальная координата при последнем нажатии
06Н	Прочитать счетчик отпусканий кнопки
При вызове	AL = 06Н ВХ = номер кнопки (0 — левая, 1 — правая)
При возврате	АХ = состояние кнопок ВХ = число отпусканий кнопки с момента последнего вызова функции СХ = горизонтальная координата при последнем отпускании DX = вертикальная координата при последнем отпускании
07Н	Установить диапазон перемещения по горизонтали
При вызове	AL = 07Н СХ = минимальная позиция курсора по горизонтали DX = максимальная позиция курсора по горизонтали
При возврате	Изменяет границы горизонтального перемещения курсора
1162
Приложение 1
	Таблица П1.13 (продолжение)
08Н	Установить диапазон перемещения по вертикали
При вызове	AL = 08Н СХ = минимальная позиция курсора по вертикали DX = максимальная позиция курсора по вертикали
При возврате	Изменяет границы вертикального перемещения курсора
09Н	Установка параметров графического курсора
При вызове	AL = 09Н ВХ = горизонтальная координата центра курсора в его маске СХ = вертикальная координата центра курсора в его маске ES:DX = указатель области данных маски экрана и маски курсора (по 16x16 пикселов)
При возврате	Устанавливает параметры курсора в графическом режиме
Пояснение	Центр курсора соответствует текущей позиции мыши. Например, если центр находится в позиции (0,0), то текущая позиция мыши — в левой верхней точке курсора; если центр в позиции 15,15 — то в правой нижней точке. Адрес маски для изображения фона курсора (16x16 пикселов) передается в регистровую пару ES:DX. К этой маске примыкает маска самого курсора (тоже 16x16 пикселов). Содержимое первой маски объединяется по "И" с текущим изображением на экране в области курсора; результат, после операции "ИСКЛЮЧАЮЩЕЕ ИЛИ" с маской курсора, выводится на экран
ОАН	Установка параметров текстового курсора
При вызове	AL = ОАН ВХ = тип курсора: 0 — мягкий (изображение задаете масками), 1 — жесткий (указываются границы аппаратного курсора) СХ = маска экрана или номер первой скан-линии DX = маска курсора или номер последней скан-линии
При возврате	Изменяет параметры курсора в текстовом режиме
ОВН	Прочесть счетчики перемещения
При вызове	AL = ОВН
При возврате	СХ = счетчик по горизонтали DX = счетчик по вертикали
Пояснение	Возвращает данные о дистанции, пройденной с момента последнего вызова этой функции^3
Функция возвращает счетчики микки. Микки — это минимальная единица перемещения мыши, регистрируемая аппаратными средствами. Положительные значения счетчика соответствуют движению мыши вправо и вверх. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью 1163
Таблица П1.13 (продолжение)
ОСН	Установить адрес процедуры обработки прерываний
При вызове	AL = ОСН СХ = маска вызова процедуры ES:DX = адрес процедуры
При возврате	Устанавливает пользовательскую процедуру обработки прерываний
Пояснение	В маске указывается набор бит, соответствующих событиям, для которых вызывается процедура. Каждому событию соответствует один бит маски; допускается задавать несколько событий в виде набора бит. Например, маска ОАН = 10=8+2 разрешает вызов процедуры при нажатии и левой, и правой кнопки мыши. □	1 (бит 0) = изменение позиции курсора □	2 (бит 1) = нажата левая кнопка □	4 (бит 2) = отпущена левая кнопка □	8 (бит 3) = нажата правая кнопка □	16 (бит 4) = отпущена правая кнопка После выполнения функции вызов процедуры происходит отдельно для каждого события, заданного в маске. При вызове процедура получает следующую информацию: □	АХ = маска прерывания □	ВХ = состояние кнопок □	СХ = позиция по горизонтали □	DX ~ позиция по вертикали □	SI = счетчик микки по горизонтали □	DI = счетчик микки по вертикали
0DH	Включить эмуляцию светового пера
При вызове	AL = 0DH
Пояснение	Используется для имитации светового пера мышью14
ОЕН	Выключить эмуляцию светового пера
При вызове	AL = ОЕН
0FH	Установить соотношение микки/пикселы
При вызове	AL = 0FH СХ = число микки на 8 пикселов по горизонтали DX = число микки на 8 пикселов по вертикали
14 После вызова функции 0DH мыши вызов функции светового пера будет возвращать координаты курсора мыши на момент последнего нажатия кнопки (когда "перо" было "опущено"). — Пер.
1164
Приложение 1
	Таблица П1.13 (продолжение)
Пояснение	Изменяет скорость перемещения курсора. По умолчанию перемещение на 1 микки отображается сдвигом курсора на 8 пикселов, как если бы функция была вызвана с СХ = DX = 1. Вызов функции с СХ = DX = 2 замедлил бы движение курсора вдвое
ЮН	Отключать курсор в указанной области
При вызове	AL = ЮН СХ, DX = координаты левого верхнего угла области SI, DI = координаты правого нижнего угла области
Пояснение	Определяет прямоугольную область на экране, где курсор невидим
13Н	Установить порог удвоения скорости
При вызове	AL = 13Н DX = порог скорости (микки/сек)
Пояснение	По умолчанию порог удвоения скорости курсора составляет 64 микки'с. Функция 13Н изменяет это значение
14Н	Установка временной процедуры обработки прерывания
При вызове	AL = 14Н СХ 3 маска прерываний ES:DX 3 адрес процедуры
При возврате	СХ = прежнее значение маски прерываний ES:DX = адрес прежней процедуры обработки прерывания
Пояснение	В отличие от функции ОСН, функция 14Н не только устанавливает процедуру обработки прерывания, но и возвращает параметры замещаемой, ранее установленной процедуры; это позволяет восстановить прежнюю процедуру15
15Н	Определить размер буфера для записи состояния драйвера
При вызове	AL = 15Н
При возврате	ВХ 3 требуемый размер буфера
Пояснение	Выясняет объем памяти для получения состояния мыши функцией 16Н
ЮН	Чтение состояния драйвера
При вызове	AL 3 ЮН ES:DX = адрес буфера для записи состояния
При возврате	Сохраняет в памяти текущее состояние мыши
ь Функция 14Н Пер.	также позволяет изменить маску прерываний для существующей процедуры. —
Директивы ассемблера, функции DOS и BIOS, управление мышью
1165
	Таблица П1.13 (продолжение)
17Н	Восстановить состояние драйвера
При вызове	AL = 17Н ES:DX = адрес буфера с информацией о состоянии мыши
При возврате	Восстанавливает состояние, сохраненное функцией 16Н
18Н	Установить альтернативную процедуру обработки прерываний
При вызове	AL = 18Н СХ = альтернативная маска прерываний ES:DX = адрес альтернативной процедуры CF = 0
Пояснение	Альтернативная процедура обработки прерываний вызывается после основной процедуры — для событий, указанных в альтернативной маске прерываний. Биты альтернативной маски: □	1 (бит 0) = изменение позиции курсора □	2 (бит 1) = нажатие левой кнопки □	4 (бит 2) = отпускание левой кнопки □	8 (бит 3) = нажатие правой кнопки □	16 (бит 4) = отпускание правой кнопки □	32 (бит 5) = нажатие клавиши <Shift> вместе с кнопкой мыши □	64 (бит 6) = нажатие клавиши <Ctrl> вместе с кнопкой мыши □	128 (бит 7) = нажатие клавиши <Alt> вместе с кнопкой мыши При вызове альтернативной процедуры обработки прерывания ей передается следующая информация: П CF = 1 □	АХ = маска прерывания (см. функцию ОСН) □	ВХ = состояние кнопок □	СХ = позиция курсора по горизонтали □	DX = позиция курсора по вертикали □	SI = счетчик микки по горизонтали □	DI = счетчик микки по вертикали
19Н	Получить адрес альтернативной процедуры обработки прерываний
При вызове	AL = 19Н СХ = альтернативная маска прерываний
При возврате	АХ = -1, если альтернативная процедура с указанной маской не найдена ES:DX = адрес процедуры			
Пояснение	Локализует ранее установленную альтернативную процедуру обработки прерываний с заданной маской
1166
Приложение 1
Таблица П1.13 (продолжение)
1АН	Установить порог чувствительности мыши
При вызове	AL = 1АН ВХ = чувствительность по горизонтали (микки на пиксел) СХ = чувствительность по вертикали (микки на пиксел) DX = порог удвоения скорости (микки/с)16
Пояснение	По умолчанию порог скорости (и по горизонтали, и вертикали) составляет 50 микки/пиксел; допустимые значения лежат в диапазоне 1—100, что позволяет устанавливать скорость 33—350% от исходной
1ВН	Определить чувствительность мыши
При вызове	AL = 1ВН
При возврате	ВХ = чувствительность по горизонтали (микки на пиксел) СХ = чувствительность по вертикали (микки на пиксел) DX = порог удвоения скорости (микки/с)
1СН	Установить частоту прерываний
При вызове	AL=1СН ВХ = код частоты прерываний
При возврате	Изменяет частоту прерываний — только для мыши типа InPort
Пояснение	По умолчанию частота прерываний 30 Гц. Допустимые значения кода частоты в регистре ВХ: □	0 — прерывания запрещены □	1 — 30 прерываний в секунду □	2 — 50 прерываний в секунду □	3 — 100 прерываний в секунду □	4 — 200 прерываний в секунду
1DH	Установить страницу дисплея
При вызове	AL = 1DH ВХ = номер видеостраницы
Пояснение	Переключает экран на указанную страницу17
1ЕН	Получить номер текущей видеостраницы
При вызове	AL = 1ЕН
При возврате	ВХ = номер видеостраницы
16 DX — 0 устанавливает стандартный порог удвоения скорости, равный 64 микки/с. — Пер.
17 Курсор при этом становится видимым. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1167
	Таблица П1.13 (продолжение)
1FH	Приостановить работу драйвера мыши
При вызове	AL = 1FH
При возврате	АХ = -1, если ошибка
	ES:BX = адрес драйвера
20Н	Возобновить работу драйвера мыши
При вызове	AL = 20Н
21Н	,,	-18 Начальная установка драйвера мыши
При вызове	А1_ = 21Н
При возврате	АХ = 0FFFFH, если успешно ВХ = число кнопок мыши
22Н	Выбрать язык для диагностических сообщений
При вызове	AL = 22Н
Пояснение	ВХ = код языка Коды языка в ВХ следующие18 19: □	0 — английский □	1 — французский ' □ 2 — голландский □	3 — немецкий □	4 — шведский □	5 — финский □	6 — испанский □	7 — португальский □	8 — итальянский
23Н	Получить информацию об используемом языке
При вызове	AL = 23Н
При возврате	ВХ = код языка
24Н	Определить тип мыши и версию драйвера
При вызове	AL = 24Н
При возврате	ВН = номер версии драйвера BL = номер модификации версии СН = тип мыши CL = номер IRQ аппаратного прерывания
18 В отличие от функции 0, функция 21Н не выполняет начальной установки аппаратных средств мыши. — Пер.
19 Функция поддерживается драйвером Microsoft International Mouse. — Пер.
1168
Приложение 1
Таблица П1.13 (продолжение)
25Н	ПдйИлйь дополнительную информацию о драйвере
При вызове	AL = 25Н
При возврате	АХ содержит следующие битовые поля и флаги: □ биты 13 и 12 — тип курсора: •	00 = мягкий •	01 =аппаратный •	1Х = графический □	бит 14 = 1 — интегрированный драйвер □	бит 15 — расширение файла драйвера: •	0 = SYS •	1= СОМ
26Н	Выяснить предельные значения виртуальных координат
При вызове	AL = 26Н
При возврате	ВХ = состояние драйвера мыши СХ = максимальное значение виртуальной координаты X DX = максимальное значение виртуальной координаты Y
27Н	Получить информацию о форме курсора и счетчики перемещений
При вызове	AL = 27Н
При возврате	АХ = маска экрана или номер первой скан-линии ВХ = маска курсора или номер последней скан-линии СХ = счетчик микки по горизонтали DX « счетчик микки по вертикали
28Н	УсггШнсммггъ «идеорежим
При вызове	AL = 28Н СХ = видеорежим DX = размер шрифта
При возврате	СХ = 0, если успешно
29Н	Получить элемент списка допустимых видеорежимов
При вызове	AL = 29Н СХ = режим поиска
При возврате	BX:DX = адрес строки ASCII с описанием видеорежима (BX.DX = 0:0 означает, что описание отсутствует) СХ = номер режима или 0, если конец списка
Пояснение	Если режим поиска в СХ = 0, функция возвращает первый элемент списка видеорежимов, а иначе — следующий элемент
Директивы ассемблера, функции DOS и BIOS, управление мышью
1169
Таблица П1.13 (продолжение)
2АН	Получить смещение "горячего пятна" курсора
При вызове	AL = 2АН
При возврате	АХ = флаг видимости курсора ВХ = смещение "горячего пятна" по X от левого верхнего угла блока курсора СХ = смещение "горячего пятна" по Y от левого верхнего угла блока курсора DX = тип мыши
Пояснение	"Горячее пятно"— это точка внутри курсора, по которой определяются текущие координаты. Флаг видимости курсора — это разность между числом вызовов функций 0 и 1
2ВН	Загрузить параметры кривой ускорения
При вызове	AL = 2ВН ВХ = номер кривой ES:SI = адрес кривой
При возврате	АХ = 0, если успешно
Пояснение	Содержимое структуры данных с параметрами кривых ускорения 1—4 показано далее
Смещение	Значение
ООН	Число участков в кривой 1
01Н	Число участков в кривой 2
02Н	Число участков в кривой 3
ОЗН	Число участков в кривой 4
04Н	Массив граничных скоростей для кривой 1
24Н	Массив граничных скоростей для кривой 2
44Н	Массив граничных скоростей для кривой 3
64Н	Массив граничных скоростей для кривой 4
84Н	Массив коэффициентов скорости для кривой 1
А4Н	Массив коэффициентов скорости для кривой 2
С4Н	Массив коэффициентов скорости для кривой 3
Е4Н	Массив коэффициентов скорости для кривой 4
104Н	Строка с именем кривой 1
114Н	Строка с именем кривой 2
124Н	Строка с именем кривой 3
134Н	Строка с именем кривой 4
1170
Приложение 1
	Таблица П1.13 (продолжение)
2СН	Прочитать параметры текущей кривой ускорения
При вызове	AL = 2СН
При возврате	Если успешно (АХ = 0), то □	ВХ = номер текущей кривой ускорения □	ES.SI = адрес структуры данных кривых
2DH При вызове	Установить/прочитать параметры кривой ускорения AL = 2DH ВХ = номер кривой20
При возврате	Если успешно (АХ = 0), то □	ВХ = номер текущей кривой ускорения □	ES:SI = адрес структуры данных кривых
2FH	Аппаратный сброс мыши
При вызове	AL = 2FH
При возврате	АХ = 0, если ошибка
ЗОН	Установить/прочитать состояние устройства Ballpoint
При вызове	AL = ЗОН ВХ = угол поворота (от -32768 до +32767) СХ = команда (0 — прочитать, 1 — установить)
При возврате	Если ошибка, то АХ = FFFFH Если успешно, то О АХ = состояние □	ВХ = угол поворота □	СХ = маска кнопок
31Н	Получить предельные значения виртуальных координат
При вызове	AL = 31H
При возврате	АХ = минимальное значение виртуальной координаты X ВХ = минимальное значение виртуальной координаты У СХ = максимальное значение виртуальной координаты X DX = максимальное значение виртуальной координаты У
20 Если ВХ = I—4, то функция устанавливает параметры кривой, подобно функции 02DH. Если ВХ = — I, то функция открывает доступ к параметрам текущей кривой, подобно функции 02СН. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью 1171
Таблица П1.13 (окончание)
32Н	Определить наличие расширенных функций
При вызове	AL = 32Н
При возврате	АХ = флаги активных функций
Пояснение	Установленные в логическую единицу биты регистра АХ означают следующее: бит 0 — активна функция 25Н, бит 1 — активна функция 26Н, и т. д. до функции 34Н
ЗЗН	Получить информацию о настройках при запуске драйвера
При вызове	AL = ЗЗН СХ = длина буфера ES:DI = адрес буфера
При возврате	АХ = 0 СХ = объем информации в буфере (в байтах)
34Н	Получить путь к файлу MOUSE.INI
При вызове	AL = 34Н
При возврате	АХ = 0 ES:DX = адрес буфера
Функции DPMI
Интерфейс DPMI (DOS Protected Mode Interface) предоставляет приложениям DOS и Windows средства для работы в защищенном режиме, а также для доступа к расширенной памяти. Четыре функции DPMI, приведенные в табл. П1.14, вызываются через мультиплексное прерывание DOS (INT2FH). Прочие функции DPMI, перечисленные в табл. П1.15, доступны через прерывание INT 31Н.
Таблица П1.14. Функции DPMI, прерывание INT 2FH
80Н	Вернуть управление DPMI-серверу
При вызове	АХ =1680Н
При возврате	АХ = ООН, если успешно АХ = 80Н, если ошибка (функция не поддерживается)
Пояснение	Рекомендуется вызывать эту функцию перед циклами ожидания (например, перед вводом данных с клавиатуры); в результате остаток кванта времени, выделенного приложению, будет отдан другому приложению
86Н	Выяснить режим, работы центрального процессора 	_____
При вызове	АХ =1686Н
При возврате	АХ = ООООН, если процессор в защищенном режиме АХ <> ООООН, если процессор в реальном режиме или в режиме виртуальной машины
1172
Приложение 1
	Таблица П1.14 (окончание)
87Н	Получить адрес перехода в защищенный режим
При вызове	АХ =1687Н
При возврате	Если успешно (АХ = 0000Н): □	ВХ = флаг поддержки 32-битных приложений □	CL = тип процессора □	DX = версия DPMI □	SI = число параграфов для данных сервера DPMI □	ES:DI = адрес процедуры для входа в защищенный режим
Пояснение	Используется для локализации процедуры DPMI для переключения процессора в защищенный режим. Бит 0 в регистре ВХ установлен в логическую единицу, если DPMI поддерживает работу 32-битных приложений. В регистре CL возвращается тип микропроцессора: 2, 3, 4 или 5 для 80286, 80386, 80486 или Pentium/Pentium 4 соответственно; в регистре DH — главный номер версии, в DL— номер модификации; в SI — число параграфов для данных DPMI; в регистровой паре ES:DI — адрес для перехода в защищенный режим
8АН	Получить адрес вызова функций API, специфических для данной реализации DPMI
При вызове	АХ = 168АН DS:DI = адрес строки ASCIIZ с именем фирмы-производителя DOS-экстендера
При возврате	АХ = 0000Н, если успешно АХ = 168АН, если ошибка ES.DI = адрес обращения к API (командой call far)
	Таблица П1.15. Функции DPMI, прерывание INT 31Н
OOOOH	Создать дескрипторы в таблице LDT
При вызове	АХ = 0000Н СХ = количество создаваемых дескрипторов
При возврате	АХ = базовый селектор, если CF = 0 АХ = код ошибки, если CF = 1
Пояснение	Распределяет один или более локальных дескрипторов; номер первого дескриптора возвращает в регистре АХ21
21 Выделяет место в таблице LDT, создавая в ней дескриптор сегмента данных, с нулевыми базой и пределом, так что пользоваться им сразу нельзя. Если создано более одного дескриптора, то регистр АХ содержит селектор первого из них, а для получения приращения до следующего селектора требуется вызов функции 0003. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1173
	Таблица П1.15 (продолжение)
0001 н	Освободить дескриптор в таблице LDT
При вызове	АХ = 0001Н ВХ = селектор освобождаемого дескриптора
При возврате	Если CF = 1, то АХ = код ошибки
Пояснение	Освобождает дескриптор в LDT, созданный функцией 0000Н; дескриптор адресуется селектором в регистре ВХ22
0002Н	Преобразовать сегмент в дескриптор
При вызове	АХ = 0002Н ВХ = сегментный адрес реального режима
При возврате	Если успешно (С = 0), то в АХ — селектор Если С = 1, то АХ = код ошибки
Пояснение	Возвращает селектор, соответствующий дескриптору, созданному для адресации сегмента реального режима. Дескриптор, созданный этой функцией, не может быть освобожден, поэтому имеет смысл использовать эту функцию для адресации таких областей данных, как видеопамять, данные BIOS и т. п.
0003Н	Получить приращение до следующего селектора
При вызове	АХ = 0003Н
При возврате	Если успешно (CF = 0), то в АХ — приращение
Пояснение	Возвращает приращение для вычисления следующего селектора при использовании функций, которые могут возвращать более одного селектора (например, функции 0000Н)
0006Н	Получить базовый адрес сегмента
При вызове	АХ = 0006Н ВХ = селектор
При возврате	Если ошибка (CF = 1), то АХ = код ошибки CX:DX = базовый адрес сегмента
Пояснение	Возвращает адрес сегмента, выбранного селектором в регистре ВХ. Результат в регистровой паре CX:DX — 32-битный линейный адрес сегмента
0007Н	Установить базовый адрес сегмента
При вызове	АХ = 0007Н ВХ = селектор CX.DX = линейный базовый адрес
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
22 Если нужно освободить несколько дескрипторов, то функция вызывается для каждого. — Пер.
1174
Приложение 1
Таблица П1.15 (продолжение)
Пояснение	Устанавливает 32-разрядный линейный базовый адрес сегмента в дескрипторе, соответствующем заданному селектору23
0008Н	Установить предел сегмента24
При вызове	АХ = 0008Н ВХ = селектор CX:DX = предел сегмента в байтах
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0009Н	Установить поле прав доступа в дескрипторе
При вызове	АХ = 0009Н ВХ = селектор СХ = права доступа
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Права доступа регламентируют обращение к сегменту в защищенном режиме. Биты регистра СХ для процессоров 80386—Pentium 4 (для процессора 80286 биты 8—15 должны быть равны 0): □	бит 0: 1 — доступен □	бит 1:1 — доступен на чтение/запись, 0 — доступен только на чтение □	бит 2:0 — расширяется вверх, 1 — вниз □	бит 3: 1—сегмент кода, 0 — данных □	бит 4: всегда 1 □	биты 5 и 6: уровень привилегий □	бит 7: 1 — присутствует, 0 — отсутствует □	биты 8-13: всегда 0 □	бит 14: 1 — режим 32-битных инструкций, 0— режим 16-битных инструкций □	бит 15 — бит гранулярности: 0 — множитель =1,1 — множитель = 4К
000AH	Создать алиасный дескриптор для сегмента кода
При вызове	АХ = 000AH ВХ = селектор
При возврате	Если ошибка (CF = 1), то АХ = код ошибки Если CF = 0, то в АХ — копия селектора
23 С помощью этой функции можно изменить базовый адрес только для тех сегментов, которые были выделены функцией OOOOH. Старшие 8 бит (регистр СН) базового адреса в 16-разрядных версиях DPMI игнорируются. — Пер.
24 С помощью этой функции можно изменить предел сегментов, выделенных функцией 0000Н. В 16-разрядных версиях DPMI предел не должен превышать 0FFFFH. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1175
	Таблица П1.15 (продолжение)
Пояснение	Создает селектор сегмента данных по селектору сегмента кода, с теми же базой и пределом
ооовн	Прочитать дескриптор
При вызове	АХ = ОООВН ВХ = селектор ES:DI = адрес буфера
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Копирует 8-байтный дескриптор в буфер по адресу ES:DI
ооосн	Установить дескриптор
При вызове	АХ = ОООСН ВХ = селектор ES:DI = адрес буфера
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Копирует 8-байтный дескриптор из буфера по адресу ES:DI в таблицу дескрипторов
000DH	Выделить дескриптор в таблице LDT
При вызове	АХ = 000DH ВХ = селектор
При возврате	Если ошибка (С = 1), то АХ = код ошибки
Пояснение	Выделяет дескриптор, соответствующий указанному селектору
000EH	Прочитать дескрипторы
При вызове	АХ = 000EH ВХ = количество дескрипторов ES:DI = адрес буфера
При возврате	Если успешно (CF = 0), то СХ = число скопированных дескрипторов, а иначе АХ = код ошибки
Пояснение	Копирует массив дескрипторов в буфер по адресу ES:DI
OOOFH	Создать дескрипторы
При вызове	АХ = 000FH ВХ = количество дескрипторов ES:DI = адрес буфера
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Создает дескрипторы, заданные в буфере по адресу ES:DL Описание дескриптора в буфере занимает 10 байт, с номером селектора в первых двух байтах
1176
Приложение 1
	Таблица П1.15 (продолжение)
01 ООН	Выделить блок памяти DOS
При вызове	АХ = 01 ООН ВХ = количество параграфов (по 16 байт)
При возврате	Если успешно (CF = 0), то □	АХ = сегментный адрес (реального режима) выделенного блока памяти □	DX = селектор выделенного блока памяти Если ошибка (CF = 1), то □	АХ = код ошибки □	ВХ = размер наибольшего доступного блока (в параграфах)
Пояснение	Распределяет память из области свободной памяти DOS (в пределах стандартной памяти)25. Полученный блок памяти может быть освобожден только функцией 0101Н
0101Н	Освободить блок памяти DOS
При вызове	АХ = 0101Н DX = селектор выделенного блока памяти
При возврате	Если ошибка (CF = 1), то АХ = код ошибки26
0200Н	Получить вектор прерывания реального режима
При вызове	АХ = 0200Н ВХ = номер прерывания
При возврате	CX:DX = адрес обработчика прерывания в формате сегмент:смещение
0201Н	Установить вектор прерывания реального режима
При вызове	АХ = 0201Н ВХ = номер прерывания CX:DX = адрес обработчика прерывания в формате сегмент:смещение
0202Н	Получить адрес обработчика исключения
При вызове	АХ = 0202Н ВХ = номер исключения (0-1FH)
При возврате	Если успешно (CF = 0), то CX:(E)DX = селектор:смещение, а иначе АХ = код ошибки27
25 Если размер запрашиваемой памяти больше 64 Кбайт, функция выделяет несколько дескрипторов. Для доступа к следующему из них можно воспользоваться функцией 0003Н. Для изменения размера блока памяти предназначена функция 0102Н. — Пер.
26 Дескрипторы, выделенные при выполнении функции 01 ООН, также освобождаются. — Пер.
27 Значение в СХ — это селектор защищенного режима, а не сегмент реального режима. В 32-битном режиме функция возвращает смещение в регистре EDX. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1177
	Таблица П1.15 (продолжение)
0203Н	Установить адрес обработчика исключения
При вызове	АХ = 0203Н ВХ = номер исключения (0-1FH) CX:(E)DX = селекгорхмещение
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0204Н	Получить вектор прерывания защищенного режима
При вызове	АХ = 0204Н ВХ = номер прерывания
При возврате	Если успешно (CF = 0), то CX:(E)DX = селекгорхмещение, а иначе АХ = код ошибки
0205Н	Установить вектор прерывания защищенного режима
При вызове	АХ = 0205Н ВХ = номер прерывания CX:(E)DX = селекгорхмещение
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0210Н	Получить расширенный вектор обработчика исключений защищенного режима
При вызове	АХ = 021 ОН ВХ = номер исключения (0—1FH)
При возврате	Если успешно (CF = 0), то CX:(E)DX = селекгорхмещение, а иначе АХ = код ошибки
0211Н	Получить расширенный вектор обработчика исключений реального режима
При вызове	АХ = 0211Н ВХ = номер исключения (0—1FH)
При возврате	Если успешно (CF = 0), то CX:(E)DX = селекгорхмещение, а иначе АХ = код ошибки
0212Н	Установить расширенный вектор обработчика исключений защищенного режима
При вызове	АХ = 0212Н ВХ = номер исключения CX:(E)DX = селекгорхмещение
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
1178
Приложение 1
Таблица П1.15 (продолжение)
021ЗН	Установить расширенный вектор обработчика исключений реального режима		
При вызове	АХ = 0213Н ВХ = номер исключения CX:(E)DX = селекторхмещение		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
0300Н	Эмуляция прерывания реального режима		
При вызове	АХ = 0300Н ВХ = номер прерывания28 СХ = счетчик слов, копируемых из стека защищенного режима в стек реального режима ES:DI = селекторхмещение структуры вызова реального режима		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Копирует заданное в регистре СХ число слов из стека защищенного режима в стек реального режима. В регистровой паре ES.DI указан адрес структуры данных в памяти, которая определяет значения регистров при переходе к обработке прерывания реального режима. Структура вызова показана далее29		
	Смещение	Размер	Регистр
	ООН	Двойное слово	EDI
	04Н	Двойное слово	ESI
	08Н	Двойное слово	EBP
	ОСН	Двойное слово	Зарезервировано, должно быть равно 0
	ЮН	Двойное слово	ЕВХ
	14Н	Двойное слово	EDX
	18Н	Двойное слово	ЕСХ
	1СН	Двойное слово	ЕАХ
	20Н	Слово	FLAGS
	22Н	Слово	ES
	24Н	Слово	DS
	26Н	Слово	FS
28 Точнее, номер прерывания задан в BL, а в ВН — признаки: бит 0 — сброс контроллера прерываний и выключение адресной линии А20, биты 1—7 — зарезервированы и должны быть равны 0. — Пер.
29 Поля CS и IP игнорируются — функция вызывает обработчик, адрес которого указан в таблице прерываний. Если поля SS и SP равны нулю, то стек распределяется DPMI. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1179
Таблица П1.15 (продолжение)
	Смещение	Размер	Регистр
	28Н	Слово	GS
	2АН	Слово	IP
	2СН	Слово	CS
	2ЕН	Слово	SP
	ЗОН	Слово	SS
0301 н	Вызвать процедуру реального режима, заканчивающуюся командой одтг		
При вызове	АХ =0301Н ВН = ООН30 СХ = счетчик слов, копируемых из стека защищенного режима в стек реального режима ES:DI = адрес структуры вызова		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Вызывает дальнюю процедуру реального режима из защищенного режима. Значения регистров при входе в подпрограмму заданы в структуре вызова (см. функцию 0300Н)		
0302Н	Вызвать процедуру реального режима, заканчивающуюся командой IRET		
При вызове	АХ = 0302Н ВН = ООН СХ = счетчик слов, копируемых из стека защищенного режима в стек реального режима ES:DI = адрес структуры вызова		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Вызывает процедуру обработки прерывания реального режима из защищенного режима. Значения регистров при входе в подпрограмму заданы в структуре вызова (см. функцию 0300Н)		
0303Н	Перехват передачи управления программе реального режима		
При вызове	АХ = 0303Н DS:SI = адрес процедуры защищенного режима ES:DI = адрес структуры для вызова процедуры реального режима		
При возврате	Если успешно (CF = 0), то CX:DX = адрес в реальном режиме, a ES:DI = адрес структуры, модифицированной для вызова процедуры защищенного режима. Если CF = 1, то АХ = код ошибки		
30 Бит 0 в ВН задает сброс контроллера прерывания и отключение адресной линии А20. Остальные биты зарезервированы и должны быть равны нулю. — Пер.
1180
Приложение 1
ТаблицаГ11.15 (продолжение)
0304Н	Отмена перехвата передачи управления программе реального режима
При вызове	АХ = 0304Н CX:DX = адрес вызова в реальном режиме
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Отменяет перехват вызова, установленный функцией 0303Н
0305Н	Получить адрес процедуры сохранения/восстановления контекста
При вызове	АХ = 0305Н
При возврате	Если успешно (CF = 0), то □	АХ = размер буфера □	ВХ:СХ = адрес процедуры для реального режима □	SI:DI = адрес процедуры для защищенного режима Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Возвращает адрес процедуры, которая сохраняет в памяти содержимое регистров перед переключением между режимами. Адрес процедуры в реальном режиме — ВХ:СХ; она сохраняет регистры защищенного режима. При работе в защищенном режиме сохранение регистров реального режима обеспечивается вызовом процедуры по адресу SI:DI. Сохранение или восстановление регистров определяется значением AL. Если AL = 0, регистры сохраняются, а если AL = 1, то восстанавливаются
0306Н	Получить адрес процедуры переключения режимов
При вызове	АХ = 0306Н
При возврате	Если успешно (CF = 0), то □	ВХ:СХ = адрес процедуры переключения в защищенный режим □	SI:DI = адрес процедуры переключения в реальный режим Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Для переключения из реального режима в защищенный выполняется дальний переход по адресу, возвращенному в регистровой паре ВХ:СХ, а для обратного переключения — по адресу, возвращенному в паре SI:DI. Перед вызовом процедуры необходимо определить значения следующих регистров: □	АХ = новое значение DS □	ВХ = новое значение SP □	СХ = новое значение ES □	DX = новое значение SS □	SI = новое значение CS □	DI = новое значение IP
0400Н	Получить версию DPMI
При вызове	АХ = 0400Н
Директивы ассемблера, функции DOS и BIOS, управление мышью 1181
Таблица П1.15 (продолжение)
При возврате	Если успешно (CF = 0), то □	АХ = номер версии DPMI31 □	ВХ = флаги32 □	CL = тип процессора33 □	DH = номер прерывания для IRQ0 (главный контроллер прерываний) □	DL = номер прерывания для IRQ8 (первый вход ведомого контроллера прерываний) Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Обычно базовые номера векторов равны 08Н для главного контроллера и 70Н для ведомого
0401Н	Получить информацию о возможностях DPMI-сервера
При вызове	АХ = 0401Н ES:DI = адрес буфера
При возврате	Если ошибка (CF = 1), то АХ = код ошибки, а иначе АХ = параметры
Пояснение	Функция поддерживается DPMI 1.0; соответствие битов в регистре АХ возможностям DPMI-сервера следующее: □	бит 6 — защита DPMI-сервера от записи □	бит 5 — защита клиента (DOS или Windows) от записи □	бит 4 — заполнение нулями □	бит 3 — отображение стандартной памяти □	бит 2 — отображение устройств □	бит 1 — перезапуск при исключении □	бит 0 — пометка страницы как доступной или модифицированной ("грязной”)
0500Н	Получить информацию о свободной памяти
При вызове	АХ = 0500Н ES:DI = адрес буфера
При возврате	CF = 1 — ошибка; CF = 0 — успешно
31 В АН — номер версии, в AL — номер модификации. — Пер.
32 Флаги в ВХ: бит 0=1, если программа запущена под управлением DPMI для 80386; бит 1=1, если процессор вернулся в реальный режим для обработки прерываний; бит 2=1, если поддерживается виртуальная память; бит 3 зарезервирован (и не имеет значения), остальные биты зарезервированы и должны быть равны нулю. — Пер.
33 CL = 2 — процессор 80286; CL = 3 — процессор 80386; CL = 4 — процессор 80486. — Пер.
1182
Приложение 1
Таблица П1.15 (продолжение)
Пояснение	Информация о свободной памяти формируется функцией в буфере по адресу ES:DI. Содержимое буфера показано далее:34		
	Смещение	Размер	Значение
	ООН	Двойное слово	Размер наибольшего доступного свободного блока (в байтах)
	04Н	Двойное слово	Максимальное количество доступных неза-блокированных страниц памяти
	08Н	Двойное слово	Максимальное количество доступных заблокированных страниц памяти
	ОСН	Двойное слово	Размер линейного адресного пространства в страницах
	ЮН	Двойное слово	Общее количество незаблокированных страниц
	14Н	Двойное слово	Количество свободных страниц
	18Н	Двойное слово	Общее количество физических страниц
	1СН	Двойное слово	Размер свободного линейного адресного пространства в страницах
	20Н	Двойное слово	Размер страничного файла или раздела в страницах
	24Н	12 байт	(Зарезервировано)
0501Н	Выделить блок памяти		
При вызове	АХ =0501Н ВХ:СХ = размер блока в байтах		
При возврате	Если успешно (CF = 0), то □	ВХ:СХ = линейный адрес выделенного блока памяти □	SI:DI = индекс блока памяти Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Распределяет блок памяти, размер которого в байтах задан 32-битным значением в регистровой паре ВХ:СХ. На выходе пара ВХ:СХ содержит начальный адрес блока, a SI:DI — индекс блока35		
0502Н	Освободить блок памяти		
При вызове	АХ = 0502Н SI.DI = индекс блока памяти		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
34 Если DPMI не поддерживает виртуальную память, функция заполняет только первое поле структуры, а в остальные поля записывает —1. — Пер.
35 Индекс используется для изменения размера блока и освобождения памяти. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1183
	Таблица П1.15 (продолжение)
0503Н	Изменить размер блока памяти	г <
При вызове	АХ = 0503Н ВХ:СХ = требуемый размер блока памяти (в байтах) SI:DI = индекс блока памяти
При возврате	Если успешно (CF = 0), то □ ВХ:СХ = новый линейный адрес блока памяти □ SI:DI = новый индекс блока памяти
	Если ошибка (CF = 1), то АХ = код ошибки
0504Н	Выделить блок линейной памяти
Пр и вызове	АХ = 0504Н ЕВХ = требуемый линейный базовый адрес36 37 ЕСХ = размер блока в байтах EDX = код подфункции
При возврате	Если успешно (CF = 0), то □ ЕВХ = линейный базовый адрес блока □ ESI = индекс блока Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Использует 32-битный DPMI для распределения блока линейной памяти, выровненного по границе страницы. Подфункция 0 только распределяет адреса для блока памяти, но самой памяти не выделяет07, а подфункция 1 создает полноценный блок с памятью
0505Н	Изменить размер блока линейной памяти
При вызове	АХ = 0505Н ES:EBX = адрес буфера ЕСХ = размер блока в байтах EDX = код подфункции (см. функцию 0504Н) ESI = индекс блока памяти
При возврате	Если успешно (CF = 0), то □ ВХ:СХ = линейный базовый адрес блока □ SI.DI = индекс блока Если ошибка (CF = 1), то АХ = код ошибки
36 Если ЕВХ = 0, то адрес назначается DPMI. — Пер.
37 Память для так называемого uncommitted-блока, создаваемого подфункцией 0, не выделена (зарезервировано только адресное пространство). Напротив, для committed-блока, создаваемого подфункцией 1, память выделена. — Пер.
1184
Приложение 1
Таблица П1.15 (продолжение)
0506Н	Получить атрибуты страниц блока линейной памяти
При вызове	АХ = 0506Н ЕВХ = смещение страницы в блоке памяти ЕСХ = счетчик страниц ES:EDX = адрес буфера ESI = индекс блока памяти
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Записывает в буфере атрибуты указанного числа страниц, входящих в линейный блок памяти. Атрибуты для каждой страницы представлены 16-битным СЛОВОМ’ □	бит 0: 0 — страница не связана с физической памятью (uncommitted), 1 — связана (committed) □	бит 1 — 1 = страница отображается П бит 3 — 0 = страница доступна только для чтения, 1 = доступна для чтения и записи □	бит 4 — 0 = флаг модификации страницы не поддерживается, 1 = поддерживается □	бит 5 — 0 = страница недоступна, 1 = доступна □	бит 6 — 0 = страница не модифицирована, 1 = модифицирована
0507Н	Установить атрибуты страниц линейного блока памяти
При вызове	АХ = Э507Н ЕВХ = смещение страницы в блоке памяти ЕСХ = счетчик страниц ES-EDX = адрес буфера ESI = индекс блока памяти
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение i	Перед вызовом функции в буфере формируется массив слов с атрибутами, по одному слову для каждой страницы блока памяти. Слово атрибутов содержит
| следующую информацию:
I □ бит 0: 0 — освободить занятую блоком физическую память, 1 — распределить память для блока
□ бит 1 — 1 = установить только атрибуты, не изменяя тип страницы
I □ бит 3 — 0 = сделать страницу доступной только для чтения, 1 = для чтения
I и записи
| □ бит 4 — 0 = игнорировать значения бит 5 и 6
। □ бит 5 — 1 = пометить страницу, как доступную
! □ бит 6 — 1 = пометить страницу, как модифицированную ("грязную")
Директивы ассемблера, функции DOS и BIOS, управление мышью
1185
Таблица П1.15 (продолжение)
0508Н	Отобразить устройство в блок памяти		
При вызове	АХ = 0508Н ЕВХ = смещение страницы в блоке памяти ЕСХ = счетчик страниц EDX = адрес устройства ESI = индекс блока памяти		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Отображает физические адреса устройства в блок памяти		
0509Н	Отобразить стандартную память		
При вызове	АХ = 0509Н EDX = линейный адрес отображаемой стандартной памяти ESI = индекс блока памяти ЕВХ = смещение в блоке памяти ЕСХ = счетчик страниц в блоке		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Отображает стандартную память в блок памяти, созданный функцией 0504Н		
050АН	Получить размер и адрес блока памяти		
При вызове	АХ = 050АН SI:DI = индекс блока памяти		
При возврате	Если успешно (CF = 0), то SI:DI = размер и ВХ:СХ = адрес блока памяти Если ошибка (CF = 1), то АХ = код ошибки		
050ВН	Получить информацию о распределенной и доступной памяти		
При вызове	АХ = 050ВН DI:SI = адрес буфера		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Записывает сведения в 128-баС вой паре DI:SI. Содержимое бус		1тный буфер по адресу, указанному в регистро-эера показано далее:
	Смещение	Размер	Значение
	ООН	Двойное слово	Общий размер физической памяти, распределенной DPMI-сервером
	04Н	Двойное слово	Общий размер виртуальной памяти, распределенной DPMI-сервером
	08Н	Двойное слово	Размер свободной виртуальной памяти, доступной DPMI-серверу
	ОСН	Двойное слово	Общий размер виртуальной памяти, выделенной виртуальной машине
38 Зак. 384
1186
Приложение 1
Таблица П1.15 (продолжение)
	Смещение	Размер	Значение
	ЮН	Двойное слово	Размер свободной виртуальной памяти, доступной виртуальной машине
	14Н	Двойное слово	Общий размер виртуальной памяти, распределенной клиенту
	18Н	Двойное слово	Размер свободной виртуальной памяти, доступной клиенту
	1СН	Двойное слово	Размер заблокированной памяти клиента
	20Н	Двойное слово	Максимальный размер заблокированной памяти клиента
	24Н	Двойное слово	Максимальный линейный адрес памяти клиента
	28Н	Двойное слово	Размер наибольшего свободного блока памяти
	2СН	Двойное слово	Размер минимальной единицы распределения
	ЗОН	Двойное слово	Размерность выравнивания при распределении
	34Н	76 байт	(Зарезервировано)
0600Н	Заблокировать линейную область памяти38		
При вызове	АХ = 0600Н ВХ:СХ = линейный адрес блокируемой области памяти SI:DI = размер блокируемой области памяти в байтах		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
0601 н	Разблокировать линейную область памяти		
При вызове	АХ = 0601Н ВХ:СХ = линейный адрес области памяти SI:DI = число разблокируемых байт		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
0602Н	Отмена блокировки страниц для области памяти виртуального режима39		
При вызове	АХ = 0602 Н ВХ:СХ = линейный адрес области памяти SI:DI = число байт в разблокируемой области памяти		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
38 Для заблокированной области памяти свопинг страниц не выполняется. — Пер.
39 Область памяти, используемая виртуальной машиной, обычно заблокирована и не подвергается свопингу. Функция разрешает свопинг для заданного участка памяти виртуальной машины. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1187
	Таблица П1.15 (продолжение)
0603Н	Возобновление блокировки страниц для области памяти виртуального режима
При вызове	АХ = 0603Н ВХ:СХ = линейный адрес области памяти SI.DI = число байт в области
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0604Н	Получить размер страницы памяти
При вызове	АХ = 0604Н
При возврате	Если успешно (CF = 0), то ВХ:СХ = размер страницы в байтах, а иначе АХ = код ошибки
0702Н	Л	40 Отметка страницы для свопинга
При вызове	АХ = 0702Н ВХ.СХ = линейный адрес области памяти SI:DI = число байт в области
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0703Н	Освободить страницу
При вызове	АХ = 0703Н ВХ:СХ = линейный адрес области памяти SI:DI = число байт в области
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Возвращает страницы операционной системе
0800Н	Преобразовать физические адреса в линейные40 41
При вызове	АХ = 0800Н ВХ:СХ = базовый физический адрес отображаемой области памяти SI:DI = число байт
При возврате	Если успешно (CF = 0), то ВХ:СХ = базовый линейный адрес, а иначе АХ = код ошибки
0801Н	Отключить отображение физических адресов
При вызове	АХ = 0801Н ВХ:СХ = базовый линейный адрес
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
40 Функция сообщает операционной системе о возможности выгрузки (свопинга) на диск указанной страницы или диапазона страниц. — Пер.
41 Используется при работе с периферийными устройствами, у которых пространство ввода-вывода отображается в диапазон физических адресов. — Пер.
1133 Приложение 1
Таблица П1.15 (продолжение)
0900Н	Получить состояние виртуальных прерываний и запретить-их
При вызове	АХ = 0900Н
При возврате	Если ошибка (с = 1), то ах = код ошибки42
0901Н	Получить состояние виртуальных прерываний и разрешить их
При вызове	АХ = 0901Н
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0902Н	Получить состояние виртуальных прерываний	Д
При вызове	АХ = 0902Н
При возврате	Если успешно (С = 0), то AL = 0 означает, что прерывания запрещены. Если ошибка (CF = 1), то АХ = код ошибки
0A00H	Получить адрес для вызова расширений DPMI	' / /
При вызове	АХ = 0A00H DS:SI = адрес строки ASCII с названием производителя DOS-экстендера
При возврате	Если успешно (CF = 0), то ES:DI = адрес точки входа для вызова расширений, а иначе АХ = код ошибки
овоон	Установить точку останова для отладки	3 - •
При вызове	АХ = ОВООН ВХ:СХ = линейный адрес точки останова DH = тип точки останова DL = размер операнда для точки останова
При возврате	Если успешно (CF = 0), то ВХ = индекс точки останова, а иначе АХ = код ошибки
Пояснение	Адрес точки останова задан в регистрах ВХ:СХ. В регистре DH — условие срабатывания: □	0 = при выполнении инструкции по адресу останова; □	1 = при записи в память по адресу точки останова; □	2 = при чтении или записи в точке останова. Регистр DL содержит размер точки в байтах— 1 или 2. Для проверки срабатывания используется функция 0В02Н
0В01Н	Отмена отладочной точки останова
При вызове	АХ = 0В01Н ВХ = индекс точки останова
42 Если С = 0, то AL = 0/1 говорит о том, что виртуальные прерывания были запреще-ны/разрешены. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1189
Таблица П1.15 (продолжение)
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Удаляет точку останова, установленную функцией 0B00H		
0В02Н	Получить состояние отладочной точки останова		
При вызове	АХ = 0В02Н ВХ = индекс точки останова		
При возврате	Если успешно (CF = 0), то АХ = состояние точки останова, а иначе АХ = код ошибки		
Пояснение	Используется для проверки срабатывания точки останова. Значение в регистре АХ при срабатывании — 1, иначе — 0		
0В03Н	Обнуление точки останова		
При вызове	АХ = 0В03Н ВХ = индекс точки останова		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Обнуляет состояние точки останова (но не удаляет ее)		
осоон	Регистрация адресов вызова провайдера резидентных процедур		
При вызове	АХ = ОСООН ES:DI = адрес буфера		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Предоставляет DPMI-адрес вызова инициализирующей части резидентной программы43. Вызов происходит при загрузке или выгрузке 16- или 32-битного приложения в той же виртуальной машине. Буфер по адресу, указанному регистром ES:DI, содержит следующую информацию для DPMI:		
	Смещение	Размерность	Назначение
	ООН	64-битное слово	Дескриптор 16-битного сегмента данных
	08Н	64-битное слово	Дескриптор 16-битного сегмента кода
	ЮН	Слово	Смещение 16-битной процедуры вызова
	12Н	Слово	(Зарезервировано)
	14Н	64-битное слово	Дескриптор 32-битного сегмента данных
	ЮН	64-битное слово	Дескриптор 32-битного сегмента кода
	24Н	Двойное слово	Смещение 32-битной процедуры вызова
43 После выполнения этой функции программа-провайдер должна завершиться (с сохранением в памяти) функцией 0С01Н. — Пер.
1190
Приложение 1
Таблица П1.15 (продолжение)
0С01Н	Завершить выполнение провайдера резидентных процедур с сохранением в памяти		
При вызове	АХ = 0С01Н BL = код завершения DX = объем резервируемой памяти DOS в параграфах		
0D00H	Распределить блок разделяемой памяти		
При вызове	АХ = 0D00H ES:DI = адрес буфера		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
Пояснение	Распределяет блок памяти, которая может быть использована несколькими DPMI-клиентами. Буфер содержит следующую информацию для DPMI (в него же записываются результаты запроса):		
	Смещение	Размерность	Значение
	ООН	Двойное слово	Требуемый размер блока в байтах (записывается клиентом)
	04Н	Двойное слово	Размер выделенной памяти (формируется DPMI-сервером)
	08Н	Двойное слово	Индекс блока памяти (формируется DPMI-сервером)
	осн	Двойное слово	Линейный адрес блока памяти (формируется DPMI-сервером)
	юн	Двойное слово	32-битное смещение строки ASCIIZ с именем блока (записывается клиентом)
	14Н	Слово	Селектор строки ASCIIZ с именем блока (записывается клиентом)
	16Н	Слово	(Зарезервировано)
	18Н	Двойное слово	0
0D01H	Освободить разделяемую память		
При вызове	AX = 0D01H SI:DI = индекс блока памяти		
При возврате	Если ошибка (CF = 1), то АХ = код ошибки		
0D02H	Получение прав доступа к блоку разделяемой памяти44		
При вызове	АХ = 0D02H DX = опции SI:DI = индекс блока памяти		
44 Используется для синхронизации доступа клиентов к разделяемой области памяти. — Пер.
Директивы ассемблера, функции DOS и BIOS, управление мышью
1191
	Таблица П1.15 (окончание)
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Опции в регистре DX: □	бит 0: 0 — останов до предоставления прав доступа, 1 — при отказе немедленный выход с кодом ошибки; □	бит 1:0 — монопольный доступ, 1 — совместный доступ
0D03H	Вернуть права доступа к разделяемой памяти
При вызове	АХ = 0D03H DX = опции SI:DI = индекс блока памяти
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
0E00H	Получить информацию о сопроцессоре
При вызове	АХ = 0E00H
При возврате	Если успешно (CF = 0), то АХ = данные о сопроцессоре, а иначе АХ = код ошибки
Пояснение	Данные в регистре АХ при успешном завершении: □	бит 0 — 1 = данному клиенту разрешено использовать сопроцессор □	бит 1 — 1 = для данного клиента включена эмуляция сопроцессора □	бит 2 — 1 = сопроцессор присутствует □	бит 3 — 1 = DPMI-сервер эмулирует сопроцессор □	биты 4-7: •	0000 = сопроцессор отсутствует •	0001 = имеется сопроцессор 80287 •	0010 = имеется сопроцессор 80387 •	0011 = имеется сопроцессор 80487/Pentium
0Е01Н	Выключить/выключить эмуляцию сопроцессора
При вызове	АХ=0Е01Н ВХ = подфункция
При возврате	Если ошибка (CF = 1), то АХ = код ошибки
Пояснение	Подфункция 1 включает эмуляцию сопроцессора для данного клиента, а подфункция 0 — отключает
ПРИЛОЖЕНИЕ 2
Система команд микропроцессоров 80x86/Pentium
Данное приложение содержит сведения о машинном языке и перечень инструкций процессоров 8086—Pentium 4, кроме команд арифметического сопроцессора, рассмотренных в главе 14.
Для каждой команды приведены:
□	мнемоническое обозначение на языке ассемблера;
□	краткое описание;
□	форматы машинного кода (включая поля смещения и непосредственного операнда) с указанием кодов операции;
□	воздействие на флаги процессора (отсутствие строки с названиями флагов "OD1TSZAPC" означает, что флаги не изменяются). Характер воздействия обозначен следующими символами:
•	? — непредсказуемое изменение (значение флага неопределенное);
•	* — предсказуемое изменение в соответствии с назначением флага;
•	1 — флаг устанавливается в 1;
•	0 — флаг обнуляется;
•	<пробел> — значение флага не изменяется.
Списку команд в табл. П2.9 предшествуют сведения о кодировке методов адресации. В табл. П2.1 приведены значения двухбитного поля модификатора; в табл. П2.9 биты этого поля обозначаются как оо1. Во всех случаях, когда задано смещение, в машинном коде оно находится после кода операции.
Таблица П2.1. Биты модификатора оо
оо Значение
00 Если mmm = 110, то смещение задано (прямая адресация); если mmm <> 110, то смещение отсутствует
01 Смещение задано знаковым байтом
10 Смещение задано 16- или 32-битном знаковым числом
11 Поле mmm содержит код регистра (а не код метода адресации данных в памяти)
1 Поля MOD, R/М и REG из главы 4 обозначаются здесь как оо, mmm и ггг. — Пер.
Система команд микропроцессоров 80x86/Pentium
1193
В табл. П2.2 приведены коды поля mmm при адресации данных в памяти в 16-битном режиме.
Таблица П2.2. Коды поля mmm при адресации данных в памяти в 16-битном режиме
1ПТПГП	Адрес
ООО	DS:[BX+SI]
001	DS:[BX+DI]
010	SS:[BP+SI]
011	SS:[BP+DI]
100	DS:[SI]
101	DS:[DI]
110	SS:[ВР]
111	DS:[ВХ]
В табл. П2.3 приведены значения кода поля ггг при выборе 8-, 16- и 32-битного операнда. Таблица П2.3. Значения поля ггг		
ггг	w = o	W = 1
000	AL	AX/EAX
001	CL	CX/ECX
010	DL	DX/EDX
011	BL	BX/EBX
100	AH	SP/ESP
101	CH	BP/EBP
110	DH	SI/ESI
111	BH	DI/EDI
Кодировка сегментных регистров приведена в табл. П2.4. Заметим, что сегментный регистр может быть явно указан только в командах mov, push и pop.
Таблица П2.4. Значения поля ггг при выборе сегментного регистра
Код поля rrr	Сегментный регистр
000	ES
001	CS
010	SS
011	DS
1194
Приложение 2
Таблица П2.4 (окончание)
	Код ПОЛЯ ггг	Сегментный регистр
	100	FS
	101	GS
В табл. П2.5 и П2.6 приведены сведения, имеющие отношение только к процессорам 80386—Pentium 4. В табл. П2.5 перечислены значения поля ггг при выборе режима 32-битной косвенной адресации.
Таблица П2.5. Значения поля ггг при косвенной адресации через 32-битный регистр
Rrr	Адрес
000	DS:[EAX]
001	DS:[ECX]
010	DS:[EDX]
011	DS:[EBX]
100	(см. табл. П2.6)
101	SS:[EBP]
110	DS:[ESI]
111	DS:[EDI]
В табл. П2.6 приведены сочетания полей машинного кода при базово-индексной адресации с масштабированием в процессорах 80386—Pentium 4. В табл. П2.6 ciisp8 означает 8-битное, a disp32 — 32-битное смещение; sinx — индексный регистр с масштабным коэффициентом.
Таблица П2.6. Сочетания полей оо, mmm и ггг при 32-битной адресации
oo	Mmm.	rrr (код базового регистра)	Адресация
00	000	—	DS:[ЕАХ]
00	001	—	DS:[ЕСХ]
00	010	—	DS:[EDX]
00	011	—	DS:[EBX]
00	100	000	DS:[EAX+sinx]
00	100	001	DS:[ECX+sinx]
00	100	010	DS:[EDX+sinx]
00	100	011	DS:[EBX+sinx]
00	100	100	SS:[ESP+sinx]
00	100	101	DS:[disp32+sinx]
Система команд микропроцессоров 80x86/Pentium
1195
Таблица П2.6 (продолжение)			
ОО	Mmm	ггг (код базового регистра)	Адресация
00	100	110	DS:[ESI+sinx]
00	100	111	DS:[EDI+sinx]
00	101	—	DS:disp32
00	110	—	DS:[ESI]
00	111	—	DS:[EDI]
01	ООО	—	DS:[EAX+disp8]
01	001	—	DS:[ECX+disp8]
01	010	—	DS:[EDX+disp8]
01	011	—	DS:[EBX+disp8]
01	100	000	DS:[EAX+sinx+disp8]
01	100	001	DS:[ECX+sinx+disp8]
01	100	010	DS:[EDX+sinx+disp8]
01	100	011	DS:[EBX+sinx+disp8]
01	100	100	SS:[ESP+sinx+disp8]
01	100	101	SS:[EBP+sinx+disp8]
01	100	110	DS:[ESI+sinx+disp8]
01	100	111	DS:[EDI+sinx+disp8]
01	101	—	SS:[EBP+disp8]
01	110	—	DS:[ESI+disp8]
01	111	—	DS:[EDI+disp8]
10	000	—	DS:[EAX+disp32]
10	001	—	DS:[ECX+disp32]
10	010	—	DS:[EDX+disp32]
10	011	—	DS:[EBX+disp32]
10	100	000	DS:[EAX+sinx+disp32]
10	100	001	DS:[ECX+sinx+disp32]
10	100	010	DS:[EDX+sinx+disp32]
10	100	011	DS:[EBX+sinx+disp32]
10	100	100	SS:[ESP+sinx+disp32]
10	100	101	SS:[EBP+sinx+disp32]
10	100	110	DS:[ESI+sinx+disp32]
10	100	111	DS:[EDI+sinx+disp32]
1196
Приложение 2
Таблица П2.6 (окончание)
оо	Mmm	ггг (код базового регистра)	Адресация
10	101	—	SS:[EBP+disp32]
10	110	—	DS:[ESI+disp32]
10	111	—	DS:[EDI+disp32]
Поля оо и mmm при базово-индексной адресации с масштабированием находятся во втором байте кода операции. Следующий байт — байт базы-индекса-масштаба — содержит три поля. Два бита слева задают масштабный коэффициент (код 00 задает множитель I, код 01 — множитель 2, код 10 — 4, а код 11 — 8). Следующие три бита содержат код индексного регистра из табл. П2.5. Крайние три бита справа — это биты ггг из табл. П2.6. Например, база-индекс-масштаб для инструкции mov al, [евх+2*есх] кодируется байтом 01 001 ОН, где 01 означает масштабный коэффициент 2, 001 — регистр ЕСХ, а ОН — регистр ЕВХ.
В табл. П2.7 приведены значения префиксов, используемых для переназначения сегмента и изменения разрядности. Например, в инструкции mov al,es:[bx] указан префикс переназначения сегмента (es:) для обращения к дополнительному сегменту данных.
Таблица П2.7. Префиксы переназначения сегмента и размерности
Код префикса	Действие
26H	Выбор сегмента из регистра ES
2EH	Выбор сегмента из регистра CS
36H	Выбор сегмента из регистра SS
ЗЕН	Выбор сегмента из регистра DS
64Н	Выбор сегмента из регистра FS
65Н	Выбор сегмента из регистра GS
66Н	Изменение размерности операнда
67Н	Изменение размерности регистра
В табл. П2.8 приведены значения числа дополнительных тактов на вычисление исполнительного адреса (effective address — еа) для процессоров 8086 и 8088. Эти значения следует добавить к числу циклов в табл. П2.9 — только для этих процессоров.
Таблица П2.8. Примеры задания исполнительного адреса и время его вычисления в процессорах 8086/8088
Адресация	Число тактов на вычисление еа	Пример инструкции
Базовая/индексная	5	MOV' CL, [DI]
Прямая	3	MOV AL,DATA1
Система команд микропроцессоров 80x86/Pentium
1197
Таблица П2.8 (окончание)
Адресация	Число тактов на вычисление еа	Пример инструкции
Базово-индексная	7	MOV AL,[BP+SI]
Базовая/индексная со смещением	9	MOV DH,[DI+20H]
Базово-индексная со смещением	11	MOV CL,[BX+DI+2]
С префиксом переназначения сегмента	еа + 2	MOV AL,ED:[DI]
Список инструкций микропроцессоров семейства 80x86—Pentium приведен в табл. П2.9. Заметим, что число тактов на выполнение инструкций процессорами Pentium Pro—Pentium 4 не указано — фирма Intel эти сведения не предоставляет. В принципе, эти значения не должны существенно отличаться от данных, приведенных в табл. П2.9 для процессора Pentium. (Для определения числа тактов имеется ИНСТРУКЦИЯ RDTSC.)
Таблица П2.9. Инструкции микропроцессоров семейства 80x86—Pentium
аа	ASCII-коррекция содержимого регистра AL после сложения
00110111
OF	DF IF TF SF	ZF	AF	PF	CF ? ?	?	*	?	*		
Пример	Микропроцессор	Число тактов
AAA	8086	8
	8088	8
	80286	3
	80386	4
	80486	3
	Pentium	3
aad ;	ASCII-коррекция содержимого регистра AX перед делением		
11010101 00001010 OF	DF IF TF SF	ZF	AF	PF	CF ? *	*	? * ?		
Пример	Микропроцессор	Число тактов
AAD	8086	60
	8088	60
	80286	14
	80386	19
	80486	14
	Pentium	10
1198
Приложение 2
Таблица П2.9 (продолжение) дам	ASCII-коррекция содержимого регистра АХ после умножения 11010100 00001010 OF	DF IF TF SF	ZF	AF	PF	CF ? *	*	?	*	?			
Пример		Микропроцессор	Число тактов
AAM		8086	83
		8088	83
		80286	16
		80386	17
		80486	15
		Pentium	18
aas	ASCII-коррекция содержимого регистра AL после вычитания			
00111111 OF	DF IF TF SF	ZF	AF	PF	CF ? ?	? *	?			
Пример		Микропроцессор	Число тактов
AAS		8086	8
		8088	8
		80286	3
		80386	4
		80486	3
		Pentium	3
adc	Сложение с переносом			
OOOlOOdw oorrrmmm disp OF	DF IF TF SF	ZF	AF	PF	CF * *	*	*	*	*			
Формат	Примеры	Микропроцессор	Число тактов
ADC reg,reg	ADC AX,BX ADC AL,BL ADC EAX,EBX ADC CX,SI ADC ESI,EDI	8086	3
		8088	3
		80286	3
		80386	3
		80486	1
		Pentium	1 или 3
ADC mem, reg	ADC DATAY,AL ADC LIST,SI ADC DATA2[DI],CL ADC [EAX],BL ADC [EBX+2*ECX],EDX	8086	16 + еа
		8088	24 + еа
		80286	7
		80386	7
		80486	•з
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1199
Таблица П2.9 (продолжение)
ADC reg,mem	ADC BL,DATA1 ADC SI,LIST1 ADC CL,DATA2[SI] ADC CX,[ESI] ADC ESI,[2*ECX]	8086	9 + ea
		8088	13 + ea
		80286	7
		80386	6
		80486	2
		Pentium	1 или 2
lOOOOOsw ooOlOmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
ADC reg,imm	ADC CX,3 ADC DI,1AH ADC DL,34H ADC EAX,12345 ADC CX,1234H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
ADC mem,imm	ADC DATA4,33 ADC LIST,'A' ADC DATA3[DI],2 ADC BYTE PTR[EBX],3 ADC WORD PTR[DI],669H	8086	17 + еа
		8088	23 + еа
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
ADC acc,imm	ADC AX,3 ADC AL,1AH ADC АН,34H ADC EAX,2 ADC AL,'Z'	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
add	Сложение			
OOOOOOdw oorrrmmm disp OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
ADD reg,reg	ADD AX,BX ADD AL,BL ADD EAX,EBX ADD CX,SI ADD ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	J	
		Pentium	1 или 3
1200
Приложение 2
Таблица П2.9 (продолжение)
ADD mem,reg	ADD DATAY,AL ADD LIST,SI ADD DATA6[DI],CL ADD [EAX],CL ADD [EDX+4*ECX] , EBX	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
ADD reg,mem	ADD BL,DATA2 ADD SI,LIST3 ADD CL,DATA2[DI] ADD CX,[EDI] ADD ESI,[ECX+200H]	8086	9 + ea
		8088	13 + ea
		80286	7
		80386	6
		80486	2
		Pentium	1 или 2
lOOOOOsw ooOOOmmm disp data
Формат	Примеры	Микропроцессор	Число тактов
ADD reg,imm	ADD CX,3 ADD DI,1AH ADD DL,34H ADD EDX,1345H ADD CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
ADD mem,imm	ADD DATA4,33 ADD LIST,'A' ADD DATA3[DI],2 ADD BYTE PTR[EBX],3 ADD WORD PTR[DI],669H	8086	17 + ea
		8088	23 + ea
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
ADD acc,imm	ADD AX,3 ADD AL,1AH ADD АН,34H ADD EAX,2 ADD AL,'Z'	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
Побитовая операция "И"
OOlOOOdw oorrrmmm disp
OF DF IF TF SF ZF ' AF PF CF
0	*	*	?	*	0
Система команд микропроцессоров 80x86/Pentium
1201
Таблица П2.9 (продолжение)
Формат	Примеры	Микропроцессор	Число тактов
AND reg,reg	AND CX,BX AND DL,BL AND ECX,EBX AND BP, SI AND EDX,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 3
AND mem, reg	AND BIT,AL AND LIST,DI AND DATAZ[BX],CL AND [EAX],BL AND [ESI+4*ECX],EDX	8086	16 + еа
		8088	24 + еа
		80286	7
		80386	7
		80486	_3	
		Pentium	1 или 3
AND reg,mem	AND BL,DATAW AND SI,LIST AND CL,DATAQ[SI] AND СХ,[EAX] AND ESI,[ECX+43H]	8086	9 + еа
		8088	13 + еа
		80286	7
		80386	6
		80486	2
		Pentium	1 или 2
lOOOOOsw oolOOmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
AND reg,imm	AND BP,1 AND DI,10H AND DL,34H AND EBP,1345H AND SP,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
AND mem, imm	AND DATA4,33 AND LIST,'A' AND DATA3[DI] ,2 AND BYTE PTR[EBX],3 AND DWORD PTR[DI],66H	8086	17 + еа
		8088	23 + еа
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
AND acc,imm	AND AX,3 AND AL,1AH AND AH,34H AND EAX,2 AND AL,'r'	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
1202
Приложение 2
Таблица П2.9 (продолжение)
AREi* .	Настройка поля RPL селектора
01100011 oorrnumm disp OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
ARPL reg,reg	ARPL AX,BX ARPL BX,SI ARPL AX,DX ARPL BX,AX ARPL SI, DI	8086	—
		8088	—
		80286	10
		80386	20
		80486	9
		Pentium	7
ARPL mem, reg	ARPL DATAY,AX ARPL LIST,DI ARPL DATA3[DI],CX ARPL [EBX],AX ARPL [EDX+4*ECX],BP	8086	—
		8088	—
		80286	11
		80386	21
		80486	9
		Pentium	7
bound	Проверка индекса массива на выход за границы массива
01100010 oorrnumm disp
Формат	Примеры	Микропроцессор	Число тактов
BOUND reg,mem	BOUND AX,BETS BOUND BP,LISTG BOUND CX,DATAX BOUND BX,[DI] BOUND SI,[BX+2]	8086	—
		8088	—
		80286	13
		80386	10
		80486	7
		Pentium	8
вФ?	Сканирование битов в прямом направлении
00001111 10111100 oorrnumm disp
OF	DF	IF	TF	SF	ZF	AF	PF	CF
?				?	*	?	?	?
Формат	Примеры	Микропроцессор	Число тактов
BSF reg,reg	BSF AX,BX BSF BX,SI BSF EAX,EDX BSF EBX,EAX BSF SI,DI	8086	—
		8088	—
		80286	—
		80386	10 + Зп	
		80486	6-42
		Pentium	6-42
Система команд микропроцессоров 80x86/Pentium
1203
Таблица П2.9 (продолжение)
BSF reg,mem	BSF AX,DATAY BSF SI,LIST BSF CX,DATA3[DI] BSF EAX,[EBX] BSF EBP,[EDX+4*ECX]	8086	—
		8088	—
		80286	—
		80386	10 + 3n
		80486	7-43
		Pentium	6-43
bsr	Сканирование битов в обратном направлении			
00001111 10111101 oorrrmmm disp OF	DF IF TF SF	ZF	AF	PF	CF ? ? * ?	?	?			
Формат	Примеры	Микропроцессор	Число тактов
BSR reg,reg	BSR AX,BX BSR BX,SI BSR EAX,EDX BSR EBX,EAX BSR SI, DI	8086	—
		8088	—
		80286	—
		80386	10 + 3n
		80486	6-103
		Pentium	7-71
BSR reg,mem	BSR AX,DATAY BSR SI,LIST BSR CX,DATA3[DI] BSR EAX,[EBX] BSR EBP,[EDX+4*ECX]	8086	—
		8088	—
		80286	—
		80386	10 + 3n
		80486	7-104
		Pentium	7-72
bswap	Перестановка байт			
00001111 HOOlrrr			
Формат	Примеры	Микропроцессор	Число тактов
BSWAP reg32	BSWAP EAX BSWAP EBX BSWAP EDX BSWAP ECX BSWAP ESI	8086	—
		8088	—
		80286	—
		80386	—
		80486	1
		Pentium	1
bt	Проверка бита 00001111 10111010 oolOOmmm disp data OF DF IF TF SF ZF AF PF CF			
1204
Приложение 2
Таблица П2.9 (продолжение)
Формат	Примеры	Микропроцессор	Число тактов
ВТ reg, imm8	ВТ AX,2 ВТ CX,4 ВТ BP, ЮН ВТ CX,8 ВТ BX,2	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	4
ВТ mem, imm8	ВТ DATAI,2 ВТ LIST,2 ВТ DATA2[DI],3 ВТ [ЕАХ],1 ВТ FROG,6	8086	—
		8088	—
		80286	—
		80386	6
		80486	3
		Pentium	4
00001111 10100011 disp			
Формат	Примеры	Микропроцессор	Число тактов
ВТ reg,reg	ВТ АХ,СХ ВТ СХ,DX ВТ ВР,АХ ВТ SI,CX ВТ ЕАХ,ЕВХ	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	4 или 9
ВТ mem,reg	ВТ DATA4,AX ВТ LIST,BX ВТ DATA3[DI],СХ ВТ [EBX],DX ВТ [DI],DI	8086	—
		8088	—
		80286	—
		80386	12
		80486	8
		Pentium	4 или 9
BTC	Проверка и инверсия бита	’7 00001111 10111010 oolllmmm disp data OF DF IF TF SF ZF AF PF CF			
Формат	Примеры	Микропроцессор	Число тактов
BTC reg,imm8	BTC АХ,2 BTC СХ,4 BTC ВР, ЮН ВТС СХ,8 ВТС ВХ,2	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 8
Система команд микропроцессоров 80x86/Pentium
1205
Таблица П2.9 (продолжение)
ВТС mem, imm8	BTC DATA1,2 BTC LIST,2 BTC DATA2[DI],3 BTC [EAX],1 BTC FROG,6	8086	—
		8088	—
		80286	—
		80386	7 или 8
		80486	8
		Pentium	8
00001111 10111011 disp			
Формат	Примеры	Микропроцессор	Число тактов
ВТС reg,reg	BTC AX,CX BTC CX,DX BTC BP,AX BTC SI,CX BTC EAX,EBX	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 13
ВТС mem, reg	BTC DATA4,AX BTC LIST,BX BTC DATA3[DI],CX BTC [EBX],DX BTC [DI],DI	8086	—
		8088	—
		80286	—
		80386	13
		80486	13
		Pentium	7 или 13
BTR	Проверка и сброс бита 00001111 10111010 oollOmmm disp data OF DF ' IF TF SF ZF AF PF CF			
Формат	Примеры	Микропроцессор	Число тактов
BTR reg,imm8	BTR AX,2 BTR CX,4 BTR BP,10H BTR CX,8 BTR BX,2	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 8
BTR mem, imm8	BTR DATA1,2 BTR LIST,2 BTR DATA2[DI],3 BTR [EAX],1 BTR FROG,6	8086	—
		8088	—
		80286	—
		80386	8
		80486	8
		Pentium	7 или 8	
1206
Приложение 2
Таблица П2.9 (продолжение)
00001111 10110011 disp			
Формат	Примеры	Микропроцессор	Число тактов
BTR reg,reg	BTR AX,CX BTR CX,DX BTR BP,AX BTR SI,CX BTR EAX,EBX	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 13
BTR mem, reg	BTR DATA4,AX BTR LIST,BX BTR DATA3[DI],CX BTR [EBX],DX BTR [DI],DI BTC [DI], DI	8086	—
		8088	—
		80286	—
		80386	13
		80486	13
		Pentium	7 или 13
BTS .	, Проверка и установка бита
00001111 10111010 oolOlmmm disp data
OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
BTS reg,imm8	BTS AX,2 BTS CX,4 BTS BP,10H BTS CX,8 BTS BX,2	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 8
BTS mem, imm8	BTS DATA1,2 BTS LIST,2 BTS DATA2[DI],3 BTS [EAX],1 BTS FROG,6	8086	—
		8088	—
		80286	—
		80386	8
		80486	_8	
		Pentium	7 или 8
00001111 10101011 disp
Формат	Примеры	Микропроцессор	Число тактов
BTS reg,reg	BTS AX,CX BTS CX,DX BTS BP,AX BTS SI,CX BTS EAX,EBX	8086	—
		8088	—
		80286	—
		80386	6
		80486	6
		Pentium	7 или 13
Система команд микропроцессоров 80x86/Pentium
1207
Таблица П2.9 (продолжение)
BTS mem, reg	BTS DATA4,AX BTS LIST,BX BTS DATA3[DI],CX BTS [EBX],DX BTS [DI],DI	8086	—
		8088	—
		80286	—
		80386	13
		80486	13
		Pentium	7 или 13
CALL	Вызов процедуры (подпрограммы)			
11101000 disp			
Формат	Примеры	Микропроцессор	Число тактов
CALL label (near)	CALL FOR_FUN CALL HOME CALL ET CALL WAITING CALL SOMEONE	8086	19
		8088	23
		80286	7
		80386	3
		80486	3
		Pentium	1
10011010 disp			
Формат	Примеры	Микропроцессор	Число тактов
CALL label (far)	CALL FAR PTR DATES CALL WHAT CALL WHERE CALL FARCE CALL WHOM	8086	28
		8088	36
		80286	13
		80386	17
		80486	18
		Pentium	4
11111111 ooOlOmmm			
Формат	Примеры	Микропроцессор	Число тактов
CALL reg (near)	CALL AX CALL BX CALL CX CALL DI CALL SI	8086	16
		8088	20
		80286	7
		80386	7
		80486	5
		Pentium	2
CALL mem (near)	CALL ADDRESS CALL NEAR PTR [DI] CALL DATAI CALL FROG CALL ME_NOW	8086	21 + еа
		8088	29 + еа
		80286	11
		80386	10
		80486	5
		Pentium	2
1208
Приложение 2
Таблица П2.9 (продолжение) 11111111 ooOllmmm			
Формат	Примеры	Микропроцессор	Число тактов
CALL mem (far)	CALL FAR_LIST[SI] CALL FROM_HERE CALL TO_THERE CALL SIXX CALL OCT	8086	16
		8088	20
		80286	7
		80386	7
		80486	5
		Pentium	2
cbw	Преобразование байта в слово (al—ах)			
10011000 				
Пример		Микропроцессор	Число тактов
CBW		8086	2
		8088	2
		80286	2
		80386	3
		80486	3
		Pentium	3
cdq	Преобразование двойного слова в 8-байтное (еах — edxzeax)			
11010100 00001010			
Пример		Микропроцессор	Число тактов
CDQ		8086	—
		8088	—
		80286	—
		80386	2
		80486	2
		Pentium	2
сьс	Сброс флага переноса			
11111000 OF DF IF TF SF ZF AF PF CF 0			
Пример		Микропроцессор	Число тактов
CLC		8086	2
		8088	2
		80286	2
		80386	2
		80486	2
		Pentium	2
Система команд микропроцессоров 80x86/Pentium
1209
Таблица П2.9 (продолжение)
cld	Сброс флага направления
11111100
OF DF IF TF SF ZF AF PF CF 0
Пример	Микропроцессор	Число тактов
CLD	8086	2
	8088	2
	80286	2
	80386	2
	80486	2
	Pentium	2
cli	Сброс флага прерываний
11111010
OF DF IF TF SF ZF AF PF CF
0
Пример	Микропроцессор	Число тактов
CLI	8086	2
	8088	2
	80286	3
	80386	3
	80486	5
	Pentium	7
clts	Сброс флага переключения задачи в регистре cro
00001111 00000110
Пример	Микропроцессор	Число тактов
CLTS	8086	—
	8088	—
	80286	2
	80386	5
	80486	7
	Pentium	10
, смс	Инвертирование флага переноса
10011000
OF DF IF TF SF ZF AF PF CF
1210
Приложение 2
Таблица П2.9 (продолжение)
Пример	Микропроцессор	Число тактов
СМС	8086	2
	8088	2
	80286	2
	80386	2
	80486	2
	Pentium	2
cmdvcc	Условное копирование 00001111 ОЮОсссс ооггпшип		
Формат	Примеры	Микропроцессор	Число тактов
CMOVcc reg,mem	CMOVNZ АХ,FROG CMOVC EAX,[EDI] CMOVNC BX,DATA1 CMOVP EBX,WAITING CMOVNE DI,[SI]	8086	—
		8088	—
		80286	—
		80386	—
		80486	—
		Pentium	2
Условия (сс), их коды и обозначения
Код	Команда	Условие копирования во флагах	Условие копирования
0000	CMOVO	О=1	Переполнение
0001	CMOVNO	0 = 0	Нет переполнения.
0010	CMOVB	С = 1	Беззнаковое меньше (below)
0011	CMOVAE	С = 0	Беззнаковое больше или равно (above or equal)
0100	CMOVE	Z = 1	Равно/ноль (equal/zero)
0101	CMOVNE	Z = 0	Не равно/не ноль (not equal/not zero)
0110	CMOVBE	С = 1 + Z = 1	Беззнаковое меньше или равно (below or equal)
0111	CMOVA	С = 0 * Z = 0	Беззнаковое больше (above)
1000	CMOVS	S = 1	Знак (sign)
1001	CMOVNS	S = 0	Нет знака (no sign)
1010	CMOVP	р = 1	Паритет (parity)
1011	CMOVNP	Р = 0	Нет паритета (no parity)
1100	CMOVL	S * о	Знаковое меньше (less than)
1101	CMOVGE	S = 0	Знаковое больше или равно (greater than or equal)
1110	CMOVLE	Z = 1 + S * о	Знаковое меньше или равно (less than or equal)
1111	CMOVG	Z = 0 + S = о	Знаковое больше (greater than)
Система команд микропроцессоров 80x86/Pentium
1211
Таблица П2.9 (продолжение)
смр	Сравнение
OOlllOdw oorrrmmm disp
OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
CMP reg,reg	CMP AX,BX CMP AL, BL CMP EAX,EBX CMP CX,SI CMP ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
CMP mem, reg	CMP DATAY,AL CMP LIST,SI CMP DATA6[DI],CL CMP [EAX],CL CMP [EDX+4*ECX],EBX	8086	9 + ea
		8088	13 + ea
		80286	7
		80386	5
		80486	2
		Pentium	1 или 2
CMP reg,mem	CMP BL,DATA2 CMP SI,LIST3 CMP CL,DATA2[DI] CMP CX,[EDI] CMP ESI,[ECX+200H]	8086	9 + ea
		8088	13 + ea
		80286	6
		80386	6
		80486	2
		Pentium	1 или 2
lOOOOOsw oolllmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
CMP reg,imm	CMP CX,3 CMP DI,1AH CMP DL,34H CMP EDX,1345H CMP CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 2
CMP mem, imm	CMP DATAS,3 CMP BYTE PTR[EDI],1AH CMP DADDY,34H CMP LIST,'A' CMP TOAD,1834H	8086	10 + еа
		8088	14 + еа
		80286	_6		
		80386	5
		80486	2
		Pentium	1 или 2	
1212
Приложение 2
Таблица П2.9 (продолжение)
OOOllllw data			
Формат	Примеры	Микропроцессор	Число тактов
СМР acC/iinm	CMP AX,3 CMP AL,1AH CMP АН,34H CMP ЕАХ,1345H CMP AL,ZYZ	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
cmps	Сравнение строк			
1010011W OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
CMPSB CMPSW CMPSD	CMPSB CMPSW CMPSD CMPSB DATAI,DATA2 REPE CMPSB REPNE CMPSW	8086	32
		8088	30
		80286	8
		80386	10
		80486	8
		Pentium	5
cmpxchg	Сравнение и обмен			
00001111 1011000W lJrrrrrr OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
CMPXCHG reg, reg	CMPXCHG EAX,EBX CMPXCHG ECX,EDX	8086	—
		8088	—
		80286	—
		80386	—
		80486	6
		Pentium	6
OOOllllw data			
Формат	Примеры	Микропроцессор	Число тактов
CMPXCHG mem,reg	CMPXCHG DATAD,EAX CMPXCHG DATA2,EDI	8086	—
		8088	—
		80286	—
		80386	—
		80486	7
		Pentium	6
Система команд микропроцессоров 80x86/Pentium
1213
Таблица П2.9 (продолжение)
CMPXCHG8B	Сравнение и обмен 8 байт
00001111 11000111 oorrrmmm OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
CMPXCHG8B mem64	CMPXCHG8B DATA3	8086	—
		8088	—
		80286	—
		80386	—
		80486	—
		Pentium	10
сило	Чтение идентификатора процессора
00001111 10100010
Пример	Микропроцессор	Число тактов
CPUID	8086	—
	8088	—
	80286	—
	80386	—
	80486	—
	Pentium	14
CWD	Преобразование слова в двойное слово (ах — dx:ax)
10011000
Пример	Микропроцессор	Число тактов
CWD	8086	5
	8088	5
	80286	2
	80386	2
	80486	3
	Pentium	2
CWDE	Преобразование слова в двойное слово с расширением (ах-> еах)
10011000
Пример	Микропроцессор	Число тактов
CWDE	8086	—
	8088	—
	80286	—
	80386	3
	80486	3
	Pentium	3
1214
Приложение 2
Таблица П2.9 (продолжение) daa	Десятичная коррекция AL после сложения 00100111 OF DF IF TF SF ZF AF PF CF ? *		
Пример	Микропроцессор	Число тактов
DAA	8086	4
	8088	4
	80286	3
	80386	4
	80486	2
	Pentium	3
das	Десятичная коррекция содержимого регистра AL после вычитания		
00101111 OF DF IF TF SF ZF AF PF CF ? *****		
Пример	Микропроцессор	Число тактов
DAS	8086	4
	8088	4
	80286	3
	80386	4
	80486	2
	Pentium	3
DEC	Декремент 111111Iw ooOOlmmm disp OF	DF IF TF SF	ZF	AF	PF	CF * * *	*	*		
Формат	Примеры	Микропроцессор	Число тактов
DEC reg8	DEC BL DEC BH DEC CL DEC DH DEC AH	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 3
DEC mem	DEC DATAY DEC LIST DEC DATA6[DI] DEC BYTE PTR [BX] DEC WORD PTR [EBX]	8086	15 + ea
		8088	23 + ea
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1215
Таблица П2.9 (продолжение)
OlOOlrrr
Формат	Примеры	Микропроцессор	Число тактов
DEC regl6 DEC reg32	DEC CX DEC DI DEC EDX DEC ECX DEC BP	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1
div	Беззнаковое деление	„	4	/ Г			
llllOllw oollOniium disp OF	DF IF TF SF	ZF	AF	PF	CF ? ?	?	?	?	?			
Формат	Примеры	Микропроцессор	Число тактов
DIV reg	DIV BL DIV BH DIV ECX DIV DH DIV CX	8086	162
		8088	162
		80286	22
		80386	38
		80486	40
		Pentium	17-41
DIV mem	DIV DATAY DIV LIST DIV DATA6[DI] DIV BYTE PTR [BX] DIV WORD PTR [EBX]	8086	168
		8088	176
		80286	25
		80386	41
		80486	40
		Pentium	17-41
enter	Образование кадра стека для процедуры 	'			
11001000 data						
Формат	Примеры	Микропроцессор	Число тактов
ENTER imm, 0	ENTER 4,0 ENTER 8,0 ENTER 100,0 ENTER 200,0 ENTER 1024,0	8086	—
		8088	—
		80286	11
		80386	10
		80486	14
		Pentium	11
ENTER imm,1	ENTER 4,1 ENTER 10, 1	8086	—
		8088	—
		80286	12
		80386	15
		80486	17
		Pentium	15
1216
Приложение 2
Таблица П2.9 (продолжение)
ENTER imm, imm	ENTER 3,6 ENTER 100,3	8086	—
		8088	—
		80286	12
		80386	15
		80486	17
		Pentium	15 + 2n
esc	Расширение процессора (начало команды сопроцессора)
hlt	Останов
11110100
Пример	Микропроцессор	Число тактов
HLT	8086	2
	8088	2
	80286	2
	80386	5
	80486	4
	Pentium	Различное
idiv	Знаковое деление
111101 lw oolllmmm disp
OF	DF	IF	TF	SF	ZF	AF	PF	CF
?				?	?	?	?	?
Формат	Примеры	Микропроцессор	Число тактов
IDIV reg	IDIV BL IDIV BH IDIV ECX IDIV DH IDIV CX	8086	184
		8088	184
		80286	25
		80386	43
		80486	43
		Pentium	22-46
IDIV mem	IDIV DATAY IDIV LIST IDIV DATA6[DI] IDIV BYTE PTR [BX] IDIV WORD PTR [EBX]	8086	190
		8088	194
		80286	28
		80386	46
		80486	44
		Pentium	22-46
Система команд микропроцессоров 80x86/Pentium
1217
Таблица П2.9 (продолжение)
imul	Знаковое умножение
llllOllw oolOlmmm disp OF	DF IF TF SF	ZF	AF	PF	CF * ?	? ?	?			
Формат	Примеры	Микропроцессор	Число тактов
IMUL reg	IMUL BL IMUL CX IMUL ECX IMUL DH IMUL AL	8086	154
		8088	154
		80286	21
		80386	38
		80486	42
		Pentium	10-11
IMUL mem	IMUL DATAY IMUL LIST IMUL DATA6[DI] IMUL BYTE PTR [BX] IMUL WORD PTR [EBX]	8086	160
		8088	164
		80286	24
		80386	41
		80486	42
		Pentium	10-11
011010s! oorrmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
IMUL reg,imm	IMUL CX,16 IMUL DI,100 IMUL EDX,20	8086	—
		8088	—
		80286	21
		80386	38
		80486	42
		Pentium	10
IMUL reg,reg,imm	IMUL DX,AX,2 IMUL CX,DX,3 IMUL BX,AX,33	8086	—
		8088	—
		80286	21
		80386	38
		80486	42
		Pentium	10
IMUL reg,mem,imm	IMUL CX,DATAY,99	8086	—
		8088	—
		80286	24
		80386	38
		80486	42
		Pentium	10
39 Зак. 384
1218
Приложение 2
Таблица П2.9 (продолжение)
00001111 10101111 oorrnumm disp			
Формат	Примеры	Микропроцессор	Число тактов
IMUL reg,reg	IMUL CX,DX IMUL DI,BX IMUL EDX,EBX	8086	—
		8088	—
		80286	—
		80386	38
		80486	42
		Pentium	10
IMUL reg,mem	IMUL DX,DATAY IMUL CX,LIST IMUL ECX,DATA6[DI]	8086	—
		8088	—
		80286	—
		80386	41
		80486	42
		Pentium	10
in	Ввод данных из порта			
HlOOlOw port#			
Формат	Примеры	Микропроцессор	Число тактов
IN acc,pt	IN AL,12H IN AX,I2H IN AL,0FFH IN AX,ОАОH IN ЕАХ,10H	8086	10
		8088	14
		80286	5
		80386	12
		80486	14
		Pentium	7
HlOllOw			
Формат	Примеры	Микропроцессор	Число тактов
IN acc,DX	IN AL,DX IN AX, DX IN EAX, DX	8086	8
		8088	12
		80286	5
		80386	13
		80486	14
		Pentium	7	
Инкремент lllllllw ooOOOmmm disp			
OF DF IF TF SF ZF AF PF CF
Система команд микропроцессоров 80x86/Pentium
1219
Таблица П2.9 (продолжение)
Формат	Примеры	Микропроцессор	Число тактов
INC reg8	INC BL INC BH INC AL INC AH INC DH	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 3
INC mem	INC DATA3 INC LIST INC COUNT INC BYTE PTR [DI] INC WORD PTR [ECX]	8086	15 + еа
		8088	23 + еа
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
INC regl6 INC reg32	INC CX INC DX INC BP INC ECX INC ESP	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1
ins	Ввод строки из порта			
OllOllOw			
Формат	Примеры	Микропроцессор	Число тактов
INSB INSW INSD	INSB INSW INSD INS DATA2 REP INSB	8086	—
		8088	—
		80286	5
		80386	15
		80486	17
		Pentium	9
int	Прерывание			
11001101 type			
Формат	Примеры	Микропроцессор	Число тактов
INT type	INT12H INT15H INT 21H INT 2EH INT 10H	8086	51
		8088	71
		80286	23
		80386	37
		80486	30
		Pentium	16-82
1220
Приложение 2
Таблица П2.9 (продолжение)
ют з	Отладочное прерывание 11001100				
Пример		Микропроцессор	Число тактов
INT 3		8086	52
		8088	72
		80286	23
		80386	33
		80486	26
		Pentium	13-56
into	Прерывание при переполнении			
11001110			
Пример		Микропроцессор	Число тактов
INTO		8086	53
		8088	73
		80286	24
		80386	35
		80486	28
		Pentium	13-56
invd	Очистка кэш-памяти			
00001111 00001000			
Пример		Микропроцессор	Число тактов
INVD		8086	—
		8088	—
		80286	—
		80386	—
		80486	4
		Pentium	15
iret/iretd	Возврат из прерывания			
11001101 data OF DF IF TF SF ZF AF PF	CF ********	*			
Формат	Примеры	Микропроцессор	Число тактов
IRET I RETD	IRET I RETD IRET 100	8086	32
		8088	44
		80286	17
		80386	22
		80486	15
		Pentium	8-27
Система команд микропроцессоров 80x86/Pentium
1221
Таблица П2.9 (продолжение) Jcc	Условный переход	\	X Olllcccc disp			
Формат	Примеры	Микропроцессор	Число тактов
Jcnd label (8-битное значение disp)	JA ABOVE JB BELOW JG GREATER JE EQUAL JZ ZERO	8086	16/4
		8088	16/4
		80286	7/3
		80386	7/3
		80486	3/1
		Pentium	1
00001111 lOOOcccc disp			
Формат	Примеры	Микропроцессор	Число тактов
Jcnd label (16-битное значение disp)	JNE NOT_MORE JLE LESS_OR_SO	8086	—
		8088	—
		80286	—
		80386	7/3
		80486	3/1
		Pentium	1
Условия (сс), их коды и обозначения
Код	Команда	Установка флагов для перехода	Условие перехода
0000	JO	О=1	Переполнение
0001	JNO	0=0	Нет переполнения
0010	JB/JNAE	С = 1	Беззнаковое меньше (below)
0011	JAE/JNB	С = 0	Беззнаковое больше или равно (above or equal)
0100	JE/JZ	Z = 1	Не равно/не ноль (not equal/not zero)
0101	JNE/JNZ	Z = 0	Не равно/не ноль (not equal/not zero)
0110	JBE/JNA	С = 1 + Z = 1	Беззнаковое меньше или равно (below or equal)
0111	JA/JNBE	С = 0 * Z = 0	Беззнаковое больше (above)
1000	JS	S = 1	Знак (sign)
1001	JNS	S = 0	Нет знака (no sign)
1010	JP/JPE	р = 1	Паритет (parity)
1011	JNP/JPO	Р = 0	Нет паритета (по parity)
1100	JL/JNGE	S * О	Знаковое меньше (less than)
1101	JGE/JNL	S = 0	Знаковое больше или равно (greater than or equal)
1110	JLE/JNG	Z = 1 + S * О	Знаковое меньше или равно (less than or equal)
1111	JG/JNLE	Z = 0 + S = о	Знаковое больше (greater than)
1222
Приложение 2
Таблица П2.9 (продолжение)
JCXZ/jecxz	Переход при СХ (ЕСХ) равном нулю 11100011			
Формат	Примеры	Микропроцессор	Число тактов
JCXZ label JECXZ label	JCXZ ABOVE JCXZ BELOW JECXZ GREATER JECXZ EQUAL JCXZ NEXT	8086	18/6
		8088	18/6
		80286	8/4
		80386	9/5
		80486	8/5
		Pentium	6/5
jmp	Безусловный переход			
11101011 disp			
Формат	Примеры	Микропроцессор	Число тактов
JMP label (short)	JMP SHORT UP JMP SHORT DOWN JMP SHORT OVER JMP SHORT CIRCUIT JMP SHORT JOKE	8086	15
		8088	15
		80286	7
		80386	7
		80486	3
		Pentium	1
11101001 disp			
Формат	Примеры	Микропроцессор	Число тактов
jmp label (near)	JMP VERS JMP FROG JMP UNDER JMP NEAR PTR OVER	8086	15
		8088	15
		80286	7
		80386	7
		80486	3
		Pentium	1
11101010 disp			
Формат	Примеры	Микропроцессор	Число тактов
JMP label (far)	JMP NOT_MORE JMP UNDER JMP AGAIN JMP FAR PTR THERE	8086	15
		8088	15
		80286	11
		80386	12
		80486	17
		Pentium	3
Система команд микропроцессоров 80x86/Pentium
1223
Таблица П2.9 (продолжение)
11111111 oolOOmmm
Формат	Примеры	Микропроцессор	Число тактов
JMP reg (near)	JMP AX JMP EAX JMP CX JMP DX	8086	11
		8088	11
		80286	7
		80386	7
		80486	3
		Pentium	2
JMP mem (near)	JMP VERS JMP FROG JMP CS:UNDER JMP DATAI[DI+2]	8086	18 + ea
		8088	18 + ea
		80286	11
		80386	10
		80486	5
		Pentium	4
11111111 oolOlmmm			
Формат	Примеры	Микропроцессор	Число тактов
JMP mem (far)	JMP WAY_OFF JMP TABLE JMP UP JMP OUT_OF_HERE	8086	24 + ea
		8088	24 + ea
		80286	15
		80386	12
		80486	13
		Pentium	4
lahf	Загрузка флагов в регистр AH			
10011111			
Пример		Микропроцессор	Число тактов
LAHF		8086	4
		8088	4
		80286	2
		80386	2
		80486	_3	
		Pentium	2	
LAR	Загрузка байта прав доступа 00001111 00000010 oorrrmmm disp OF DF IF TF SF ZF AF PF CF			
1224
Приложение 2
Таблица П2.9 (продолжение)
Формат	Примеры	Микропроцессор	Число тактов
LAR reg,reg	LAR AX, BX LAR CX,DX LAR ECX,EDX	8086	—
		8088	—
		80286	14
		80386	15
		80486	11
		Pentium	8
LAR reg,mem	LAR CX,DATA1 LAR AX,LIST3 LAR ECX,TOAD	8086	—
		8088	—
		80286	16
		80386	16
		80486	11
		Pentium	8
lds	Загрузка дальнего указателя в DS и в регистр общего назначения
11000101 oorrrmmm
Формат	Примеры	Микропроцессор	Число тактов
LDS reg,mem	LDS DI,DATA3 LDS SI,LIST2 LDS BX,ARRAY_PTR LDS CX,PNTR	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	7
		80486	6
		Pentium	4
lea	Загрузка исполнительного адреса
10001101 oorrrmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LEA reg,mem	LEA DI,DATA3 LEA SI,LIST2 LEA BX,ARRAY_PTR LEA CX,PNTR	8086	2 + ea
		8088	2 + ea
		80286	3
		80386	2
		80486	2
		Pentium	1
leave Выход из процедуры высокого уровня
11001001
Пример	Микропроцессор	Число тактов
LEAVE	8086	—
	8088	—
	80286	5
	80386	4
	80486	5
	Pentium	3
Система команд микропроцессоров 80x86/Pentium
1225
Таблица П2.9 (продолжение)
les	Загрузка дальнего указателя в ES и в регистр общего назначения
11000100 oorrnrimm
Формат	Примеры	Микропроцессор	Число тактов
LES reg,mem	LES DI,DATA3 LES SI,LIST2 LES BX,ARRAY_PTR LES CX,PNTR	8086	16 + еа
		8088	24 + еа
		80286	7
		80386	7
		80486	6
		Pentium	4
lfs	Загрузка дальнего указателя в FS и в регистр общего назначения
00001111 10110100 oorrrmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LFS reg,mem	LFS DI,DATA3 LFS SI,LIST2 LFS BX,ARRAY_PTR LFS CX,PNTR	8086	—
		8088	—
		80286	—
		80386	7
		80486	6
		Pentium	4
lgdt	Загрузка регистра таблицы глобальных дескрипторов
00001111 00000001 ooOlOmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LGDT mem64	LGDT DESCRIP LGDT TABLED	8086	—
		8088	—
		80286	11
		80386	11
		80486	11
		Pentium	6
lgs	Загрузка дальнего указателя в GS и в регистр общего назначения
00001111 10110101 oorrrmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LGS reg,mem	LGS DI,DATA3 LGS SI,LIST2 LGS BX,ARRAY_PTR LGS CX,PNTR	8086	—
		8088	—
		80286	—
		80386	7
		80486	6
		Pentium	4
1226
Приложение 2
Таблица П2.9 (продолжение)
lidt	Загрузка регистра таблицы дескрипторов прерываний 00001111 00000001 ooOllmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
LIDT mem64	LIDT DATA3 LIDT LIST2	8086	—
		8088	—
		80286	12
		80386	11
		80486	11
		Pentium	6
lldt	Загрузка регистра таблицы локальных дескрипторов			
00001111 00000000 ooOlOmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
LLDT reg	LLDT BX LLDT DX LLDT CX	8086	—
		8088	—
		80286	17
		80386	20
		80486	11
		Pentium	9
LLDT mem	LLDT DATAI LLDT LIST3 LLDT TOAD	8086	—
		8088	—
		80286	19
		80386	24
		80486	11
		Pentium	9
lmsw	Загрузка слова состояния процессора 80286			
00001111 00000001 oollOmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
LMSW reg	LMSW BX LMSW DX LMSW CX	8086	—
		8088	—
		80286	3
		80386	10
		80486	2
		Pentium	8
LMSW mem	LMSW DATAI LMSW LIST3 LMSW TOAD	8086	—
		8088	—
		80286	6
		80386	13
		80486	3
		Pentium	8
Система команд микропроцессоров 80x86/Pentium
1227
Таблица П2.9 (продолжение)
lock	Префикс установки сигнала LOCK# (захват шины)
11110000
Формат	Примеры	Микропроцессор	Число тактов
LOCK:inst	LOCK:XCHG АХ,ВХ LOCK:ADD AL,3	8086	2
		8088	3
		80286	0
		80386	0
		80486	1
		Pentium	1
lods	Загрузка строкового операнда
lOlOllOw
Формат	Примеры	Микропроцессор	Число тактов
LODSB	LODSB	8086	12
LODSW	LODSW	8088	15
LODSD	LODSD	80286	5
	LODS DATA3	80386	5
		80486	5
		Pentium	2
loop/loopd	Циклическое выполнение, пока сх/есх о 0
11100010 disp
Формат	Примеры	Микропроцессор	Число тактов
LOOP label LOOPD label	LOOP NEXT LOOP BACK LOOPD LOOPS	8086	17/5
		8088	17/5
		80286	8/4
		80386	11
		80486	7/6
		Pentium	5/6
ioope/iooped Цикл пока равно
11100001 disp
Формат	Примеры	Микропроцессор	Число тактов
LOOPE label LOOPED label LOOPZ label LOOPZD label	LOOPE AGAIN LOOPED UNTIL LOOPZ ZORRO LOOPZD WOW	8086	18/6	
		8088	18/6
		80286	8/4
		80386	11
		80486	9/6
		Pentium	7/8
1228
Приложение 2
Таблица П2.9 (продолжение)
loopne/loopned Цикл пока не равно
11100000 disp
Формат	Примеры	Микропроцессор	Число тактов
LOOPNE label LOOPNED label LOOPNZ label LOOPNZD label	LOOPNE FORWARD LOOPNED UPS LOOPNZ TRY_AGAIN LOOPNZD WOO	8086	19/5
		8088	19/5
		80286	8/4
		80386	11
		80486	9/6
		Pentium	7/8
lsl	Загрузка границы сегмента
00001111 00000011 oorrrmmm disp
OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
LSL reg,reg	LSL AX,BX LSL CX,BX LSL EDX,EAX	8086	—
		8088	—
		80286	14
		80386	25
		80486	10
		Pentium	8
LSL reg,mem	LSL AX,LIMIT LSL EAX,NUM	8086	—
		8088	—
		80286	16
		80386	26
		80486	10
		Pentium	8
Lss	Загрузка дальнего указателя в SS й в регистр общего назначения
00001111 10110010 oorrrmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LSS reg,mem	LSS DI,DATA1 LSS SP,STACK_TOP LSS CX,ARRAY	8086	—
		8088	—
		80286	—
		80386	7
		80486	6
		Pentium	4
Система команд микропроцессоров 80x86/Pentium
1229
Таблица П2.9 (продолжение)
ltr	Загрузка регистра задачи
00001111 00000000 ooOOlmmm disp
Формат	Примеры	Микропроцессор	Число тактов
LTR reg	LTR AX LTR CX LTR DX	8086	—
		8088	—
		80286	17
		80386	23
		80486	20
		Pentium	10
LTR meml6	LTR TASK LTR NUM	8086	—
		8088	—
		80286	19
		80386	27
		80486	20
		Pentium	10
mov	Пересылка данных			
lOOOlOdw oorrrmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
MOV reg,reg	MOV CL,CH MOV BH,CL MOV CX,DX MOV EAX,EBP MOV ESP,ESI	8086	2
		8088	2
		80286	2
		80386	2
		80486	1
		Pentium	1
MOV mem,reg	MOV DATA7,DL MOV NUMB,CX MOV TEMP,EBX MOV [ECX],BL MOV [DI],DH	8086	9 + еа
		8088	13 + еа
		80286	3
		80386	2
		80486	1
		Pentium	1
MOV reg,mem	MOV DL,DATA8 MOV DX,NUMB MOV EBX,TEMP+3 MOV CH,TEMP[EDI] MOV CL,DATA2	8086	10 + еа
		8088	12 + еа
		80286	5
		80386	4
		80486	1
		Pentium	1
1230
Приложение 2
Таблица П2.9 (продолжение)
llOOOllw ooOOOmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
MOV mem, imm	MOV DATAF,23H MOV LIST,12H MOV BYTE PTR [DI],2 MOV NUMB,234H MOV DWORD PTR[ECX],1	8086	10 + ea
		8088	14 + ea
		80286	3
		80386	2
		80486	1
		Pentium	1
lOllwrrr data			
Формат	Примеры	Микропроцессор	Число тактов
MOV reg,imm	MOV BX,22H MOV CX,12H MOV CL,2 MOV ЕСХ,123456H MOV DI,100	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
lOlOOOdw disp			
Формат	Примеры	Микропроцессор	Число тактов
MOV mem, acc	MOV DATAF,AL MOV LIST,AX MOV NUMB,EAX	8086	10
		8088	14
		80286	3
		80386	2
		80486 .	1
		Pentium	1
MOV acc,mem	MOV AL,DATAE MOV AX,LIST MOV EAX,LUTE	8086	10
		8088	14
		80286	5
		80386	4
		80486	1
		Pentium	1
lOOOlldO oosssmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
MOV seg, reg	MOV SS,AX MOV DS,DX MOV ES,CX MOV FS,BX MOV GS,AX	8086	2
		8088	2
		80286	2
		80386	2
		80486	1
		Pentium	1
Система команд микропроцессоров 80x86/Pentium
1231
Таблица П2.9 (продолжение)
MOV seg,mem	MOV SS,STACK_TOP MOV DS,DATAS MOV ES,TEMPI	8086	8 + ea
		8088	12 + ea
		80286	2
		80386	2
		80486	1
		Pentium	2 или 3
MOV reg,seg	MOV BX, DS MOV CX, FS MOV CX, ES	8086	2
		8088	2
		80286	2
		80386	2
		80486	1
		Pentium	1
MOV mem, seg	MOV DATA2,CS MOV TEMP,DS MOV NUMB1,SS MOV TEMP2,GS	8086	9 + ea
		8088	13 + ea
		80286	3
		80386	2
		80486	1
		Pentium	1
00001111 COlOOOdO llrrrmmm			
Формат	Примеры	Микропроцессор	Число тактов
MOV reg,cr	MOV EBX,CR0 MOV ECX,CR2 MOV EBX,CR3	8086	—
		8088	—
		80286	—
		80386	6
		80486	4
		Pentium	4
MOV cr,reg	MOV CR0,EAX MOV CR1,EBX MOV CR3,EDX	8086	—
		8088	—
		80286	—
		80386	10
		80486	4
		Pentium	12-46	
00001111 OOlOOOdl llrrrmmm						
Формат	Примеры	Микропроцессор	Число тактов
MOV reg,dr	MOV EBX, DR6 MOV ECX,DR7 MOV EBX, DR1	8086	—
		8088	—
		80286	—
		80386	22
		80486	10
		Pentium	11
1232
Приложение 2
Таблица П2.9 (продолжение)
MOV dr,reg	MOV DRO,EAX MOV DR1,EBX MOV DR3,EDX	8086	—
		8088	—
		80286	—
		80386	22	
		80486	11
		Pentium	11
00001111 OOlOOldO llrrrmmm			
Формат	Примеры	Микропроцессор	Число тактов
MOV reg,tr	MOV EBX,TR6 MOV ECX,TR7	8086	—
		8088	—
		80286	—
		80386	12
		80486	4
		Pentium	11
MOV tr,reg	MOV TR6,EAX MOV TR7,EBX	8086	—
		8088	—
		80286	—
		80386	12
		80486	6
		Pentium	11	
movs	Пересылка данных из строки в строку			
1010010W			
Формат	Примеры	Микропроцессор	Число тактов
MOVS в MOVSW MOVSD	MOVSB MOVSW MOVSD MOVS DATAI,DATA2	8086	18
		8088	26
		80286	5
		80386	7
		80486	7
		Pentium	4		
movsx	Пересылка с расширением знака			
00001111 lOlllllw oorrrmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
MOVSX reg,reg	MOVSX BX,AL MOVSX EAX, DX	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	3
Система команд микропроцессоров 80x86/Pentium
1233
Таблица П2.9 (продолжение)
MOVSX reg,mem	MOVSX AX,DATA34 MOVSX EAX,NUMB	8086	—
		8088	—
		80286	—
		80386	6
		80486	3
		Pentium	3
movzx	Пересылка с расширением нулями	:			
OOOOllll lOUCllw oorrrmmm. disp			
Формат	Примеры	Микропроцессор	Число тактов
MOVZX reg,reg	MOVZX BX,AL MOVZX EAX,DX	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	3
MOVZX reg,mem	MOVZX AX,DATA34 MOVZX EAX,NUMB	8086	—
		8088	—
		80286	—
		80386	6
		80486	3
		Pentium	3
mul	Беззнаковое умножение			
llllOllw oolOOmmm disp OF	DF IF TF SF	ZF	AF	PF	CF * ?	? ?	?	*			
Формат	Примеры	Микропроцессор	Число тактов
MUL reg	MUL BL MUL CX MUL EDX	8086	118
		8088	143
		80286	21
		80386	38
		80486	42
		Pentium	10 или 11
MUL mem	MUL DATA9 MUL WORD PTR [ESI]	8086	139
		8088	143
		80286	24
		80386	41
		80486	42
		Pentium	11
1234
Приложение 2
Таблица П2.9 (продолжение)
ixtiG	Изменение знака (арифметическое инвертирование)
llllOllw ooOllmmm disp
OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
NEG reg	NEG BL NEG CX NEG EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 3
NEG mem	NEG DATA9 NEG WORD PTR [ESI]	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
nop	Пустая операция			
10010000
Пример	Микропроцессор	Число тактов
NOP	8086	3
	8088	3
	80286	3
	80386	3
	80486	3
	Pentium	1
not	Побитовое инвертирование		
llllOllw ooOlOmmm disp
Формат	Примеры	Микропроцессор	Число тактов
NOT reg	NOT BL NOT CX NOT EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1235
Таблица П2.9 (продолжение)
NOT mem	NOT DATA9 NOT WORD PTR [ESI]	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
он	Побитовая операция "ИЛИ"			
OOOOlOdw oorrrmmm disp OF	DF IF TF SF	ZF	AF	PF	CF 0	*	*	?	*	0			
Формат	Примеры	Микропроцессор	Число тактов
OR reg,reg	OR AX,BX OR AL,BL OR EAX,EBX OR CX,SI OR ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
OR mem,reg	OR DATAY,AL OR LIST,SI OR DATA2[DI],CL OR [EAX], BL OR [EBX+2*ECX],EDX	8086	16 + еа
		8088	24 + еа
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
OR reg,mem	OR BL,DATAI OR SI,LIST1 OR CL,DATA2[SI] OR CX,[ESI] OR ESI,[2*ECX]	8086	9 + еа
		8088	13 + еа
		80286	7
		80386	6
		80486	2
		Pentium	1 или 3
lOOOOOsw ooOOlmmm disp data					
Формат	Примеры	Микропроцессор	Число тактов
OR reg,imm	OR CX,3 OR DI,1AH OR DL,34H OR EDX,1345H OR CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
1236
Приложение 2
Таблица П2.9 (продолжение)
OR mem, imm	OR DATAS,3 OR BYTE PTR[EDI],1A OR DADDY,34H OR LIST,'A' OR TOAD,1834H	8086	17 + ea
		8088	25 + eaH
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
OOOOllOw data			
Формат	Примеры	Микропроцессор	Число тактов
OR acc,imm	OR AX, 3 OR AL,1AH OR АН,34H OR ЕАХ,1345H OR AL,'Y'	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
OUT	Запись данных в порт			
lllOOllw port#			
Формат	Примеры	Микропроцессор	Число тактов
OUT pt,acc	OUT 12H,AL OUT 12H,AX OUT 0FFH,AL OUT 0A0H,AX OUT 1OH,EAX	8086	10
		8088	14
		80286	3
		80386	10
		80486	10
		Pentium	12-26
lllOlllw			
Формат	Примеры	Микропроцессор	Число тактов
OUT DX,acc	OUT DX,AL OUT DX,AX OUT DX,EAX	8086	8
		8088	12
		80286	3
		80386	11
		80486	10
		Pentium	12-26
OUTS	Запись строки в порт			
OllOlllw			
Формат	Примеры	Микропроцессор	Число тактов
OUTSB OUTSW OUTSD	OUTSB OUTSW OUTSD OUTS DATA2 REP OUTSB	8086	—
		8088	—
		80286	5
		80386	14
		80486	10
		Pentium	13-27
Система команд микропроцессоров 80x86/Pentium
1237
Таблица П2.9 (продолжение)
pop	Извлечение слова из стека
OlOllrrr
Формат	Примеры	Микропроцессор	Число тактов
POP reg	POP CX POP AX POP EDI	8086	8
		8088	12
		80286	5
		80386	4
		80486	1
		Pentium	1
10001111 ooOOOmmm disp
Формат	Примеры	Микропроцессор	Число тактов
POP mem	POP DATAl POP LISTS POP NUMBS	8086	17 + ea
		8088	25 + ea
		80286	5
		80386	5
		80486	4
		Pentium	3
OOssslll
Формат	Примеры	Микропроцессор	Число тактов
POP seg	POP DS POP ES POP SS	8086	8
		8088	12
		80286	5
		80386	7
		80486	3
		Pentium	3
00001111 lOsssOOl
Формат	Примеры	Микропроцессор	Число тактов
POP seg	POP ES POP GS	8086	—
		8088	—
		80286	—
		80386	7
		80486	3
		Pentium	3
1238
Приложение 2
Таблица П2.9 (продолжение) popa/popad	Извлечение из стека содержимого всех регистров 01100001			
Пример		Микропроцессор	Число тактов
РОРА POPAD		8086	—
		8088	—
		80286	19
		80386	24
		80486	9
		Pentium	5
pope/poped	Восстановление из стека регистра флагов flags/eflags			
10010000 OF DF IF TF SF ZF AF PF CF ******** *			
Пример		Микропроцессор	Число тактов
POPF POPFD		8086	8
		8088	12
		80286	5
		80386	5
		80486	6
		Pentium	4 или 6
Pusn	Запись слова в стек			
OlOlOrrr			
Формат	Примеры	Микропроцессор	Число тактов
PUSH reg	PUSH CX PUSH AX PUSH EDI	8086	11
		8088	15
		80286	3
		80386	2
		80486	1
		Pentium	1
11111111 oollOmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
PUSH mem	PUSH DATA1 PUSH LISTS PUSH NUMBS	8086	16 + еа
		8088	24 + еа
		80286	5
		80386	5
		80486	4
		Pentium	1 или 2
Система команд микропроцессоров 80x86/Pentium
1239
Таблица П2.9 (продолжение)
OOssllO
Формат	Примеры	Микропроцессор	Число тактов
PUSH seg	PUSH ES PUSH CS PUSH DS	8086	10
		8088	14
		80286	3
		80386	2
		80486	3
		Pentium	1
00001111 lOsssOOO			
Формат	Примеры	Микропроцессор	Число тактов
PUSH seg	PUSH ES PUSH GS	8086	—
		8088	—
		80286	—
		80386	2
		80486	3
		Pentium	1
OllOlOsO data			
Формат	Примеры	Микропроцессор	Число тактов
PUSH imm	PUSH 2000H PUSH 53220 PUSHW 10H PUSH ',' PUSHD 100000H	8086	—
		8088	—
		80286	3
		80386	2
		80486	1
		Pentium	1
pusha/pushad	Запись в стек содержимого всех регистров	. х			
01100000					
Пример		Микропроцессор	Число тактов
PUSHA PUSHAD		8086	—
		8088	—
		80286	17
		80386	18
		80486	11
		Pentium	5
1240
Приложение 2
Таблица П2.9 (продолжение)
pushf/pushfd Запись в стек содержимого регистра флагов flags/eflags 10011100
Пример	Микропроцессор	Число тактов
PUSHF PUSHED	8086	10
	8088	14
	80286	3
	80386	4
	80486	3
	Pentium	3 или 4
RCL/RCR/ROL/BOR ЦиКЛИЧбСКИЙ СДВИГ
HOlOOOw ooTTTmmm disp
OF DF IF TF SF ZF AF PF CF
TTT = 000 - ROL, TTT = 001 - ROR, TTT = 010 - RCL, TTT = Oil - RCR
Формат	Примеры	Микропроцессор	Число тактов
ROL reg,1 ROR reg, 1	ROL CL, 1 ROL DX,1 ROR CH,1 ROR SI,1	8086	2
		8088	2
		80286	2
		80386	3
		80486	3
		Pentium	1 или 3
RCL reg,1 RCR reg, 1	RCL CL,1 RCL SI,1 RCR AH,1 RCR EBX,1	8086	2
		8088	2
		80286	2
		80386	9
		80486	3
		Pentium	1 или 3
ROL mem, 1 ROR mem, 1	ROL DATAY,1 ROL LIST,1 ROR DATA2[DI],1 ROR BYTE PTR [EAX],1	8086	15 + еа
		8088	23 + еа
		80286	7
		80386	7
		80486	4
		Pentium	1 или 3
RCL mem, 1 RCR mem, 1	RCL DATA1,1 RCL LIST,1 RCR DATA2[SI],1 RCR WORD PTR [ESI],1	8086	15 + еа
		8088	23 + еа
		80286	7
		80386	10
		80486	4
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1241
Таблица П2.9 (продолжение)
110100lw ooTTTmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
ROL reg,CL ROR reg,CL	ROL CH,CL ROL DX,CL ROR AL,CL ROR ESI,CL	8086	8 + 4n
		8088	8 + 4n
		80286	5 + n
		80386	3
		80486	3
		Pentium	4
RCL reg,CL RCR reg,CL	RCL CH,CL RCL SI,CL RCR AH,CL RCR EBX,CL	8086	8 + 4n
		8088	8 + 4n
		80286	5 + n
		80386	9
		80486	3
		Pentium	7-27
ROL mem,CL ROR mem,CL	ROL DATAY,CL ROL LIST, CL ROR DATA2[DI],CL ROR BYTE PTR [EAX],CL	8086	20 + 4П
		8088	28 + 4n
		80286	8 + n
		80386	7
		80486	4
		Pentium	4
RCL mem,CL RCR mem,CL	RCL DATAI,CL RCL LIST,CL RCR DATA2[SI],CL RCR WORD PTR [ESI],CL	8086	20 + 4П
		8088	28 + 4n
		80286	8 + n
		80386	10
		80486	9
		Pentium	9-26
HOOOOOw ooTTTmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
ROL reg,imm ROR reg,imm	ROL CH,4 ROL DX,5 ROR AL,2 ROR ESI,14	8086	—
		8088	—
		80286	5 + n
		80386	3
		80486	2
		Pentium	1 или 3
RCL reg,imm RCR reg,imm	RCL CL,2 RCL SI,12 RCR AH,5 RCR EBX,18	8086	—
		8088	—
		80286	5 + n
		80386	9
		80486	8
		Pentium	8-27
1242
Приложение 2
Таблица П2.9 (продолжение)
ROL mem, imm ROR mem, imm	ROL DATAY,4 ROL LIST,3 ROR DATA2[DI],7 ROR BYTE PTR [EAX],11	8086	—
		8088	—
		80286	8 + n
		80386	7
		80486	4
		Pentium	1 или 3
RCL mem, imm RCR mem, imm	RCL DATA1,5 RCL LIST,3 RCR DATA2[SI],9 RCR WORD PTR [ESI],8	8086	—
		8088	—
		80286	8 + n
		80386	10
		80486	9
		Pentium	8-27
rdmsr	Чтение модельно-зависимого регистра
пшшш
00001111 00110010
Пример		Микропроцессор	Число тактов
RDMSR		8086	
		8088	
		80286	
		80386	
		80486	
		Pentium	20-24	
REP	Префикс повторения		
11110011 1010010W			
Формат	Примеры	Микропроцессор	Число тактов
REP MOVS	REP MOVSB	8086	9+17n
	REP MOVSW	8088	9 + 25n
	REP MOVSD	80286	5 + 4n
	REP MOVS DATA1,DATA2	80386	8 + 4n
		80486	12 + 3n
		Pentium	13 + n	
11110011 1010101W
Формат	Примеры	Микропроцессор	Число тактов
REP STOS	REP STOSB	8086	9 + 10n
	REP STOSW	8088	9 + 14n	
	REP STOSD	80286	4 + 3n	
	REP STOS ARRAY	80386	5 + 5n	
		80486	7 + 4n	
		Pentium	9 + n	 —
Система команд микропроцессоров 80x86/Pentium
1243
Таблица П2.9 (продолжение)
11110011 OllOllOw
Формат	Примеры	Микропроцессор	Число тактов
REP INS	REP INSB REP INSW REP INSD REP INS ARRAY	8086	—
		8088	—
		80286	5 + 4n
		80386	12 + 5П
		80486	17 + 5n
		Pentium	25 + 3n
11110011 0110111W			
Формат	Примеры	Микропроцессор	Число тактов
REP OUTS	REP OUTSB REP OUTSW REP OUTSD REP OUTS ARRAY	8086	—
		8088	—
		80286	5 + 4n
		80386	12 + 5n
		80486	17 + 5n
		Pentium	25 + 4n
repe/repne	Префикс условного повторения	<<	‘ 11110011 1010011W			
Формат	Примеры	Микропроцессор	Число тактов
REPE CMPS	REPE CMPSB REPE CMPSW REPE CMPSD REPE CMPS DATA1,DATA2	8086	9 + 22n
		8088	9 + 30n
		80286	5 + 9n
		80386	5 + 9n
		80486	7 + 7n
		Pentium	9 + 4n
11110011 1010111W
Формат	Примеры	Микропроцессор	Число тактов
REPE SCAS	REPE SCASB REPE SCASW REPE SCASD REPE SCAS ARRAY	8086	9+ 15n
		8088	9+ 19n
		80286	5 + 8n
		80386	5 + 8n
		80486	7 + 5n
		Pentium	9 + 4n	
1244
Приложение 2
Таблица П2.9 (продолжение)
11110010 1010011W
Формат	Примеры	Микропроцессор	Число тактов
REPNE CMPS	REPNE CMPSB REPNE CMPSW REPNE CMPSD REPNE CMPS ARRAY,LIST	8086	9 + 22n
		8088	9 + 30n
		80286	5 + 9n
		80386	5 + 9n
		80486	7 + 7n
		Pentium	8 + 4n
11110010 101011W			
Формат	Примеры	Микропроцессор	Число тактов
REPNE SCAS	REPNE SCASB REPNE SCASW REPNE SCASD REPNE SCAS ARRAY	8086	9 + 15n
		8088	9+ 19N
		80286	5 + 8n
		80386	5 + 8n
		80486	7 + 5n
		Pentium	9 + 4n
кет	Возврат из процедуры			
11000011			
Пример		Микропроцессор	Число тактов
ret (near)		8086	16
		8088	20
		80286	11
		80386	10
		80486	5
		Pentium	2
11000010 data			
Формат	Примеры	Микропроцессор	Число тактов
RET imm (near)	RET 4 RET 100H	8086	20
		8088	24
		80286	11
		80386	10
		80486	5
		Pentium	3
Система команд микропроцессоров 80x86/Pentium
1245
Таблица П2.9 (продолжение)
11001011			
Пример		Микропроцессор	Число тактов
ret (far)		8086	26
		8088	34
		80286	15
		80386	18
		80486	13
		Pentium	4-23
11001010 data			
Формат	Примеры	Микропроцессор	Число тактов
RET imm (far)	RET 4 RET 100Н	8086	25
		8088	33	
		80286	11
		80386	10
		80486	5
		Pentium	4-23
Rsm	Выход из режима управления системой 00001111 10101010			
OF DF IF TF SF ZF AF PF CF
Пример	Микропроцессор	Число тактов
RSM	8086	—
	8088	—
	80286	—
	80386	—
	80486	—
	Pentium	1
sahf	Запись содержимого регистра АН в регистр флагов	1	,		
10011110 OF DF IF TF SF ZF AF PF CF *****		
Пример	Микропроцессор	Число тактов
SAHF	8086	4
	8088	4
	80286	2_________
	80386		3
	80486	2
	Pentium	2
1246
Приложение 2
Таблица П2.9 (продолжение)
SAL/SAR/SHL/SHR СДВИГ
HOlOOOw ooTTTmmm disp
OF	DF IF TF SF	ZF	AF	PF CF
* *	*	?
TTT = 100 - SHL/SAL, TTT = 101 - SHR, TTT = 111 - SAR
Формат	Примеры	Микропроцессор	Число тактов
SAL reg,1 SHL reg,1 SHR reg, 1 SAR reg,1	SAL CL, 1 SHL DX,1 SAR CH,1 SHR SI,1	8086	2
		8088	2
		80286	2
		80386	3
		80486	3
		Pentium	1 или 3
SAL mem, 1 SHL mem, 1 SHR mem, 1 SAR mem,1	SAL DATAI,1 SHL BYTE PTR [DI],1 SAR NUMB,1 SHR WORD PTR[EDI],1	8086	15 + ea
		8088	23 + ea
		80286	7
		80386	7
		80486	4
		Pentium	1 или 3
110100Iw ooTTTmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
SAL reg,CL SHL reg,CL SAR reg,CL SHR reg,CL	SAL CH, CL SHL DX,CL SAR AL, CL SHR ESI,CL	8086	8 + 4n
		8088	8 + 4n
		80286	5 + n
		80386	3
		80486	3
		Pentium	4
SAL mem,CL SHL mem,CL SAR mem, CL SHR mem,CL	SAL DATAU,CL SHL BYTE PTR [ESI],CL SAR NUMB,CL SHR TEMP,CL	8086	20 + 4n
		8088	28 + 4n
		80286	8 + n
		80386	7
		80486	4
		Pentium	4
llOOOOOw ooTTTmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
SAL reg,imm SHL reg,imm SAR reg,imm SHR reg,imm	SAL CH, 4 SHL DX,10 SAR AL, 2 SHR ESI,23	8086	—
		8088	—
		80286	5 + n
		80386	3
		80486	2
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1247
Таблица П2.9 (продолжение)
SAL mem,imm SHL mem,imm SAR mem,imm SHR mem, imm	SAL DATAU,3 SHL BYTE PTR [ESI],15 SAR NUMB,3 SHR TEMP,5	8086	—
		8088	—
		80286	8 + n
		80386	7
		80486	4
		Pentium	1 или 3
sbb	Вычитание с заемом			
OOOHOdw oorrrmrnm disp OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
SBB reg,reg	SBB CL,DL SBB AX,DX SBB CH, CL SBB EAX,EBX SBB ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
SBB mem,reg	SBB DATAJ,CL SBB BYTES,CX SBB NUMBS,ECX SBB [EAX],CX	8086	16 + еа
		8088	24 + еа
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
SBB reg,mem	SBB CL,DATAL SBB CX,BYTES SBB ECX,NUMBS SBB DX,[EBX+EDI]	8086	9 + еа
		8088	13 + еа
		80286	7
		80386	7
		80486	2
		Pentium	1 или 2
lOOOOOsw ooOllmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
SBB reg,imm	SBB CX,3 SBB DI,1AH SBB DL,34H SBB EDX,1345H SBB CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
1248
Приложение 2
Таблица П2.9 (продолжение)
SBB mem, imm	SBB DATas,3 SBB BYTE PTR[EDI],1A SBB DADDY,34H SBB LIST,'A' SBB TOAD,1834H	8086	17 + ea
		8088	25 + eaH
		80286	7
		80386	7
		80486	3
		Pentium	1 или 3
OOOlllOw data			
Формат	Примеры	Микропроцессор	Число тактов
SBB acc,imm	SBB AX, 3 SBB AL,1AH SBB АН,34H SBB ЕАХ,1345H SBB AL, ' Y'	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
scas	Сравнение строковых данных 1010111W OF DF IF TF SF ZF AF PF CF			
Формат	Примеры	Микропроцессор	Число тактов
SCAS В	SCAS В	8086	15
SCASW	SCASW	8088	19
SCASD	SCASD	80286	7
	SCAS DATAF	80386	7
	REP SCASВ	80486	6
		Pentium	4
SETcc	Установка байта по условию		
00001111 lOOlcccc ooOCOmmm			
Формат	Примеры	Микропроцессор	Число тактов
SETcnd reg3	SETA BL	8086	—
	SETB СН	8088	—
	SE1G DL	80286	—
	SETS BE	80386	4
	SETZ AL	80486	3
		Pentium	1 или 2
SETcnd mem8	SETE DATAK	8086	—
	SETAE LESS_OR_SO	8088	—
		80286	—
		80386	5
		80486	3
		Pentium	1 или 2
Система команд микропроцессоров 80x86/Pentium
1249
Таблица П2.9 (продолжение)
Условия (сс), их коды и обозначения
Код	Команда	Условие установки во флагах	Условие установки
0000	SETO	О=1	Переполнение
0001	SETNO	0=0	Нет переполнения
0010	SETB/SETAE	С = 1	Беззнаковое меньше (below)
0011	SETAE/SETNB	С = 0	Беззнаковое больше или равно (above or equal)
0100	SETE/SETZ	Z = 1	Равно/ноль (equal/zero)
0101	SETNE/SETNZ	Z = 0	Не равно/не ноль (not equal/not zero)
0110	SETBE/SETNA	С = 1 + Z = 1	Беззнаковое меньше или равно (below or equal)
0111	SETA/SETNBE	С = 0 * Z = 0	Беззнаковое больше (above)
1000	SETS	S = 1	Знак (sign)
1001	SETNS	S = 0	Нет знака (no sign)
1010	SETP/SETPE	р = 1	Паритет (parity)
1011	SETNP/SETPO	Р = 0	Нет паритета (no parity)
1100	SETL/SETNGE	S * О	Знаковое меньше (less than)
1101	SETGE/SETNL	S = 0	Знаковое больше или равно (greater than or equal)
1110	SETLE/SETNG	Z = 1 + S * О	Знаковое меньше или равно (less than or equal)
1111	SETG/SETNLE	Z = 0 + S = о	Знаковое больше (greater than)
sgdt/sidt/sldt Запись в память содержимого регистра таблицы дескрипторов
00001111 00000001 ooOOOmmm disp
Формат	Примеры	Микропроцессор	Число тактов
SGDT mem	SGDT MEMORY SGDT GLOBAL	8086	—
		8088	—
		80286	11
		80386	9
		80486	10
		Pentium	4
00001111 00000001 ooOOlmmm disp
Формат	Примеры	Микропроцессор	Число тактов
SIDT mem	SIDT DATAS SIDT INTERRUPT	8086	—
		8088	—
		80286	12
		80386	9
		80486	10
		Pentium	4
40 Зак 384
1250
Приложение 2
Таблица П2.9 (продолжение)
00001111 00000000 ooOOOmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
SLDT reg	SLDT CX SLDT DX	8086	—
		8088	—
		80286	2
		80386	2
		80486	2
		Pentium	2
SLDT mem	SLDT NUMBS SLDT LOCALS	8086	—
		8088	—
		80286	3
		80386	2
		80486	3
		Pentium	2
SHLD/SHRD	СДВИГ С ДВОЙНОЙ ТОЧНОСТЬЮ			
00001111 10100100 oorrrmmm disp data OF	DF IF TF SF	ZF	AF	PF CF ? *	* ?			
Формат	Примеры	Микропроцессор	Число тактов
SHLD reg,reg,imm	SHLD AX,CX,10 SHLD DX,BX,8 SHLD CX,DX,2	8086	—
		8088	—
		80286	—
		80386	3
		80486 .	2
		Pentium	4
SHLD mem, reg,imm	SHLD DATAQ,CX,8	8086	—
		8088	—
		80286	—
		80386	7
		80486	3
		Pentium	4
00001111 10101100 oorrrmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
SHRD reg,reg,imm	SHRD CX,DX,2	8086	—
		8088	—
		80286	—
		80386	3
		80486	2
		Pentium	4
Система команд микропроцессоров 80x86/Pentium
1251
Таблица П2.9 (продолжение)
SHRD mem,reg,imm	SHRD DATAZ,DX,4	8086	—
		8088	—
		80286	—
		80386	7
		80486	2
		Pentium	4
00001111 10100101 oorrrmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
SHLD reg,reg,CL	SHLD BX,DX,CL	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	4 или 5
SHLD mem, reg,CL	SHLD DATAZ,DX,CL	8086	—
		8088	—
		80286	—
		80386	7
		80486	3
		Pentium	4 или 5
00001111 10101101 oorrrmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
SHRD reg,reg,CL	SHRD AX,DX,CL	8086	—
		8088	—
		80286	—
		80386	3
		80486	3
		Pentium	4 или 5
SHRD mem,reg,CL	SHRD DATAZ,DX,CL	8086	—
		8088	—
		80286	—
		80386	7
		80486	3
		Pentium	4 или 5
1252
Приложение 2
Таблица П2.9 (продолжение) smsw	Сохранить слово состояния процессора 80286 00001111 00000001 ооЮОпипт disp			
Формат	Примеры	Микропроцессор	Число тактов
SMSW reg	SMSW AX SMSW DX SMSW BP	8086	—
		8088	—
		80286	2
		80386	10
		80486	2
		Pentium	4
SMSW mem	SMSW DATAQ	8086	—
		8088	—
		80286	3
		80386	3
		80486	3
		Pentium	4
stc	Установить флаг переноса			
11111001 OF DF IF TF SF ZF AF PF CF 1			
Пример		Микропроцессор	Число тактов
STC		8086	2
		8088	2
		80286’	2
		80386	2
		80486	2
		Pentium	2
std	Установить флаг направления			
11111101 OF DF IF TF SF ZF AF PF CF 1			
Пример		Микропроцессор	Число тактов
STD		8086	2
		8088	2
		80286	2
		80386	2
		80486	2
		Pentium	2
Система команд микропроцессоров 80x86/Pentium
1253
Таблица П2.9 (продолжение)
sti	Установить флаг прерывания
11111011	’
OF DF IF TF SF ZF AF PF CF
1
Пример		Микропроцессор	Число тактов
STI		8086	2
		8088	2
		80286	2
		80386	3
		80486	5
		Pentium	7
stos	Запись строки данных			
1010101W			
Формат	Примеры	Микропроцессор	Число тактов
STOSB STOSW STOSD	STOSB STOSW STOSD STOS DATA_LIST REP STOSB	8086	11
		8088	15
		80286	3
		80386	40
		80486	5
		Pentium	3
str	Запись регистра задачи			
00001111 00000000 ooOOlmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
STR reg	STR AX STR DX STR BP	8086	—
		8088	—
		80286	2
		80386	2
		80486	2
		Pentium	2
STR mem	STR DATA3	8086	—
		8088	—
		80286	2
		80386	2
		80486	2
		Pentium	2
1254
Приложение 2
Таблица П2.9 (продолжение)
sub	> Вычитание
00010ldw oorrrmmm disp
OF DF IF TF SF ZF AF PF CF * *****			
Формат	Примеры	Микропроцессор	Число тактов
SUB reg,reg	SUB CL,DL SUB AX,DX SUB CH,CL SUB EAX,EBX SUB ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
SUB mem, reg	SUB DATAJ,CL SUB BYTES,CX SUB NUMBS,ECX SUB [EAX],CX	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
SUB reg,mem	SUB CL,DATAL SUB CX,BYTES SUB ECX,NUMBS SUB DX,[EBX+EDI]	8086	9 + ea
		8088	13 + ea
		80286	7
		80386	7
		80486	2
		Pentium	1 или 2
lOOOOOsw oolOlmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
SUB reg,imm	SUB CX,3 SUB DI,1AH SUB DL,34H SUB EDX,1345H SUB CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
SUB mem, imm	SUB DATAS,3 SUB BYTE PTR[EDI],1AH SUB DADDY,34H SUB LIST,'A' SUB TOAD,1834H	8086	17 + еа
		8088	25 + еа
		80286	7
		80386	7	
		80486	3
		Pentium	1 или 3
Система команд микропроцессоров 80x86/Pentium
1255
Таблица П2.9 (продолжение)
OOlOllOw data
Формат	Примеры	Микропроцессор	Число тактов
SUB acc,imm	SUB AL,3 SUB AX, 1AH SUB ЕАХ,34H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1
test	Побитовое сравнение			
lOOOOOlw oorrrmmm disp OF	DF IF TF SF	ZF	AF	PF	CF 0	*	*	?	*	0			
Формат	Примеры	Микропроцессор	Число тактов
TEST reg,reg	TEST CL, DL TEST BX,DX TEST DH,CL TEST EBP,EBX TEST EAX,EDI	8086	5
		8088	5
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
TEST mem,reg reg,mem	TEST DATAJ,CL TEST BYTES,CX TEST NUMBS,ECX TEST [EAX],CX TEST CL,POPS	8086	9 + еа
		8088	13 + еа
		80286	6
		80386	5
		80486	2
		Pentium	1 или 2
llllOllsw ooOOOmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
TEST reg,imm	TEST BX,3 TEST DI,1AH TEST DH,44H TEST EDX,1AB345H TEST SI,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 2
TEST mem,imm	TEST DATAS,3 TEST BYTE PTR[EDI],1AH TEST DADDY,34H TEST LIST,'A' TEST TOAD,1834H	8086	11 + еа
		8088	11 + еа
		80286	_6	
		80386	5
		80486	2
		Pentium	1 или 2
1256______________________________________________________________Приложение 2
Таблица П2.9 (продолжение)
IOIOIOOw data
Формат	Примеры	Микропроцессор	Число тактов
TEST acc,imm	TEST AL,3 TEST AX,1AH TEST ЕАХ,34H	8086	4
		8088	4	"
		80286	3
		80386	2
		80486	1
		Pentium	1
verr/verw	Проверка сегмента на чтение/запись			
00001111 00000000 oolOOmmm disp
OF DF IF TF SF ZF AF PF CF
Формат	Примеры	Микропроцессор	Число тактов
VERR reg	VERR CX VERR DX VERR DI	8086	—
		8088	—
		80286	14
		80386	10
		80486	11
		Pentium	7
VERR mem	VERR DATAJ VERR TESTB	8086	—
		8088	—
		80286	16
		80386	11
		80486	11
		Pentium	7
00001111 00000000 oolOlmmm disp
Формат	Примеры	Микропроцессор	Число тактов
VERW reg	VERW CX VERW DX VERW DI	8086	—
		8088	—
		80286	14
		80386	15
		80486	11
		Pentium	7
VERW mem	VERW DATAJ VERW TESTB	8086	—
		8088	—
		80286	16
		80386	16
		80486	11		
		Pentium	7_		
Система команд микропроцессоров 80x86/Pentium
1257
Таблица П2.9 (продолжение) wait	Ожидание завершения операции в сопроцессоре 10011011		
Пример	Микропроцессор	Число тактов
WAIT/FWAIT	8086	4
	8088	4
	80286	3
	80386	6
	80486	6
	Pentium	1
wbinvd	Обратная запись и очистка кэш-памяти		
00001111 00001001		
Пример	Микропроцессор	Число тактов
WBINVD	8088/8086	—
	80286	—
	80386	—
	80486	5
	Pentium	2000+
wrmsr	Запись в модельно-зависимый регистр		
00001111 00110000		
Пример	Микропроцессор	Число тактов
WRMSR	8088/8086	—
	80286	—
	80386	—
	80486	—
	Pentium	30-45
xadd	Обмен и сложение 00001111 HOOOOOw llrrrrrr OF DF IF TF SF ZF AF PF CF * *****		
Формат	Примеры	Микропроцессор	Число тактов
XADD reg,reg	XADD ЕВХ,ЕСХ XADD EDX,ЕАХ XADD EDI,EBP	8086	—
		8088	—
		80286	—
		80386	—
		80486	3
		Pentium	3 или 4
1258
Приложение 2
Таблица П2.9 (продолжение)
00001111 HOOOOOw oorrrmmm disp			
Формат	Примеры	Микропроцессор	Число тактов
XADD mem,reg	XADD DATA5,ECX XADD [EBX],EAX XADD [ECX+4],EBP	8086	—
		8088	—
		80286	—
		80386	—
		80486	4
		Pentium	3 или 4
xchg	Обмен			
lOOOOllw oorrrmmm			
Формат	Примеры	Микропроцессор	Число тактов
XCHG reg,reg	XCHG CL,DL XCHG BX,DX XCHG DH,CL XCHG EBP,EBX XCHG EAX,EDI	8086	4
		8088	4
		80286	3
		80386	3
		80486	3
		Pentium	3
XCHG mem,reg reg,mem	XCHG DATAJ,CL XCHG BYTES,CX XCHG NUMBS,ECX XCHG [EAX],CX XCHG CL,POPS	8086	17 + еа
		8088	25 + еа
		80286	5
		80386	5
		80486	5
		Pentium	3
lOOlOreg			
Формат	Примеры	Микропроцессор	Число тактов
XCHG acc,reg reg,acc	XCHG BX,AX XCHG AX,DI XCHG DH,AL XCHG EDX,EAX XCHG SI,AX	8086	3
		8088	3
		80286	3
		80386	3
		80486	3
		Pentium	2
xlat	Табличное перекодирование			
11010111			
Пример		Микропроцессор	Число тактов
XLAT		8086	11
		8088	11
		80286	5
		80386	3
		80486	4
		Pentium	4
Система команд микропроцессоров 80x86/Pentium
1259
Таблица П2.9 (продолжение)
XDR	Побитовая операция "ИСКЛЮЧАЮЩЕЕ ИЛИ"	; .
000110dw oorrrmmm disp
OF	DF IF TF SF	ZF	AF	PF	CF 0	*	*	?	*	0			
Формат	Примеры	Микропроцессор	Число тактов
XOR reg,reg	XOR CL, DL XOR AX, DX XOR CH, CL XOR EAX,EBX XOR ESI,EDI	8086	3
		8088	3
		80286	2
		80386	2
		80486	1
		Pentium	1 или 2
XOR mein, reg	XOR DATAJ,CL XOR BYTES,CX XOR NUMBS,ECX XOR [EAX],CX	8086	16 + ea
		8088	24 + ea
		80286	7
		80386	6
		80486	3
		Pentium	1 или 3
XOR reg,mem	XOR CL,DATAL XOR CX,BYTES XOR ECX,NUMBS XOR DX,[ERX+EDI] •4	8086	9 + ea
		8088	13 + ea
		80286	7
		80386	7
		80486	2
		Pentium	1 или 2
lOOOOOsw oollOmmm disp data			
Формат	Примеры	Микропроцессор	Число тактов
XOR reg,imm	XOR CX,3 XOR DI,1AH XOR DL,34H XOR EDX,1345H XOR CX,1834H	8086	4
		8088	4
		80286	3
		80386	2
		80486	1
		Pentium	1 или 3
XOR mem,imm	XOR DATAS,3 XOR BYTE PTR[EDI],1AH XOR DADDY,34H XOR LIST,'A' XOR TOAD,1834H	8086	17 + еа
		8088	25 + еа
		80286	7_	
		80386	1
		80486	3
		Pentium	1 или 3
1260
Приложение ?
Таблица П2.9 (окончание)
OOlOlOlw data
Формат	Примеры	Микропроцессор	Число тактов
XOR асе,imm	XOR AL,3 XOR АХ, 1АН XOR ЕАХ,34Н	8086	4	'
		8088	4	'
		80286	3
		80386	2
		80486	1
		Pentium	1
SIM D-команды
Команды ХММ, приведенные в табл. П2.9, относятся к категории SIMD-команд (Single Instruction Multiple Data), выполняющих одинаковые операции над несколькими независимыми данными2. Команды SIMD используются, в основном, в мультимедийных приложениях. Регистры ХХМ нумеруются от 0 до 7 и обозначаются ХММО—ХММ7. Емкость каждого регистра — 128 бит. Форматы ХММ-данных показаны на рис. П2.1.
Рис. П2.1. Форматы данных 128-битных регистров ХММ в Pentium III и Pentium 4
В памяти ХММ-данные хранятся в 16-байтных словах; для доступа к ним в инструкциях используется оператор qword ptr3. Команды ХММ выполняют операции над упакованными и неупакованными действительными числами двойной точности. На рис. П2.2 приведена иллюстрация выполнения операции умножения данных в формате ХММ. Обратите внимание, вторая инструкция — для неупакованных данных — передает старшую часть источника в приемник без умножения.
2 Команды ХММ, в отличие от инструкций ММХ, выполняются не сопроцессором, а отдельным устройством в составе процессоров Pentium III и Pentium 4. — Пер.
3 Оператор QWORD PTR обозначает данные в памяти как 8-байтные. — Пер.
Система команд микропроцессоров 80x86/Pentium
1261
Умножение упакованных ХММ-данных двойной точности с помощью команды mulpd хммо, xmmi
Умножение неупакованных ХММ-данных двойной точности с помощью команды mulsd xmmo,xmmi
Рис. П2.2. Операции над упакованными и неупакованными действительными числами
Таблица П2.10. Команды ХММ
MOVUPD	Копирование невыровненных упакованных ХММ-даннш двоййр^лВ ТОЧНОСТИ	..	. '	'•	~
Примеры: MOVUPD ХММО, OWORD DATA3	; копировать DATA3 в ХММО MOVUPD OWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4			
MOVSD	Копирование скалярных упакованных ХММ-данных двойной 7 точности в младшие 8 байт	. *	; Ч
Примеры:
MOVSD ХММО, DWORD DATA3	; копировать DATA3 в ХММО
MOVSD DWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4
1262		Приложение 2 Таблица П2.10 (продолжение)
M3VHPD	Копирование упакованных ХММ-данных двойной точности в старший»? 8 байт
	— . Примеры: MOVHPD ХММО, ['WORD DATA3	; колировать DATA3 в ХММО MOVHPD DWORD PTR DATA4, ХММ2	; копировать ХМГ'44 в DATA4	
MOVLPD	Копирование упакованных ХММ-данных двойной точности в ' младшие 8 байт	. 	—	* * •
Примеры: MOVLPD ХММО, DWORD DATA3	; копировать DATA3 в ХММО MOVLPD DWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4	
MOVMSKPD	Копирование знаковой маски упакованных данных двойной точности	.
Примеры: MOVMSKPD ЕАХ, ХММ1	; копировать два знаковых Оита в регистр ; общего назначения	
MOVAPS	Копирование четырех выровненных (по 16-байтной границе) . упакованных ХММ-данных одинарной точности	\
Примеры: MOVAPS ХММО, OWORD DATA3	копировать DATA3 в ХММО MOVAPS OWORD PTR DATA4, ХММ2 ; копировать ХММ4 в DATA4	
MOVUPS	Копирование четырех невыровненных упакованных ХММ-данньк^^ одинарной точности	.
Примеры: MOVUPS ХММО, OWORD DATA3	; копировать DATA3 в ХММО MOVUPS OWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4	
MOVLPS	Копирование пары упакованных ХММ-данных одинарной точности^ младшие 8 байт	'-Мю8
Примеры: MOVLPS ХММО, OWORD DATA3	; копировать DATA3 в ХММО MOVLPS OWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4	
MOVHPS	Копирование упакованных ХММ-данных одинарной точностй В старшие 8 байт	'
Примеры: MOVHPS ХММО, OWORD DATA3	; копировать DATA3 в ХММО MOVHPS OWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4	__	
MOVAPD	Копирование выровненных (по 16-байтной границе) упакованн^хШВ ХММ-данных двойной точности			'
Примеры:
MOVAPD ХММО, OWORD DATA3	; копировать DATA3 в ХММО
MOVAPD OWORD PTR DATA4, ХММ2	; копировать ХММ4 в DATA4
Система команд микропроцессоров ouxoo/rcuuuiH
Таблица П2.10 (продолжение)
MOVLHPS	Копирование пары упакованных ХММ-данных одинарной точности из младших 8 байт в старшие 8 байт
Примеры:
MOVLHPS ХММО, ХММ1	; копировать младшую часть ХММ1 в старшую
; часть ХММО
MOVLHPS ХММЗ, ХММ2	; копировать младшую часть ХММ2 в старшую
; часть ХММЗ	
MOVHLPS	Копирование пары упакованных ХММ-данных одинарной точности из старших 8 байт в младшие 8 байт
Примеры:
MOVHLPS ХММО, ХММ2	; копировать старшую часть ХММ2 в младшую
; часть ХММО
MOVHLPS ХММ4, ХММ5	; копировать старшую часть ХММ5 в младшую
; часть ХММ4
MOVMSKPS	Копирование знаковых бит четырех упакованных ХММ-данных одинарной точности в регистр общего назначения
Примеры: MOVMSKPS ЕВХ, ХММО	; копировать знаковые биты ХММО в ЕВХ MOVMSKPS EDX, ХММ2	; копировать знаковые биты ХММ2 в EDX	
ADDPD	Сложение упакованных ХММ-данных двойной точности
Примеры: ADDPD ХММО, OWORD DATA3	; прибавить DATA3 к ХММО ADDPD ХММ2, ХММЗ	; прибавить ХММЗ к ХММ2	
ADDSD	Сложение скалярных ХММ-данных двойной точности
Примеры: ADDSD ХММО, OWORD DATA3	; прибавить DATA3 к ХММО ADDSD ХММ4, ХММ2	; прибавить ХММ2**к ХММ4	
ADDPS	Сложение пары упакованных ХММ-данных одинарной точности
Примеры: ADDPS ХММО, QWORD DATA3	; прибавить DATA3 к ХММО ADDPS ХММЗ, ХММ2	; прибавить ХММ2 к ХММЗ	
ADDLS	Сложение скалярных ХММ-данных одинарной точности
Примеры: ADDLS ХММО, DWORD DATA3	; прибавить DATA3 к ХММО ADDLS ХММ7, ХММ2	; прибавить ХММ2 к ХММ7	
SUBPD	Вычитание упакованных ХММ-данных двойной точности	/•
Примеры: SUBPD ХММО, OWORD DATA3	; вычесть DATA3 из ХММО SUBPD ХММ2, ХММЗ	; вычесть ХММЗ из ХММ2	
1264
Приложение 2
Таблица П2.10 (продолжение)
SUBSD	Вычитание скалярных ХММ-данных двойной точности
Примеры: SUBSD ХММО, OWORD DATA3	; вычесть DATA3 из ХММО SUBSD ХММ4, ХММ2	; вычесть ХММ2 из ХММ4	
SUBPS	Вычитание пары упакованных ХММ-данных одинарной точности
Примеры: SUBPS ХММО, QWORD DATA3	; вычесть DATA3 из ХММО SUBPS ХММЗ, ХММ2	; вычесть ХММ2 из ХММЗ	
SUBLS	Вычитание скалярных ХММ-данных одинарной точности
Примеры: SUBLS ХММО, DWORD DATA3	; вычесть DATA3 из ХММО SUBLS ХММ7, ХММ2	; вычесть ХММ2 из ХММ7	
MULPD	Умножение упакованных ХММ-данных двойной точности
Примеры: MULPD ХММО, OWORD DATA3	; умножить DATA3 на ХММО MULPD ХММЗ, ХММ2	; умножить ХММ2 на ХММЗ	
	Умножение скалярных ХММ-данных двойной точности
Примеры: MULSD ХММО, OWORD DATA3	; умножить DATA3 на ХММО MULSD ХММЗ, ХММ6	; умножить ХММ6 на ХММЗ	
MULPS	Умножение пары упакованных ХММ-данных одинарной точности
Примеры: MULPS ХММО, QWORD DATA3	; умножить DATA3 на ХММО MULPS ХММО, ХММ2	; умножить ХММ2 на ХММО	
MULSS	Умножение ХММ-данных одинарной точности
Примеры: MULSS ХММО, DWORD DATA3	; умножить DATA3 на ХММО MULSS ХММ1, ХММ2	; умножить ХММ2 на ХММ1	
DIVPD	Деление упакованных ХММ-данных двойной точности
Примеры: DIVPD ХММО, OWORD DATA3	; разделить ХММО на DATA3 DIVPD ХММЗ, ХММ2	; разделить ХММЗ на ХММ2	
DIVSD	Деление скалярных ХММ-данных двойной точности
Примеры: DIVSD ХММО, OWORD DATA3	; разделить ХММО на DATA3 DIVSD ХММЗ, ХММ6	; разделить ХММЗ на ХММб	
DIVPS	Деление пары упакованных ХММ-данных одинарной точности
Примеры:
DIVPS ХММО, QWORD DATA3
DIVPS ХММО, ХММ2
; разделить ХММО на DATA3
; разделить ХММО на ХММ2
Таблица П2.10 (продолжение)
DIVSS	Деление ХММ-данных одинарной точности
Примеры: DIVSS ХММО, DWORD DATA3	; разделить ХММО на DATA3 DIVSS ХММ1, ХММ2	; разделить ХММ1 на ХММ2	
SQRTPD	Вычисление квадратных корней упакованных ХММ-данных двойной точности
Примеры: SQRTPD ХММО, OWORD DATA3	; вычислить корни DATA3, результаты - в ХММО SQRTPD ХММЗ, ХММ2	; вычислить корни ХММ2, результаты - в ХММЗ	
SQRTSD	Вычисление квадратного корня скалярных ХММ-данных двойной точности
Примеры: SQRTSD ХММО, OWORD DATA3	; вычислить корень DATA3, результат — в ХММО SQRTSD ХММЗ, ХММ6	; вычислить корень ХММ6, результат - в ХММЗ	
SQRTPS	Вычисление квадратных корней пары упакованных ХММ-данных одинарной точности
Примеры: SQRTPS ХММО, QWORD DATA3	; вычислить корни DATA3, результаты - в ХММО SQRTPS ХММО, ХММ2	; вычислить корни ХММ2, результаты - в ХММО	
SQRTSS	Вычисление квадратного корня ХММ-данных одинарной точности
Примеры: SQRTSS ХММО, DWORD DATA3	; вычислить корень DATA3, результат - в ХММО SQRTSS ХММ1, ХММ2	; вычислить корень ХММ2, результат - в ХММ1	
RCPPS	Вычисление обратных значений упакованных ХММ-данных одинарной точности
Примеры:
RCPPS ХММО, OWORD DATA3	; вычислить обратные значения DATA3,
; результат - в ХММО RCPPS ХММЗ, ХММ2	; вычислить обратные значения ХММ2,
; результат - в ХММЗ
RCPSS	Вычисление обратного значения ХММ-данных одинарной точности
Примеры:
RCPSS ХММО, OWORD DATA3	; вычислить обратное значение DATA3,
; результат - в ХММО RCTSS ХММЗ, ХММ 6	; вычислить обратное значение ХММ6,
; результат - в ХММЗ
RSQRTPS	Вычисление обратных значений квадратных корней упакованных ХММ-данных одинарной точности
Примеры:
RSQRTPS ХММО, OWORD DATA3 ; вычислить обратные значения корней DATA3
RSQRTPS ХММЗ, ХММ2	; вычислить обратные значения корней ХММ2
41 Зак 384
1266______________________________________________________Приложение 2
Таблица П2.10 (продолжение)	
RSQRTSS	Вычисление обратного значения квадратного корня скалярных	3 ХММ-данных одинарной точности	1
Примеры: RSQRTSS ХММО, OWORD DATA3	; вычислить обратное значение корня DATA3 RSQRTSS ХММЗ, ХММ6	; вычислить обратное значение корня ХММб	
MAXPD	Определение наибольшего из упакованных ХММ-данных двойной точности	д
Примеры: MAXPD ХММО, OWORD DATA3	; сравнить числа в DATA3, наибольшее - в ХММО	| MAXPD ХММЗ, ХММ2	; сравнить числа в ХММ2, наибольшее — в ХММЗ	*	
MAXSD	Определение наибольшего из скалярных ХММ-данных двойной Ж точности	.Д
Примеры: MAXSD ХММО, OWORD DATA3	; сравнить числа в DATA3, наибольшее - в ХММО MAXSD ХММЗ, ХММб	; сравнить числа в ХММб, наибольшее — в ХММЗ	
MAXPS	Определение наибольшего из упакованных ХММ-данных одинарноЙд точности
Примеры: MAXPS ХММО, QWORD DATA3	; сравнить числа в DATA3, наибольшее - в ХММО MAXPS ХММО, ХММ2	; сравнить числа в ХММ2, наибольшее - в ХММО	
MAXSS	Определение наибольшего из скалярных ХММ-данных одинарной точности
Примеры: MAXSS ХММО, DWORD DATA3	; сравнить числа в DATA3, наибольшее - в ХММО MAXSS ХММ1, ХММ2	; сравнить числа в ХММ2, наибольшее - в ХММ1	
MINPD	Определение наименьшего из скалярных ХММ-данных двойной точности	-Jgjg
Примеры: MINPD ХММО, OWORD DATA3	; сравнить числа в DATA3, наименьшее - в ХММО MINPD ХММЗ, ХММ2	; сравнить числа в ХММ2, наименьшее — в ХММЗ	
MINSD	Определение наименьшего из скалярных ХММ-данных двойной точности	‘
Примеры: MINSD ХММО, OWORD DATA3	; сравнить числа в DATA3, наименьшее — в ХММО MINSD ХММЗ, ХММб	; сравнить числа в ХММб, наименьшее — в ХММЗ	
MINPS		  . ' Определение наименьшего из упакованных ХММ-данных одинарной,g точности		
Примеры:	
MINPS ХММО, QWORD DATA3	; сравнить числа в DATA3', наименьшее - в ХММО
MINPS ХММО, ХММ2	; сравнить числа в ХММ2, наименьшее - в ХММО
Система команд микропроцессоров 80x86/Pentium
1267
Таблица П2.10 (продолжение)
MINSS	Определение наименьшего из скалярных ХММ-данных одинарной точности
Примеры:
MINSS ХММО, DWORD DATA3	; сравнить числа в DATA3, наименьшее — в ХММО
MINSS ХММ1, ХММ2	; сравнить числа в ХММ2, наименьшее - в ХММ1
ANDPD	Поразрядное логическое произведение упакованных ХММ-данных двойной точности
Примеры:
ANDPD ХММО, OWORD DATA3	; логическое произведение DATA3 и ХММО
ANDPD ХММ2, ХММЗ	; логическое произведение ХММЗ и ХММ2
ANDNPD	Поразрядная операция "И-НЕ" над упакованными ХММ-данными двойной точности
Примеры:
ANDNPD ХММО, OWORD DATA3	; логическое произведение DATA3 и логической
; инверсии ХММО
ANDNPD ХММ4, ХММ2	; логическое произведение ХММ2 и логической
; инверсии ХММ4	
ANDPS	Поразрядное логическое произведение пары упакованных ХММ-данных одинарной точности
Примеры:
ANDPS ХММО, QWORD DATA3	; логическое произведение DATA3 и ХММО
ANDPS ХММЗ, ХММ2	; логическое произведение ХММ2 и ХММЗ
ANDNPS	Поразрядная операция "И-НЕ" над упакованными ХММ-данными одинарной точности
Примеры:
ANDNPS ХММО, DWORD DATA3	; логическое произведение DATA3 и логической
; инверсии ХММО **
ANDNPS ХММ7, ХММ2	; логическое произведение ХММ2 и логической
; инверсии ХММ7	
ORPD	Поразрядное логическое сложение упакованных ХММ-данных двойной точности
Примеры:
ORPD ХММО, OWORD DATA3	; логическое сложение DATA3 и ХММО
ORPD ХММ2, ХММЗ	; логическое сложение ХММЗ и ХММ2	
ORPS	Поразрядное логическое сложение пары упакованных ХММ-данных одинарной точности		 	'	
Примеры: ORPS ХММО, OWORD ORPS ХММЗ, ХММ2	DATA3	; логическое сложение DATA3 и ХММО ; логическое сложение ХММ2 и ХММЗ
XORPD	Поразрядное "ИСКЛЮЧАЮЩЕЕ ИЛИ" упакованных ХММ-данных двойной точности	" '	
Примеры: XORPD ХММО, OWORD DATA3 XORPD ХММ2, ХММЗ		; "ИСКЛЮЧАЮЩЕЕ ИЛИ" DATA3 и ХММО ; "ИСКЛЮЧАЮЩЕЕ ИЛИ" ХММЗ и ХММ2
1268
Приложение 2
Таблица П2.10 (продолжение)
XORPS	Поразрядное "ИСКЛЮЧАЮЩЕЕ ИЛИ" упакованных ХММ-данных одинарной точности	.
Примеры: XORPS ХММО, OWORD DATA3	; "ИСКЛЮЧАЮЩЕЕ ИЛИ" DATA3 и ХММО XORPS ХММ2, ХММЗ	; "ИСКЛЮЧАЮЩЕЕ ИЛИ" ХММЗ и ХММ2	
CMPPD	Сравнение упакованных ХММ-данных двойной точности	, 
Примеры: CMPPD ХММО, OWORD DATA3	; сравнить DATA3 с ХММО CMPPD ХММ2, ХММЗ	; сравнить ХММЗ с ХММ2	
CMPSD	Сравнение скалярных ХММ-данных двойной точности	к
Примеры: CMPSD ХММО, QWORD DATA3	; сравнить DATA3 с ХММО CMPSD ХММЗ, ХММ2	; сравнить ХММ2 с ХММЗ	
CMPISD	Сравнение скалярных ХММ-данных двойной точности, с установкой / EFAGS	.<£
Примеры: CMPISD ХММО, OWORD DATA3	; сравнить DATA3 С ХММО CMPISD ХММ2, ХММЗ	; сравнить ХММЗ c ХММ2	
UCCMISD	Сравнение неупорядоченных скалярных ХММ-данных двойной t А точности, с установкой EFAGS
Примеры: UCOMISD ХММО, QWORD DATA3	; сравнить DATA3 С ХММО UCOMISD ХММЗ, ХММ2	; сравнить ХММ2 с ХММЗ	
CMPPS	Сравнение упакованных ХММ-данных одинарной точности
Примеры: CMPPS ХММО, OWORD DATA3	; сравнить DATA3 С ХММО CMPPS ХММ2, ХММЗ	; сравнить ХММЗ c ХММ2		_	
CMPSS			 к	... .... Сравнение пары упакованных ХММ-данных одинарной точности,
Примеры: CMPSS ХММО, QWORD DATA3	; сравнить DATA3 с ХММО CMPSS ХММЗ, ХММ2	; сравнить ХММ2 с ХММЗ	
CCMISS	Сравнение скалярных ХММ-данных одинарной точности и	. изменение EFLAGS
Примеры: COMISS ХММО, OWORD DATA3	; сравнить DATA3 с ХММО COMISS ХММ2, ХММЗ	; сравнить ХММЗ с ХММ2			
UCCMISS	Сравнение неупорядоченных ХММ-данных одинарной точности. изменение EFLAGS		 • - 	• > ' -
Примеры: UCOMISS ХММО, QWORD DATA3	; сравнить DATA3 с ХММО UCOMISS ХММЗ, ХММ2	; сравнить ХММ2 с ХММЗ		.	
Система команд микропроцессоров 80x86/Pentium
1269
Таблица П2.10 (окончание)
SHUFPD	Перераспределение упакованных ХММ-данных двойной точности
Примеры: SHUFPD ХММО, OWORD DATA3	; перераспределить DATA3 и ХММО SHUFPD ХММ2, ХММ2	; поменять местами старшую и младшую части ХММ2	
UNPCKHPD	Чередование верхних упакованных значений ХММ-данных двойной точности
Примеры: UNPCKHPD »!0, OWORD DATA3	; перемещение старшего элемента DATA3 в ХММО UNPCKHPD ХХМЗ, ХММ2	; перемещение старшего элемента ХММ2 в ХММЗ	
UNPCKLPD	Чередование нижних упакованных значений ХММ-данных двойной точности
Примеры: UNPCKLPD ХММО, OWORD DATA3	; перемещение младшего элемента DATA3 в ХММО UNPCKLPD ХММЗ, ХММ2	; перемещение младшего элемента ХММ2 в ХММЗ	
SHUFPS	Перераспределение упакованных ХММ-данных одинарной точности
Примеры: SHUFPS ХММО, QWORD DAТАЗ	; перераспределить DATA3 и ХММО SHUFPS ХММ2, ХММ2	; поменять местами старшие и младшие части ХММ2	
UNPCKHPS	Чередование верхних упакованных значений ХММ-данных одинарной точности
Примеры: UNPCKHPS ХММО, QWORD DATA3	; перемещение старших элементов DATA3 в ХММО UNPCKHPS ХММЗ, ХММ2	; перемещение старших элементов ХММ2 в ХММЗ	
UNPCKLPSD	Чередование нижних упакованных значений ХММ-данных одинарной точности
Примеры: UNPCKLPSD ХММО, QWORD DATA3	; перемещение младших элементов DATA3 в ХММО UNPCKLPSD ХХМЗ, ХММ2	; перемещение младших элементов ХММ2 в ХММЗ 3	
ПРИЛОЖЕНИЕ 3
Воздействие инструкций на флаги
В табл. П3.1 приведен список инструкций, выполнение которых оказывает влияние на флаги процессора. Знаки ”0" и ”1” обозначают характер воздействия: □ ? — состояние флага неопределенное;
□	* — состояние флага определяется результатом операции;
□	0 — флаг обнуляется;
□	1 — флаг устанавливается в 1.
Таблица П3.1. Инструкции, воздействующие на флаги
Команда	Состояние флагов								
	OF	DF	IF	TF	SF	ZF	AF	PF	CF
ААА	?				?	?	*	?	*
AAD	?				*	*	?	*	?
ААМ	?				*	*	?	*	?
AAS	?				?	?	*	?	*
ADC	*				*	*	*	*	*
ADD	*				*	*	*	*	*
AND	0				*	*	?	*	0
ARPL						*			
BSF						*			
BSR						*			
ВТ									*
BTC									*
BTR									*
BTS									*
CLC									0
CLD		0							
CLI			0						
Воздействие инструкций на флаги
1271
Таблица П3.1 (продолжение)
Команда	Состояние флагов								
	OF	DF	IF	TF	SF	ZF	AF	PF	CF
СМС									*
СМР	*				*	*	*	*	*
CMPS	*				*	*	*	*	*
CMPXCHG	*				*	*	*	*	*
CMPXCHG8B						*			
DAA	?				*	*	*	*	*
DAS	?				*	*	*	*	*
DEC	*				*	*	*	*	
DIV	?				?	?	?	?	?
IDIV	?				?	?	?	?	?
IMUL	*				?	?	?	?	*
INC	*				*	*	*	*	
I RET	*	*	*	*	*	*	*	*	*
LAR						*			
LSL						*			
MUL	*				?	?	?	?	*
NEG	*				*	*	*	*	*
OR	0				*	*	?	*	0
POPF	*	*	*	*	*	*	*	*	*
RCL/RCR	*								*
REPE/REPNE						*			
ROL/ROR	*			4					*
SAHF					*	*	*	*	*
SAL/SAR	*				*	*	?	*	*
SHL/SHR	*				*	*	?	*	*
SBB	*				*	*	*	*	*
SCAS	*				*	*	*	*	*
SHLD/SHRD	?				*	*	?	*	*
S.TC									1
STD		1							
STI			1						
1272
Приложение 3
Таблица П3.1 (окончание)
Состояние флагов
Команда	OF	DF	IF	TF	SF	ZF	AF	PF	CF
SUB	*				*	*	*	*	*
TEST	0				*	*	?	*	0
VERR/VERW						*			
XADD	*				*	*	*	*	*
XOR	0				*	*	?	*	0
ПРИЛОЖЕНИЕ 4
Ответы на контрольные вопросы с четными номерами
Глава 1
2. Жозеф Жаккар, Герман Холлерит.
4. Конрад Цузе.
6. ENIAC.
8. Августа Ада Байрон.
Ю. Программа хранится в памяти.
12. Более 100 000 000 экземпляров.
14. 16 Мбайт.
16. В 1993 г.
18. В 1999 г.
20. MIPs (Millions of Instructions Per second) — миллион инструкций в секунду.
22. I или 0.
24. 1024.
26. Около 1 000 000.
28. 640 Кбайт.
30. I Мбайт.	**
32. 80386, 80486 и Pentium (Pentium Pro—Pentium 4 могут адресовать 64 Гбайт).
34. BIOS (Basic Input/Output System — базовая система ввода-вывода) содержит программы для обслуживания основных периферийных устройств.
36. Системы класса АТ разработаны для микропроцессоров начиная с 80286, а системы XT — для микропроцессора 8086/8088.
38. 8 или 16 (32-битные ISA-карты поддерживает только шина EISA).
40. AGP — Advanced Graphics Port — расширенный графический порт (со скоростью передачи данных до 533 Мбайт/с).
42. EMS — Expanded Memory System — расширенная память.
44. Драйверы загружаются в область стандартной памяти ТРА или в верхнюю память.
46. Файл CONFIG.SYS задаст конфигурацию персонального компьютера; в этом файле, в частности, указываются драйверы, загружаемые при включении компьютера.
48. Программа COMMAND.COM обрабатывает информацию, вводимую с клавиатуры в режиме командной строки.
50. Область высокой памяти НМА находится в диапазоне адресов 100000Н —10FFEFH.
52. Блоки верхней памяти UMB находятся над системной областью DOS.
54. См. в главе 1 рис. 1.5.
1274
Приложение 4
56. Шина адреса, шина данных и шина управления.
58. Сигнал MRDC (Memory Read Control).
60. Чтение памяти.
62.	а) 13.25
б)	57.1875
в)	43.3125
г)	7.0625
64. а) 163.1875
б) 297.75
в) 172.859375
г) 4 011.1875
д) 3 000.0578125
66. а) 0.1012, 0.5в и O.D|6
б)	0.000000012, 0.002g и 0.01 i6
в)	0.101000012, 0.502g и 0.А1 i6
г)	0.1 Ь, 0.68 и О.С|6
д)	0.11И2, 0.74g и O.F|6
68. а) С2|6
б)	10FD|6
в)	В.С|6
г)	Ю|6
д)	8ВА|6 70. а) 0111 1111
б)	0101 0100
в)	0101 0001
г)	1000 0000
72. а) 46 52 4F 47
б)	41 72 63
в)	57 6174 65 72
г)	57 65 6С 6С
74. MESS DB 'What time is it?'
76.	a)	0000 00111110	1000
6)	11111111	1000	1000
в)	0000 0011	0010	0000
r)	1111 0011	0111	0100
78.	a)	34 12
6)	22 Al
в)	00 Bl
80. DATA2 DW 123AH 82.	a)	-128
6)	+51
в)	110
r)	-118
Ответы на контрольные вопросы с четными номерами 1275
84. а) ООНПШ 10000000000000000000000
б)	1 10000010 01010100000000000000000
в)	0 10000101 10010001000000000000000
г)	1 1000 1001 00101100000000000000000
Глава 2
2. 16 бит.
4. ЕВХ.
6. Для адресации следующей исполняемой инструкции.
8. Нет.
10. Флаг разрешения прерываний IF (Interrupt Flag).
12. В реальном режиме сегментный регистр определяет начало сегмента памяти размером 64 Кбайт.
14.	а) 12000Н
б)	21000Н
в)	24А00Н
г)	25000Н
д)	3F12DH
16. Регистровая пара ESDI
18. Регистровая пара SS.SP.
20.	а) 12000Н
б)	21ОО2Н
в)	26200Н
г)	А1000Н
д)	2СА00Н
22. В диапазоне адресов 000000Н—FFFFFFH.	. **
24. Сегментный регистр содержит селектор, который выбирает дескриптор из локальной или глобальной таблицы дескрипторов. Дополнительно, в сегментном регистре указывается запрашиваемый уровень привилегий.
26. A00000H—А01000Н.
28. Базовый адрес — 00280000Н, конечный адрес — 00290FFFH.
30. 3.
32. 64 Кбайт
03	10
90	00
00	00
2F	FF
36. Локальная таблица дескрипторов адресуется посредством регистра LDTR (Local Descriptor Table Register).
38. Невидимая часть сегментного регистра, регистр задачи и регистр таблицы дескрипторов.
40. 4 Кбайт.
1276
Приложение 4
42. 1024.
44. К элементу 0 каталога страниц и к элементу 200Н таблицы страниц.
46. В буфере TLB (Translation Look-aside Buffer) хранятся последние 32 трансляции линейного адреса в физический адрес, выполненные механизмом страничного преобразования.
Глава 3
2. АН, AL, ВН, BL, СН, CL, DH и DL.
4. ЕАХ, ЕВХ, ЕСХ, EDX, ESP, EBP, EDI и ESI.
6. Разрядность операндов не совпадает.
8. a) MOV EDX,EBX
б) MOV CL, BL
В) MOV BX,SI Г) MOV АХ, DS Д) MOV АН,AL Ю. Символом #. 12 Директивой .CODE. 14. В поле мнемоники операции. 16. Для возврата в DOS.
IS. Директива .STARTUP загружает адрес сегмента данных в регистр DS.
20. Квадратные скобки [ ] обозначают косвенную адресацию данных в памяти.
22 Передача данных из памяти в память инструкцией MOV недопустима. 24. MOV WORD PTR [DI], 3.
26. Инструкция MOV bx,data копирует в регистр ВХ слово, расположенное в сегменте данных по смешению data, в то время как инструкция MOV вх, offset data загружает в регистр ВХ величину смещения DATA.
28. Инструкция правильная — это другая форма записи команды mov al, [вх+Sl].
30. а) Н750Н
б) Н950Н
в) Н700Н
32. Регистр ВР или ЕВР в микропроцессорах начиная с 80386. 34. FIELDS STRUC
Fl DW ?
F2 DW ?
F3 DW ?
F4 DW ?
F5 DW ? FIELDS ENDS
36. Прямая, относительная и косвенная адресация.
38. Внутрисегментный переход ограничен текущим сегментом кода; напротив, межсегментный переход позволяет передать управление в пределах всего адресного пространства.
40. 32 бита.
42. Короткая (short).
44. jmp вх.
Ответы на контрольные вопросы с четными номерами
1277
46. Команда push в 16-битном варианте записывает в стек 2 байта, а в 32-битном варианте — 4 байта.
48. АХ, СХ, DX, ВХ. SP, ВР, DI и SI.
50. PUSHED.
Глава 4
2. Бит W машинного кода инструкций выбирает размерность данных — байт (W = 0) или слово/двойное слово (W = 1); бит D задает направление передачи данных.
4. Регистр DL.
6. Косвенная адресация DS: (BX+DIJ.
8. MOV АХ, DI.
10. 8В 77 02.
12. Значение сегментного регистра CS нельзя изменять отдельно от указателя инструкций IP. Эта инструкция, скорее всего, приведет к сбою программы.
14. 16-бит.
16. Регистры АХ, СХ, DX, ВХ, SP, ВР, SI и DL
18.	а) Инструкция PUSH АХ сохраняет в стеке содержимое регистра АХ.
б)	Инструкция POP ESI удаляет из стека 32-битное значение, помещая его в расширенный регистр индекса источника ESI.
в)	Инструкция push [ВХ] записывает в стек 16-битное значение, расположенное в сегменте данных по смешению, указанному регистром ВХ.
г)	Инструкция pushed сохраняет в стеке содержимое регистра флагов EFLAGS.
д)	Инструкция POP DS извлекает из стека 16-битное число и помешает его в регистр DS.
е)	Инструкция PUSHD 4 записывает в стек 32-битное число 4.
20. Инструкция push еах записывает биты 31—24 регистра ЕАХ в стек, расположенный в памяти по адресу 20FFH, биты 23-^16 — по -адресу 20FEH, биты 15—8 — по адресу 20FDH, биты 7—0 — по адресу 20FCH. После записи данных содержимое регистра указателя стека SP уменьшается на 4 и содержит, в результате, 20FCH.
22. Например, SS = SP = 200Н.
24. Команда MOV с оператором OFFSET более эффективна для процессоров, предшествующих микропроцессору Pentium.
26. Эта инструкция загружает в регистр DS и ВХ составляющие двойного слова, расположенного в памяти по смешению NUMB.
28. MOV BX,NUMB
MOV DX,BX
MOV SI,BX
30. Инструкция CLD сбрасывает флаг направления, a STD — устанавливает.
32. Инструкция LODSB копирует байт, расположенный в сегменте данных по смешению, указанному регистром SI, в регистр AL. Затем содержимое регистра S1 увеличивается или уменьшается на 1, в зависимости от флага направления.
34. Команда OUTSB передает байт, расположенный в памяти в сегменте данных по смешению, указанному регистром SI, в порт, номер которого указан в регистре DX. Затем содержимое регистра SI увеличивается или уменьшается на 1, в зависимости от флага направления.
1278
Приложение 4
36. MOV SI, OFFSET SOURCE MOV DI/OFFSET DEST MOV CX,12 REP MOVSB
38. XCHG EBX, ESI.
40. Инструкция xlat складывает содержимое регистров AL и BX, а затем, используя результат в качестве смещения, копирует байт из сегмента данных в регистр AL.
42 Инструкция IN AL, 12Н считывает данные из порта номер 0012Н в регистр AL.
44. Префикс переназначения сегмента позволяет изменить сегмент, выбираемый процессором при выполнении данной команды, на любой другой сегмент1.
46 XCHG АХ,ВХ XCHG ECX,EDX XCHG SI,DI
48. Директива определения байт . DB.
50. Директива . DB используется для резервирования в памяти байт, . DW — слов, . DD — двойных слов.
52. Директива . EQU присваивает метке значение, которое определяется как результат целочисленного выражения, указанного в правой части.
54. Директива .MODEL определяет тип модели памяти, используемой при трансляции программы.
56. Организации памяти с полным определением сегментов.
58. Начало процедуры обозначается директивой .PROC, конец — директивой .ENDP.
60. Атрибут USE16 записывается в одной строке с директивой .SEGMENT при полном определении сегментов. При использовании модели памяти директива .486 указывается после задания модели — в этом случае ассемблер выбирает режим 16-битных инструкций.
62. COPS PROC FAR MOV AX,CS:DATA1 MOV BX/AX MOV CX,AX MOV DX,AX MOV SI, AX RET COPS ENDP
Глава 5
2. Размерность операндов неодинакова.
4. После выполнения команды значение регистра АХ будет равно 3100Н, а состояние флагов следующее: С = 0, А = l,S = 0, Z = 0 и О = 0.
1 Точнее, префикс позволяет выбрать другой источник сегментного адреса. Обычно сегментный адрес при выполнении команды доступа к памяти считывается процессором из регистра DS или SS. Источник сегментного адреса, выбираемый по умолчанию, может быть изменен — для этого и используется префикс переназначения сегмента. — Пер.
Ответы на контрольные вопросы с четными номерами
1279
6. ADD АХ,ВХ ADD АХ,СХ ADD AX, DX ADD AX,SP MOV DI,AX
8. ADC DX,BX.
10. He хватает директивы .byte ptr, .word ptr или .DWORD ptr. Без них ассемблер не может определить размерность данных для инструкции inc [ВХ].
12. Разность равна 81Н, а значения флагов — С = 0, А = 0, S = 1, Z = 0 и О = 0.
14. DEC ЕВХ.
16. Инструкции sub и СМР аналогичны, но СМР не изменяет приемник.
18. Произведение формируется в паре регистров DX:AX, причем старшая часть — в регистре DX.
20. В паре регистров EDX:EAX.
22. MOV DL, 5 MOV AL, DL MUL DL MUL DL
24. Регистр AX.
26. При переполнении или делении на нуль генерируется прерывание.
28. В регистре АН.
30. daa при сложении и DAS при вычитании.
32. Инструкция ААМ преобразует число, находящееся в регистре АХ к формату двоичнодесятичных чисел BCD за счет деления содержимого регистра АХ на 10. Результат (00—99) сохраняется в регистрах АН и AL.
34. PUSH АХ MOV AL, BL ADD AL, DL DAA	**
MOV DL,AL MOV AL, BH ADC AL, DH DAA MOV DH,AL POP AX ADC AL,CL DAA MOV CL,AL MOV AL, AH ADC AL,CH DAA MOV CH,AL
36. MOV BH, DH AND BH,1FH
38. MOV SI, DI OR SI,1FH
1280
Приложение 4
40. OR АХ, OFH
AND AX,1FFFH
XOR AX,0E0H
42. TEST CH, 4 ИЛИ ВТ CH, 2
44. a) SHR DI, 3
6) SHL AL, 1
B) ROL AL, 3
Г) RCR EDX, 1
Д) SAR DH, 1
46. С дополнительным сегментом данных.
48. Префикс repe повторяет инструкцию scasb до тех пор, пока содержимое регистра СХ не станет равным 0, а содержимое регистра AL и совпадет с байтом из памяти по адресу ESDI.
50. Команда cmpsb сравнивает содержимое байтовых элементов массивов.
52. На экране будет отображена латинская буква С.
Глава 6
2. Ближний (near).
4. Дальний (far).
6. а) ближний б) короткий в) дальний
8. Регистр EIP или 1Р.
10. Инструкция JMP АХ выполняет ближний переход по смещению, заданному регистром АХ.
12. Инструкция jmp [DI] выполняет ближний переход по смещению, хранящемуся в сегменте данных по смещению, указанному регистром DI. Команда jmp far ptr [Dl] выполняет дальний переход.
14. Команда ja выполняет условный переход, если в результате сравнения беззнаковое число в приемнике больше беззнакового числа в источнике.
16. JE, JNE, JG, JGE, JL И JLE
18. JBE И JA
20. SETZ
22. есх
24. MOV DI,OFFSET DATA CLD MOV CX,150H MOV AL,0
AGAIN:
STOSB LOOP AGAIN
26. CMP AL, 3 JNE 70000 ADD AL,2 70000:
Ответы на контрольные вопросы с четными номерами
1281
28. MOV SI,OFFSET BLOCKA MOV DI,OFFSET BLOCKB CLD . REPEAT
LODSB STOSB .UNTIL AL==0
30. MOV SI,OFFSET BLOCKA MOV DI,OFFSET BLOCKB CLD MOV AL,0 .WHILE AL!=12H
LODSB ADD AL,ES:[DI] STOSB
. ENDW
32. Обе инструкции сохраняют адрес возврата в стеке и передают управление процедуре. При ближнем вызове адрес возврата представляет собой значение для записи в регистр Е1Р или IP, а при дальнем вызове — пару значений для записи в регистры EIP или IP и CS.
34. RET.
36. С помощью атрибута near или far в директиве .proc.
38. CUBE PROC NEAR USES AX DX MOV AX,CX MUL CX MUL CX RET CUBE ENDP
40. MOV EDI,0 ADD EAX,EBX .IF CARRY?
MOV EDI,1	*
.ENDIF ADD EAX,ECX .IF CARRY?
MOV EDI,1 .ENDIF ADD EAX,EDX .IF CARRY?
MOV EDI,1 .ENDIF
42. INT, INTO и DIV/IDIV (при ошибке).
44. Прерывание по вектору 0 зарезервировано для ошибки деления.
46. Команда iret извлекает из стека адрес возврата, подобно команде ret, но потом, в отличие от этой команды, извлекает из стека копию регистра флагов.
48. Команда INTO вызывает прерывание при установленном флаге переполнения OF (Overflow Flag).
50. Команда STI разрешает, a CLI запрещает прерывания по входу INTR.
52. Аппаратное прерывание по вектору 09Н.
1282
Приложение 4
54. Прерывание генерируется, если значение 16- или 32-битного регистра будет вне диапазона. заданного значениями слов или двойных слов в памяти.
56. Регистр ВР.
58. Null-строка — это строка символов, заканчивающаяся байтом со значением ООН.
60. Измените определение MES2 следующим образом:
MES2 DB 'Your Name',0
Глава 7
2. OBJ-файл генерируется в любом случае; в зависимости от опций запуска ассемблер может создавать дополнительные LST- и CRF-файлы.
4. Директива public используется для объявления имени метки, данных или целого сегмента доступным другим модулям.
6. При помощи ключевых слов NEAR ptr, far ptr, BYTE, WORD ИЛИ DWORD в директиве EXTRN.
8. Объявление макрокоманды открывается директивой MACRO и завершается директивой ENDM.
10. Параметры перечисляются при объявлении макрокоманды — в директиве MACRO. При вызове макрокоманды параметры указываются после имени макрокоманды.
12. Директива local объявляет метки, используемые в макрокоманде; в макроопределении директива LOCAL ставится сразу после оператора MACRO.
14. ADDM MACRO LIST,LENGTH MOV CX,LENGTH MOV SI,OFFSET LIST MOV AX,0 CLD .REPEAT ADD AX,[SI] ADD SI,2
.UNTILCXZ ENDM
16. RANDOM MACRO LOCAL Rl Rl: INC CL MOV AH, 6 MOV DL,-1 INT 21H JZ Rl ENDM
18. DISP MACRO PARA IFB <PARA> MOV AH,6 MOV DL,13 INT 21H MOV DL,10 ENDIF
Ответы на контрольные вопросы с четными номерами 1283
IFNB <PARA> MOV DL,PARA ENDIF MOV AH, 6 INT 21H ENDM
20. DIPS PROC NEAR MOV AH, 6 MOV DL,-1 INT 21H JZ DISP .IF AL==0 PUSH AX SHR AL,4 ADD AL,ЗОН .IF AL>'9' ADD AL,7 .ENDIF MOV AH,6 MOV DL,AL INT 21H POP AX AND AL,OFH ADD AL,ЗОН .IF AL>' 9' ADD AL,7 .ENDIF MOV AH,6 MOV DL,AL INT 21H .ENDIF RET	*
DISP ENDP
22. INT 33H.
24. Функция 24H прерывания INT ЗЗН возвращает тип мыши в регистре СН.
26. Если этого не сделать, то в лучшем случае на экране останется след курсора, а в худшем — произойдет сбой системы в целом.
28. Посредством последовательных делений на 10.
30. ЗОН.
32. Сначала вычесть из каждой цифры ЗОН, затем умножить наиболее значимую цифру на 100, а следующую цифру — на 10, и просуммировать результаты.
34. HEXAS PROC NEAR ; преобразование числа в AL AND AL,0FH MOV BX,OFFSET LOOK XLAT CS:LOOK RET HEXAS ENDP
1284
Приложение 4
LOOK DB 30H,31H,32H,33H
DB 34H,35H,36H,37H
DB 38HZ39H,41H,42H
DB 43H,44H,45HZ46H
36. XLAT SS:LOOK.
38. Загрузочный сектор содержит программу, которая копируется в память при включении питания и загружает DOS. Таблица распределения дискового пространства FAT содержит информацию об использовании кластеров диска. Корневой каталог — это основной каталог диска.
40. Запись начальной загрузки находится в нулевом секторе диска и предназначена для загрузки DOS.
42. Байт атрибута определяет, является ли элемент логической структуры диска каталогом, файлом или меткой тома, определяет возможность чтения (атрибут только для чтения) и записи в файл или в каталог, а также доступа к ним (атрибуты скрытый и системный).
44. 4 Гбайт.
46. 256 байт.
48. RRNAM PROC NEAR USES DS ES MOV AXZCS MOV DSZAX MOV ESZAX MOV DI,OFFSET NEW1 MOV SI,OFFSET OLD1 MOV AHZ56H INT 21H RET
RRNAM ENDP
NEW1 DB	•TEST.LIS'z0
OLD1 DB	'TEST.LST'z0
50. .MODEL TINY .CODE DISP MACRO PARA MOV DLZPARA MOV AHZ 6 INT 21H ENDP .STARTUP MOV CXZ 8 .REPEAT DISP 13 DISP 10 DISP ' ' MOV ALZ 8 SUB ALZCL ADD AL, ЗОН DISP AL DISP 13 DISP 10 DISP '2'
Ответы на контрольные вопросы с четными номерами
1285
DISP ' '
DISP '='
MOV АХ,100Н
SHR AX,CL .IF AL>99
DISP '1'
SUB AL,100
AAM
ADD AX,3030H DISP AH DISP AL .ELSE
AAM .IE AH!=0
ADD АН,ЗОН DISP AH
.ENDIF
ADD AL,ЗОН DISP AL .ENDIF .UNTILCXZ .EXIT END
52. .MODEL TINY .386 .CODE .STARTUP
CALL GETADR CALL DISPA . EXIT DISP MACRO PARA MOV DL,PARA MOV AH,6 INT 21H ENDM GETADR PROC NEAR
MOV EDI,0 MOV ESI,0 .WHILE 1 CALL GETN .BREAK IF AL==13 SHL EDI,4 MOV AH,0 ADD DI,AX ADD AL,ЗОН .IF AL> ' 9'
ADD AL,7 .ENDIF DISP AL
.ENDW
1286
Приложение 4
MOV SI,DI
AND SI,0FH
SHR EDI,4 MOV DS,DI
SHL EDI,4
RET
GETADR ENDP
DISPA PROC NEAR
MOV CX,256
CALL ADR
.REPEAT
LODSB
ADD AX,3030H .IE AH> ' 9'
ADD AH,7 .ENDIF .IF AL> ' 9'
ADD AL,7 .ENDIF
DISP AH DISP AL DISP ' ' MOV AX,SI AND AX,15 .IF ZERO?
CALL ADR .ENDIF .UNTILCXZ RET
DISPA ENDP
ADR	PROC NEAR USES CX EDI
	DISP 13 DISP 10 MOV CX,5 ADD	EDI,ESI ROL EDI,12 .REPEAT ROL EDI,4 MOV AX,DI AND AL,OFH ADD AL,ЗОН .IF AL> ' 9'
	ADD AL,7 .ENDIF DISP AL .UNTILCXZ DISP r ' RET
ADR END	ENDP
Ответы на контрольные вопросы с четными номерами
1287
Глава 8
2. Встроенный ассемблер не поддерживает директивы определения байт.
4. Регистры АХ, ВХ, СХ, DX и ES в 16-битных приложениях, а также регистры ЕАХ, ЕВХ, ЕСХ, EDX и ES в 32-битных приложениях.
6. Оператор .model с атрибутом с.
8.	Эта инструкция использует регистр SI как указатель символа в строке stringl, копируя его в регистр DL.
10.	Исполняемый модуль, полученный из программы в примере 8.6, компактней, поскольку исключает библиотеки C/C++ значительного объема, обусловленного необходимостью предусмотреть все ситуации.
12.	Встроенный ассемблер в обеих версиях транслятора C/C++ остается, в основном, без изменений.
14.	Эта библиотека позволяет воспользоваться функциями консольного ввода-вывода, такими как _putch и _getche.
16.	При разработке встроенных приложений для доступа к портам чаще используются команды ассемблера IN и OUT.
18.	Преобразование числа в строку выполняется за счет деления на основание системы счисления. Например, при делении на 8 остаток представляет восьмеричную цифру от 0 до 7.
20. Информация о времени хранится в CMOS-памяти в формате BCD-чисел.
22. Директива public делает процедуру или метку доступной другим модулям.
24. Функция Getlt с одним параметром целочисленного типа не возвращает результата.
26. Редактор Visual Studio может быть использован для редактирования модулей на языках C/C++ и ассемблер.
28. Процедура Scan использует байтовые параметры.
30. .386 .MODEL flat, С .CODE public Myne Myne proc , \ datal: byte mov al,datal .if al >= ' a' && al <= ' z' sub al,7 .endif ret Myne endp end
Глава 9
2. Они являются TTL-совместимыми до тех пор, пока ток нулевого логического уровня не превышает 2,0 мА.
4. Адресные разряды А7—АО.
6. Низкий логический уровень сигнала на выводе RD микропроцессора указывает, что он считывает данные из памяти или из устройства ввода-вывода.
1288
Приложение 4
8. Сигнал CLK должен быть ТТЛ-уровня, прямоугольной формы с коэффициентом заполнения 33%, при котором сигнал имеет высокий логический уровень в течение одной трети периода.
10. Сигнал WR указывает на то, что микропроцессор разместил информацию на своей шине данных для записи в память или устройство ввода-вывода.
12. Если сигнал DT/R имеет высокий логический уровень, то это указывает на то, что по шине данных микропроцессора передаются данные в память или устройство ввода-вывода.
14. Сигналы S2 —S0.
16. Выходные сигналы QS1 и QS0 на одноименных выводах указывают на состояния очереди команд микропроцессора, предназначенных для математического сопроцессора.
18. Коэффициент деления равен трем.
20. 2,33 МГц.
22. AD19-AD0.
24. Для демультиплексирования выводов шины адреса/данных обычно используют 8-разряд-ные защелки типа 74LS373.
26. Система на базе микропроцессора 8086 или 8088 должна содержать буферы, если хотя бы к одному из выводов шины подключается более 10 удельных нагрузок. Это связано с тем, что максимальный выходной ток на выводах микропроцессора имеет значение не более 2 мА.
28. 4.
30. Чтение или запись.
32.	а) Такт Tj используется микропроцессором для выдачи адреса при обращении к памяти или устройству ввода-вывода.
б)	Такт Т2 предоставляет время для формирования управляющих сигналов записи или чтения при доступе к памяти или устройству ввода-вывода, а также для получения в конце такта сигнала готовности READY, который указывает на подтверждение завершения обмена.
в)	Такт Т3 используется для выборки или передачи данных при обмене с памятью или устройством ввода-вывода.
г)	Такт Т4 используются для дезактивирования всех управляющих сигналов для начала нового цикла обмена.
34. 400 нс (2 периода тактовой частоты).
36. Входной сигнал на выводе ASYNC синхрогенератора 8284А управляет выбором типа синхронизации.
38. Минимальный режим процессора (MIN MODE) используется до тех пор, пока в системе нет необходимости использовать арифметический сопроцессор, в противоположном случае используется максимальный режим (MAX MODE).
Глава 10
2.	а) 256
б)	2048
в)	4096
г)	8192
Ответы на контрольные вопросы с четными номерами
1289
4. Вывод CS или СЕ в микросхеме памяти используется для выбора и разрешения ее работы. При активизации этого сигнала выполняется операция чтения или записи.
6. Сигнал низкого уровня, поступающий на вывод разрешения записи WE , используется для активизации операции записи в память при условии, что на вывод CS или СЕ также поступает соответствующий активный сигнал.
8. Микропроцессор 8088 с тактовой частотой 5 МГц предоставляет памяти для доступа к данным время равное 460 нс. С таким микропроцессором микросхема постоянной памяти типа EPROM со временем доступа 450 нс работать будет, но только в том случае, если задержка времени, дешифратора адреса и буферов в системе составит менее 10 нс, что маловероятно.
10. Запоминающее устройство типа SRAM (Static RAM) относится к статическим элементам памяти, которые сохраняют данные в течение подачи на них питания. Статические элементы памяти предназначены как для чтения, так и для записи.
12. 250 нс.
14. Для подачи 16-разрядного адреса на восемь адресных выводов Aq—А7 микросхемы DRAM типа TMS4464A используются мультиплексоры.
16. Для регенерации типовой микросхемы DRAM требуется 2—4 мс.
18. См. схему на рис. П4.1.
20. В этом случае дешифратору разрешается работать. При этом в зависимости от состояния адресных входов А, В и С сигнал на одном из восьми выходов дешифратора становится низкого логического уровня.
22. См. схему на рис. П4.2.
24. Во многих случаях дешифратор адреса, выполненный на микросхеме ППЗУ, больше подходит для дешифрации адреса памяти, чем специализированный линейный дешифратор типа 74LS138.
26. См. табл. П4.1.
1290
Приложение 4
А17
А16
74ALS32
U2
40000Н - 41FFFH
42000Н - 43FFFH
44000Н - 45FFFH
46000Н - 47FFFH
48000Н - 49FFFH
4A000H-4BFFFH
4C000H-4DFFFH
4E000H-4FFFFH
74ALS138
Рис. П4.2
Таблица П4.1
ОЕ	А8	А7	А6	А5	А4	АЗ	А2	А1	АО	оо	01	02	03	04	05	Об	07
0	0	0	0	0	1	1	0	0	0	0	1	1	1	1	1	1	1
0	0	0	0	0	1	1	0	0	1	1	0	1	1	1	1	1	1
0	0	0	0	0	1	1	0	1	0	1	1	0	1	1	1	1	1
0	0	0	0	0	1	1	0	1	1	1	1	1	0	1	1	1	1
0	0	0	0	0	1	1	1	0	0	1	1	1	1	0	1	1	1
0	0	0	0	0	1	1	1	0	1	1	1	1	1	1	0	1	1
0	0	0	0	0	1	1	1	1	0	1	1	1	1	1	1	0	1
0	0	0	0	0	1	1	1	1	1	1	1	1	1	1	1	1	0
28. EQUATIONS
/01	=	А19	*	/А18	*	А17	*	А16	*	/А15	*	/А14 * /А13
/02	=	А19	*	/А18	*	А17	*	А16	*	/А15	*	/А14 * А13
/03	=	А19	*	/А18	*	А17	*	А16	*	/А15	*	А14 * /А13
/04	=	А19	*	/А18	*	А17	*	А16	*	/А15	*	А14 * А13
/05	=	А19	*	/А18	*	А17	*	А16	*	А15	*	/А14 * /А13
/Об	=	А19	*	/А18	*	А17	*	А16	*	А15	*	/А14 * А13
/07	=	А19	*	/А18	*	А17	*	А16	*	А15	*	А14 * /А13
/08	=	А19	*	/А18	*	А17	*	А16	*	А15	*	А14 * А13
30. См. схему на рис. П4.3. 34. 5. 36. Один.
38. Сигнал разрешения старшего байта ВНЕ (Byte High Enable) предназначен для выбора старшего банка памяти, а сигнал АО или BLE (Byte Low Enable) выбирает младший банк памяти.
40. Для выбора памяти в системе, построенной на микропроцессоре 8086, используются или отдельные дешифраторы, или отдельные управляющие сигналы записи.
42. Младший.
46. См. схему на рис. П4.4.
Ответы на контрольные вопросы с четными номерами
1291
Рис. П4.4
48. Цикл регенерации с единственным сигналом RAS выбирает новую адресную строку, но не выбирает динамический элемент памяти DRAM для чтения или записи. Сигнал RAS производит внутреннее считывание/запись выбранной строки. За счет этого перезаряжаются внутренние конденсаторы, которые и хранят данные в элементах динамической памяти.
1292
Приложение 4
50. 15,625 мкс.
52. Вывод BS выбирает банк памяти.
Глава 11
2. Вслед за операционным кодом в памяти сразу запоминается фиксированный адрес порта в вода-вывода.
4. В регистре DX
6. Команда OUTSB копирует содержимое ячейки памяти сегмента данных, адресуемого регистром SI на шину данных, где и записывается в устройстве ввода-вывода, которое адресуется регистром DX. Содержимое регистра SI, после передачи, увеличивается или уменьшается, в зависимости от флага направления DF.
8. Разница системы ввода-вывода, отображаемой в памяти, и системы изолированного ввода-вывода состоит в том, что при изолированном вводе-выводе ячейки ввода-вывода изолируются от адресного пространства системы памяти.
Ю. Базовым элементом интерфейса вывода является защелка, которая фиксирует выходные данные микропроцессора.
12. Младших
14. Схема устранения дребезга контактов устраняет механическое дребезжание переключателя за счет использования защелки или триггера.
16. См. схему на рис. П4.5.
Рис. П4.5
18. См. схему на рис. П4.6.
; Уравнение (EQUATIONS) для микросхемы U1
EQUATIONS
/01 = /U2 * /А4 * /А5 * /Аб * /А7 * А8 * /АЗ * /А2 * /А1 * /МЮ /02 = /U2 * /А4 * /А5 * /Аб * /А7 * А8 * /АЗ * /А2 * А1 * /МЮ /03 =	/U2	*	/А4	*	/А5	*	/Аб	*	/А7	*	А8	*	/АЗ * А2	*	/А1 * МЮ
/04 =	/U2	*	/А4	*	/А5	*	/Аб	*	/А7	*	А8	*	/АЗ * А2	*	А1	*	/МЮ
/05 = /U2 * /А4 * /А5 * /Аб * /А7 * А8 * АЗ * /А2 * /А1 * /МЮ /06 =	/U2	*	/А4	*	/А5	*	/Аб	*	/А7	*	А8	*	АЗ * /А2	*	А1	*	/МЮ
/07 =	/U2	*	/А4	*	/А5	*	/Аб	*	/А7	*	А8	*	АЗ * А2 *	/А1	*	/МЮ
Ответы на контрольные вопросы с четными номерами
1293
/08 = /U2 * /А4 * /А5 * /Аб * /А7 * А8 * АЗ * А2 * А1 * /МЮ ; Уравнение (EQUATIONS) для микросхемы U2
EQUATIONS
/U2 = /А9 * /А10 * /АН * /А12 * /А13 * /А14 * /А15
U1
PAL16L8
U1
16L8
Рис. П4.7
Рис. П4.6
20. См. схему на рис. П4.7.
; Уравнение (EQUATIONS) для микросхемы U1
EQUATIONS
/01 =	/U2	*	/А9 * /А5 * /Аб * /А7 * А8 * АЗ	*	А2	*	/А1	*	/МЮ
/02 =	/U2	*	/А9 * /А5 * /Аб * /А7 * А8 * АЗ	*	/А2	* А1	*	/МЮ
/03 =	/U2	*	А9 * /А5 * /Аб * /А7 * А8 * /АЗ	*	А2	*	/А1	*	МЮ
/04 =	/U2	*	А9 * /А5 * /Аб * /А7 * А8 * /АЗ	*	А2	*	А1 *	/МЮ
; Уравнение (EQUATIONS) для микросхемы U2
EQUATIONS
/U2 = /ВНЕ * /А4 * /А10 * /АН * /А12 * /А13 * /А14 * /А15
22. К линиям D7—DO.
24. 24.
26. Выводы А1 и АО.
28. См. схему на рис. П4.8.
30. Режим 0, в котором микросхема ППИ работает как буферизованное устройство ввода или как устройство вывода с защелкой; режим 1, в котором микросхема выполняет стробированные операции ввода-вывода; и, наконец, режим 2, в котором осуществляются двунаправленные операции ввода-вывода.
1294
Приложение 4
D0-D7
АЗ А4
А5 А6
А7 А8
А9 А10
А11
2.
-----3 12
-----Г 13
-----г 14
-----с 15
-----16
-----Я 17
-----з- 18
----ГГ 19
----— 110
2.
7.
01 02 03 04 05 06 07 08
кдэ
3
>31 гр
М/Ю
PAL16L8
АО
82С55
4
8
Рис. П4.8
32. При возбуждении катушки ток вынуждает якорь постоянного магнита сделать шаг (переместиться) в следующее положение.
34. MOV AL, OFH
OUT COMMAND, AL
36. Входной сигнал ACK (acknowledge) сбрасывает сигнал OBF в состояние логической единицы, указывая на незаполненное состояние буфера порта.
38. IN	AL, PORTC
TEST	AL, 16
JNZ FOR_A_ONE
40. Выводы РСО—PC2.
42. Отображаемая позиция выбирается за счет изменения адреса этой позиции, находящегося в наборе адресных команд.
44. Линия занятости тестируется командой занятости флага, а затем проверкой самого старшего разряда.
46. 10—20 мс.
48. Два такта.
50. Ошибка переполнения (overrun error) указывает на то, что данные переполнили внутренний буфер FIFO.
52. См. схему на рис. П4.9.
54. 10 МГц.
56. См. схему на рис. П4.10.
58. Младший байт.
Ответы на контрольные вопросы с четными номерами
1295
Рис. П4.9
8 МГц
Рис. П4.10
60. ; использование синхронизации в 1 МГц
MOV	AL, 74Н
OUT	CONTROL,	AL
MOV	AL, 65H	; счет	101
OUT	TIMER1,	AL
MOV	AL, 0
OUT	TIMER1,	AL
1296
Приложение 4
62. Асинхронные последовательные данные — это данные, которые посылаются без синхро-
визирующего импульса.
64. LINE EQU 023H
LSB EQU 020H
MSB EQU 02]H
FIFO EQU 022H
MOV AL,10001010B	; разрешение работы делителя
OUT LINE,AL
MOV AL,60	; программирование скорости в бодах
OUT LSB, AL
MOV AL,0
OUT MSB,AL
MOV AL,00011001B	; программирование 7-разрядных
; данных, бита паритета с проверкой
OUT LINE,AL	; на нечетность, и одного стоп-бита
MOV AL,00000111В	; разрешение передатчика
OUT FIFO,AL	; и приемника
66. Сиплекс — это отправка или получение информации, но осуществляемая только в одном
направлении. Полудуплекс — отправка и получение информации, но осуществляемые в
каждый момент времени только в одном направлении. Дуплекс — отправка и получение информации в двух направлениях одновременно.
68. SENDS PROC NEAR
MOV CX,16 .REPEAT .REPEAT IN AL,LSTAT ; прочесть регистр состояния линии TEST AL,20H ; проверить бит TH .UNTIL !ZERO? LODSB	; получить данные
OUT DATA,AL	; передать данные
.UNTILCXZ
RET
SENDS ENDP
70. 0,01 B.
72. .MODEL TINY .CODE .STARTUP MOV	DX,4OOH
.WHILE 1 MOV	CX,256
MOV	AL, 0
.REPEAT OUT	DX,AL
INC	AL
CALL DELAY
Ответы на контрольные вопросы с четными номерами
1297
.UNTILCXZ
MOV СХ,256
.REPEAT
OUT	DX,AL
DEC	AL
CALL DELAY
.UNTILCXZ
. ENDW
DELAY PROC NEAR
время задержки 39 мкс
DELAY ENDP
END
74. Сигнал на вывод INTR указывает на то, что преобразователь ADC080X завершил преобразование.
76.	См. схему на рис. П4.11.
; Уравнение (EQUATIONS) для микросхемы U1
EQUATIONS
/01 = /A15*/A14*/A13*/A12*/All*/A10*A9*/A8*/A7*A6*A5*/A4*/A3*/A2*/Al*/BLE
/08 = /A15VA14*/A13*/A12*/All*/A10*A9*/A8*/A7*A6*A5*A4*/A3*/A2*/Al*/BLE
Рис. П4.11
Глава 12
2. Прерывание — это процесс, инициируемый аппаратным или программным обеспечением, который прерывает любую выполняемую на данный момент программу и вызывает соответствующую подпрограмму.
42 Зак 384
1298 Приложен* д
4. Прерывания высвобождают время при обслуживании устройств, поскольку процеЕ^ использует время только тогда, когда устройство инициирует прерывание. Таким обраЕ^ время процессора не тратится на опрос устройств.	Е
6. INT, INTO, IRET ИЛИ IRETD, CLI, STI.	I
8. В первом килобайте памяти по адресам ООООООООН—000003FFH.	I
Ю. Векторы ООН—1FH зарезервированы корпорацией Intel для использования микропрЛес, сорами семейства, хотя некоторые используются в персональном компьютере и дляИру-гих целей.	Е
12. Таблица дескрипторов прерываний находится в любом месте системы физической пЕяТц и адресуется с помощью регистра таблицы дескрипторов прерываний IDTR (IntEupt Descriptor Table Register).	I
14. Основное отличие состоит в размещении векторов прерываний. Для прерывания в Валь-ном режиме используется вектор из таблицы векторов, расположенной в нижней |асти памяти в 1 Кбайте, тогда как для прерывания в защищенном режиме исполь»ется дескриптор из любой ячейки системы памяти. Другим отличием является тоВ что процедура обслуживания прерываний в защищенном режиме может быть размеифна в любом месте системы памяти.
16. Команда INTO прерывает программу только в случае установки флага переполнении OF (Overflow Flag).
18. Команда возврата из обработчика прерывания IRET функционирует как команда RET дальнего перехода (типа far), за исключением того, что перед возвратом из обработчика данные из стека выталкиваются в регистр флагов.
20.	Флаги сохраняются в стеке, флаги IF и TF очищаются, и вызывается процедура обслуживания прерываний с использованием вектора, взятого из таблицы векторов прерываний.
22.	Флаг трассировки TF устанавливается для выполнения трассировки программы. Трассировка — это, по сути, пошаговое выполнение программы, необходимое для ее отладки. При выполнении трассировки вызывается прерывание программы после выполнения каждой ее команды.
24.	Единственный способ сброса или установки флага трассировки TF — это получить содержимое регистра флагов, а затем изменить бит флага трассировки на нуль или единицу перед возвратом этого содержимого в регистр флагов. Специальной команды для установки или сброса флага трассировки нет.
26.	Нет. Выходной сигнал INTA активизируется процессором только в ответ на сигнал высокого логического уровня, поступающего на вывод INTR.
28.	Вывод NMI является чувствительным к уровню и фронту сигнала, поступающего на этот вывод.
30.	Буфер FIFO (First in First Out) — это память типа "первым пришел — первым обслужен", которая сохраняет данные в порядке их поступления, причем данные, поступившие ранее, будут обслужены раньше чем данные, поступившие позже. Иногда буфер FIFO называют очередью.
32. См. схему на рис. П4.12.
34.	Система прерываний с последовательным опросом — это метод прерываний, при котором сигнал запроса прерывания высокого логического уровня от любого устройства поступает на вывод INTR микропроцессора. При использовании системы с последовательным опросом используется один вектор прерывания. Задача определения устройства, вызывающего прерывание, возлагается на процедуру обслуживания.
36.	Микросхема 8259А — это программируемый контроллер прерываний, который осуществляет прием до восьми маскируемых запросов на прерывание с фиксированными уровнями приоритета, а также передачу в микропроцессор одного сигнала запроса на прерывание и кода вектора.
Ответы на контрольные вопросы с четными номерами
1299
Рис. П4.12
38.	Выводы IRO—IR7 контроллера 8259А предназначены для приема запросов на прерывание, поступающие на них от периферийных устройств.
40.	При каскадном варианте подключения контроллеров вывод INT подчиненного (slave) контроллера 8259А может соединяться с любым выводом запроса на прерывание IR главного (master).
42.	OCW (Operation Command Word) — это командные слова операций, используемое для управления контроллером 8259А после его инициализации посредством командных слов инициализации ICW (Initialization Command Word).
44.	Командное слово инициализации ICW2 задает начальный номер вектора, который используется для выводов запроса на прерывание для данного контроллера.
46.	Командное слово инициализации ICW1 предназначено для конфигурирования контроллера прерываний 8259А, в частности, определяет реагирование выводов запроса на прерывание контроллера на фронт или уровень сигнала.
48.	Алгоритм циклического сдвига приоритетов состоит в том, что низший 7 уровень приоритета становится на позицию только что обслуженного запроса.
50. Порты 20Н и 21Н.
Глава 13
2. HOLD — это вывод микропроцессора, используемый для приема одноименных входных сигналов запроса системной шины со стороны периферийного устройства для выполнения им процесса прямого доступа к памяти. Когда на вывод HOLD поступает сигнал высокого логического уровня, то микропроцессор: а) в течение нескольких тактов прекращает выполнение программы; б) переводит свои выводы адреса, данных и управления в состояние с высоким импедансом и в) устанавливает сигнал высокого логического уровня на выводе HLDA, чтобы подтвердить предоставление системной шины периферийному устройству для выполнения им процедуры прямого доступа к памяти (DMA).
4. При выполнении процедуры DMA и операции записи данные передаются из устройства ввода-вывода в память.
6. С помощью сигнала DACK.
8. Микропроцессор находится в состоянии предоставления управления шиной периферийному устройству, если оба сигнала HOLD и HLDA имеют высокий логический уровень.
10. 4.
1300
Приложение 4
12.	Регистр управления CR (Command Register).
14.	LATCHB EQU	ЮН	; защелка адреса U3
	CLEAR_F EQU	7СН	; триггеры First/Last
	СН0_А EQU	7ОН	; регистр адреса канала 0
	СН1_А EQU	72Н	; регистр адреса канала 1
	СН1_С EQU	73Н	; регистр счета слов канала 1
	MODE	EQU	7ВН	; регистр режимов
	CMMD	EQU	78Н	; регистр управления
	MASKS EQU	7FH	; регистр масок
	REQ	EQU	79Н	; регистр запросов
	STATUS	EQU	78Н	;	регистр	состояния TRANS	PROC	FAR USES AX MOV	AL,20H SHR	AL,4 OUT	LATCHB,AL OUT	CLEAR_F,AL	;	сброс	триггеров First/Last MOV	AX,1000H	;	программирование	адреса источника OUT	CH0_A,AL MOV	AL,AH OUT	CH0_A,AL MOV	AX,0000H	; программирование адреса назначения OUT	CH1_A,AL MOV	AL,AH OUT	CH1_A,AL MOV	AX,00FFH	;	программирование	регистра	счета OUT	CH1_C,AL MOV	AL,AH OUT	CH1_C,AL MOV	AL,88H	;	программирование	регистра	режимов OUT	MODE,AL MOV	AL,85H OUT	MODE,AL MOV	AL,1	;	разрешение передач OUT	CMMD,AL	;	типа "память-память” MOV	AL,ОЕН	;	размаскировать канал 0 OUT	MASKS,AL MOV	AL,4	;	начать передачу DMA OUT	REQ,AL .REPEAT	; ожидание завершения процедуры DMA IN	AL,STATUS •UNTIL AL &1 TRANS ENDP
Ответы на контрольные вопросы с четными номерами
1301
16. Мини-дискета или мини-диск.
18. Дорожками.
20. Цилиндр.
22. См. рис. П4.13.
Рис. П4.13
24. "Парящие" или "летящие" головки — это магнитные головки внутри накопителя на жестких магнитных дисках, поскольку они "парят" ("летят") над поверхностью дисков на воздушной подушке, создаваемой их вращением с большой скоростью.
26. Шаговый электродвигатель является менее быстродействующим и менее точным при позиционировании магнитных головок. При использовании "звуковой" катушки применяется обратная связь с магнитной дорожкой диска, что обеспечивает более точное позиционирование магнитных головок.
28. CD-ROM (Compact Disk-Read Only Memory) — это оптический компакт-диск, предназначенный только для чтения.
30. Красный, зеленый и синий.
32. Пиксел (pixel) — это наименьший элемент изображения в видеодисплея.
34. Цифровой RGB-монитор отображает 16 цветов, благодаря образованию цвета из комбинации четырех сигналов: трех основных цветов R, G, В (красный, зеленый, синий) и сигналу яркости.
36. 7-разрядный ЦАП позволяет сформировать 27 = 128 уровней для каждого из основных цветов. Поэтому такая видеосистема может формировать (128 х 128 х 128) 2 097 152 различных цветов.
38. 560 строк.
Глава 14
2. 16 бит (диапазон ±32 К), 32 бита (диапазон ±2 Г) и 64 бита (±9 х 1018).
4. 32-битное одинарной точности, 64-битное двойной точности и 80-битное расширенной точности.
6.	а) -7.5
б)	+0.5625
в)	+320
г)	+2.0
Д) +10
е) +0.0
8. Микропроцессор может выполнять предназначенные ему инструкции2.
2 Если операнды команд сопроцессора и центрального процессора не находятся в одной и той же области системной памяти. — Лер.
1302 Приложение 4
10. Инструкция FSTSW АХ копирует регистр состояния сопроцессора в регистр АХ центрального процессора.
12. После выполнения команд FCOMP ST(2) и FSTSW АХ инструкция SAHF копирует регистр АН в младший байт регистра флагов, после чего равенство проверяется командой условного перехода je.
14. FSTSW АХ.
16. Данные хранятся в восьми 80-битных регистрах, по принципу стека.
18. Нулевой регистр стека ST(0).
20. Аффинная бесконечность имеет знак, а проективная — нет.
22. Расширенная точность.
24. Инструкция FST data копирует, не выталкивая из стека, содержимое регистра ST(0) в память — в формате действительного числа двойной точности.
26. FADD ST,ST(3)
28. FSUB ST(2),ST
30. Команда прямого деления fdiv выполняется по схеме ST(0) = ST(l)/ST(0). Если в команде fdiv задан операнд, например, fdiv st(2), выполняется операция ST(0) = ST(0)/ST(2). В командах обратного деления делимое и делитель меняются местами, а результат по-прежнему формируется на вершине стека.
32. Инструкция копирует данные при условии "беззнаковое меньше". 34. RECEP PROC NEAR MOV TEMP,EAX FLD1 FLD TEMP FDIVR FSTP TEMP MOV EAX,TEMP RET TEMP DD ? RECEP ENDP
36. Команда F2XMI возводит число 2 в целую степень, заданную в регистре ST(0), и, уменьшив результат на 1, помещает его на вершину стека — на место показателя степени.
38. FLDPI.
40. Команда помечает регистр ST(2) как свободный.
42. Команда fsave записывает в память состояние сопроцессора (содержимое всех регистров), включая данные.
44. REAC PROC NEAR FLDPI FADD ST,ST(0) FMUL F FMUL Cl FLD1 FDIVR FSTP XC RET REAC ENDP
Ответы на контрольные вопросы с четными номерами
1303
46. Команда fwait приостанавливает работу центрального процессора до завершения сопроцессором текущей операции; используется перед выполнением команд сопроцессора3.
48.	ТОТ PROC NEAR
	FLD1 FDIV R2 FLD1 FDIV R3 FLD1 FDIV R4 FADD FADD FLD1 FDIVR FADD RI FSTP RT RET TOT ENDP
50.	ARRAY1 DQ	100 DUP (?)
	ARRAY2 DQ	100 DUP (?)
	ARRAY3 DQ	100 DUP (?) PROD PROC NEAR
	MOV EBX,OFFSET ARRAY1-8
	MOV EDX,OFFSET ARRAY2-8
	MOV ESI,OFFSET ARRAY3-8 MOV ECX,100 AGAIN:
	FLD QWORD PTR [EBX+8*ECX]
	FMUL QWORD PTR [EDX+8*ECX]
	FSTP QWORD PTR [ESI+8*ECX] LOOPD AGAIN RET PROD ENDP
52.	POW PROC NEAR MOV TEMP,EBX FLD TEMP F2XM1 FLD1 FADD MOV TEMP,EAX FLD TEMP FYL2X FSTP TEMP MOV ECX,TEMP RET POW ENDP
3 Вставка команды FWAIT перед каждой командой сопроцессора была необходима при работе с сопроцессором 8087. В последующих поколениях 80x87 необходимость в команде FWAIT возникает лишь при обработке прерываний по ошибкам сопроцессора. — Пер.
1304
Приложение 4
54.	VOUT VIN DBG TWEN	DD DD DD DD	100 DUP 100 DUP 100 DUP 20.0	(? (? (?
	GAIN	PROC	NEAR	
		LEA	EBX,VOUT	-4
		LEA	EDX,VIN-	4
		LEA	ES I, DBG-	4
		MOV	ECX,100	
AGAIN:
FLD DWORD PTR [EBX+4*ECX]
FDIV DWORD PTR [EDX+4*ECX]
CALL LOGIC
FMUL TWEN
FSTP DWORD PTR [ES1+4*ECX]
LOOPD AGAIN
RET
GAIN ENDP
56. Команда emms очищает стек сопроцессора после использования команд ММХ-рас-ширения.
58. Результат, превышающий диапазон положительных (или отрицательных) значений, при знаковом насыщении устанавливается равным границе диапазона. Например, если при сложении байт сумма больше +127, результат равен +127; а если разность байт меньше -128, то результат вычитания равен -128.
60. FSAVE.
Глава 15
2. Первый стандарт шины ISA поддерживал только 8-разрядные передачи, а следующий более современный стандарт шины обеспечивал как 8-, так и 16-разрядные передачи.
4. См. схему на рис. П4.14.
6. См. схему на рис. П4.15.
8. См. схему на рис. П4.16.
10. См. руководство программиста (Instructor’s Manual).
12. 32.
14. 32 МГц.
16. Основное отличие состоит в том, что шина PCI поддерживает 32- или 64-разрядную шину данных, что делает ее пригодной для микропроцессора Pentium или Pentium Pro.
18. Конфигурационное пространство позволяет программному обеспечению определять вставленную в разъем PCI карту, для того чтобы программа могла автоматически настроить систему.
20. На контактах С/ BE (command/byte enable) шины PCI появляется команда ведущего устройства, выданная им для подчиненного устройства.
22. См. руководство программиста (Instructor's Manual).
24. С полной скоростью (full speed) работы 12 Мбит/с и при низкой скорости (low speed) работы — 1,5 Мбит/с.
Ответы на контрольные вопросы с четными номерами
1305
Рис. П4.14
SD7 SD6 SD5
SD4
SD3
SD2 SD1 SDO
SAO SA1 SA2 SA3 SA4 SA5 SA6 SA7 SA8 SA9 SA10 SA11 SA12 SA13 SA14
SMEMR
SA15 SA16 SA17 SA18
SA19 LA20 LA21 LA22
LA23
Рис. П4.15
1306
Приложение 4
U5
Рис. П4.16
26. При полной скорости — 5 м, а при низкой — 3 м.
28. 127.
30. Стаффинг (bit stuffing) — это вставка дополнительного бита нуля после переданных подряд нескольких единиц для осуществления надежной передачи данных. Например, при передачах по методу NRZI бит нуля вставляется после шести следующих подряд единиц.
Ответы на контрольные вопросы с четными номерами
1307
32. От 1 до 1023 байт.
34. Пропускная способность 32-разрядной шины PCI при тактовой частоте 33 МГц равна 132 Мбайт/с, а 64-разрядной шины — 264 Мбайт/с. Пропускная способность шины AGP в режиме 2х составляет 528 Мбайт/с, а в режиме 4х — более 1 Гбайта/с.
Глава 16
2. В микропроцессорах 80186/80188 имеется встроенный тактовый генератор, блок выбора кристалла, таймеры, программируемые контроллеры прерываний, контроллер DMA, а также последовательный и параллельные интерфейсы.
4. Тактовый сигнал с частотой 10 МГц.
6. Нагрузочная способность каждого выходного вывода микропроцессоров 80186/80188 для сигналов низкого логического уровня равна 3,0 мА при коэффициенте разветвления по выходу 7 для микросхем ТТЛ-технологии с диодами Шоттки (типа TTLS) и 10 для схем КМОП-технологии (типа CMOS).
8. Во временных диаграммах микропроцессоров 80186/80188 сигнал ALE устанавливается на полпериода тактового сигнала раньше, чем в диаграммах процессоров 8086/8088.
10. 417 нс.
12. MOV АХ, 1100Н
MOV DX, 0FFFEH
OUT DX,AL
14. Десять для большинства версий микропроцессоров 80186/80188, включая все внутренние прерывания.
16. Регистры управления прерываниями управляют одним источником прерывания.
18. Регистр опроса и регистр состояния опроса имеют одинаковый формат. Разница состоит в том, что при считывании из регистра опроса выполняется цикл подтверждения прерывания, а при считывании регистра опроса состояний прерывания нет.
20. 3.
22. Таймер 2, а таймеры 0 и 1 могут соединяться к внешним источникам синхронизации.
24. Бит INH (inhibit) регистра управления таймера должен быть установлен, для того чтобы можно было изменять бит разрешения счета EN (enable).
26. Бит ALT (alternate) выбирает режим работы с одним или двумя регистрами максимально-
	го счета.		
28.	MOV АХ,	123	
	MOV	DX,	0FF5AH
		OUT	DX,AL
		MOV	AX, 23
		ADD	DX, 2
		OUT	DX,AL
		MOV	AX,8007H
		MOV	DX,0FF58H
		OUT	DX,AL
30.	2.		
32.	Программно	канал	запускается с помощью управляющего регистра или же аппаратно с
помощью таймера 2 или сигналом на соответствующем выводе DRQ0 или DRQ1.
34. 7.
36. Базового.
1308 Приложение 4
38. От 0 до 15 тактов ожидания.
40. Определяет функционирование линий PCS5/A0 и PCS6/A1.
42. MOV DX,CFF90H
MOV АХ,1001Н
OUT DX,AL
MOV DX,0FF92H
MOV AX,1008H
OUT DX,AL
44. К 1 Гбайту памяти.
46. Проверяет сегмент на возможность считывания в защищенном режиме.
48. RTOS (Real Time Operating System) — это операционная система реального времени.
Глава 17
2. 64 Тбайта.
4. См. рис. П4.17.
FFFFFFFF
OOOFFFFF
Карта памяти реального режима
00000000
Карта памяти защищенного режима
00000000
Рис. П4.17
6. Карта памяти микропроцессора 80386 имеет размер 4 Гбайта и 32-разрядную организацию. Каждый из четырех 8-разрядных банков памяти выбирается с помощью четырех сигналов разрешения байтов памяти ВЕЗ — ВЕО .
8. Конвейерная адресация позволяет микропроцессору выставлять адрес в цикле обмена во время выборки данных предшествующего цикла. Это предоставляет памяти дополнительное время для доступа к данным.
Ю. С адреса ООООН до адреса FFFFH.
12. Единственными отличиями являются большая разрядность шины адреса и данных (32 бита).
14. Сигнал высокого уровня, поступающий на вывод BS16, выбирает работу процессора с 32-разрядной шиной данных, а когда сигнал имеет низкий логический уровень, то работу с 16-разрядной шиной данных.
Ответы на контрольные вопросы с четными номерами 1309
16. ЕАХ, ЕВХ, ЕСХ, EDX, WSP, EBP, ESI, EDI, EIP и EFLAGS.
18. Регистр CRO — включает в себя биты регистра MSW процессора 80286, а добавленный бит PG разрешает механизм страничной переадресации памяти, а ЕТ является индикатором поддержки инструкций математического сопроцессора; CR1 — зарезервирован для использования в будущем; CR2 — предназначен для хранения линейного адреса, по которому был получен последний отказ страницы памяти, и CR3 — фиксирует базовый адрес каталога страниц.
20. С прерывание типа 1.
22. Команда BSR сканирует число справа налево. При обнаружении 1 флаг нуля ZF сбрасывается, а номер позиции сохраняется в приемнике. Если же ни один из разрядов источника не содержит 1, то флаг ZF устанавливается в 1.
24. MOV FS:[DI]z ЕАХ
26. Да.
28. Прерывание типа 7 используется при эмуляции арифметического сопроцессора.
30. Двойное прерывание по ошибке происходит при наличии в микропроцессоре более одного прерывания.
34. Если индикатор таблицы имеет высокий логический уровень, то локальную таблицу дескрипторов LDT выбирает сегментный регистр.
36. 8192.
38. дескриптор сегмента кода и данных определяет данные, стек и сегменты кода, а дескрипторы системных сегментов предназначены для хранения информации о таблицах системы, задачах и вентилях.
40. Сегмент состояния задачи TSS адресуется специальным дескриптором, к которому имеет доступ регистр задач TR.
42. Переход в реальный режим работы осуществляется после аппаратного сброса или после сброса бита РЕ (protect enable) в управляющем регистре CR0. Переход в защищенный режим выполняется установкой бита РЕ в регистре CR0, но с предварительным выполнением еще ряда операций.
44. Каталог страниц хранится в памяти и адресуется с помощью управляющего регистра CR3, который содержит базовый адрес каталога страниц.
46. Линейный адрес D0000000H адресует физическую страницу, получая доступ к строке каталога страниц 11101000000. По этому строке определяется адрес таблицы страниц, которая описывает память в 4 Мбайт. Строка таблицы страниц 0000000000 фиксирует адрес памяти C0000000H, чтобы преобразовать линейный адрес D0000000H в C0000000H.
48. Ввод FLUSH очищает внутреннюю кэш-память микропроцессора 80486.
50. Различий нет, за исключением микропроцессора 80486SX, который имеет флаг выравнивания АС, используемый арифметическим сопроцессором (80487).
52. Проверка на четность.
54. 16.
56. При сквозной записи операция записи осуществляется одновременно в кэш и в основную память.
58. При использовании страничной трансляцией адресов памяти кэширование может включаться и выключаться для преобразований различных страниц.
60. Если содержимое регистров AL и CL равно, то содержимое AL копируется в AL и устанавливается флаг ZF = 1, если же не равно, тогда содержимое регистра CL записывается в AL, флаг ZF сбрасывается (ZF = 0), а остальные флаги устанавливаются по результату сравнения как после команды смр.
62. Если PCD = 0, то кэширование текущей страницы памяти разрешено.
1310
Приложение 4
Глава 18
2. До 64 Гбайт.
4. Выходные сигналы на выводах DP7—DPO (data parity) представляют собой биты паритета соответствующих восьми байт шины данных микропроцессора Pentium. .
6. Входной сигнал на выводе BRDY (burst ready) указывает микропроцессору Pentium, что внешняя система направила данные на шину или получила их с выводов шины данных. Этот сигнал используется для введения тактов ожидания в циклы шины микропроцессора Pentium.
8. 18,5 нс.
10. Т2.
12. Микропроцессор Pentium содержит два раздельных блока кэш-памяти по 8 Кбайт: один для данных, другой для команд.
14. Да, если они не зависят друг от друга.
16. Режим системного управления SMM (System Management Mode) — это специальный режим, предназначенный для системных функций высокого уровня, таких как: управление режимом электропитания и обеспечение безопасности. Доступ к режиму SMM осуществляется с помощью аппаратного прерывания, сигнал запроса которого подается на вывод SMI микропроцессора Pentium.
18. С адреса 38000Н.
20. Эта команда сравнивает 8-байтныс данные содержимого регистров EDX:EAX с приемником, т. е. 8-байтной переменной, находящейся в памяти.
22. ID. VIF и VIP.
24. Микропроцессоры Pentium и Pentium Pro получают доступ к страницам размером 4 Мбайта посредством использования каталога страниц для запоминания базового адреса физической страницы памяти, вместо адреса таблицы страниц, как это было в процессорах 80386 и 80486.
26. Микропроцессоры Pentium и Pentium Pro имеют различные размеры шины адреса (32 разряда в микропроцессоре Pentium против 36 в Pentium Pro), в систему команд Pentium Pro добавлены новые команды FCMOV и CMOV, и микропроцессор Pentium Pro имеет встроенную кэш-память второго уровня размером 256 или 512 Кбайт в зависимости от версии.
28. 33 линии адреса: А35—АЗ.
30. По существу, время доступа одинаково для обоих микропроцессоров, если они работают с одной и той же тактовой частотой шины.
32. 72-битная SDRAM, именуемая иначе ЕСС SDRAM.
Глава 19
2. 512 Кбайт, 1 Мбайт и 2 Мбайта.
4. Кэш-память второго уровня микропроцессора Pentium Pro выполнена на одном кристалле с процессором, тогда как кэш-память второго уровня микропроцессора Pentium II представляет собой отдельные микросхемы, устанавливаемые на печатной плате, на которой размещается и процессор Pentium II. Печатная плата с кэш-памятью и процессором установлена в специальный картридж.
6. 64 Гбайта.
8. 242 вывода.
Ответы на контрольные вопросы с четными номерами 1311
10. Выводы чтения и записи заменены выводами запроса команды, используемым контроллером шины для запроса операции чтения или записи. В отличие от прежних версий микропроцессора, которые сами формировали сигналы чтения и записи информации, микропроцессор Pentium II получает эти команды от контроллера внешней шины.
12. 8 нс.
14. SYSENTER_CS, SYSENTER.SS и SYSENTER.ESP.
16. Номер MSR-регистра должен быть записан в регистр ЕСХ, после этого можно применять команду чтения rdmsr или записи wrmsr. Например, после выполнения команды rdmsr пара регистров EDX:EAX будет хранить содержимое MSR-регистра.
18. TEST PROC NEAR.
CPUID.
TEST EDX,800H ; проверить 11-й бит.
.IF ZERO?.
CLC.
.ELSE.
STC.
.ENDIF.
RET.
TESTS ENDP.
20. По команде SYSEXIT адрес возврата извлекается, размещается в регистре EDX, а затем сохраняется в регистре EIP.
22. Команда SYSEXIT возвращает управление обратно на кольцо защиты, относящееся к приложениям с уровнем привилегии равным 3.
24. Pentium Pro.
Предметный указатель
А	Е
AMD 40 ANSI 381 ASCII 31, 72 0 вывод 318 0 расширенный код 312 0 строка ASCIIZ 347	ЕСС 484 EDO DRAM 461, 506 EEPROM 52, 445, 448 EGA 320 EPROM 448 0 программатор 52 0 типа 2716 448
В	E
BCD-числа 31, 74, 585 BIOS 51, 448, 855 BIST 1032, 1056	Г FAR 277 FAR PTR 260 FAT 342
С	0 с длинными именами файлов 346 FCB 345
Celeron 45, 46 CGA 320 CISC 38, 46 Chip set 690 СОМ-порт 604 CPS 524 CPU 40, 59	FCC 561 Flip-chip 46 Frame 600 G GAL 471 GDT 108, 636
D	GPIB 567 GUI 39
DAC 754 DEC 48 DIMM 461 DMA 409 DOS 50, 51 DPMI 57, 286 6 функции 1171 DRAM 445, 457 0 типа 41256 460 0 типа TMS4464 457 0 контроллер типа 82С08 507 DR-DOS 37	H HD44780 548 HDD 744 HMA 52 1 IBM 33 IBM PC 49
Предметный указатель
1313
IBM PC/AT 49 IBM PC/XT 49 iCOMP 43 IDT 635 IEEE-488 567 ISA 49 ISP 690	PLD 471 PnP 847, 852 POST 55 PPI 538 PROM 448 0 типа TBP28L42 469 PSP 171, 360, 1147
L	R
Laptop 958 LCD 547 LSB 588	RAM 52 RAMBUS 46, 461 RIMM 461 RISC 46
M	RLL 54 RMM 448
MCA 49 MFC 382 MFM 54 MIPS 38, 424 MMU 945 MMX 42, 43, 399, 811 0 команды 811, 814 D арифметические 812 D логические 813 D передачи 813 D преобразования 813 D сдвига 813 D сравнения 812 0 типы данных 811 MOSFET 404 MSB 589 MS-DOS 51 MSW 949	ROM 52, 445, 447 ROM BIOS 55 RPG 35 RPL 105, 106 s SDRAM 46, 461, 507 SIMM 460 SRAM 445 0 типа 4016 451, 452 0 типа 62256 456 т TLB 111 ТРА 49, 51, 53 TSR 53 TSS 632
N
Notebook 958 null-строка 293	u UART 599
0	UART 16550 669 UMA 49, 53 UMB 57, 59
OverDrive 40	Unicode 72
P	USB 50
 PALASM 472 PATH 59 PC-DOS 51 PGA 956 PIC 655 PLA 471	V VCPI 57, 286 VESA 829, 845 VGA 39, 320 Visual C/C++ 396 VL-bus 50
1314
Предметный указатель
W
WorkBench 297
WYSIWYG 39
X
XMS49
А
Абака 32
Адрес:
О базовый 104
0 дешифрирование 463
0 конечный 98
0 корневой 1013
0 линейный 109, 110
О переменный 517
О порта ввода-вывода 55, 184
О реального режима 97
0 сегментный 97
0 системы ввода-вывода 55
0 смещение 97, 172
0 физический 109
0 фиксированный 517
Адресация:
О данных 117
° базово-индексная 131
а базово-индексная с масштабированием 139, 163
° базово-индексная со смешением 136
п в защищенном режиме 103
° в реальном режиме 97
° в стеке 146
° косвенная 128
° косвенная сс? смещением 134
° непосредственная 122
° прямая 125
° регистровая 121
0 инструкций 143
° косвенная 144
° относительная 144
° прямая 143
О конвейерная 963
Аналитическая машина 32
Аналого-цифровой преобразователь (АЦП) 612
0 ADC0804 615, 836
Арбитр шины 715, 717
0 8289 714,717
° организация 717
° принцип работы 720
° схемы обслуживания приоритетов 724
Арифметика двоично-десятичная 228
Арифметический сопроцессор 763, 769
0 BCD 766
0 вычислительное устройство (NEU) 770
0 регистр состояния 771
° коды условий 772, 773
0 регистр тегов 776
О регистр управления 774
0 регистры стека 770
О совместимость 763
0 устройство управления (CU) 770
0 форматные преобразования 767
Ассемблер 156, 189, 297
0 MASM 124
0 TASM 124
0 встроенный 381
° правила использования 382
О использование с С/С++
° в 16-битных приложениях 381
° в 32-битных приложениях 390
0 условная трансляция 304
Атрибут:
0 extern 395
0 FAR 279, 280
0 NEAR 279, 280
0 USE16 199
0 USE32 199
Б
Базовая система ввода-вывода (BIOS) 51, 448, 855
0 видеофункции 319
О системная область 1158
Предметный указатель
1315
Байт 75
О прав доступа 105
Банк памяти 487
Безразличное состояние 464
Библиотеки 300
О создание 300
Билл Гейтс 37
Бит 36
О выбора таблицы дескрипторов TI 105
О гранулярности 104
О скрытый 80
Блок:
О _asm 382
0 предсказания переходов 42
0 страничной трансляции адресов 981
О управления памятью (MMU) 981
О управления файлом 345
Бод 599
Буфер:
О ассоциативной трансляции TLB 111
О предвыборки 38
О типа FIFO 571, 649
Бэббидж 32
В
В вод-вывод:
О изолированный 518
О отображаемый в памяти 518
Вентили 983
Вентильная матричная логика ВМЛ (GAL)
471
Видеоадаптер:
О CGA54
О EGA 54
О VGA 54
Видеопамять 53
Винчестер 744
О автоматическая парковка головок 745
О зона парковки 745
О интерфейс АТА 749
О интерфейс ESDI 748
О интерфейс IDE 749
О интерфейс SCSI 748
О интерфейс ST506/412 747
О привод с подвижной катушкой 745
О привод с шаговым двигателем 745
О привод со "звуковой катушкой" 745
Виртуальная память 950
Вычислительная машина:
О ENIAC34
О UNIVAC 35
О Z3 33
О Колосс 34
О на электронных лампах 33
О Энигма 34
Вычитание 215
0 с заемом 218
Г
Генератор кварцевый 412
Генератор/детектор четности типа 74AS280 481
Глобальная таблица дескрипторов (GDT) 108, 636, 987
Горячая клавиша 364, 371, 378
д
Дальний переход 143
Данные шестнадцатеричные:
О ввод 333
О вывод 335
Двигатель шаговый 553
Двойное слово 60
Действительные числа 766
Декремент 215, 217
Деление 223
О инструкция AAD 230
О остаток 224, 225, 226
О переполнение 281
О сдвиг вправо 240
Дескриптор 103, 282, 981
О адрес 283
О базовый адрес 104
О бит гранулярности 104, 982
О глобальный 103
О локальный 103
О нуль-дескриптор 987
О предел сегмента 104
О приложения 103
О сегмента кода и данных 984
О системный 103
О системных сегментов 986
О таблица 103, 105
Дешифратор:
О линейный 465
О на логическом элементе И-НЕ 463
О на ППЗУ (PROM) 469
О одноступенчатый 465
О типа 74LS138 465
О типа 74LS139 468
Динамическая память:
О модули DIMM 461
О модули SIMM 460
1316
Предметный указатель
Директива 190
0 .286 190
О .286Р 190
О .287 190
О .386 140, 161, 190, 394
О 386Р 190
О .387 190
О .486 140, 190
О .486Р 190
О .586 140, 190
О .586Р 190
О .80187 769
О .80287 769
О .80387 769
О .80487 769
О .80587 769
О .8087 769
О .BREAK 270
О CODE 124
О CONTINUE 270
О .DATA 127, 192
О ELSE 266
О ELSEIF 266
О .ENDIF 266
О .ENDW 269
О .EXIT 190, 196, 267, 319
О 1F 266-268
О LISTALL 195, 267
О .MODEL 124, 140, 150, 190, 394, 1114
О REPEAT 272
О .STACK 171, 191
О .STARTUP 124, 190, 196, 267
О .UNTIL 272
О UNTILCXZ 273
О WHILE 269
О @DATA 196
О ALIGN 193
О ALIGN 2 190
О ASSUME 190, 194
О BYTE 72, 190
О BYTE PTR 129, 165
О DB 72, 76, 188, 190
О DD 79, 81, 174, 190, 765, 768, 769
О DQ 81, 190, 765, 768, 769
О DT 190, 766, 768, 769
О DUP 190, 193
О DW 77, 190, 765
О DWORD 79, 190
О DWORD PTR 129
О ELSE 310
О END 124, 191
О ENDIF 304, 310
О ENDM 191, 302
О ENDP 191, 194, 274
О ENDS 191, 192, 197
О EQU 191, 193
О EXTRN 257, 298
О FAR 191
О FAR PTR 257
О FOR 309
О IF 304, 310
О INCLUDE 304
О LOCAL 303
О MACRO 191, 302
О NEAR 191
О OFFSET 130, 172, 191
О ORG 191, 194
О PROC 191, 194, 274, 280
О PTR 191
О PUBLIC 298, 299, 394
О REAL10 81, 769
О REAL4 81, 769
О REAL8 81, 769
О REPEAT 307
О SEGMENT 191, 192, 197, 984
О SHORT 255
О STRUC 140, 191
О USE16 191
О USE32 191
О USES 191
О WHILE 308
О WORD 77, 191
О WORD PTR 129, 165
Диск:
О несъемный 744
О фиксированный 744
О флоптический (floptical) 744
Дискета 738
О 3,5" 742
О 5,25" 739
О двусторонняя 739
О двусторонняя с высокой плотностью записи 740, 743
О двусторонняя с двойной плотностью записи 739, 743
О двусторонняя со сверхвысокой плотностью записи 744
О индексное отверстие 738
О микро 738, 742
О мини 738, 739
Длинное целое 765
Дорожка 342
Драйвер 52, 57
О ANSI.SYS58
О EMM386.EXE 52, 55, 57, 59, 1011
О HIMEM.SYS 52, 57, 99, 286
О MOUSE.SYS 52, 58
О PRINT.SYS 58
Предметный указатель
1317
О SETVER.EXE 58
О SONY.CDU.SYS 58
Дребезг контактов 526
О устранение 558
Ж
Жаккар 33
Жидкокристаллический дисплей (ЖКД) 547
3
Загрузочная запись 342, 343
Загрузочный сектор 342
Запрашиваемый уровень привилегий 106
Запуск холодный 477
Защищенный режим, переход в режим 992
Знаковое расширение 159
ЗУ масочное 448
И
Импульс:
О коэффициент заполнения 408
0 скважность 408
Индикатор:
0 DMC20481 547
О жидкокристаллический (ЖКИ) 547
0 на светодиоде 528
0 светодиодный 543
О семисегментный 336
Инкремент 212
Инструкции:
0 арифметические 208
° сложения 209
° строковые 245
0 возврата из прерывания 283
0 вызова прерываний 282
0 логические 232
0 передачи данных 156
° строковые 175
0 передачи управления 253, 275, 279
0 управления 286
0 условной установки 264
Интерфейс:
О Centronics 524, 860
0 DPMI 1171
О JTAG 1045, 1093
0 ввода-вы вода 516
° элементарный 521
Интегральная схема (ИС) 465
Исключение 281, 288
Источник 118
К
Кадр 600
Калькулятор:
0 Бомара 33
0 Монро 33
Каталог:
0 имена 346
0 корневой 346
Квитирование 524
Килби 34
Клавиша 53
Кластер 344
Ключевое слово THIS 193
Код:
0 ASCII 72
0 Unicode 971
О дополнительный 70
О инверсный 70
О коррекции ошибок ЕСС 1077, 1096
О машинный 125, 157, 256
О операции 158
° бит направления 158
° бит размерности 158
° поле MOD 159
° поле R/M 158
° поле REG 158
О семисегментный 184, 336
Команда:
О ААА229
0 AAD 229, 230
0 ААМ 229, 230, 330
0 AAS 229, 232
О ADC 209, 214
0 ADD 209
О AND 232
0 ARPL 949, 950
О BOUND 288, 632, 633
0 BSF244
0 BSR244
0 BSWAP 187
О ВТ 239
0 ВТС239
0 BTR239
0 BTS239
О CALL 143, 274, 275, 277
0 CBW224
0 CDQ226
0 CLC287
О CLD 95, 175
О CLI 95, 284
0 CLTS949
О СМС 287
О CMOV 187
1318
Предметный указатель
Команда (прод.):	0	FISTP 777, 798
0 СМР 219,238	0	FISUB 799
0 CMPS 246	0	FISUBR 799
0 CMPSB246	0	FLD 777, 778, 793
0 CMPSD 246	0	FLD1 784, 793
0 CMPSW246	0	FLDCW 775, 785, 794
0 CMPXCHG 220	0	FLDENV 786, 795
0 CMPXCHG8B 220, 1060	0	FLDL2E 784, 794
0 COM IP 790	0	FLDL2T 784, 794
0 CPUID 96, 1061, 1099, 1109	0	FLDLG2 784, 794
0 CV 198	0	FLDLN2 784, 794
0 CWD 226	0	FLDPI 784, 793
0 DAA 94, 228	0	FLDZ 784, 793
0 DAS 94, 228, 229	0	FMOV 763
0 DEC 215, 217	0	FMUL 795
0 DIV 223	0	FMULP 795
0 EMMS 814, 822	0	FNCLEX 785, 789
0 ENTER 289	0	FNDISI 791
0 ESC 288, 632	0	FNENI 792
0 F2XM1 783, 788	0	FNINIT 785, 792
0 FABS 781.788	0	FNOP 786, 795
0 FADD 779, 789	0	FNSAVE 785, 797
0 FADDP789	0	FNSTCW 785, 798
0 FBLD ТП, 778, 793	0	FNSTENV 785, 799
0 FBSTP П1, 798	0	FNSTSW 799
0 FCHS782	0	FNSTSW AX 785
0 FCLEX 785, 789	0	FPATAN 783, 795
0 FCMOVcc 790	0	FPREM 781, 796
0 FCMOVcc 778	0	FPREM1 781, 796
0 FCOM 782, 789	0	FPTAN 783, 796
0 FCOMI 763, 790	0	FRNDINT 781, 796
0 FCOMP 782, 789	0	FRSTOR 785, 796
0 FCOMPP 782, 789	0	FSAVE 785, 797
0 FCOS 783, 790	0	FSCALE 781, 797
0 FDECSTP 786, 791	0	FSETPM 785, 797
0 FDISI791	0	FSIN 783, 797
0 FDIV 791	0	FS1NCOS 783, 797
0 FDIVP 791	0	FSQRT 781, 798
0 FDIVR 791	0	FST 777, 798
0 FDIVRP791	0	FSTCW 785, 798
0 FEN I 792	0	FSTENV 785, 799
0 FFREE 786, 792	0	FSTP 777, 798
0 FIADD 789	0	FSTSW 771, 799
0 FICOM 782, 789	0	FSTSW AX 785
0 F1COMP 782, 789	0	FSUB 799
0 FIDIV 791	0	FSUBP 799
0 FIDIVR 791	0	FSUBR 799
0 FILD 777, 778, 793	0	FSUBRP 799
0 F1MUL795	0	FTST 782, 800
0 FINCST786	0	FUCOM 800
0 FINCSTP792	0	FUCOMI 790
0 FINIT 785, 792	0	FUCOMIP 790
0 FIST 777, 798	0	FUCOMP 800
Предметный указатель
1319
0	FUCOMPP 800	0	LOOPEW 266
0	FWAIT 771, 786, 800	0	LOOPNE 266
0	FXAM 782, 800	0	LOOPNED 266
0	FXCH 777, 801	0	LOOPNEW 266
0	FXL2XP1 801	0	LOOPNZ 266
0	FXTRACT 781, 801	0	LOOPZ 266
0	FYL2X 783, 801	0	LSL 949, 950
0	FYL2XP1 784	0	LSS 173
0	HLT 287	0	LTR 949, 990
0	IDIV 223	0	MOV 117, 118, 157
0	IMUL 221	0	MOVED 813, 814
0	IN 184, 516	0	MOVEQ 813-815
0	INC 212	0	MOVS 179
0	INS 180	0	MOVSX 186, 224
0	INSB 181	0	MOVZX 186, 224
0	INSD 181	0	MUL 221
0	INSW 181	0	NEG 239, 240
0	INT 282, 283	0	NOP 288
0	INT 1AH 855	0	NOT 239, 240
0	INT 3 282-284, 630, 634	0	OR 234
0	INT n 634	0	OUT 184, 516
0	INTO 282, 284, 632, 634	0	OUTS 181
0	IRET 283, 284, 630, 634, 644	0	PACKSS 813
0	IRETD 284, 630, 634, 644	0	PACKSSDW 815
0	JA 263	0	PACKSSWB 815
0	JAE 263	0	PACKUS 813
0	JB 263	0	PACKUSWB 816
0	JBE263	0	PADD 812, 816
0	JCXZ 263	0	PADDB 812, 822
0	JE 263	0	PADDD 812
0	JECXZ 263	0	PADDS 816
0	JG 263	0	PADDUS 816
0	JGE 263	0	PADDW812, 822
0	JL 263	0	PAND 813, 817, 822
0	JLE 263	0	PANDN 813, 817
0	JMP 143,253	0	PCMPEQ 812
0	JNE 263	0	PCMPEQU 817
0	LAHF 183	0	PCMPEQUB 812
0	LAR 949	0	PCMPEQUD 813
0	LDGT 949	0	PCMPEQUW812
0	LDS 173	0	PCMPGT812, 817
0	LEA 171, 172	0	PMADD 818
0	LEAVE 289	0	PMADDWD 812
0	LES 173	0	PMULH 818
0	LFS 173	0	PMULHW812
0	LGDT 987	0	PMULL 818
0	LGS 173	0	PMULLW 812
0	LIDT 949, 987	0	POP 146, 166, 168, 382
0	LLDT 949, 987	0	POPA 148, 166, 168
0	LMSW 949	0	POPAD 167
0	LODS 176	0	POPF 168
0	LOOP 264	0	POPFD 168
0	LOOPE 266	0	POR 813, 818
0	LOOPED 266	0	PSLL 813, 819
1320
Предметный указатель
Команда (прод.)-.	0 WRMSR 1063
0 PSRA 813,819	0 XADD 215
0 PSRL813, 819	0 XCHG 182
0 PSUB 812, 820	0 XLAT 183, 336
0 PSUBB 812	0 XOR 236
0 PSUBD812	0 префикс повторения REP 178
0 PSUBS 820	Командное слово 588
0 PSUBUS 820	Командный процессор 52
0 PSUBW 812	Команды:
0 PUNPCHL 821	0 ХММ 1260
0 PUNPCKH 813, 821	0 передачи данных
0 PUNPCKL813	° дополнительные 182
0 PUSH 146, 166, 382	0 полный перечень 1192
0 PUSHA 148, 166	0 сопроцессора 776
0 PUSHAD 167	Комбинация клавиш 72
0 PUSHF 166, 283	0 <Ctrl>+<C> 267
0 PXOR813, 821	Компакт-диск:
0 RCL 244	0 CD-ROM 738, 749
0 RCR 244	0 CD-RW 749
0 RDMSR 1063	0 DVD 738, 751
0 RDTSC 1062	0 WORM (CD-R) 738, 749
0 RET 146, 274, 279, 284	Компоновщик 297, 298
0 ROL 244	Компьютер Альтаир 37
0 ROR 244	Конвейер 963
0 RSM 1064	Контроллер встроенный 875
0 SAHF 183	Корневой каталог 342, 343
0 SAL 241	Короткое целое 765
0 SAR 241,949	Корпус:
0 SBB 216, 218	0 DIP 403, 600
0 SCAS 245	0 LCC 880
0 SCASB 245, 263	0 PGA 881, 956
0 SCASD 245	0 PLCC 600
0 SCASW 245	Курсор, позиционирование 320
0 SET 59	Кэш-память 42, 963, 965
0 SGDT949	0 второго уровня (L2) 45, 965
0 SHL241	0 кэш-попадание 1027
0 SHLD 242	0 кэш-промах 1027
0 SHR 241	0 метод сквозной записи 1027
0 SHRD 242	0 первого уровня (L1) 45, 965
0 SIDT949	0 третьего уровня (L3) 47
0 SLDT949	
0 SMSW949	п
0 STC 287	Л 1
0 STD 95, 175	Листинг 125
0 STI 95, 284	Логика RTL 34
0 STOS 177	Локальная сеть 876
0 SUB 215	Локальная таблица дескрипторов (LDT) 108,
0 SYSENTER 1100	987
0 SYSEXIT 1101	
0 TEST 238	
0 VERR 949, 950	м
0 VERW 949, 950	Магнитная запись: 0 кластер 746
0 WAIT 287, 632, 882	
Предметный указатель
1321
Макрокоманда 302
Макроопределение 302
Мантисса 79, 80
Массив 211
Меандр 591, 878
Метка 144, 255
О внешняя 257
О глобальная 257
О дальняя 257
О локальная 303
Метод:
О записи:
° модифицированная частотная модуляция (MFM) 739
° модифицированная частотная модуляция (MFM) 741,746
° с ограничением длины поля записи (RLL) 746, 747
° частотная модуляция (FM) 740 0 квантования времени 1009 О кодирования NRZI 865 Механизм виртуальной памяти 950 Микропроцессор (МП) 34, 36, 59 О 80186/80188
° Архитектура 875
° Блок выбора кристалла 879, 914
° Блок управления периферией (РСВ) 891
° Блок управления регенерацией 880
° Блок шинного интерфейса (BIU) 876
° Блок-схема 875
° Версии 875
° Временные параметры 885
° Генератор тактовых импульсов 877
° Контроллер DMA 911
° Контроллер прерываний 894
° Операционный блок (EU) 876
° Описание выводов 881
° Прерывания 893
° Программирование 891
° Программируемый блок DMA 879
° Программируемый контроллер прерываний 878
° Таймеры 878, 902 0 80286 38, 945
° Система команд 948
0 80386 39, 956
° регистры отладки и тестирования 978
° система ввода-вывода 970
° управление памятью 981
° управляющие регистры 977 0 80486 40,1016
° кэш 1027
° назначение сигналов и выводов 1018
° система памяти 1025
° тестовые регистры кэш 1030
° управление памятью 1030
0 80486DX2 40
0 80486DX4 40
0 8086/8088 38
° максимальный режим работы 404
° минимальный режим работы 404
° назначение выводов 406
0 i4004 34, 36
0 i4040 36
0 i8008 36
0 i8080 36, 37
0 i8085 37, 38
0 Celeron 45, 46
0 Itanium 47
0 Itanium 2 47
0 МС6800 36
0 Merced 46
0 Pentium 42, 1038
° SMRAM 1058
° буфер адресов переходов (ВТВ) 1052
° дамп записи 1058
° назначение выводов 1040
° ОЗУ системного управления 1058
° регистры 1053
° синхронизация системы 1049
° система ввода-вывода 1048
° система памяти 1046
° суперскалярная архитектура 1053
° счетчик тактов процессора TSC 1062
° управление памятью 1056
0 Pentium 4 46, 1105
° гиперконвейерная технология 1109
° набор регистров 1107
0 Pentium II 45, 1085
° назначение выводов 1088
° система памяти 1095
0 Pentium II Хеоп 1087
0 Pentium III 46, 1103
° системная шина 1103
° чипсеты 1103
0 Pentium OverDrive 42, 1038
0 Pentium Pro 43, 45, 1065
° назначение выводов 1069
° синхронизация системы 1077
° система ввода-вывода 1077
° система памяти 1075
° структура 1065
° схема обнаружения и коррекции ошибок ЕСС 1077
° управляющий регистр CR4 1079
0 Pentium Хеоп 45
0 Z-80 38
0 Блок управления памятью (MMU) 945
0 буфер процесса трансляции адреса (TLB) 980
1322
Предметный указатель
Микропроцессор (МП) (прод.)\
О защищенный режим 103
0 линейный адрес 978
0 максимальный режим работы 435
0 минимальный режим работы 435
0 параллельный 717
0 программная модель 90
° регистры 92
0 распределенный 717
0 реальный режим работы 97
0 режим виртуального 8086 1009
0 сокет 688
0 суперскалярный 42
0 тестовый порт (ТАР) 1045
0 ядро 42
Микросхема 34
0 16550 669
0 74LS138 465
0 74LS139 468
0 8237 690
0 8253 585
0 8254 585
0 8255А538
0 8255А-5 538
0 8259А655
0 8279 571
0 8284 411
0 8288 8288 404, 410, 435, 438, 464, 476
О 8289 714, 717
О 82С55 538
О 82С55 647
О ADC0804 615, 836
О DAC0830 612
О PAL16L8 471
Модельно-специфические регистры 1063
Модем 601
Модульное программирование 312
Модуляция длительности импульса 595
Монитор 751
О CGA752
О EGA 755
О RGB 752
О VGA 755
О аналоговый RGB-монитор 754
О монохромный 752
0 мультичастотный 759
О пиксел 756, 757
О с прогрессивной (построчной) разверткой 759
О с чересстрочной разверткой 759
О строка растра 757
О цветной 752
О цифровой или ТТЛ (TTL) 752
Мультимедийное расширение системы команд (ММХ) 763
Мультиплексор 458
Мышь:
О определение типа 324
0 определение версии драйвера 324
0 проверка наличия драйвера 323
0 функции драйвера 323, 1160
н
Накопитель на жестких магнитных дисках (НЖМД) 744
Накопитель:
О CD-ROM 52
О DVD 50, 52
Начальный загрузчик 343
Номер порта 517
О
Обработчик прерывания 634
Обратная запись слов 75
Обратный порядок байтов 77
Обслуживание устройств:
О по прерыванию 629
О по программе 564
О с опросом 564
Объектный модуль 297
ОЗУ 52, 444
О динамическое 445
О статическое 445
Операнды 118, 121
О непосредственные 123
О размерность 60, 121
О регистровые 121
Операционная система 56
О DOS 50, 51
° системная область 1158
° функции 1120
О DR-DOS37
О MS-DOS 51
О PC-DOS 51
О реального времени (RTOS) 925
Опрос 524
Осциллятор 412
Отладчик CodeView 131, 198, 383
Ошибка памяти 481
О двойная 484
О исправление 483
О одинарная 483
Предметный указатель
1323
п
Пакетный цикл 1027
Память:
О ЕСС 484
О EMS54
О ТРА50
О банк 487
О блоки верхней памяти (UMB) 981
О верхняя 49, 53
О высокая (НМА) 52, 57, 99
О динамическая 457, 504
° регенерация 457
О дополнительная 54
О логическая страница 1010
О окно 54
О отображаемая 54
О расслоение 965
О расширенная 49, 981
О реальная 49
О с двукратным чередованием адресов 965
О с чередованием адресов 965
О системная область 53
О стандартная 49, 50
О статическая 451
О страничное управление 1010
О физическая страница 1011
О энергозависимая 451
Параграф 98
Паскаль 32
Перекрестные ссылки 297
Переход:
О безусловный 254
° ближний 254, 256
° дальний 254, 257
° короткий 254, 255
О в соответствии с содержимым регистра 258
О внутрисегментный 254
О дважды косвенный 145, 260
О косвенно-косвенный 145
О косвенный 258
О межсегментный 254
О относительный 256
О по содержимому памяти 260
О условный 261
ПЗУ 52, 444, 445, 447
О масочное 448
О энергонезависимые 448
Пиксел 39
Плата:
О материнская 829
О системная 829
Подпрограмма 274, 291
Помехоустойчивость 405
Порт 517
О AGP 829, 870
О ЕСР 860
О ЕРР860
О LPT859
О SPP859
О ввода-вывода 518
° дешифрирование адреса 530
° номер 517
О номер 55
О стандартный параллельный 859
Порядок числа 79
Посылка 600
ППЗУ 448
Права доступа 103
Преобразование:
О байта в слово 224
О в семисегментный код 336
О двоичного числа:
° в BCD 230
° в строку ASCII-символов 329
О двойного слова в 8-байтное слово 226
О действительного числа в десятичное 768
О десятичного числа 67
° в действительное 767
° дробной части 68
° целой части 67
О слова в двойное слово 225
О строки ASCII-символов в двоичное число 332
О табличное 336
Прерывание 281, 628
О аппаратное 641
° маскируемое 641, 644
° немаскируемое 641
О в защищенном режиме 635
° IDTR 635
° таблица дескрипторов прерываний (IDT) 635
О в реальном режиме 634
О вектор 281, 630
О вложенное 644
О внешнее 281, 284
О внутреннее 281
О назначение 628
О начальный адрес процедуры обслуживания 630
О немаскируемое 483
О обработка 364
О от UART 16550 669
О перехват 364, 640
О программное 281
1324
Предметный указатель
Прерывание (прод.)\
О процедура обработки 284
О расширение системы прерываний 650
0 система с последовательным опросом устройств 652
0 таблица векторов прерываний 630
Префикс:
О LOCK 288
0 REP 181, 204
О REPE 246
О REPNE 245, 246
О модификации 157
° размерности адреса 158
° размерности регистра 158
0 переназначения сегмента 189
О программного сегмента 171, 360, 1147
Приемник 118
Проверка бит 238
Программа:
О COMMAND.COM 52
О PALASM 472
О REGEDIT.EXE 52
О SYS.COM 53
О библиотекарь 300
О пошаговый режим работы 636
О резидентная 53, 365, 366, 378
О транслятор ML 297
О трассировка 638
Программатор 52
Программируемая логическая матрица
(ПЛМ) 471
Программируемая матричная логика (ПМЛ) 471
О типа PAL16L8 471
Программируемое логическое устройство (ПЛУ) 471
Программируемый интервальный таймер 8253 585
Программируемый интервальный таймер 8254 585
О командное слово 588
О описание 585
О программирование 588
О режимы работы 589
О управление двигателем постоянного тока 595
Программируемый интерфейс 8279 571
О описание 572
О подключение 6-разрядного дисплея 582
О подключение к МП 8088 574
0 подключение клавиатуры 576
0 программирование 576
Программируемый контроллер DMA 8237
690
0 внутренние регистры 694
0 назначение выводов 692
0 подключение к микропроцессору 703
0 программирование 700
Программируемый контроллер прерываний 8259А 655
0 ведомый 655
0 ведущий 655
0 инициализация 666
0 каскадное подключение 658
0 командные слова инициализации 658
0 командные слова операций 658, 662
0 назначение выводов 655
0 подключение одного контроллера 657
0 программирование 658, 666
0 регистры состояния 665
Программируемый периферийный интерфейс (ППИ) 538, 647
0 8255А538
0 82С55 538, 647
0 описание 539
0 подключение индикатора 547
0 подключение клавиатуры 556, 680
0 подключение шагового двигателя 553
0 программирование 541
0 режим 0 543
0 режим 1 561
0 режим 2 567
Процедура 274, 291
0 FAR 274
0 NEAR 274
0 ближняя 274
0 глобальная 195
0 локальная 195
Прямой доступ к памяти (DMA) 687
0 контроллер 8237 690
0 операция чтения 689
Прямой порядок байтов 77, 79
Псевдооператоры 190
р
Расширение:
0 СОМ 297
0 CRF297
0 EXE 297
0 INC 304
0 LST297
0 МАС 304
0 данных:
° знаковое 186
° нулями 186
Регенерация памяти, скрытая 504
Предметный указатель
1325
Регистр:
О 8-битный 92
О 16-битный 92
О 32-битный 92
О ММХ811
О ХММ 1260
О глобальной таблицы дескрипторов (GDTR) 108, 987
О задач (TR) 109, 990
О локальной таблицы дескрипторов (LDTR) 108, 987
О общего назначения 92
° аккумулятор 92
° данных 93
° счетчик 92
° указатель базы 92, 93
° указатель источника 93
° указатель приемника 93
О программно-доступный 91
0 программно-недоступный 91, 108
О расширенный 92
О сегментный 96, 99
° данных 96
° дополнительный 97
° дополнительных данных 97
° кода 96
° стека 97
О специализированный 93
° указатель инструкции 93
° указатель стека 93
О состояния машины (MSW) 949, 977
О страниц DMA 690, 706
О таблицы дескрипторов прерываний (IDTR) 108, 987
О управляющий 109
О флагов 94
° поле IOPL 992
Регистровая пара 99
Режим:
О 16-битных инструкций 105
О 32-битных инструкций 105
О системного управления SMM 1058
РПЗУ-УФ 448
О программатор 448
РПЗУ-ЭС 448
С
Сдвиг 240
О арифметический 240
О логический 240
О циклический 243
Сегмент:
О данных 129
0 полное определение 192, 197, 200
О состояния задачи (TSS) 971, 990
° карта разрешения ввода-вывода 990
0 стека 129
Сектор 342
Селектор 103, 981
0 бит индикатора таблицы (TI) 982, 987
0 запрашиваемый уровень привилегий
(бит L) 987
Сигнал:
0 активный 63
0 инверсный 63
Синхрогенератор 8284А 411
0 назначение выводов 411
0 функционирование 414
Система:
0 ввода-вывода 55
0 многозадачная 714
0 многопоточная 940
0 многопроцессорная 714
0 мультипроцессорная 714
Система связи:
0 дуплексная 600
0 полудуплексная 600
0 симплексная 600
Система счисления 64
0 вес числа 65
0 восьмеричная 65
0 двоичная 64
0 десятичная 64
0 десятичная точка 65
0 основание системы 65
0 позиционная 65
0 распределенная 714
0 шестнадцатеричная 65
Система автоматизированного
проектирования (CAD) 751
Сканирование бит 244
Скан-код 313—315
0 чтение 376
Слово 60, 76
0 двойное 78
Сложение с переносом 214
Смещение в странице 110
Сортировка 357
Спецификация РпР 847
Способ магнитной записи без возврата к
нулю (NRZ) 740
Спулер печати 723, 726, 729
Сравнение 219
Стандарт IEEE-754 79
Старт:
0 горячий 477
0 холодный 477
1326
Предметный указатель
Стек 99
О инициализация 170
О инструкции 166
О кадр 289, 292
О косвенная адресация 131
О принцип LIFO 146
О сегментный регистр 97
О указатель 93, 129
Страничное преобразование 109
О каталог страниц 111
О механизм 109
О таблицы страниц 111
Структуры данных 140
Суперскалярная технология 42
Схема:
О интегральная (ИС) 465
О исправления и обнаружения ошибок
□ типа 74LS636 484
О обнаружения и коррекции ошибок (ЕСС) 1077
т
Таблица дескрипторов 103, 987
О глобальная (GDT) 987
О локальная (LDT) 108, 636, 987
О прерываний (IDT) 987
Таблица размещения файлов FAT 342
Таймер 585
О сторожевой 878
Текущий уровень привилегии задачи (CPL) 992
Тетрада 36, 69
Технология:
О EPIC 47
0 ММХ811
Точка останова 284, 630
Транзистор 34
Транзисторная пара Дарлингтона 529, 554
Триггер Шмитта 678
Тьюринг 33
У
Указатель инструкции 93, 99
Умножение 221
Универсальный асинхронный приемопередатчик (UART) 599
0 инициализация 604
О описание 600
О ошибка кадра (посылки) 612
О ошибка паритета 612
О ошибка переполнения 612
О передача данных 610
С прием данных 611
0 программирование 604
Уровень привилегий 95, 106
ф
Файл:
О AUTOEXEC.BAT 58
О COMMAND.COM 52, 343
0 CONFIG.SYS 56
0 IBMBIO.COM 52
0 IO.SYS 52, 343
0 MSDOS.SYS 343
0 SYSTEM.INI 52
О закрытие 350
0 запись данных 348
0 имена 345
О командный 59
О логический номер 345, 348
0 открытие 349
0 пакетный 59
О переименование 353
О прямой доступ 354
0 создание 347
0 удаление 353
О указатель 350
0 формата LST 125
0 формата EXE 127
0 чтение 350
0 шестнадцатеричный дамп 360
Фарадей 33
Фирма ADM 1016
Флаг:
0 вспомогательного переноса 94, 210, 217
0 знака 95, 210, 262
0 направления 95, 175, 245, 518
0 нуля 95, 210, 238, 244, 262, 774
0 паритета 94, 210, 262, 774
0 переноса 94, 209, 210, 213, 214, 217, 221, 232, 239, 243, 262, 287, 348, 774
0 переполнения 95, 210, 221, 232, 262, 284, 632
0 разрешения прерываний 95, 210, 283, 284, 636
0 трассировки 95, 210, 281, 283, 630, 636
0 уровня привилегий 95
Флоптический диск (floptical) 744
Флэш-память 445, 479
Функции:
0 BIOS
° вызов 1148
0 DOS 1120
Предметный указатель
1327
X
Холлерит 33
ц
Целое слово 765
Центральный процессор (ЦП) 59
Цикл шины 423
О записи 430
О такты 423
О такты ожидания 425, 431
О чтения 425
Циклический избыточный код (CRC) 869
Цилиндр 739
Цифроаналоговый преобразователь (ЦАП) 612, 754
0 DAC0830 612
0 лестничного типа R-2R 613
О разрешающая способность 613
Цузе 33
ч
Часы реального времени 677, 678, 908
Чипсет (chipset) 45, 690
Число:
0 беззнаковое 75
О двоично-десятичное (BCD) 74
О действительное 79
О знаковое 75
0 неупакованное 74
О с плавающей точкой 79
° двойной точности 79
° мантисса 79, 80
° одинарной точности 79
° порядок 79
° смещение 80
° смещенный порядок 80
0 упакованное 74, 763, 766
ш
Шаговый двигатель 745
Шина 48, 59, 61
О AGP 50, 870
0 EISA 49, 50, 830, 840
О ISA 50, 518, 521, 714, 829
О Micro Channel 717
О Multibus 717
О PCI 50, 521, 847
° конфигурационная память 852
° конфигурационное пространство 852
° мост 848
О USB 50, 829, 863
° NRZI-кодирование 865
° байт синхронизации (SYNC) 866
° идентификатор пакета (PID) 866
° конец пакета (ЕОР) 869
° поле Check 868
° стаффинг 866
° функция 864
° хост 864
О VESA 50
0 VLB 829, 845
О адреса 48, 61
О арбитр 715, 717
О внешняя 714
0 данных 62
О демультиплексирование 416
0 локальная 714, 715
0 мастер 715
0 общая (разделяемая) 714, 715
0 памяти 714
0 периферийных устройств 714
0 расширения 714
О системная 714
0 управления 63, 438
О "хозяин" шины 715
Шинный контроллер 8288 404, 410, 435, 438, 464, 476
0 назначение выводов 438
э
ЭВМ 33
Элемент каталога страниц 110
Элемент таблицы страниц 110
Элементы ЗУ
О выбор кристалла 447
0 выборка 447
О назначение выводов 445
0 разрешение выборки кристалла 447
О разрешение записи 447
О разрешение работы 447
О с байтовой организацией 446
Элементы памяти:
О динамические 457
О статические 451
Энергонезависимая память 448
1328
Предметный указатель
Я
Язык:
О Ada 35, 36
О Algol 35
О Basic 35
О C/C++ 35
О Cobol 35
О Flow-Matic 35
О Fortran 35
О Pascal 32, 35
О Visual Basic 35
О ассемблера 35
О высокого уровня 35
О машинный 35, 157