45. Арифметические команды сопроцессора

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

Арифметические команды имеют следующий формат Fppp (для вещественных операндов) или FIppp (для целочисленных операндов), где ррр может принимать значения:

  • ADD – сложение
  • SUB – вычитание
  • SUBR – обратное вычитание
  • MUL – умножение
  • DIV – деление
  • DIVR – обратное деление

Возможны следующие комбинации операндов:
Fppp (FIppp) <без операндов> — выполняет операцию над ST(0) — приемник и ST(1) — источник. Результат заносится в регистр стека сопроцессора ST(0).

Fppp (FIppp) <источник – адрес ячейки памяти> — выполняет операцию над значением ST(0) и источником. Результат заносится в регистр стека сопроцессора ST(0).
Fppp (FIppp) , — выполняет операцию над значением в регистре стека сопроцессора ST(i) и значением в вершине стека ST(0). Результат заносится в регистр ST(i).

FpppP (FIpppР) , — операция выполняется аналогично предыдущей команде, только последним действием команды является выталкивание значения из вершины стека сопроцессора ST(0). Результат сложения остается в регистре ST(i-1).

В чем заключается «обратность» вычитания и деления?
Проанализируйте описание этих двух команд и Вам все станет понятно:
FSUB st(i), st — команда вычитает значение в вершине стека SТ(0) из значения в регистре стека сопроцессора ST(i). Результат вычитания запоминается в регистре стека сопроцессора ST(i).
FSUBR st(i),st — команда вычитает значение в вершине стека ST(0) из значения в регистре стека сопроцессора ST(i). Результат вычитания запоминается в вершине стека сопроцессора — регистре ST(0).


Пример: сложение трех чисел:
.data
Sarray dd 1.5, 3.4, 6.6  ;объявим массив вещественных чисел, котрые мы хотим сложить
Sum dd ?  ;зарезервируем место для результата
.code 
Finit  ;инициализируем сопроцессор
Fld Sarray   ;загрузим первый элемент Sarray
Fadd Sarray+4  ;прибавим к вершине второй элемнт массива
Fadd Sarray+8  ;и третий туда же
Fstp Sum  ;выгрузим значение из вершины стека сопроцессора в переменную Sum  

Дополнительные арифметические команды

  • FSQRT ; извлечение квадратного корня
  • FSCALE ; масштабирование ST(0) = ST(0)*2ST(1), ST(1) – целое число
  • FPREM ; вычисляет частичный остаток ST(0) = ST(0) — q*ST(1), где q – целая часть результата ST(0)/ST(1)
  • FPREM1 ; вычисляет частичный остаток ST(0) = ST(0) — q*ST(1), где q – ближайшее к ST(0)/ST(1) целое число
  • FPNDINT ; округление до целого
  • FXTRACT ; расцепляет число на — порядок, который заменяет число в ST(1), мантиссу, которая помещается в ST(0)
  • FABS ; получение модуля числа
  • FCHS ; изменение знака числа
17.07.2015