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