ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.12.2021

Просмотров: 12178

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

388

 Глава 5. Уровень архитектуры команд

программное обеспечение проходит цикл снова и снова до тех пор, пока данный
бит не примет значение 1. Это значит, что устройство готово принять символ. Как
только терминал приходит в состояние готовности, программное обеспечение за-
писывает символ в буферный регистр дисплея, который переносит символ на эк-
ран и дает сигнал устройству установить бит готовности в регистре состояния дис-
плея на 0. Когда символ уже отображен, а терминал готов к обработке следующего
символа, бит READY снова устанавливается на 1 контроллером.

В качестве примера программируемого ввода-вывода рассмотрим процедуру,

написанную на Java (листинг 5.5). Эта процедура вызывается с двумя парамет-
рами: массивом символов, который нужно вывести, и количеством символов, ко-
торые присутствуют в массиве (до 1 К). Тело процедуры представляет собой цикл,
который выводит по одному символу. Сначала центральный процессор должен
подождать, пока устройство будет готово, и только после этого он выводит символ,
и эта последовательность действий повторяется для каждого символа. Процедуры

in

 и

 out

 — это обычные процедуры языка ассемблера для чтения и записи регист-

ров устройств, которые определяются по первому параметру, из или в перемен-

ную, которая определяется по второму параметру. Деление на 128 убирает млад-
шие 7 битов, при этом бит READY остается в бите 0.

Листинг 5.5.

 Пример программируемого ввода-вывода

public static void output_buffer(int buf[]. int count) {

//Вывод блока данных на устройство

int status, i. ready;

for (i=0; i<count; i++) {

do {

status=in(display_status_reg); // получение информации

о состоянии устройства

ready=(status«7)&0x01: // выделение бита

готовности

} while (ready==l);

out(display_buffer_reg, buf[i]);

Основной недостаток программируемого ввода-вывода заключается в том, что

центральный процессор проводит большую часть времени в цикле, ожидая готовно-
сти устройства. Такой процесс называется

 активным ожиданием.

 Если центрально-

му процессору больше ничего не нужно делать (например, в стиральной машине),
в этом нет ничего страшного (хотя даже простому контроллеру часто нужно конт-
ролировать несколько параллельных процессов). Но если процессору нужно вы-
полнять еще какие-либо действия, например запускать другие программы, то ак-
тивное ожидание здесь не подходит, и нужно искать другие методы ввода-вывода.

Чтобы избавиться от активного ожидания, нужно, чтобы центральный процес-

сор запускал устройство ввода-вывода и указывал этому устройству, что необхо-
димо осуществить запрос на прерывание, когда оно завершит свою работу. Посмот-
рите на рис. 5.19. Установив бит разрешения прерываний в регистре устройства,
программное обеспечение сообщает, что аппаратное обеспечение будет передавать
сигнал о завершении работы устройства ввода-вывода. Подробнее мы рассмотрим
прерывания ниже в этой главе, когда перейдем к обсуждению передачи управления.


background image

Типы команд

389

Во многих компьютерах сигнал прерывания порождается путем логического

умножения (И) бита разрешения прерываний и бита готовности устройства. Если
программное обеспечение сначала разрешает прерывание (перед запуском устрой-
ства ввода-вывода), прерывание произойдет сразу же, поскольку бит готовности
будет равен 1. Таким образом, может понадобиться сначала запустить устройство,
а затем сразу после этого ввести прерывание. Запись байта в регистр состояния
устройства не изменяет бита готовности, который может только считываться.

Ввод-вывод с управлением по прерываниям — это большой шаг вперед по срав-

нению с программируемым вводом-выводом, но все же он далеко не совершенен.

Дело в том, что прерывание требуется для каждого передаваемого символа. Следо-
вательно, нужно каким-то образом избавиться от большинства прерываний.

Решение лежит в возвращении к программируемому вводу-выводу. Но только

эту работу должен выполнять кто-то другой. Посмотрите на рис. 5.20. Мы добави-
ли новую микросхему — контроллер

 прямого доступа к памяти (ПДП)

 с прямым

доступом к шине.

Терминал

О

о

Адрес

Счетчик \

Процессор \ \ ПДП

Память

100

32

Устройство

Направление

100

Шина

Рис. 5.20. Система с контроллером прямого доступа к памяти

Микросхема ПДП имеет по крайней мере 4 регистра. Все они могут загружать-

ся программным обеспечением, работающим на центральном процессоре. Первый
регистр содержит адрес памяти, который нужно считать или записать. Второй ре-

гистр содержит число, которое показывает количество передаваемых байтов или

слов. Третий регистр содержит номер устройства или адрес устройства ввода-вы-
вода, определяя, таким образом, какое именно

 устройство нам требуется.

 Четвер-

тый регистр сообщает, должны ли данные считываться с устройства или записы-
ваться на него.

Чтобы записать блок из 32 байтов из адреса памяти 100 на терминал (напри-

мер, устройство 4), центральный процессор записывает числа 32,100 и 4 в первые
три регистра ПДП и код записи (например, 1) в четвертый регистр, как показано


background image

3 9 0 Глава 5. Уровень архитектуры команд

на рис. 5.20. Контроллер ПДП, инициализированный таким способом, делает за-
прос на доступ к шине, чтобы считать байт 100 из памяти, точно так же как если бы
центральный процессор считывал этот байт. Получив нужный байт, контроллер
ПДП посылает устройству 4 запрос на ввод-вывод, чтобы записать на него байт.
После завершения этих двух операций контроллер ПДП увеличивает значение
регистра адреса на 1 и уменьшает значение регистра счетчика на 1. Если значение
счетчика больше 0, то следующий байт считывается из памяти и записывается на
устройство ввода-вывода.

Когда значение счетчика доходит до 0, контроллер ПДП останавливает переда-

чу данных и устанавливает линию прерывания на микросхеме процессора. При

наличии ПДП центральному процессору нужно только инициализировать несколь-
ко регистров. После этого центральный процессор может выполнять какую-либо

другую работу до тех пор, пока передача данных не завершится. При завершении
передачи данных центральный процессор получает сигнал прерывания от кон-
троллера ПДП. Некоторые контроллеры ПДП содержат два, три и более наборов
регистров, так что они могут управлять несколькими процессами передачи одно-
временно.

Отметим, что если какое-нибудь высокоскоростное устройство, например диск,

будет запускаться контроллером ПДП, то потребуется очень много циклов шины
и для обращений к памяти, и для обращений к устройству. Во время этих циклов
центральному процессору придется ждать (ПДП всегда имеет приоритет над цен-
тральным процессором на доступ к шине, поскольку устройства ввода-вывода обыч-
но не допускают задержек). Процесс отбирания контроллером ПДП циклов шины

у центрального процессора называется

 захватом цикла.

 Но выигрыш в том, что не

нужно обрабатывать одно прерывание при каждом передаваемом байте (слове),
сильно перевешивает потери, происходящие из-за захвата циклов.

Команды процессора Pentium II

В этом и следующих двух разделах мы рассмотрим наборы команд трех машин:
Pentium II, UltraSPARC II и picojava II. Каждая из них содержит базовые коман-

ды, которые обычно порождаются компиляторами, а также набор команд, которые
редко используются или используются только операционной системой. Мы будем

рассматривать обычные команды. Начнем с Pentium II.

Команды Pentium II представляют собой смесь команд 32-битного формата и

команд, которые восходят к процессору 8088. На рисунке 5.21 приведены наибо-
лее распространенные команды с целыми числами, которые широко используют-
ся в настоящее время. Этот список далеко не полный, поскольку в него не вошли
команды с плавающей точкой, команды управления, а также некоторые редкие
команды с целыми числами (например, использование 8-битного байта для вы-
полнения поиска по таблице). Тем не менее этот список дает представление о том,
какие действия может выполнять Pentium П.

Многие команды Pentium II обращаются к одному или к двум операндам, кото-

рые находятся или в регистрах, или в памяти. Например, бинарная команда ADD


background image

Типы команд 391

складывает два операнда, а унарная команда INC увеличивает значение одного опе-
ранда на 1. Некоторые команды имеют несколько похожих вариантов. Например,
команды сдвига могут сдвигать слово либо вправо, либо влево, а также могут рас-
сматривать знаковый бит особо или нет. Большинство команд имеют несколько
различных кодировок в зависимости от природы операндов.

На рисунке 5.21 поля SRC — это источники информации (SOURCE). Они не

изменяются. Поля DST — это пункты назначения (DESTINATION). Они обычно
изменяются командой. Существуют правила, определяющие, что может быть ис-
точником, а что пунктом назначения, но здесь мы не будем о них говорить. Многие
имеют три варианта: для 8-, 16- и 32-битных операндов соответственно. Они разли-
чаются по коду операции И/ИЛИ по одному биту в команде. На рис. 5.21 приведе-
ны в основном 32-битные команды.

Для удобства мы разделили команды на несколько групп. Первая группа со-

держит команды, которые перемещают данные между частями машины: регистра-
ми, памятью и стеком. Вторая группа содержит арифметические операции со зна-

ком и без знака. Для умножения и деления 64-битное произведение или делимое
хранится в двух регистрах: ЕАХ (младшие биты) и EDX (старшие биты).

Третья группа включает двоично-десятичную арифметику. Здесь каждый байт

рассматривается как два 4-битных полубайта. Каждый полубайт содержит 1 деся-
тичный разряд (от 0 до 9). Комбинации битов от 1010 до 1111 не используются.
Таким образом, 16-битное целое число может содержать десятичное число от 0 до
9999. Хотя такая форма хранения неэффективна, она устраняет необходимость
переделывать десятичные входные данные в двоичные, а затем обратно в десятич-
ные для вывода. Эти команды используются для выполнения арифметических
действий над двоично-десятичными числами. Они широко используются в про-
граммах на языке COBOL.

Логические команды и команды сдвига манипулируют битами в слове или

байте. Существует несколько комбинаций.

Следующие две группы связаны с проверкой и сравнением и осуществлением

перехода в зависимости от полученного результата. Результаты проверки и срав-
нения хранятся в различных битах регистра EFLAGS. Значок Jxx стоит вместо
набора команд, которые совершают условный переход в зависимости от результа-
тов предыдущего сравнения (то есть в зависимости от битов в регистре EFLAGS).

В Pentium II есть несколько команд для загрузки, сохранения, перемещения,

сравнения и сканирования цепочек символов или слов. Перед этими командами
может стоять специальный префиксный байт REP (repetition — повторение), ко-
торый заставляет команду повторяться до тех пор, пока не будет выполнено опре-
деленное условие (например, пока регистр ЕСХ, значение которого уменьшается

на 1 после каждого повторения, не будет равен 0). Таким образом, различные дей-
ствия (перемещение, сравнение и т. д.) могут производиться над произвольными
блоками данных.

Последняя группа содержит команды, которые не вошли ни в одну из предыду-

щих групп. Это команды перекодирования, команды управления, команды ввода-
вывода и команды остановки процессора.


background image

392

Глава 5. Уровень архитектуры команд

Команды перемещения

MOV DST, SRC

PUSH SRC

POP DST

XCHGDS1.DS2

LEA DST, SRC

CMOV DST, SRC

Перемещает SRC в DST

Помещает SRC в стек

Выталкивает слово из стека и помещает его в DST

Меняет местами DS1 и DS2

Загружает действительный адрес SRC в DST

Условное перемещение

Арифметические команды

ADD DST, SRC

SUB DST, SRC

MUL SRC

IMUL SRC

DIV SRC
IDV SRC

ADC DST, SRC

SBB DST, SRC

INC DST

DEC DST
NEG DST

Складывает SRC и DST

Вычитает SRC из DST

Умножает EAX на SRC (без знака)

Умножает ЕАХ на SRC (со знаком)

Делит EDX:EAX на SRC (без знака)

Делит EDX:EAX на SRC (со знаком)

Складывает SRC с DST и прибавляет бит переноса

Вычитает DST и переносит из SRC

Прибавляет 1 к DST

Вычитает 1 из DST

Отрицает DST (вычитает DST из 0)

Двоично-десятичные команды

DAA
DAS

ААА
AAS
ААМ
AAD

Десятичная коррекция

Десятичная коррекция для вычитания

Коррекция кода ASCII для сложения

Коррекция кода ASCII для вычитания

Коррекция кода ASCII для умножения

Коррекция кода ASCII для деления

Логические команды

AND

 DST, SRC

OR DST, SRC

XOR DST, SRC

NOT DST

Логическая операция И над SRC и DST

Логическая операция ИЛИ над SRC и DST

Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ над SRC и DST

Замещение DST дополнением до 1

Команды сдвига/циклического сдвига

SAL/SAR DST, #

SHL/SHR DST, #

ROL/ROR DST, #
ROL/ROR DST, #

Сдвиг DST влево/вправо на # битов

Логический сдвиг DST влево/вправо на # битов

Циклический сдвиг DST влево/вправо на # битов

Циклический сдвиг DST по переносу на # битов

Команды тестирования/сравнения

TSTSRC1.SRC2

CMPSRC1.SRC2

Операнды логической операции И, установка флагов

Установка флагов на основе вычитания SRC1-SRC2

Рис.  5 . 2 1

. Команды с целыми числами в Pentium И (начало)