Машинные форматы команд
Команды формата а) передают данные в память и считывают их из памяти, включая соотв. передачи в командах управления FPU.
б) – арифметические операции и операции сравнения.
Поле формата MF (memory format) определяет тип операнда в памяти:
00 – вещественное, одинарная точность (32 бита)
01 – короткое целое двоичное (32 бита)
10 – вещественное, двойная точность (64 бита)
11 – целое слово (16 бит) или упакованное десятичное (80 бит)
в) арифметические операции и сравнения с привлечением регистрового стека FPU
Поле reg задаёт ST(i). Бит R (reverse) показывает, возвращается результат в вершину стека (R=0) или в другой регистр стека (R=1) , т.е. он показывает операции обратного вычитания и деления. Бит P (Pop) указывает, проводится ли операция извлечения из стека (P = 1 -> TOP + 1) или нет (P = 0)
г) Команды операций с константами, трансцендентные и доп. арифметические операции. Операнды определяются неявно кодом операции
д) Зарезервированы для команд управления FPU, которые не обращаются к памяти, как и в предыдущем случае – неявное определение операндов по КОП.
Команды FPU удобно разделить на 5 групп:
1) Команды передачи данных
2) Арифметические команды
3) Команды сравнения
4) Команды трансцендентных операций
5) Команды управления
Команды загрузки:
- декремент указателя стека (TOP--) | Похожи на PUSH
- передача адресуемого операнда в новую вершину стека ST(0)
FLD r/m – вещественное
FILD m – целое
FBLD m – целое десятичное
FLD ST(0) ;копирует вершину стека
FLD QWORD PTR [bx] ;загрузка длинного вещественного
FILD WORD PTR AR1[si] ; загрузка целого слова
Команды сохранения:
производят сохранение, т.е. передачу содержимого ST(0) в память без модификации указателя стека TOP в SW
FST r/m ;нельзя РТ
FST mem -> память только в форматах ОТ и ДТ
FIST m ;m -> ЦС или КЦ, нельзя ДЦ (не хватает КОП FPU)
Мантисса округляется в соответствии с полем RC и длинной мантиссы получателя, порядок корректируется с учётом длины и смещения формата получателя.
FST ST(4) ;ST(0) -> ST(4)
FIST WORD PTR MEM1 ;ST(0) -> MEM1 (целое слово)
FST DWORD PTR MEM2 ;ST(0) -> MEM2 (веществ.)
Команда обмена регистров FXCH reg – обменивает содержимое ST(0) с другим численным регистром. Поле ТОР в слове состояния не модифицируется. Например:
FXCH st(5) ; st(0) ß à st(5).
Команды включения в регистровый стек констант
FLDZ - Загрузить в стек +0.0
FLD1 - “ -------------------“ 1.0
FLDPI - “ ------------“ число Пи
FLDLG2 – “ ---------“ log10 (2)
FLDLN2 – “ ---------“ ln(2)
FLDL2T – “ ----------“ log2(10)
FLDL2E – “ ----------“ log2(e)
2. Арифметические команды
В мнемонике команд устройства с плавающей точкой приняты соглашения:
· первая буква всегда F (floating) и обозначает плавающую точку (в командах ЦП нет команд с такой начальной буквой)
· вторая буква I (integer) обозначает операцию с двоичным целым числом из памяти, буква В (Binary-coded decimal) – операцию с десятичным операндом из памяти, в других вариантах – операция с вещественными числами
· предпоследняя или последняя буква R указывает обратную операцию (для вычитания и деления)
· последняя буква Р (Рор) идентифицирует команду, заключительным действием которой является извлечение из стека.
Базовые арифметические команды +, - , *, / - имеют два операнда (источник и приёмник) и реализуют следующее действие:
приёмник ß (приёмник) операция (источник)
Для некоммуникативных операций вычитания ( - ) и деления ( / ) имеется обратный вариант команд:
приёмник ß (источник) операция (приёмник)
Во всех случаях один из операндов должен быть в регистре ST(0) - вершине стека. Например:
FADD ; st(0) + st(1) à st(0)
FADD qword ptr [bx] ; st(0) + квадрослово (64бита) из памяти à st(0)
FADD mem1
FADDP ; st(1) + st(0) à st(1) , TOP++ , st(1) à st(0)
Мнемоника базовых арифметических команд
Вещественное, Стек | Целое | С извлечением | Операция |
FADD | FIADD | FADDP | Сложение ( + ) |
FSUB | FISUB | FSUBP | Вычитание ( - ) |
FSUBR | FISUBR | FSUBRP | Обратное вычитание |
FMUL | FIMUL | FMULP | Умножение ( * ) |
FDIV | FIDIV | FDIVP | Деление ( / ) |
FDIVR | FIDIVR | FDIVRP | Обратное деление |
Рассмотрим подробнее команду вычитания.
Безоперандная форма FSUB ; [st(0), st(1)] à st(0) – st(1) à st(0);
FSUB mem32/64 ; mem – операнд в памяти одинарной или двойной точности. Действие: st(0) – [mem] à st(0).
FSUB op1, op2 ; где ор1 – st(0) |st(i) и ор2, соответственно, st(i)|st(0);
1) st(0) – st(i) à st(0)
2) st(i) – st à st(i)
Пример:
.DATA
x dd 20.0
y dd 5.0
.CODE
…
…
FLD x ; st = 20.0
FSUB y ; st = 15.0
FLD y ; st = 5, st(1) = 15.0
FSUB st(1), st(0) ; st = 5.0, st(1) = 10.0
FSUBP ; вычитание с выталкиванием из стека
Действие: st(1) – st(0) à st(1) ; TOP++ à rezultat st(0)
Отметим, что команда FSUB , выполняющая то же ( st(1) – st(0) à st(1) ), транслируется в команду FSUBP st(1), st(0) а не в FSUB st(1), st
FSUBP st(i) ; st(i) - уменьшаемое, действие:
st(i) – st à st(i); TOP++; после чего результат в st(i-1);
FSUBP st(i), st(0) ; аналог предыдущей команды.
Пример:
.DATA
x dd 20.0
y dd 5.0
.CODE
….
….
FLD x ; st(0) = 20.0
FLD y ; st(0) = 5; st(1) = 20.0
FSUBP ; st(0) = 15.0 ; (st = 5, st(1) = 15, TOP++ , st =15.)
FLD y ; st = 5.0, st(1) =15.
FSUBP st(1), st(0) ; st(0) =10.0
FSUBR - обратное вычитание вещественных чисел. Действие:
st(1) – st(0) à st(0)
FSUBR mem32/64 ; [ mem32/64 ] – st à st
FSUBR st(0), st(i) ; st(i) - st à st
FSUBR st(i), st ; st – st(i) à st(i)
Пример:
.DATA
x dd 20.0
y dd 5.0
.CODE
……….
FLD y ; st(o) = 5.0
FSUBR x ; st(o) = 15.0
FLD x ; st = 20.0; st(1) = 15.0
FSUB st(1), st ; st(1) = -5.0; st = 20.0
FSUBRP ; обратное вычитание с выталкиванием из стека
st(1) - st à st(1) ; TOP ++ , st(1) à st(0).
FSUBRP st(i), st ; st– st(i) à st(i); TOP++ ; st(i) à st(i-1).
Другие команды преобразования данных:
FABS ; | st(0) | à st(0),
FCHS ; изменить знак числа в st(0),
FRNDINT ; округлить число в вершине стека до целого в соответствии с режимом округления в поле RC слова состояния,
FSCALE ; масштабировать st(0) по степеням двойки ( в st(1)), т.е. st(0)= st(0) * 2 st(1) , при этом значение st(1) предварительно округляется в сторону нуля до ближайшего целого.
FXTRACT ; приведенный порядок st(0) (экспонента) à st(0) , TOP --, мантисса à st(0), экспонента окажется в st(1).
FSQRT ; корень квадратный из числа в st(0) à st(0).
Команды сравнения
Предназначены для анализа числа в вершине стека и формированию кода условия в слове состояния SW ( C0, C2, C3 ). К ним относятся сравнение, проверка (или сравнение с нулём) и анализ (получение подробной информации о числе). Имеются специальные формы команд, допускающие сравнение с целым или вещественным числом, находящимся в памяти, и извлечение из стека после сравнения. Проверить образованный код условия может только целочисленное устройство (ЦП). После выполнения команд FSTSW ax и SAHF биты C3, C2 и C0 оказываются во флагах ZF, PF, СF EFLAGS .
FCOM ; st - st(1) à C3, C2, C0
FCOM op ; st – op à C3,C2, C0 ; op - st(i) или операнд в памяти одинарной или двойной точности.
Условие | С3 | С2 | С0 |
ST(0) > op | |||
ST(0) < op | |||
ST(0) = op | |||
несравнимы |