Цифровые устройства и микропроцессоры
.pdf160
работает один процессор, другой переводит шины и линии S0-S2 в третье состояние. Шина управления формируется системным контроллером ВГ88, ША – регистрами типа ИР82, ШД – приёмопередатчиком ВА86. Для синхронизации используется общий генератор. Для формирования сигнала готовности СА используется дешифратор адреса А1-А15, срабатывающий по команде OUT ADRR, где указывается адрес, выделенный для ВМ89.
Значение сигнала SEL формируется по адресу линии А0. сигналы запросов прерываний с выходов SINTR1, SINTR2 ВМ89 подаются на вход INTR ВМ86 через контроллер прерываний (на рис. не показан).
Сигналы запросов прямого доступа от ВУ, участвующих в ПДП – пересылках, подаются на входы DRQ1, DRQ2 процессора ВМ89 (если >2, то можно объединить по схеме или). Если окончанием ПДП управляет ВУ, то оно сообщает об этом по сигналам EXT1 и EXT2.
Так как у ВМ86 две линии RQ/GT, то к нему можно подключить два ПВВ. В слабо связанной (удалённой, дистанционной) конфигурации ВМ89 поль-
зуется СШ, являющейся общей для всех процессорных модулей.
Каждый процессор должен иметь свой арбитр шины, связанный с другими арбитрами по шине арбитража. Если программа процессора ввода/вывода размещена только в локальной памяти, а в системной памяти располагается только один из четырёх управляющих блоков SCPB, SCB, CP и PB, осуществляется действительно полная параллельная работа процессоров.
Система команд процессора ввода/вывода имеет 53 команды, команды классифицируются на следующие группы:
1.общие передачи данных;
2.8 и 16-битные арифметические операции;
3.8 или 16-битные логические операции;
4.команды загрузки и запоминания указателей;
5.условные и безусловные переходы и вызовы подпрограмм;
6.операции манипуляции битами и проверки;
7.команды управления процессором.
Лекция № 20
7. АРИФМЕТИЧЕСКИЙ СОПРОЦЕССОР
7.1. Архитектура арифметического сопроцессора
7.1.1. Общие сведения Существующие современные однокристальные микропроцессоры с
длиной слова 16 и 32 бита оперируют практически с двумя простыми форматами численных данных: знаковыми и беззнаковыми целыми двоичными числами, хотя с определенными ограничениями допускают десятичные целые числа. Вычислительные возможности их ограничены только арифметическими операциями. Реализация расширенных форматов данных и систем
161
команд в однокристальных микропроцессорах ведет к их чрезмерному усложнению и трудности в программировании. Программная реализация сложных команд на микропрограммном уровне ведет к значительному снижению быстродействия микропроцессора.
В сложившейся ситуации наибольшее распространение получил принцип специализации, который применяется в процессорах средних и больших компьютеров. Суть его заключается в разработке вспомогательных процессорных модулей со своими системами команд, ориентированных на конкретные прикладные области: процессор арифметики с плавающей точкой, процессор символьных данных, процессор ввода-вывода и др. Такие вспомогательные процессоры работают под общим управлением центрального (главного) процессора и обычно разделяют с ним основную память. Специализация позволяет достичь очень высокого быстродействия.
В сопроцессорной конфигурации вспомогательный процессор (сопроцессор) подключается к системной шине параллельно центральному процессору. Сопроцессор не имеет своей отдельной программы и не может считывать команды из памяти, но может обращаться к памяти для записи и считывания данных, запрашивая для этого шину центрального процессора. Кроме того, сопроцессор контролирует системную шину и может «перехватить» адреса и данные при обращении к памяти центрального процессора. Таким образом, программа оказывается смесью команд центрального процессора и сопроцессора, причем считывание команд из памяти осуществляет только центральный процессор.
Первым из сопроцессоров, предназначенных для работы с центральным процессором К1810ВМ86 (I8086), появился процессор числовых данных, или арифметический сопроцессор К1810ВМ87 (I8087). Он рассчитан на применение в системах с интенсивной численной обработкой, в которых:
•численные данные изменяются в очень широком диапазоне;
•при реализации алгоритмов возникают очень большие и малые промежуточные данные;
•требуется высокая точность вычисления;
•необходима производительность, превышающая возможности центрального процессора.
Наряду с традиционными арифметическими командами, работающими
как целыми, так и числами с плавающей точкой, арифметический сопроцессор имеет команды таких сложных операций, как извлечение квадратного корня, вычисление тригонометрических и обратных тригонометрических функций, возведение в степень, логарифмирование и др.
7.1.2. Архитектура сопроцессора. Структурная схема. Взаимодействие блоков
Структурную схему сопроцессора удобно представить в виде программной модели. В программную (регистровую) модель любого процессора
162
включаются только те регистры, которые доступны программисту на уровне машинных команд. Арифметический сопроцессор имеет общую стековую организацию. Выбор такой организации обусловлен несколькими обстоятельствами. Одно из них заключается в том, что в математических расчетах результат текущей операции часто может заместить один или оба исходных операнда и является операндом следующей команды. Стековая организация позволяет в этих случаях применять так называемые безадресные команды небольшой длины (неявная адресация), сокращая, таким образом, число обращений к памяти и, следовательно, повышая быстродействие.
Основу программной модели сопроцессора, показанной на рис. 79, образует регистровый стек из восьми 80-битовых регистров R0–R7. В этих (арифметических) регистрах хранятся числа, представленные в так называемом временном вещественном формате. В любой момент времени трехбитовое поле ST в слове состояния определяет регистр, являющийся текущей вершиной стека (Stack Top) и обозначается ST(0) или просто ST. При операции включения в стек осуществляется декремент поля ST и загружаются адресуемые данные в новую вершину стека. При операции извлечения из стека в получатель, которым чаще всего является память, передается содержимое текущей вершины стека, а затем производится инкремент поля ST.
В организации регистрового стека сопроцессора имеется несколько отличий от классического стека, который в большинстве современных процессоров аппаратно реализуется в памяти.
Во-первых, стек имеет круговую (кольцевую) организацию. Необходимо помнить, что максимальное число включений в стек без промежуточных извлечений равно восьми, а девятое включение перезапишет элемент, помещенный в стек первым (на самом деле сопроцессор зафиксирует здесь особый случай недействительной операции и, если прерывание замаскировано или запрещено, тогда произойдет перезапись, иначе в сопроцессор загрузится
NAN).
|
163 |
|
|
|
Регистровый стек |
|
Признаки |
||
79 78 Порядок 64 63 |
Мантиса |
|
(тэги) |
|
0 |
1 |
0 |
R0
R1
R2
R3
R4
R5
R6
R7
|
Указатель |
|
|
Слово признаков |
|
команды |
|
|
|
|
|
|
|
Регистр состояния |
|
|
|
|
|
|
|
|
||
|
Указатель |
|
Регистр управлен. |
|
|
данных |
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 79. Программная модель сопроцессора
Во-вторых, в командах сопроцессора допускают явное или неявное обращение к регистрам стека с модификацией или без модификации поля ST. Так в некоторых операциях операндом служит содержимое вершины стека.
В-третьих, сопроцессор имеет команды, в которых не изменяется содержимое вершины стека (в процессоре стек автоматически модифицируется при любом обращении к нему).
С каждым регистром стека ассоциируется двухбитовый тэг (признак), совокупность которых образует слово тэгов. Тэг регистра R0 находится в младших битах этого слова, а тэг регистра R7 – в старших. Тэг фиксирует наличие в регистре действительного числа (конечное ненулевое число) – код 00, истинного нуля – код 01, специального числа (денормализованное число, не-число или бесконечность) – код 10 и отсутствие данных – код 11. Попытка команды извлечь число из пустого регистра фиксируется как особый случай недействительной операции. Кроме того, попытка загрузить число в непустой регистр также вызывает регистрацию особого случая.
Программист может использовать слово тэгов для интерпретации содержимого регистров только после передачи этого слова в память.
Остальными регистрами в программной модели сопроцессора являются регистр управления, регистр состояния, два регистра указателя команды и два регистра указателя данных.
164
Регистр состояния. В слове состояния (рис. 80) отражается текущее состояние сопроцессора после выполнения последней команды.
15 |
|
|
0 |
||||||||||
B |
C3 |
TOP |
C2 |
C1 |
C0 |
ES |
SF |
PE |
UE |
OE |
ZE |
DE |
IE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 80. Слово состояния сопроцессора
Шесть младших битов показывают исключительные ситуации: IE – недействительная операция;
DE – денормализованный операнд; ZE – ошибка деления на ноль;
OE – ошибка переполнения. Возникает в случае выхода порядка числа за максимально допустимый диапазон;
UE – ошибка антипереполнения. Возникает, когда результат слишком
мал;
PE – ошибка точности. Устанавливается, когда процессору приходится округлять результат из-за того, что его точное представление невозможно (например при делении 1 на 3).
SF – ошибка работы стека сопроцессора. Устанавливается в единицу, если возникает одна из трех исключительных ситуаций – PE, UE или IE. В частности, его установка информирует о попытке записи в заполненный стек, или при попытке чтения из пустого стека.
ES – суммарная ошибка работы сопроцессора. Бит устанавливается в единицу, если установится в единицу хотя бы один из шести битов (IE, DE, ZE, OE, UE, PE).
С0-С3 – коды условия. Отражают результат выполнения последней команды сопроцессора (таблица 27).
|
|
|
|
Таблица 27 |
С3 |
С2 |
С1 |
С0 |
Описание |
0 |
0 |
х |
0 |
ST > источника (src) или нуля |
0 |
0 |
х |
1 |
ST < источника (src) или нуля |
1 |
0 |
х |
0 |
ST = источнику (src) или нулю |
1 |
1 |
х |
0 |
Не сравнимы |
TOP – трехбитовое поле, показывающее номер регистра, который является вершиной стека.
Регистр управления. Слово управления (рис. 81) определяет для сопроцессора один из вариантов обработки численных данных.
|
|
|
|
|
165 |
|
|
|
|
|
|
|
|
15 |
|
|
|
|
0 |
||||||||
X |
X |
X |
IC |
RC |
PC |
IEM |
X |
PM |
UM |
OM |
ZM |
DM |
IM |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 81. Слово управления сопроцессора
Для каждого варианта программист задает маскирование особых случаев, точность вычислений, способ округления и интерпретацию бесконечности. Слово управления загружается из памяти с помощью команды FLDCW.
Шесть младших битов слова управления представляют собой индивидуальные маски особых случаев. Если любой из этих битов установлен в 1, то возникновение соответствующего особого случая, которое фиксируется в шести младших битах слова состояния, не будет вызывать прерывание центрального процессора (прерывание запрещено или замаскировано), а если бит содержит – 0, тогда генерируется соответствующее прерывание центрального процессора.
IEM – маска управления прерывания, которая разрешает (IEM = 0) или запрещает (IEM = 1) прерывание центрального процессора.
PC – биты управления точностью вычисления 00 – 24 бита, 10 – 53 бита, 11 – 64 бита. По умолчанию вводится режим с максимальной точностью.
RC – биты управления округлением (таблица 28). Необходимость операции округления может возникнуть, например, при вычислении дробной или целой части числа. В этом случае целесообразно выбирать режим усечения. Для того чтобы выяснить характер округления, обозначим:
m – значение в ST(0) или результат работы некоторой команды; a и b – наиболее близкие значения к m, причем a < m < b.
|
|
Таблица 28 |
RC |
Режим |
Принимаемый результат |
00 |
Округления к |
Значение m округляется к бли- |
|
ближайшему |
жайшему числу a или b |
01 |
Округления вниз |
a |
10 |
Округления вверх |
b |
11 |
Усечение |
Производится отбрасывание |
|
|
дробной части |
IC – бит управления бесконечностью. Определяет одну из двух моделей интерпретации бесконечности: проективную (IC=0) или аффинную (IC = 1). По умолчанию вводится проективный режим, в котором сопроцессор обрабатывает два специальных значения «плюс бесконечность» и «минус бесконечность» как одно и то же значение «бесконечность», не имеющее знака. В аффинном режиме сопроцессор допускает значения бесконечности со знаком плюс или минус.
Информация, содержащаяся в регистрах указателя команды и операнда (совместно их называют указателями особого случая), предназначена только
166
для процедур обработки особых случаев. Когда сопроцессор выполняет численную команду, он автоматически сохраняет в этих регистрах физический адрес команды сопроцессора, физический адрес операнда, если он присутствует в команде.
Лекция № 21
7.1.3Программирование сопроцессора
Всистему команд арифметического сопроцессора К1810ВМ87 входят 69 базовых команд, которые можно разделить на шесть групп: команды передачи данных, арифметические команды, команды сравнения, команды трансцендентных операций, команды загрузки констант и команды управления сопроцессором.
Типичная команда сопроцессора воспринимает один или два операнда. Операндами наиболее часто служит содержимое регистров сопроцессора, но может привлекаться и содержимое ячеек памяти (с регистрами процессора арифметический сопроцессор не работает).
Варифметическом сопроцессоре формирование команды происходит следующим образом:
F I С,
где F – обозначение команды арифметического сопроцессора; I – формат операнда, I – целочисленный формат (integer), для вещественных чисел буква I отсутствует; С – команда.
Например, FILD – загрузка целого числа в арифметический сопроцессор (LD – load), для вещественного числа команда загрузки – FLD.
Расширенные форматы данных арифметического сопроцессора требуют введения в ассемблер специальных директив определения данных. Резервирования памяти для переменных и констант сопроцессора осуществляют следующие директивы:
DW – определить слово (16 битов);
DD – определить двойное слова (32 бита); DQ – определить счетверенное слово (64 бита); DT – определить 10 байтов.
Основные характеристики численных данных приведены в табл. 29.
|
|
|
Таблица 29 |
|
|
|
|
Формат |
Диапазон |
Точность |
Особенность |
Целое слово |
104 |
16 битов |
Дополнительный код |
Короткое целое |
109 |
32 бита |
Дополнительный код |
Длинное целое |
1019 |
64 бита |
Дополнительный код |
Упакованное десятичное |
1018 |
18 цифр |
Прямой код |
Короткое вещественное |
10±38 |
24 бита |
Неявный бит F0 |
Длинное вещественное |
10±308 |
54 бита |
Неявный бит F0 |
Временное вещественное |
10±4932 |
64 бита |
Явный бит F0 |
167
Необходимо помнить, что с операндами размером 1 байт арифметический сопроцессор не работает. Для представления чисел в вещественном формате, как правило, используют директивы DD и DQ.
*7.2. Система команд сопроцессора
Команды передачи данных. Команды этой группы производят передачу данных между регистрами стека, а также между вершиной стека и памятью. Одной командой число из памяти, представленное в любом формате сопроцессора, преобразуется во временный вещественный формат (10 байтов) и загружается (включается) в стек. Аналогичным образом, но в обратном порядке осуществляется передача числа в память.
Команды загрузки. В арифметическом сопроцессоре существует три команды загрузки следующего вида:
FLD |
src |
загрузка вещественного числа (src – источник); |
FILD |
src |
загрузка двоичного целого числа; |
FBLD |
src |
загрузка десятичного целого числа. |
Команды загрузки осуществляют декремент указателя стека и передачу в новую вершину стека содержимое источника, т. е. производят включения в стек. Например, даны три числа:
ADQ 5.672
BDW 342
CDT 10
Программа выглядит следующим образом:
FLD |
A |
|
FILD |
B |
|
FLD |
ST |
|
FBLD |
C |
|
После выполнения программы состояние сопроцессора будет: |
||
|
ST(0) |
10 |
|
ST(1) |
342 |
|
ST(2) |
342 |
|
ST(3) |
5.672 |
В команде FLD источником может быть один из регистров стека или память, а в командах FILD и FBLD – только память, причем команда FBLD поддерживает только формат DT. Команды FILD и FBLD являются точными, т. е. в них ошибки округления отсутствуют.
Для загрузки данных из массива чаще всего используют косвенную адресацию. Например, если определен массив данных
A DQ 5.7649, 6.0, – 4.98E-6
загрузка данных в сопроцессор выглядит следующим образом: LEA SI, A
168
FLD QWORD PTR [SI]
FLD QWORD PTR [SI+8]
FLD QWORD PTR [SI+16]
Состояние сопроцессора будет следующим:
ST(0) |
5.7649 |
ST(1) |
6.0 |
ST(2) |
– 4.98E-6 |
Примечание. Во всех приводимых примерах при отсутствии явной спецификации типа операнда (QWORD PTR) предполагается, что он определен соответствующей директивой.
Команды запоминания. В арифметическом сопроцессоре существуют две команды запоминания:
FST запоминание вещественного числа (dst – приемник); FIST запоминание двоичного целого числа.
Эти команды производят передачу содержимого вершины стека в память без изменения указателя стека ST.
Вкоманде FST получателем может быть регистр стека или вещественная переменная в памяти (только короткая или длинная форма представления чисел, т. е. DW или DQ).
Вкоманде FIST получателем является переменная в памяти, имеющая формат короткого целого или целого слова (DW или DD). Поскольку все числа в сопроцессоре хранятся в вещественном формате, при запоминании данных с помощью команды FIST округление производится в соответствии с управляющим словом сопроцессора (за исключением, если запоминается число, загруженное до этого с помощью команды FILD).
Примеры ассемблерных команд запоминания:
FST |
ST(5) |
; Передает ST(5) в ST(0). |
FST |
QWORD PTR [SI] |
; Передает вещественное число в память. |
FISTP QWORD PTR [SI] |
; Передать целое слово в память. |
Рассмотренные команды не допускают получатель в форматах длинного целого (8 байтов), временного вещественного (10 байтов) и упакованного десятичного (10 байтов).
Команды запоминания с извлечением из стека. Три команды, помимо передачи данных из ST(0) в получатель, осуществляют извлечения из стека, а регистр, бывший вершиной стека, отмечается как пустой и производится инкремент указателя стека:
FSTP запоминание вещественного числа (dst – приемник); FISTP запоминание двоичного целого числа.
FBSTP запоминание десятичного целого числа.
Действие этих команд эквивалентно действию команд загрузки с той лишь разницей, что данные из вершины стека удаляются. Примеры рассмотренных команд на ассемблере:
FSTP ST ; Извлечение из стека.
|
|
169 |
FISTP DWORD PTR [SI] |
; Передает короткое целое в память. |
|
FBSTP MEAN |
|
; Передать десятичное целое в память. |
Команды обмена. Команда обмена содержимого регистров |
||
FXCH dst |
ST(0) ↔ dst |
обменивает содержимое получателя ST(i) и вершины стека ST(0). При пустом поле операнд обменивает содержимое регистров ST(0) и ST(1). При-
меры команды обмена: |
|
FXCH ST(5) |
; Обменивает содержимое ST(5) и ST(0). |
FXCH |
; Обменивает содержимое ST(1) и ST(0). |
Арифметические |
команды. Основные арифметические команды, ис- |
пользуемые в сопроцессоре, ориентированы на разработку эффективных алгоритмов, что позволяет программисту минимизировать число обращений к памяти и оптимально использовать регистровый стек. Все арифметические команды, работающие с регистрами, выполняются только в вещественном формате.
Команды сложения. Операция сложения реализуется командами со следующими формами:
FADD |
//src/dst, src |
сложение вещественных чисел; |
FADDP |
dst, src |
сложение вещественных чисел с извлечением из стека; |
FIADD |
src |
сложение вершины стека с целым числом. |
Команда FADD ST,ST производит удвоение вершины стека. Примеры использования команд сложения:
FADD ST(3),ST |
; ST(3) = ST(3) + ST(0). |
FADD QWORD PTR [SI] |
; ST(0) = ST(0) + содержимое ячейки памяти |
|
; (вещественное число). |
FIADD WORD PTR A |
; ST(0) = ST(0) + ячейка памяти (целое число). |
FADD |
; ST(0) = ST(0) + ST(1) (с выталкиванием). |
FADDP ST(1), ST(2) |
; ST(0) = ST(1) + ST(2) (с выталкиванием). |
FADD ST(2) |
; ST(0) = ST(0) + ST(2). |
Команды вычитания. Вычитание dst = dst – src осуществляют следую-
щие команды: |
|
|
FSUB |
//src/dst, src |
вычитание вещественных чисел; |
FSUBP |
dst, src |
вычитание вещественных чисел с извлечением |
|
|
из стека; |
FISUB |
src |
вычитание из вершины стека целого числа. |
Для вычитания dst = src – dst предназначены команды: |
||
FSUBR |
//src/dst, src |
вычитание вещественных чисел; |
FSUBRP |
dst, src |
вычитание вещественных чисел с извлечением |
|
из стека. |
Примеры команд вычитания: |
|
FSUB ST(3),ST |
; ST(3) = ST(3) – ST(0). |
FSUB QWORD PTR [SI] |
; ST(0) = ST(0) – содержимое ячейки памяти |