-
Notifications
You must be signed in to change notification settings - Fork 0
Математический сопроцессор. Классификация команд
- Пересылки данных
- Базовая арифметика
- Сравнения
- Трансцендентные операции
- Константы
- Управление
- CPUID
Команды взаимодействия со стеком (загрузка-выгрузка вещественного числа, целого, BCD)
-
FLD
- загрузить вещественное число из источника (переменная или ST(n)) в стек. Номер вершины вSR
увеличивается -
FST
/FSTP
- скопировать/считать число с вершины стека в приемник -
FILD
- преобразовать целое число из источника в вещественное и загрузить в стек -
FIST
/FISTP
- преобразовать вершину в целое и скопировать/считать в приемник -
FBLD
/FBSTP
- загрузить/считать десятичное BCD-число -
FXCH
- обменять местами 2 регистра (вершину и источник) стека
Есть аналоги вычитания, деления обратных команд, когда делится второй аргумент на первый. TODO
-
FADD
,FADDP
,FIADD
- сложение, сложение с выдавливанием из стека, сложение целых. Один из операндов - вершина стека. -
FSUB
,FSUBP
,FISUB
- вычитание, аналогично сложению. -
FSUBR
,FSUBRP
,FISUBR
- обратное вычитание (приемник из источника) -
FMUL
... - умножение -
FDIV
... - деление -
FDIVR
... - обратное деление -
FPREM
- найти частичный остаток от деления (делится ST(0) на ST(1)). Остаток ищется цепочкой вычитаний, до 64 раз. -
FABS
- модуль -
FCHS
- изменить знак -
FRNDINT
- округлить до целого -
FSCALE
- масштабировать по степени двойки (ST(0) * 2ST(1)) -
FXTRACT
- извлечь мантиссу и экспоненту. ST(0) разделяется на мантиссу и экспоненту, мантисса дописывается на вершину стека. -
FSQRT
- квадратный корень ST(0)
По результатам команд сопроцессора могут выставляться как основные флаги процессора, так и дополнительные в регистре SR.
FCOMP
, FCOMPP
выталкивают одно или сразу 2 числа с вершины стека.
Сравниваем 2 числа на вершине стека между собой - можем их там оставить или извлечь.
-
FCOM
,FCOMP
,FCOMPP
- сравнить и вытолкнуть из стека -
FUCOM
,FUCOMP
,FUCOMPP
- сравнить, без учета порядков и вытолкнуть -
FICOM
,FICOMP
,FICOMPP
- сравнить целые -
FCOMI
,FCOMIP
,FUCOMI
,FUCOMIP
- появились в pentium. -
FTST
- сравнение с нулем. -
FXAM
- выставить флаги в соответствии с типом числа.
К подобным операциям относится вычисление синуса, косинуса и т.п.
Операндом обычно выступает значение в радианах, при этом не во всем диапазоне (нельзя давать слишком большие углы).
FSIN
FCOS
-
FSINCOS
- вычислить синус и косинус одновременно -
FPTAN
- вычислить тангенс -
FPATAN
- вычислить арктангенс -
F2XM1
- вычислить 2^x - 1 -
FYL2X
- вычислить y * log2(x) -
FYL2XP1
- вычислить y * log2(x + 1)
Загрузка констант на вершину стека
- FLD1 - загрузить 1
- FLDZ - загрузить 0
- FLDPI - загрузить PI
- FLDL2E - загрузить log2(e)
- FLDL2T - загрузить log2(10)
- FLDLG2 - загрузить lg(2)
- FLDLN2 - загрузить ln(2)
Предусмотрены команды прямого изменения указателя вершины стека, сохранения/изменения состояние сопроцессора. По-хорошему, FINIT должна вызываться первой, при желании поработать с сопроцессором (она очистит все регистры от данных, пометив их пустыми, регистры CR и SR - значениям по умолчанию). FSAVE и FRSTOR сохраняет 94 или 108 байт в зависимости о разрядности машины.
-
FINCSTP
,FDECSTP
- увеличить/уменьшить указатель вершины стека -
FFREE
- пометить регистр как пустой -
FINIT
,FNINIT
- инициализировать дефолтными значениями -
FCLEX
,FNCLEX
- очистить регистры CR и SR и флаги исключений ...
CPUID сообщает информацию о производителе, типе, модификации процессора и о наличии различных расширений. Ее параметром является регистр EAX.
- Если
EAX=0
то в качестве результата возвращается следующее-
EAX
- максимальное значение (1 или 2) -
EBX:ECX:EDX
- 12-байтный идентификатор производителя процессора (ASCII-строчка)
-
- Если
EAX=1
то возвращается следующее-
EAX
- версия процессора -
EDX
32-разрядная информации о допустимых расширениях- наличие FPU
- поддержка v86
- поддержка точек останова
- CR4 - дополнительный регистр управления
- расширение адресации PAE
- APIC
- быстрые системные вызовы
- POE
- машинно-специфический регистр
- команды условной пересылки данных CMOVcc
- MMX
- FXSR (MMX2)
- SSE
-
- Если
EAX=2
, то в EAX, EBX, ECX, EDX возвращается информация о существующих механизмах кэширования и поддержке TLB.
- Неточный результат - произошло округление по правилам, заданным в CR. Бит в SR хранит направление округления.
- Антипереполнение - переход в денормализованное число
- Переполнение - переход в "бесконечность" соответствующего знака
- Деление на ноль - переход в "бесконечность" соответствующего знака
- Денормализованный операнд
- Недействительная операция