Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
<< Назад В начало Далее >> |
|