Система команд сопроцессора
Возможны три формата команд сопроцессора, аналогичные форматам команд центральных процессоров 8086/80286/80386. Это команды с обращением к оперативной памяти, команды с обращением к одному из численных регистров и команды без операндов, заданных явным образом.
Команды с обращением к памяти могут занимать от двух до четырех байтов, в зависимости от способа адресации операнда, находящегося в памяти:
¦1 байт ¦1 байт ¦1 байт ¦1 байт ¦ +-----T----+---T----T---+-----------+-----------+ ¦11011¦КОП1¦MOD¦КОП2¦R/M¦ Смещение1 ¦ Смещение2 ¦ L-----+----+---+----+---+-----------+------------
Первые пять битов соответствуют команде центрального процессора ESC. Поля КОП1 и КОП2 определяют выполняемую команду, т.е. содержат код операции. Поля MOD и R/M вместе с полями "Смещение1" и "Смещение2" задают адрес операнда в памяти аналогично тому, как это происходит в процессорах 8086/80286/80386. Однако есть и отличия, связанные с возможностью адресации численных регистров сопроцессора.
Приведем таблицу, показывающую зависимость способа адресации от содержимого полей MOD и R/M:
-----T----------------------------------------------¬ ¦Поле¦ Поле MOD ¦ ¦R/M +---------T---------------T----------------T---+ ¦ ¦ 00 ¦ 01 ¦ 10 ¦11 ¦ +----+---------+---------------+----------------+---+ ¦000 ¦(bx)+(si)¦(bx)+(si)+disp8¦(bx)+(si)+disp16¦ST0¦ ¦001 ¦(bx)+(di)¦(bx)+(di)+disp8¦(bx)+(di)+disp16¦ST1¦ ¦010 ¦(bp)+(si)¦(bp)+(si)+disp8¦(bp)+(si)+disp16¦ST2¦ ¦011 ¦(bp)+(di)¦(bp)+(di)+disp8¦(bp)+(di)+disp16¦ST3¦ ¦100 ¦ (si) ¦ (si)+disp8 ¦ (si)+disp16 ¦ST4¦ ¦101 ¦ (di) ¦ (di)+disp8 ¦ (di)+disp16 ¦ST5¦ ¦110 ¦ disp16 ¦ (bp)+disp8 ¦ (bp)+disp16 ¦ST6¦ ¦111 ¦ (bx) ¦ (bx)+disp8 ¦ (bx)+disp16 ¦ST7¦ L----+---------+---------------+----------------+----
Если в таблице указаны значения смещения disp8 или disp16, это означает, что в команде присуствует один или два байта смещения, соответственно.
Если поле MOD содержит значение 11, возможна адресация численных регистров ST0...ST1. При этом команда не содержит байтов смещения.
Формат команды с обращением к численному регистру приведен на следующем рисунке:
¦1 байт ¦1 байт ¦ +-----T----+---T----T---+ ¦11011¦КОП1¦11 ¦КОП2¦STi¦ L-----+----+---+----+----
Видно, что это есть частный случай предыдущей команды, в которой поле MOD содержит значение 11 и отсутствуют байты смещения.
Самый простой формат имеют команды без явного обращения к операндам:
¦1 байт ¦1 байт ¦ +-----T----+---T--------+ ¦11011¦КОП1¦11 ¦ КОП2 ¦ L-----+----+---+---------
Разумеется, если вы пишете программу для сопроцессора на языке ассемблера, вы можете использовать мнемоническое обозначение команд. Все мнемоники команд сопроцесора начинаются с буквы F, поэтому их легко отличить от команд процессоров 8086/80286/80386/80486.
Все команды сопроцессора можно разделить на несколько групп:
Команды пересылки данных предназначены для загрузки чисел из оперативной памяти в численные регитры, записи данных из численных регистров в операивную память, копирования данных из одного численного регистра в другой.
Арифметические команды выполняют такие операции, как сложение, вычитание, умножение, деление, извлечение квадратного корня, нахождение частичного остатка, округление и т.п.
Команды сравнения сравнивают вещественные и целые числа, выполняют анализ чисел.
Трансцендентные команды предназначены для вычисления различных тригонометрических, логорифмических, показательных и гиперболических функций - sin(), cos(), tg() и т.п.
Последняя группа команд - управляющие команды - обеспечивают установку режима работы арифметического сопроцессора, его сброс и инициализацию, перевод сопроцессора в защищенный режим работы и т.д.
Следующие разделы будут посвящены детальному описанию различных групп команд сопроцессора.