Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.4.4. Команды арифметических операций

Команды этой группы обеспечивают выполнение арифметических операций сложения, вычитания, умножения, деления и ряда других (табл. 2.30).

Один из операндов всегда размещается в верхнем регистре арифметического стека ST(0), второй операнд выбирается из памяти или регистра стека ST(i), номер которого за­дается байтом MODRM. Формат выбираемого из памяти операнда ОТ, ДТ, ДВ, ЦС, КЦ определяется кодом операции. Результат операции размещается в регистрах арифмети­ческого стека ST(0) или ST(i).

После выполнения операций FADDP, FSUBP, FMULP, FDIVP вершина стека освобож­дается, т. е. для регистра ST(0) устанавливается значение tag = 11. Содержимое поля ТОР в регистре FPSR увеличивается на единицу, т. е. производится сдвиг вершины стека на один регистр вниз. Соответственно, значение номера i для регистра ST(i) уменьшает­ся на единицу. Например, если операнд выбирается из регистра ST(3), то после выполне­ния операции и размещения результата в этот регистр его номер относительно новой вершины стека принимает значение ST(2).

Команды обратных операций FSUBR, FSUBRP, FDIVR, FDIVRP обеспечивают измене­ние порядка следования операндов при вычитании и делении.

При выполнении операций над вещественными числами операндами могут служить ± О и ± L. В этих случаях формирование результатов арифметических операций производится в соответствии с табл. 2.31, где используются следующие обозначения:

Н, IE= 1 -устанавливается флаг недействительной операции IE = 1, результатом явля­ется код неопределенности, если значение маски IM = 1;

(±) - знак результата S устанавливается с помощью операции «Исключающее ИЛИ» над знаками операндов S1, S2, т. е. S = S1 (+) S2;

±0 при UE = 1 - результат +0 или -0 устанавливается при получении антипереполнения (UE = 1), если значение маски DM = 1;

*0 - знак устанавливается в зависимости от способа округления, заданного полем RC: +0 при RC = 00,10,11; -0 при RC = 01.

При выполнении операций, вызывающих установку флагов IE = 1, UE = 1 или ZE = 1, реализуется прерывание, если флаги не маскированы. Если же соответствующие маски имеют значение IM = 1, UM = 1, или ZM = 1, то процессор продолжает выполнение программы, а результатами операций служат коды неопределенности (Н) при IE = 1, ±0 при UE-1, ±L при ZE = 1, согласно табл. 2.31.

He-числа SNAN, QNAN также могут быть операндами при выполнении команд над ве­щественными числами. В этом случае результат арифметической операции определяется согласно табл. 2.32, где QNAN (SNAN) обозначает не число QNAN, полученное из SNAN путем установки единицы в старшем разряде мантиссы. Остальные разряды мантиссы при преобразовании SNAN в QNAN сохраняют свое значение.

Команда FPREM производит деление числа, расположенного в ST(0), на число в ST(1), остаток накапливается в регистре ST(0). Деление осуществляется путем последовательного вычитания, которое выполняется п раз -до тех пор, пока не будет получено ST(0) < ST(1).

При этом в регистре FPSR бит С2 принимает значение 0. Число вычитаний п определяется как частное ST(0)/ST(1), которое округляется до целого путем отбрасывания дробной части. Знак остатка устанавливается таким же, как знак делимого. Максимальное число выполняе­мых вычитаний ограничено п <- 64. Если 64 вычитаний недостаточно для получения ST(0)<ST(1), то в регистре FPSR устанавливается значение бита С2 = 1, а в регистре ST(0) сохраняется частичный остаток. Точный остаток получается при повторных выполнениях команды FPREM до получения С2 = 0. После выполнения этой команды биты СО, С1, СЗ регистра FPSR содержат три младших разряда частного.

Команда FPREM1 также осуществляет вычисление частичного остатка. Отличие от команды FPREM состоит в том, что число вычитаний при выполнении команды FPREM1 определяется в соответствии со стандартом IEEE 754, как частное ST(0)/ST(1), которое округляется до ближайшего целого. Получаемый остаток в этом случае будет не больше половины делителя.

Команда FSQRT вычисляет квадратный корень из содержимого ST(0) и размещает его в этом же регистре.

Команды FABS и FCHS изменяют знак числа в регистре ST(0), чтобы получить абсо­лютное значение этого числа (команда FABS) или число с противоположным знаком (ко­манда FCHS).

КОМАНДЫ СРАВНЕНИЯ

К этой группе относятся команды (табл. 2.33), выполняющие сравнение двух операндов с плавающей точкой и установкой соответствующих битов в регистре состояния FPSR или регистре EFIAGS, а также команды тестирования (сравнение операнда с нулем) и анализа содержимого регистра ST(0).

Команды FCOM, FCOMP, FCOMPP производят сравнение вещественных чисел. При выполнении команды FCOMP после сравнения производится освобождение вершины сте­ка - регистра ST(0), т. е. значение поля ТОР увеличивается на единицу, а бывший регистр ST(0) становится пустым. После сравнения содержимого двух верхних регистров стека ST(0) и ST(1) по команде FCOMPP освобождаются оба этих регистра. Команды FICOM, FICOMP выполняют аналогичные операции с целыми числами в формате ЦС (ml 6int) и КЦ (m32int). По результатам сравнения устанавливаются соответствующие значения битов СО, С1, СЗ в регистре FPSR согласно табл. 2.34. При этом проверяются типы сравниваемых операн­дов. Операнды считаются не сравнимыми, если один из них или оба являются не числами или представлены в неподдерживаемом (unsupported) формате. В этом случае фиксирует­ся ошибка FPU типа #1 (недействительная операция) и реализуется исключение типа #MF («Ошибка FPU»), если в регистре FPCR бит маски IM = 0.

Команды FUCOM, FUCOMP, FUCOMPP выполняют такие же операции, как FCOM, FCOMP, FCOMPP, но не реализуют исключение при поступлении не чисел типа QNAN, по­зволяя текущей программе обрабатывать неупорядоченные (unordered) операнды.

Команды FCOMI, FCOMIP, FUCOMIP, FUCOMIP производят сравнение операндов, разме­щенных в регистрах ST(0), ST(1). При этом результаты сравнения представляются опреде­ленными значениями признаков ZF, PF, CF в регистре EFLAGS в соответствии с табл.2.35. После выполнения сравнения команды FCOMIP, FUCOMIP освобождают регистр ST(0). Ко­манды FCOMI, FCOMIP реализуют исключение типа #MF при сравнении операндов, являющихся не числами, команды FUCOMI, FUCOMIP не вызывают исключения, позволяя сравни­вать, таким образом, неупорядоченные (unordered) операнды.

Команды FUCOM, FUCOMP, FUCOMPP производят сравнение мантисс операндов. При этом допускается сравнение не чисел),и имеют единичные значения всех разрядов порядка). Если один или оба операнда являются не числами, то устанавливается значе­ние бита С2 = 1, а биты СЗ и СО определяют соотношение между мантиссами в соответ­ствии с табл. 2.34, где х = ST(1). Команда FUCOMP освобождает вершину стека - регистр ST(0), команда FUCOMPP-два верхних регистра стека -ST(0) и ST(1).

Команда FTST выполняет сравнение содержимого регистра ST(0) с нулем, устанавли­вая биты СЗ, С2, СО в регистре FPSR в соответствии с табл. 2.34, где х = 0.

Команда FXAM производит анализ содержимого ST(0) и устанавливает соответствую­щие значения битов СО-СЗ в регистре FPSR. При этом бит С1 принимает значения знака, а разряды СО, С2, СЗ определяют содержимое ST(0) в соответствии с табл. 2.36.