292.89K
Категория: ПрограммированиеПрограммирование

FPU. Регистры

1.

FPU

2.

Регистры

3.

Адресация регистров

4.

Мнемоническое обозначение команд сопроцессора
Первая буква F
Вторая – тип операнда в памяти
i - целое двоичное
b - целое десятичное
пусто – вещественное
Последние p – выталкивание результата
(Пред)последняя r – реверс операндов

5.

Форматы команд
– Стековый
– Регистровый
– С памятью
FADD
FADD ST(1),ST
FADD mem64real

6.

Команды передачи данных
Основными командами передачи данных являются
команда FLD (загрузка данных в вершину стека сопроцессора);
команда FST (сохранение вершины стека сопроцессора в память)
Команды передачи данных можно разделить на следующие группы:
команды передачи данных в вещественном формате;
команды передачи данных в целочисленном формате;
команды передачи данных в двоично-десятичном формате.

7.

Команды передачи данных вещественного типа
Команда
Операнды
Пояснение
Описание
FLD
src
TOPSWR-=1; ST(0)=src;
Загрузка операнда в вершину
стека
FST
dst
dst=ST(0);
Сохранение вершины стека в
память
FSTP
dst
dst=ST(0); TOPSWR+=1;
Сохранение вершины стека в
память с выталкиванием
FXCH
ST(i)
ST(0) ↔ ST(i)
Обмен значений ST(0) и ST(i)

8.

Команды передачи данных целого типа
Команда
Операнды
Пояснение
Описание
FILD
src
TOPSWR-=1; ST(0)=src; Загрузка операнда в вершину стека
FIST
dst
dst=ST(0);
Сохранение вершины стека в
память
FISTP
dst
dst=ST(0); TOPSWR+=1;
Сохранение вершины стека в
память с выталкиванием

9.

Команды загрузки констант
Команда
Пояснение
Описание
FLDZ
TOPSWR-=1; ST(0)=0;
Загрузка 0
FLD1
TOPSWR-=1; ST(0)=1;
Загрузка 1
FLDPI
TOPSWR-=1; ST(0)=3.1415926535;
Загрузка π
FLDL2T
TOPSWR-=1; ST(0)=3.3219280948;
Загрузка log210
FLDL2E
TOPSWR-=1; ST(0)=1.4426950408;
Загрузка log2e
FLDLG2
TOPSWR-=1; ST(0)=0.3010299956;
Загрузка lg 2
FLDLN2
TOPSWR-=1; ST(0)=0.6931471805;
Загрузка ln 2

10.

Команды сравнения данных вещественного типа
Команда
Операнды
Пояснение
Описание
FCOM FUCOM
src
ST(0) — src
Вещественное сравнение
FCOMP FUCOMP
src
ST(0) — src; TOPSWR+=1;
Вещественное сравнение с
выталкиванием
FCOMPP FUCOMPP

ST(0) — ST(1); TOPSWR+=2;
Вещественное сравнение с двойным
выталкиванием
FCOMI FUCOMI
ST, ST(i)
ST(0) — ST(i)
Вещественное сравнение c
модификацией EFLAGS
ST(0) — ST(i); TOPSWR+=1;
Вещественное сравнение c
выталкиванием с модификацией
EFLAGS
FCOMIP FUCOMIP
ST, ST(i)
FXAM

Анализ ST(0)

11.

Команды FCOMI, FUCOMI
Условие
ZF
PF
CF
Переход
ST(0) > ST(i)
0
0
0
ja
ST(0) < ST(i)
0
0
1
jb
ST(0) = ST(i)
1
0
0
je
ST(0) >= ST(i)
*
0
0
jae
ST(0) <= ST(i)
*
0
*
jbe

12.

Арифметические команды вещественного типа
Команда
Операнды
Пояснение
Описание
FADD
dst, src
dst = dst + src;
Сложение вещественное
Сложение вещественное с
ST(i) = ST(i) + ST(0); TOPSWR+=1;
выталкиванием
FADDP
ST(i), ST(0)
FSUB
dst, src
FSUBP
ST(i), ST(0)
FSUBR
dst, src
FSUBRP
ST(i), ST(0)
FMUL
dst, src
FMULP
ST(i), ST(0)
FDIV
dst, src
FDIVP
ST(i), ST(0)
FDIVR
dst, src
Деление вещественное
Деление вещественное с
ST(i) = ST(i) / ST(0); TOPSWR+=1;
выталкиванием
dst = src /dst;
Деление вещественное реверсивное
FDIVRP
ST(i), ST(0)
ST(i) = ST(0) / ST(i); TOPSWR+=1;
dst = dst — src;
Вычитание вещественное
Вычитание вещественное с
ST(i) = ST(i) — ST(0); TOPSWR+=1;
выталкиванием
Вычитание вещественное
dst = src — dst;
реверсивное
Вычитание вещественное
ST(i) = ST(0) — ST(i); TOPSWR+=1;
реверсивное с выталкиванием
dst = dst * src;
Умножение вещественное
Умножение вещественное с
ST(i) = ST(i) * ST(0); TOPSWR+=1;
выталкиванием
dst = dst / src;
Деление вещественное реверсивное с
выталкиванием

13.

Дополнительные арифметические команды
Команда
Пояснение
Описание
FSQRT
ST(0) = √ST(0)
Вычисление квадратного корня
FABS
ST(0) = |ST(0)|
Вычисление модуля
FCHS
ST(0) = -ST(0)
Изменение знака
FXTRACT
temp = ST(0); ST(0)=порядок(temp); TOP-=1;
ST(0)=мантисса(temp);
Выделение порядка и мантиссы
FSCALE
ST(0) = ST(0) · 2ST(1)
Масштабирование по степеням 2
FRNDINT
ST(0)=(ST(0))
Округление ST(0)
ST(0)=ST(0)-Q*ST(1)
Частичный остаток от деления
FPREM
FPREM1

14.

Команды трансцендентных функций
Команда
Пояснение
Описание
FSIN
ST(0) = sin(ST(0))
Вычисление синуса
FCOS
ST(0) = cos(ST(0))
Вычисление косинуса
FSINCOS
temp=ST(0); ST(0)=sin(temp); TOP-=1; ST(0)=cos(temp);
Вычисление синуса и косинуса
FPTAN
ST(0)=tg(ST(0)); TOP-=1; ST(0)=1.0;
Вычисление тангенса
FPATAN
ST(1)=atan(ST(1)/ST(0)); TOP+=1;
Вычисление арктангенса
F2XM1
ST(0)=2ST(0)-1;
Вычисление выражения y=2x-1
FYL2X
x=ST(0); y=ST(1); TOP+=1; ST(0)=y*log2x;
Вычисление выражения y*log2x
FYL2XP1
x=ST(0); y=ST(1); TOP+=1; ST(0)=y*log2(x+1);
Вычисление выражения y*log2(x+1)

15.

Пример 1
int main()
{
static float a = 2.5;
static float b = 1.5;
static float c = 0;
__asm
{
finit
fld a
fld b
fadd
fstp c
}
}

16.

Пример 2
int main()
{
static float data[] = { 6.0, 2.0, 4.5, 3.2 };
static float c = 0;
// 6.0 * 2.0 + 4.5 * 3.2 <=> 6.0 2.0 * 4.5 3.2 * +
__asm
{
finit
fld data
fmul data + 4
fld data + 8
fmul data + 12
fadd
fstp c
}
}
English     Русский Правила