Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Цифровые устройства и микропроцессоры

.pdf
Скачиваний:
516
Добавлен:
09.06.2015
Размер:
3.6 Mб
Скачать

 

 

170

 

 

; (вещественное число).

FISUB WORD PTR A

; ST(0) = ST(0) – ячейка памяти (целое число).

FSUB

 

; ST(0) = ST(1) – ST(0) (с выталкиванием).

FSUBP ST(1), ST

; ST(0) = ST(1) – ST(0) (с выталкиванием).

FSUB ST(2)

; ST(0) = ST(0) – ST(2).

Команды умножения. Операция умножения реализуется следующими

командами:

 

FMUL

//src/dst, src

умножение вещественных чисел;

FMULP

dst, src

умножение вещественных чисел с извлечением

 

 

из стека;

FMUL

 

ST(0) = ST(0) * ST(1);

FIMUL

src

умножение вершины стека на целое число.

Примеры команд умножения:

FMUL ST(3),ST

; ST(3) = ST(3) * ST(0).

FMUL QWORD PTR [SI]

; ST(0) = ST(0) * содержимое ячейки памяти

 

 

; (вещественное число).

FIMUL WORD PTR A

; ST(0) = ST(0) * ячейка памяти (целое число).

FMUL

 

; ST(0) = ST(0) * ST(1) (с выталкиванием).

FMULP ST(1), ST(2)

; ST(0) = ST(1) * ST(2) (с выталкиванием).

FMUL ST(2)

; ST(0) = ST(0) * ST(2).

Команды деления. Для выполнения операции деления предусмотрены

команды:

 

 

FDIV

//src/dst, src

деление вещественных чисел;

FDIVP

dst, src

деление вещественных чисел с извлечением из

 

 

стека;

FIDIV

src

деление вершины стека на целое число.

Для деления dst = src / dst предназначены команды:

FDIVR

//src/dst, src

деление вещественных чисел;

FDIVRP

dst, src

деление вещественных чисел с извлечением из

 

 

стека.

Примеры команд деления:

FDIV ST(3),ST

; ST(3) = ST(3) / ST(0).

FDIV QWORD PTR [SI]

; ST(0) = ST(0) / содержимое ячейки памяти

 

 

; (вещественное число).

FIDIV WORD PTR A

; ST(0) = ST(0) / ячейка памяти (целое число).

FDIV

 

; ST(0) = ST(1) / ST(0) (с выталкиванием).

FDIVP ST(1), ST

; ST(0) = ST(1) / ST(0) (с выталкиванием).

FDIV ST(2)

; ST(0) = ST(0) / ST(2).

Дополнительные команды. К арифметическим командам также относятся семь дополнительных команд, имеющих безоперандную форму, т. е. работают с вершиной стека.

Команда FSQRT – извлечение квадратного корня, заменяет число, находящееся в вершине стека, значением квадратного корня. При использова-

171

нии этой команды необходимо помнить об области определения операнда (содержимое вершины стека должно быть больше или равно нулю).

Команда FSCALE – масштабирование интерпретирует содержимое регистра ST(1) как целое двоичное число и прибавляет его к смещенному по-

рядку числа, находящегося в вершине стека: FSCALE ; ST(0) = ST(0) * 2ST(1)

Таким образом, команда FSCALE осуществляет быстрое умножение (когда ST(1) > 0) или деление (когда ST(1) < 0) содержимого вершины стека на целую степень 2. В этой команде предполагается, что масштабный коэффициент в ST(1) является целым числом в диапазоне –215 < ST(1) < 215. Если он не является целым числом, но находится в указанном диапазоне и больше по абсолютному значению 1, в команде принимается ближайшее целое, меньшее по абсолютному значению исходного масштабного коэффициента (усечение дробной части).

Команда FPREM вычисляет частичный остаток от деления числа, находящегося в вершине стека ST(0), на следующий элемент стека ST(1) и загружает результат в ST(0):

FPREM ; ST(0) = ST(0) – (q * ST(1)),

где q – целое число. Другими словами, содержимое ST(1) выступает модулем в операции деления. Например, если ST(1) = 2, тогда получаем деление по модулю 2. Знак остатка имеет знак исходного делимого, т. е. содержимого

ST(0).

Команда FRNDINT осуществляет округление числа, находящегося в вершине стека ST(0), до целого. Режим округления показывает поля RC в слове управления сопроцессора.

Команда FXTRACT выделяет компоненты числа с плавающей точкой, преобразует число, находящееся в вершине стека ST(0), в два числа, представляющих собой фактическое значение его порядка и мантиссы. Выделенный порядок заменяет исходный операнд в вершине стека, а мантисса включается в стек (с декрементом указателя стека). Например, если в ST(0) находилось число 5.766754, то после выполнения команды FXTRACT ST(0) = =1.4416885, а ST(1) = 2. Соответственно 5.766754 = 1.4416885*22.

Две последние команды выполняют элементарные операции нахождения абсолютного значения и изменения знака числа, которое содержится в

вершине стека:

 

FABS

; Абсолютное значение числа.

FCHS

; Изменение знака числа.

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

Команды данной группы предназначены для анализа

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

Команда сравнения вещественных чисел имеет форму FCOM src и осуществляет сравнение содержимого вершины стека ST(0) и источника src. Источником может быть регистр стека или вещественное число в памяти (в

172

формате короткого или длинного вещественного). Если поле операнда пустое, производится сравнение ST(0) и ST(1). Операнды считаются несравнимы (С3, С1 = 11), когда хотя бы один из них имеет специальное значение (проективная бесконечность или не-число). Например, имеем число A = – 0.43

(A DQ – 4.3e-1), необходимо определить знак числа.

FLDZ

; Загрузка нуля в стек.

FLD QWORD PTR A

; Загрузка числа А в стек.

FCOM

; Сравнения чисел.

FSTSW AX

; Чтение слова состояния в AX.

SAHF

; Запись содержимого регистра AH в

 

; регистр флагов центрального процессора.

До выполнения программы состояния регистра флагов SW = 0000H, после выполнения программы SW = 3100H (С3 – С0 = 0001). После выполнения команды SAHF устанавливается флаг С регистра флагов (CF = 1), далее можно использовать команду условного перехода JC.

Команда FCOMP src сравнения и извлечения из стека действует аналогично команде FCOM, но дополнительно осуществляет извлечение из стека. Если в предыдущем примере вместо команды FCOM использовать FCOMP, тогда в стеке останется одно число, а регистр флагов будет равен SW = 3900H (TOP = 111).

При выполнении команды FICOM содержимое источника (память) интерпретируется как целое слово или короткое целое, преобразуется во временный вещественный формат и сравнивается с ST(0). Команда FICOMP src производит те же действия и дополнительно реализует извлечение из стека.

Команда FTST производит проверку числа, находящегося в вершине стека, посредством сравнения его с нулем. Результат фиксируется в слове состояния сопроцессора. Рассматривая предыдущий пример, можно написать

программу:

 

FLD QWORD PTR A

; Загрузка числа А в стек.

FTST

; Сравнения числа с нулем.

FSTSW AX

; Чтение слово состояния в AX.

SAHF

; Запись содержимого регистра AH в

 

; регистр флагов центрального процессора.

После выполнения программы SW = 3900H (С3 – С0 = 0001).

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

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

Команда FPTAN – вычисление частичного тангенса, как результат формируется два числа X и Y, отношение которых дает тангенс угла α в виде

173

tg α=Y X . Значение угла α должно находится в вершине стека ST(0) и

быть в диапазоне от нуля до π/4 (0 < α < π/4).

Примечание. Для арифметических сопроцессоров I80387 и более поздних модификаций команда FPTAN заменяет содержимое ST(0) на tg (ST(0)) и затем включает 1.0 в стек, т. е. результат выполнения функции находится в ST(1). Содержимое ST(0) должно быть выражено в радианах и находится в диапазоне от –263 до 263. Если число находится вне допустимого диапазона, тогда флаг С 2 устанавливается в 1 и содержимое ST(0) не изменяется.

Команда FPATAN – вычисление частичного арктангенса формирует результат α = arctg(Y/X), причем значение X берется из вершины стека ST(0), а значение Y – из регистра ST(1). Значения исходных операндов должны удовлетворять требованию 0 < Y < X < .

Примечание. Для арифметических сопроцессоров I80387 и более поздних модификаций для команды FPATAN содержимое ST(0) и ST(1) должно находится в диапазоне от –263 до 263. Результат имеет тот же знак, что и операнд в ST(1), и величину меньше π.

Если обозначить через z аргумент обратной функции, через X и Y значения в ST(0) и ST(1) до выполнения команды FPATAN, то получение в ST(0) значения осуществляется по следующим формулам:

 

 

 

z

 

=arctg (Y X );

arcsin(z)=arctg

 

 

 

 

 

 

 

(1z)(1+ z)

 

 

1z

=2arctg (Y X );

arccos(z)=2arctg

 

 

 

 

 

 

 

1+ z

 

 

arctg(z)=arctg (z1)=arctg (Y X ), arcctg(z) = arctg (1z)=arctg (Y X );

 

1

 

 

arc sec(z)=arctg

 

= arctg (Y X );

 

 

 

 

(z

1)(z +1)

 

z 1

 

=2arctg(Y X).

 

 

arccosec(z)=2arctg

z +1

 

 

 

 

Например, программа для вычисления arcsin(z):

FLD QWORD PTR z

 

 

; Загрузка в ST(0) аргумента

FLD1

 

 

; Загрузка 1

FSUB QWORD PTR z

 

 

; Вычисление 1–z

FPATAN

 

 

; Вычисление arcsin(z)

Результат находится в ST(0).

Команда FSIN заменяет содержимое ST(0) на sin(ST(0)). Для арифметических сопроцессоров I80387 и более поздней модификации аргумент выражен в радианах и должен удовлетворять диапазону от –263 до 263.

Команда FCOS производит вычисление косинуса угла. Данная команда работает аналогично команде FSIN.

174

Команда FSINCOS вычисляет значение синуса и косинуса угла. Результатом выполнения будет в ST(0) косинуса угла, а в ST(1) – синуса.

Команда F2XM1 вычисляет значение функции Y = 2x – 1. Значение ST(0) должно находится в диапазоне –1 < ST < 1. Используя команду F2XM1 можно осуществить возведение в степень X любых чисел, пользуясь формулами:

10x =2x log2 10 , ex =2x log2 e , Yx =2x log2 Y.

Необходимые для таких вычислений константы log210 и log2e встроены в сопроцессор.

Команда FYL2X предназначена для вычисления значений функции Z=Ylog2X. Аргумент X находится в вершине стека, а аргумент Y – в ST(1). Диапазон изменения чисел 0 < X <, – < Y < . С помощью данной команды удобно вычислять логарифмы по любому основанию с применением тож-

дества lognX = logn2*log2X.

Команда FYL2XP1 вычисляет значение функции Z = Y log2(X+1). Аргумент X берется из вершины стека, а Y – из ST(1). Значение X должно нахо-

 

 

2

 

 

 

 

 

X2

1, а Y в диапазоне – < Y < .

дится в диапазоне 1

2

 

 

 

 

 

 

Команды загрузки констант. Простые команды загрузки наиболее часто встречающихся в вычислениях констант приведены в табл. 30. Загрузка осуществляется путем включения константы в стек, т. е. декремента указателя стека, и передачи в новую вершину стека значения константы, представленной во временном вещественном формате.

Таблица 30

Мнемоника

Операция

FLDZ

Загрузка в стек +0.0

FLD1

Загрузить в стек +1.0

FLDPI

Загрузить в стек π

FLDL2T

Загрузить log210

FLDL2E

Загрузить log2e

FLDLG2

Загрузить log102

FLDLN2

Загрузить loge2

Команды управления сопроцессором. С помощью команд управления сопроцессором можно задать режим работы сопроцессора, а также проанализировать результаты команд сравнения и проверки.

Команда FINIT инициализации сопроцессора функционально эквивалентна сигналу сброса CLR, но она не влияет на синхронизацию выборки команд центрального процессора и сопроцессора. Состояние сопроцессора после команды инициализации приведено в табл. 31.

175

 

 

Таблица 31

 

 

Интерпретация

 

 

Поле

Состояние

 

Слово управления

 

Проективная

 

 

Управление бесконечностью

0

 

 

Управление точностью

11

64 бита

 

 

Управление округлением

00

Округление к ближайшему

 

 

Маска разрешения прерываний

1

Прерывания запрещены

 

 

 

 

 

 

 

Слово состояния

 

Не определен

 

 

Код условия

XXXX

 

 

Указатель стека

000

Начало стека

 

 

Запрос прерывания

0

Отсутствует

 

 

Флажки особых случаев

000000

 

 

 

 

 

 

 

 

Слово тэгов

 

Пустые регистры

 

 

Тэги

11

 

 

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

Основное назначение команды FLDCW src заключается в загрузке в регистр управления сопроцессора нового содержимого из источника src (им должно быть целое число из памяти) с целью установки или изменения режима работы, например режима управления округлением.

Команды FSTCW dst и FSTSW dst осуществляют запоминание текущих слов управления и состояния соответственно в ячейке памяти, определяемой получателем. Команда FSTSW dst допускает использование в качестве приемника слова состояния сопроцессора регистр AX центрального процессора. Данная команда часто используется для реализации условных переходов по результатам команд сопроцессора, а также вызова процедур обработки особых случаев в таких системах, где не применяются прерывания. После команды чтения состояния необходимо использовать команду WAIT, чтобы состояние сопроцессора было передано до продолжения программы.

Команды FDECSTP и FINCSTP производят декремент и инкремент стека соответственно.

С помощью команд FDISI и FENI программист управляет запрещением (маскированием) и разрешением прерываний от сопроцессора. Обе команды соответствующим образом воздействуют на бит IEM маски разрешения прерываний в слове управления сопроцессора.

Функция команды FCLEX сброса особых случаев заключается в том, чтобы сбросить в нуль флажки особых случаев.

176

Лекция № 21

7.3. Специальные числовые значения и особые случаи

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

7.3.1. Вещественные числа с нарушением нормализации Сопроцессор хранит ненулевые вещественные числа в нормализован-

ной форме, т. е. старший бит мантиссы, являющийся разрядом целой части, содержит единицу. Отсутствие старших нулей в мантиссе, имеющей в каждом формате фиксированную длину, позволяет сохранить максимум значащих цифр. Например, число, хранящееся в сопроцессоре 2.359256745865683Е–3 имеет больше значащих цифр, чем число 0.235925674586568Е–4. Обозначим минимально представимое число δ, тогда для представления чисел в диапазоне 0 – δ приходится нарушать нормализацию, т. е. допускать числа, мантисса которых содержит один или несколько старших нулей. Такие числа возникают, когда результат операции слишком мал для представления в нормализованной форме. Например, при хранении в сопроцессоре во временном вещественном формате числа 1.375543754123429Е–4934 произойдет нарушение нормализации, т. к. это число будет представлено в стеке в виде 0.013755437541234Е–4932. Наличие старших нулей в мантиссе расширяет диапазон в области малых чисел, но за счет некоторой потери точности, т. к. количество значащих цифр мантиссы уменьшается.

Денормализованные числа

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

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

177

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

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

7.3.3. Ненормализованные числа

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

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

7.3.4. Нули и псевдонули

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

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

марное число старших нулевых битов мантиссы сомножителей больше 64 (0.0*10 – 4932).

178

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

команды сравнения и проверки;

команда FRNDINT округления до целого;

операции деления, в которых делимое является истинным нулем или псевдонулем, а делитель – псевдонуль.

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

Лекция № 22

7.3.5.Бесконечности

Ввещественных форматах предусмотрено представление специальных значений, называемых бесконечностями. Они кодируются с максимальным смещенным порядком 11…11 и мантиссой 1 00…0. При загрузке бесконечности в регистр его содержимое отмечается тегом специального значения.

 

 

 

Таблица 32

 

 

 

 

Истинный результат

Режим

Получаемый

Нормализация

Знак

округления

результат

Нормализован

+

Вверх

Плюс бесконечность

Нормализован

+

Вниз

Наибольшее положительное число

Нормализован

Вверх

Наименьшее отрицательное число

Нормализован

Вниз

Минус бесконечность

Не нормализован

+

Вверх

Плюс бесконечность

Не нормализован

+

Вниз

Наибольший порядок, мантисса ре-

 

 

 

зультата

Не нормализован

Вверх

То же

Не нормализован

Вниз

Минус бесконечность

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

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

–INF и +INF.

179

7.3.6. Не-числа

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

Сопроцессор формирует особое не-число, называемое вещественной неопределенностью, в результате маскированной реакции на особый случай недействительной операции. Например, при попытке выполнить какую-либо арифметическую операцию с пустым регистром. Если этот особый случай замаскирован, сопроцессор возвращает как результат не-число, а если оба операнда являются не-числа, результатом будет не-число с большей мантиссой. Таким образом, полученное однажды не-число распространяется в вычислениях и выдается как окончательный результат. Обозначаются не-числа как –NAN и +NAN.

8.МИКРОПРОЦЕССОРЫ КЛАССА PENTIUM

8.1. Основныеособенностиархитектурыипрограммирования процессоровI80186 иI80286

Выше подробно рассматривалась архитектура микропроцессоров I8086/8088. Посвятим несколько слов дальнейшему развитию этой ветви, кратко рассмотрев основные архитектурные особенности микропроцессоров серии Intel. Все вычислительные устройства имеют некоторые общие и индивидуальные свойства архитектуры. Большинство типов ЭВМ построено на фон-неймановских правилах, основанных на следующем:

принципе хранимой программы, согласно которому программа и данные находятся в одном адресном пространстве;

линейное пространство памяти – совокупность ячеек памяти, которым последовательно присваиваются адреса;

последовательное выполнение программ, которое может быть изменено только командами условного и безусловного перехода и командами вызова подпрограмм.

Процессоры I80186/I88 не представляют нового поколения архитектуры. У них разрядность шины адреса – 20 бит, шины данных – 16 бит (у 80188

– 8 бит). Эти процессоры имеют встроенные контроллеры прерываний, прямого доступа к памяти, трехканальный таймер и генератор синхронизации. В них сокращено число тактов, необходимых для выполнения некоторых команд. Есть модификации со встроенными последовательными портами.

Для расширения вычислительных возможностей процессоров

8086/8088, 80186/80188 фирмой INTEL был разработан сопроцессор 8087,

получивший название NPX (Numeric Processor Extension). Его применение