Машинные форматы команд

 

 

Команды формата а) передают данные в память и считывают их из памяти, включая соотв. передачи в командах управления 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
несравнимы