Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Команды сравнения с извлечением из стека обеспечивают удобный способ его очистки. Математический сопроцессор не имеет команды, которая бы легко извлекала операнд из стека, вместо нее можно использовать команды сравнения с извлечением из стека. Эти команды также изменяют и регистр состояния, поэтому их нельзя применять, если биты состояния необходимо использовать в дальнейшей работе. Но в большинстве случаев эти команды позволяют быстро извлечь из стека один или два операнда.

Существуют две специальные команды сравнения. Это команда сравнения содержимого вершины стека с нулем ftst, с помощью которой можно быстро определить знак содержимого вершины стека, и команда fxam.
Команда fxam анализирует операнд в вершине стека сопроцессора ST(0) и устанавливает определенным образом биты состояния со-сз в регистре состояния. Иными словами, команда сравнивает операнд в стеке со стандартными типами числовых значений, определенных для математического сопроцессора.
К стандартным типам фирма Intel относит корректные положительные и отрицательные вещественные числа, ноль, нечисла (Not- A-Number — NAN), числа неизвестного формата, бесконечность (Infinity), положительные и отрицательные денормализованные числа (Denormal), пустое значение в регистре ST(0) (Empty).

Приведем пример программы, выполняющей анализ числа при помощи команды fxam. Это консольное приложение, написанное на Delphi. Программа ожидает ввода с клавиатуры целого числа и анализирует его знак и равенство нулю. Результат сравнения выводится на экран дисплея. Пусть вас не смущает то, что для иллюстрации процесса вычислений мы используем встроенный ассемблер Delphi. По способу передачи параметров и возврата результата наша процедура эквивалентна внешней процедуре на языке TASM фирмы Borland. Исходный текст приложения приведен в листинге 2.25.
Листинг 2.25. Программа, выполняющая анализ введенных с клавиатуры целых чисел
program fxamex;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
il, ires: Integer;
cl: Char;
function CheckFxam(pi: PInteger): Integer; assembler;
asm
f init
fild DWORD PTR
fxam
xor EAX, EAX
fstsw AX
and AX, 4700h
shr EAX, 6
sal AH, 5
or AL, AH
shr AL, 2
xor AH, AH
fwait
[pi]
end;
begin
repeat
WriteLn;
Write('Enter integer value: ' ) ;
ReadLn(il);
ires := CheckFxam(@il);
case ires of
4: WriteLn('-> Positive Normal');
6: WriteLn('-> Negative Normal');
8: WriteLn('-> Zero');
10: WriteLn('-> Zero');
else
WriteLn('-> Other');
end;
Write('Press с to continue or other key to exit...');
ReadLn(cl) ;
until cl <> 'c' ;
end.

Приведенный пример является довольно сложным и требует дополнительного анализа. Основные вычисления выполняются в процедуре checkFxam.
В качестве входного параметра процедура принимает адрес переменной целочисленного типа. Анализ переменной выполняется двумя командами:
fild DWORD PTR [pi]
fxam

После выполнения этих команд биты сз-со устанавливаются определенным образом в регистре состояния сопроцессора. Для удобства работы сохраним значения этих битов в предварительно обнуленном регистре АХ:
xor ЕАХ, ЕАХ
fstsw АХ

Сгруппируем сз-со в регистре АХ таким образом, чтобы они заняли позиции младших битов в регистре AL. ЭТО выполняется с помощью команд:
and АХ, 4700h
shr ЕАХ, б
sal АН, 5
or AL, АН
shr AL, 2

Последнее, что нужно сделать — вернуть результат в регистре ЕАХ В основную программу, не забыв перед этим обнулить регистр АН. Возвращаемое значение находится в диапазоне от 0 до 15. Основная программа анализирует знак целого числа и его равенство нулю. Это соответствует значениям 4, 6, 8 и 10 в регистре ЕАХ. Остальные значения для упрощения анализа программы не рассматриваются.

Следующей группой команд, на которые мы обратим наше внимание, являются команды, вычисляющие значения степенных и тригонометрических функций. Эти команды позволяют сопроцессору вычислять сложные математические выражения, такие как логарифмы, экспоненты и тригонометрические функции. Далее приведен список этих команд:
fsqrt
fscale
fprem
fxtract
fabs
fchs
fsin
fcos
fsincos
fptan
fpatan
f2xml
fyl2x
fyl2xpl


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru