Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

FLDCW CW    ; загрузка регистра управления




FLD1

FLDPI

. . .

FSTP B

MOV BX, OFFSET C

FST QWORD PTR [BX]

MOV DI, OFFSET D

FSTP TBYTE PTR [DI]

FIST A

MOV SI, OFFSET B

FISTP DWORD PTR B

FISTP C

FXCH

FXCH ST(2)

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

Арифметические команды сложения, вычитания, умножения и деления имеют две формы: с выталкиванием из стека и без выталкивания. Команды с выталкиванием из стека (мнемоническое обозначение заканчивается на букву ‘P’) выталкивают из стека значение операнда после записи результата в стек.

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

< команда> ST, < регистр>

или

< команда> < регистр>, ST

В указанный регистр или регистр ST(0) помещается результат выполнения операции над двумя регистрами. Например:

< команда> ST, ST(1)

В этом примере результат выполнения операции над регистрами ST(0) и ST(1) помещается в регистр ST(0). Во втором случае синтаксис команды такой:

 

< команда> < операнд>

Операнд может быть ячейкой памяти размером 4 байта для одинарной точности или 8 байт для двойной точности.

    Команды с выталкиванием из стека имеют следующий синтаксис:

< команда> < регистр>, ST

Сначала производится арифметическая операция, результат выполнения операции записывается в указанный регистр, а затем из стека выталкивается значение операнда (регистр ST(0)). Пример:

< команда> ST(2), ST

В этом примере производится арифметическая операция над регистрами ST(0) и ST(2), результат записывается в регистр ST(2), а затем из стека выталкивается значение операнда (регистр ST(0)).

    В таблице 13 представлены арифметические команды сопроцессора.

 

Таблица 13

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

Арифметическая операция Формы команды Синтаксис Выполняемые действия

Сложение

FADD

FADD < ST>, < регистр> ST: = ST + регистр
FADD < регистр>, ST регистр: = регистр + ST
FADD < операнд> ST: = ST + операнд
FADDP FADDP < регистр>, ST регистр: = регистр + ST, выталкивание из стека

Вычитание

FSUB

FSUB < ST>, < регистр> ST: = ST – регистр
FSUB < регистр>, ST регистр: = регистр – ST
FSUB < операнд> ST: = ST – операнд
FSUBP FSUBP < регистр>, ST регистр: = регистр – ST, выталкивание из стека

Умножение

FMUL

FMUL < ST>, < регистр> ST: = ST * регистр
FMUL < регистр>, ST регистр: = регистр * ST
FMUL < операнд> ST: = ST * операнд
FMULP FMULP < регистр>, ST регистр: = регистр * ST, выталкивание из стека

Деление

FDIV

FDIV < ST>, < регистр> ST: = ST / регистр
FDIV < регистр>, ST регистр: = регистр / ST
FDIV < операнд> ST: = ST / операнд
FDIVP FDIVP < регистр>, ST регистр: = регистр / ST, выталкивание из стека

 

    Примеры использования команд:

X DD 0. 1                ; определение числа X

Y DD –0. 5     ; определение числа Y

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FADDP ST(1), ST  ; ST(1): = ST(1) + ST(0),

; выталкивание операнда

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FSUB ST, ST(1); ST(0): = ST(0) – ST(1)

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FMUL ST(1), ST; ST(1): = ST(1) * ST(0)

. . .

FLD X                     ; загрузка числа X

FDIV Y                   ; ST(0): = ST(0) / Y

    Команда FSQRT извлекает квадратный корень из значения регистра ST(0) и помещает результат в регистр ST(0). Пример использования команды FSQRT:

X DQ 225. 0   ; определение числа X

. . .

FLD X           ; загрузка числа X

FSQRT          ; извлечение корня

    Команда FSCALE умножает значение регистра ST(0) на двойку в степени значения регистра ST(1) и записывает результат в регистр ST(0), или ST(0): = ST(0) * 2ST(1). При этом значение степени числа 2 округляется до наименьшего целого числа.

Пример использования команды FSCALE:

X DQ 1. 25     ; определение числа X

Y DQ 64. 0     ; определение числа Y

. . .

FLD Y                     ; загрузка числа Y

FLD X                     ; загрузка числа X

FSCALE                 ; ST(0): = X * 2Y

    Команда FABS помещает в регистр ST(0) абсолютное значение регистра ST(0), или ST(0): = |ST(0)|. Пример использования команды FABS:

X DQ –1. 0     ; определение числа X

. . .

FLD X                     ; загрузка числа X

FABS                               ; вычисление абсолютного значения

    Команда FCHS изменяет знак числа в регистре ST(0) на противоположный и помещает результат в регистр ST(0), или ST(0): = –ST(0). Пример использования команды FCHS:

X DQ 100. 0            ; определение числа X

. . .

FLD X                     ; загрузка числа X

FCHS                               ; изменение знака

Команда FPREM вычисляет остаток от деления ST(0) на ST(1) по формуле , при этом значение остатка помещается в вершину стека, а содержимое регистра ST(1) не изменяется. Команда не имеет операндов.

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

    Команда FPATAN вычисляет значение арктангенса. При этом вычисляется значение арктангенса частного значений регистров ST(1) и ST(0). Результат заносится в регистр ST(1), после чего из стека выталкивается операнд. Таким образом, после выполнения команды FPATAN в регистре ST(0) оказывается вычисленное значение арктангенса. Результат выполнения команды FPATAN имеет знак операнда в регистре ST(1) и по модулю не превосходит числа p.

    Пример использования команды FPATAN:

X DQ 2. 0                ; определение числа X

Y DQ 1. 0                ; определение числа Y

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FPATAN                ; ST(0): = atan(X / Y)

    Команда FPTAN вычисляет значение тангенса. Операндом является регистр ST(0). Результат вычисления тангенса записывается в регистр ST(0) и в стек заносится 1. Таким образом, после выполнения команды FPTAN в регистре ST(0) оказывается 1, а в регистре ST(1) – вычисленное значение тангенса. Операнд команды должен быть в пределах от –263 до +263.

    Пример использования команды FPTAN:

X DD 1. 0       ; определение числа X

. . .

FLD X                     ; загрузка числа X

FPTAN                   ; ST(0): = 1, ST(1): = tan(X)

    Команда F2XM1 вычисляет значение функции 2x – 1. Операндом является регистр ST(0). Результат вычисления значения функции заносится в регистр ST(0). Значение операнда должно быть в пределах от –1. 0 до +1. 0, в противном случае результат выполнения команды будет иметь неопределенное значение.

    Пример использования команды F2XM1:

X DQ 0. 5                ; определение числа X

. . .

FLD X                     ; загрузка числа X

F2XM1                   ; ST(0): = 2X-1

    Команда FYL2X вычисляет значение функции y * log2(x). Операндом y является регистр ST(1), а операндом x – ST(0). Результат вычисления значения функции заносится в регистр ST(1), после чего из стека выталкивается операнд. Таким образом, после выполнения команды FYL2X в регистре ST(0) оказывается вычисленное значение функции. Операнд ST(0) должен быть положительным ненулевым числом.

    Пример использования команды FYL2X:

X DQ 4. 0                ; определение числа X

Y DQ 2. 0                ; определение числа Y

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FYL2X                    ; ST(0): = Y * log2(X)

Команда FYL2XP1 вычисляет значение функции y * log2(x + 1). Операндом y является регистр ST(1), а операндом x – ST(0). Результат вычисления значения функции заносится в регистр ST(1), после чего из стека выталкивается операнд. Таким образом, после выполнения команды FYL2XP1 в регистре ST(0) оказывается вычисленное значение функции. Операнд ST(0) должен быть положительным ненулевым числом.

    Пример использования команды FYL2X P1:

X DD 32. 0     ; определение числа X

Y DD 0. 5                ; определение числа Y

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FYL2X                    ; ST(0): = Y * log2(X + 1)

    Команды сравнения данных позволяют сравнивать между собой значения регистров стека сопроцессора и операндов из памяти. Результаты сравнения определяются флагами условий C0, C2 и C3. Все команды сравнения выполняют сравнение значений регистра ST(0) и какого-либо другого регистра или ячейки памяти. Значения флагов условий C0, C2 и C3 в зависимости от результатов сравнения представлены в табл. 14.

Таблица 14

Интерпретация значений флагов условий

Условие C0 C2 C3
ST(0) > SRC
ST(0) < SRC
ST(0) = SRC
Особый случай

SRC – это второй операнд, с которым производится сравнение. Им может быть регистр стека сопроцессора или ячейка памяти. Особым случаем является сравнение операндов, один из которых является нечисловым значением NaN или не может быть сравнен с другим операндом. Если флаг IM сброшен, то флаги условий при возникновении особого случая не устанавливаются.

    В таблице 15 представлены команды сравнения данных сопроцессора

Таблица 15

Команды сравнения данных сопроцессора

Команда сравнения Операнд Назначение
FCOM   сравнение ST(0) и ST(1)
FCOM память сравнение ST(0) и значения ячейки памяти
FCOMP память сравнение ST(0) и значения ячейки памяти, выталкивание из стека операнда
FCOMPP   сравнение ST(0) и ST(1) и выталкивание из стека двух операндов
FTST   сравнение ST(0) с 0. 0

 

    Примеры использования команд сравнения данных сопроцессора:

X DD 1. 0                ; определение числа X

Y DD 1. 01     ; определение числа Y

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FCOM                              ; сравнение ST(0) и ST(1)

. . .

FLD X               ; загрузка числа X

FCOMP Y               ; сравнение ST(0) и Y

. . .

FLD Y                     ; загрузка числа Y

FTST                                ; сравнение Y с 0. 0

. . .

FLD X                     ; загрузка числа X

FLD Y                     ; загрузка числа Y

FCOMPP                ; сравнение X и Y

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

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

1. В регистр управления сопроцессора заносится значение 037FH (округление до ближайшего представимого числа, расширенная точность, все особые случаи замаскированы).

2. В регистр состояния заносится значение 0000H (флаги особых случаев сброшены, вершина стека установлена в 0).

3. Все регистры стека сопроцессора помечаются в регистре признаков как пустые. Сами значения регистров стека не изменяются.

4. В регистр указателя команды заносится значение 0000H.

5. В регистр указателя операнда заносится значение 0000H.

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

    Команда FSTSW сохраняет значение регистра состояния сопроцессора в 2-х байтовой ячейке памяти. Синтаксис команды:

FSTSW < адресное_выражение>

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

    Примеры использования команды FSTSW:

SW DW?       ; переменная для сохранения значения

. . .

MOV BX, OFFSET SW   ; настройка BX на SW

FSTSW [BX] ; сохранение значения регистра состояния

    Команда FLDCW загружает в регистр управления сопроцессора слово из памяти. Синтаксис команды:

FLDCW < адресное_выражение>

В качестве адресного выражения может использоваться прямая или косвенная адресация памяти. Тип операнда можно не указывать, так как он известен заранее. Команда FLDCW вместе с командой FSTCW может использоваться для установки необходимых режимов работы сопроцессора (точность, управление округлением, маски особых случаев).

    Пример использования команды FLDCW:

CW DW?                          ; переменная для загрузки

                                         ; регистра управления

. . .

FLDCW CW                    ; загрузка регистра управления

                                         ; сопроцессора

    Команда FSTCW сохраняет значение регистра управления сопроцессора в ячейке памяти. Синтаксис команды:

FSTCW < адресное_выражение>

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

    Пример использования команды FSTCW:

CW DW?                          ; переменная для сохранения

                                         ; регистра управления

. . .

FSTCW CW                     ; сохранение регистра управления сопроцессора

 

    Пример использования команд FLDCW и FSTCW для установки двойной точности и округления в сторону нуля:

CW DW?                    ; переменная для сохранения регистра управления

. . .

FSTCW CW               ; сохранение регистра управления

OR CW, 0000111000000000B ; установка нужного режима работы

FLDCW CW               ; загрузка регистра управления

    Команда FCLEX сбрасывает в регистре состояния сопроцессора флаги особых случаев (PE, OE, UE, ZE, DE и IE), флаг суммарной ошибки ES, флаг ошибки стека SF и флаг занятости B.

    Команда FSAVE сохраняет в памяти значения всех числовых и нечисловых регистров сопроцессора и затем повторно инициализирует сопроцессор. Формат, в котором команда FSAVE записывает значения нечисловых регистров в память, представлен ниже.

 

Регистр управления

Регистр состояния

Регистр признаков

Указатель команды (биты 0 – 15)

Указатель команды (биты 16 – 31)

Указатель операнда (биты 0 – 15)

Указатель операнда (биты 16 – 31)

 

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

FSAVE < адресное_выражение>

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

Пример использования команды FSAVE:

; область памяти для сохранения регистров

S DB (14 + 10 * 8) DUP (? )

. . .

; сохранение значений регистров сопроцессора

FSAVE S  

    Команда FRSTORE заносит в регистры сопроцессора значения, ранее сохраненные командой FSAVE. Синтаксис команды FRSTORE – такой же, как у команды FSAVE.

    Пример использования команды FRSTORE:

; область памяти для сохранения регистров

S DB (14 + 10 * 8) DUP (? )

. . .

; сохранение значений регистров сопроцессора

FSAVE S  

; восстановление значений регистров сопроцессора

FRSTORE S

    Команда FFREE помечает регистр стека сопроцессора как свободный. Эта команда заносит код 11B в регистр признаков сопроцессора для указанного регистра стека. Синтаксис команды:

FFREE ST(i)

i – целое число от 0 до 7, определяющее необходимый регистр стека сопроцессора. При выполнении команды FFREE содержимое указанного регистра и значение указателя стека не изменяются.

    Пример использования команды FFREE:

FFREE ST(0)

FFREE ST(1)

FFREE ST(2)

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...