Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ассемблеру, 1ый семестр (Гончаревич А Л) [3131 вопросов] / шпоры-1 / 20 Система команд математического сопроцессора..docx
Скачиваний:
50
Добавлен:
15.06.2014
Размер:
27.67 Кб
Скачать

Арифметические команды

Команды сопроцессора, входящие в группу арифметических команд, реализуют четыре основные арифметические операции — сложение, вычитание, умножение и деление. Имеется также несколько дополнительных команд, предназначенных для повышения эффективности использования основных арифметических команд. С точки зрения типов операндов арифметические команды сопроцессора можно разделить на команды, работающие с вещественными и целыми числами. Рассмотрим их.

Целочисленные арифметические команды

Целочисленные арифметические команды предназначены для работы на тех участках вычислительных алгоритмов, где в качестве исходных данных используются целые числа в памяти в формате слово и короткое слово, имеющие размерность 16 и 32 бита.

При рассмотрении целочисленных арифметических команд обратите внимание на большую гибкость задания операндов в этих командах.

FIADD источник — команда складывает значения ST(0) и целочисленного источника, в качестве которого выступает 16- или 32-разрядный операнд в памяти.Результат сложения запоминается в регистре стека сопроцессора ST(0).

FISUB источник — команда вычитает значение целочисленного источника из ST(0). Результат вычитания запоминается в регистре стека сопроцессора ST(0). В качестве источника выступает 16- или 32-разрядный целочисленный операнд в памяти.

FIMUL источник — команда умножает значение целочисленного источника на содержимое ST(0). Результат умножения запоминается в регистре стека сопроцессора ST(0). В качестве источника выступает 16- или 32-разрядный целочисленный операнд в памяти.

FIDIV источник — команда делит содержимое ST(0) на значение целочисленного источника. Результат деления запоминается в регистре стека сопроцессора ST(0). В качестве источника выступает 16- или 32-разрядный целочисленный операнд в памяти.

Для команд, реализующих арифметические действия деления и вычитания, важен порядок расположения операндов. По этой причине система команд сопроцессора содержит соответствующие реверсивные команды, повышающие удобство программирования вычислительных алгоритмов. Чтобы отличить эти команды от обычных команд деления и вычитания, их мнемокоды оканчиваются символом R.

FISUBR источник — команда вычитает значение ST(0) из целочисленного источника. Результат вычитания запоминается в регистре стека сопроцессора ST(0). В качестве источника выступает 16- или 32-разрядный целочисленный операнд в памяти.

FIDIVR источник — команда делит значение целочисленного источника на содержимое 5Г(0). Результат деления запоминается в регистре стека сопроцессора ST(0). В качестве источника выступает 16- или 32-разрядный целочисленный операнд в памяти.

Команды управления сопроцессором

Последняя группа команд предназначена для общего управления работой сопроессора. Команды этой группы имеют особенность — перед началом своего выполнения они не проверяют наличие незамаскированных исключений.

Команда WAIT/FWAIT — это команда ожидания. Она предназначена для синхронизации работы процессора и сопроцессора. Так как основной процессор и сопроцессор работают параллельно, то может создаться ситуация, когда за командой сопроцессора, изменя ющей данные в памяти, следует команда основного процессора, которой эти данные требуются. Чтобы синхронизировать работу этих команд, необходимо включит з между ними команду WAIT/FWAIT. Встретив данную команду в потоке команд, основной процессор приостановит свою работу до тех пор, пока не поступит аппаратный сигнал о завершении очередной команды в сопроцессоре. Здесь есть еце один эффект, отмеченный ранее. Он касается корректной обработки исключений и связанной с ними информации. Далее с необходимой степенью подробности будут рассмотрены команды, входящие в группу команд управления. Некоторые из этих команд мы уже применя-

ли в программах этой главы.

Из всех команд управления первой логично рассмотреть команду, приводящую сопроцессор в некоторое начальное состояние, — это команда инициализации сопроцессора FINIT/FNINIT. Она инициализирует управляющие регистры сопроцессора определенными значениями.

и Регистр управления CWR инициализируется числом 037h, что означает установку режимов:

RC = 00 — округление к ближайшему целому; поле управления точностью PC = 11 — максимальная точность (64 бита).

Регистр состояний SWR инициализируется нулевым значением, что означает отсутствие исключений и указание на то, что физический регистр стека сопроцессора RO является вершиной стека и соответствует логическому регистру ST(0). Регистр тегов TWR инициализируется единичным значением — это означает, что все регистры стека сопроцессора пусты.

Регистры указателей данных DPR и команд IPR инициализируются нулевыми

значениями.

Следующие две команды работают с регистром состояния SWR.

FSTSW/FNSTSW ах — команда сохранения содержимого регистра состояния SWR в регистре АХ. Эту команду целесообразно использовать для подготовки к условным переходам по описанной при рассмотрении команд сравнения схеме.

FSTSW/FNSTSW приемник — команда сохранения содержимого регистра состояния SWR в ячейке памяти. От рассмотренной ранее команда отличается типом операнда — теперь это ячейка памяти размером два байта (в соответствии с размерностью регистра SWR).

Обратите внимание на то, что команды, работающие с регистром SWR, выполняют только считывание содержимого этого регистра. Запись не предусмотрена,так как она попросту не требуется за исключением, возможно, поля ТОР, которое является указателем текущей вершины стека.

Следующие две команды, работающие с информацией в регистре управления CWR, напротив, поддерживают действие записи и чтения содержимого этого регистра.

FSTCW/FNSTCW приемник — команда сохранения содержимого регистра управления CWR в ячейке памяти размером два байта. Эту команду целесообразно использовать для анализа полей маскирования исключений, управления точностью и округления. Следует заметить, что операндом не является регистр АХ, в отличие от команды FSTSW/FNSTSW.

FLDCW источник — команда загрузки значения ячейки памяти размером 16 битов в регистр управления CWR. Эта команда выполняет действие, противоположное действию команды FSTCW/FNSTCW. Команду FLDCW целесообразно использовать для задания или изменения режима работы сопроцессора. Следует отметить, что если в регистре состояния SWR установлен любой бит исключения, то попытка загрузки нового содержимого в регистр управления CWR приведет к возбуждению исключения. По этой причине необходимо перед загрузкой ре-

гистра CWR сбросить все флаги исключений в регистре SWR.

Следующая команда — команда без операндов FCLEX/FNCLEX — позволяет сбросить флаги исключений в регистре состояния SWR сопроцессора, которые, в частности, необходимы для корректного выполнения команды FLDCW. Ее также применяют в случаях, когда необходимо сбрасывать флаги исключений в регистре SWR, например, в конце подпрограмм обработки исключений. Если этого не делать, то при исполнении первой же команды сопроцессора прерванной программы (кроме тех команд, которые имеют в названии своего мнемокода второй символ л) опять возбуждается исключение.

Как мы отметили ранее, сопроцессор имеет две команды, которые работают

с указателем стека в регистре SWR.

• FINCSTP — команда!увеличения указателя стека на единицу (поле ТОР) в регистре SWR. Команда не имеет операндов. Действие команды FINCSTP подобно действию команды FSF, но она извлекает значение операнда из стека «в никуда». Таким образом, эту команду можно использовать для выталкивания ставшего ненужным операнда из вершины стека. Команда работает только с полем ТОР и не изменяет соответствующее данному регистру поле в регистре тегов TWR, то есть регистр остаемся занятым и его содержимое из стека не извлекается.

• FDECSTP — команд^ уменьшения указателя стека (поле ТОР) в регистре SWR. Команда не имеет операндов. Действие команды FDECSTP подобно действию команды FLD, но она| не помещает значения операнда в стек. Таким образом, эту команду можно использовать для проталкивания внутрь стека операндов, ранее включенных ^ него. Команда работает только с полем ТОР и не изменяет соответствующее [данному регистру поле в регистре тегов TWR, то есть регистр остается пустым.

Следующая комайда, FFREE st(i), помечает любой регистр стека сопроцессора как пустой. Это команда освобождения регистра стека ST(i). Команда записывает в поле регистра тегов|, соответствующего регистру ST(i), значение 1 lb, что соответствует пустому регистру. При этом указатель стека (поле ТОР) в регистре SWR и содержимое самого регистра не изменяются. Применяя эту команду, помните, что ST(i) — это относительный, а не физический номер регистра стека сопроцессора.