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





Листинг 2.21. Пример кода, использующий различные команды сопроцессора
• data
X DD 1. .3
Y DD -7.. 8
Z DD 0. ,0
code
f init
fid DWORD PTR X
fadd DWORD PTR Y
fid DWORD PTR X
fsub DWORD PTR Y
fxch st(l)
fdiv st(l), st(0)
fxch st(l)
fstp DWORD PTR Z
fwait

Проведем детальный анализ примера. Вычисление выражения (х - Y) / (х + Y) выполним в три этапа. Первый шаг — вычисление знаменателя при помощи команд:
fid DWORD PTR X
fadd DWORD PTR Y

В вершину стека (регистр ST(0)) загружается значение переменной х. Далее к этому значению прибавляется значение переменной Y. В результате выполнения этих двух команд в вершине стека будет находиться сумма х и Y.
Следующие две команды выполняют вычисление разности х и Y. ДЛЯ ЭТОГО в вершину стека загружается значение х, затем производится вычитание значения Y:
fid DWORD PTR X
fsub DWORD PTR Y

Далее надо быть очень внимательным. После выполнения первых пяти команд нашего фрагмента в регистре ST(0) находится разность х и Y. Так как стек сопроцессора организован в виде циклического буфера, то ранее вычисленное значение х + Y переместилось в регистр стека ST(1).
Чтобы разделить разность переменных х и Y на их сумму, поменяем значения в регистрах ST(0) и ST(1) и выполним операцию деления содержимого регистра ST (1) на значение в регистре ST ( о ) :
fxch st(l)
fdiv st(l), st(0)

После выполнения этих команд в регистре ST(1) находится вычисленное значение величины z. Чтобы записать значение ST(1) В переменную z, выполним следующие команды:
fxch st(l)
fstp DWORD PTR Z

Как и в наборе команд процессора, у математического сопроцессора имеются команды, выполняющие сравнение двух чисел. Далее приводится мнемоника команд сравнения:
WORD_INT LABEL WORD
SHORT_INT LABEL DWORD
SHORT_REAL LABEL DWORD
LONG REAL LABEL QWORD
f com
fcomp ST (2)
ficom WORD_INT
fcom SHORT_REAL
fcomp
ficomp SHORT_INT
fcomp LONG_REAL
fcompp
ftst
fxam


 
 
 

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