Текст
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