Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПиП МПС(Ассемблер Левицкий экт 4) / MProc / M3 / Программирование блока FPU в IA.doc
Скачиваний:
66
Добавлен:
16.04.2013
Размер:
249.86 Кб
Скачать

Базовые команды математического сопроцессора

Регистры сопроцессора доступны для программиста через номер, определенный относительно текущей верхушки стека регистров. В языке Ассемблера есть специальная группа команд, которая генерирует коды сопроцессора и организует его взаимодействие с главным процессором. Названия этих команд начинаются с буквы F, а следующие буквы определяют тип операции. Все команды пересылок данных в процессор с необходимыми преобразованиями данных имеют в названии буквыLDи выполняются путем размещения данных с плавающей точкой в верхушки стека с предварительным изменением текущего значения указателя стекаstи преобразованием во внутреннюю десятибайтную форму с плавающей точкой. Базовая командаFLDперемещает данные как из регистров с плавающей точкой, указанных в командах Ассемблера в формеst[i], где i - номер нужного регистра относительно верхушки стека, так и с любой области главной памяти и задается по формату:

[метка:] fldоперанд-источник

Команды FILDиFBLDзадаются программистом для преобразования целочисленных данных в форму с плавающей точкой при загрузке четырех-, восьми- и десятибайтных данных в сопроцессор из памяти. БукваIзадает целочисленные двоичные данные, букваВ- десятибайтные двоично-десятичные данные в bcd-коде. КомандыFSTиFISTзадают копирование содержимого верхушки стекаst[0]с преобразованиями в формат, соответствующий определению области приемника. Команды извлечения из стека и преобразования данных:FSTP, FISTPиFBSTPпосле преобразования данных освобождают соответствующий регистр стека и смещают указатель стека, причем операндом в них может быть регистр сопроцессора. КомандаFXCHзадает обмен регистра верхушки стекаst[0]с регистром, заданным в операнде. Группа безоперандных команд используется для загрузки распространенных констант в верхушку стекаFLDZ- 0,FLD1- 1,FLDPI-,FLDLG2-lg2,FLDLN2-ln2,FLDL2T-log2l0 логарифм числа 10 по основанию 2,FLDL2E-log2e.

Аргументы стандартных математических функций языка С могут быть переданы в подпрограмму через верхушку стека процессора в виде числа с плавающей точкой в формате длинного вещественного представления (float double),для чего в вызывающей последовательности для одноместной функции можно использовать следующие команды, включая команды сопроцессора:

FLDx; Загрузка аргумента в стек сопроцессора

SUBsp,8; Подготовка места в стеке главного процессора

МОV bp,sp ; Подготовка указателя

FSTP qwordptr[bp]; Пересылка аргумента в стек из

; сопроцессора

CALLимя входной точки функциив библиотечном модуле

ADD sp,8; Освобождение стека

Результат вычисления стандартной функции также в формате длинного вещественного (float double)будет размещен в сегменте данных, а его внутрисегментный адрес в подпрограммах используемой библиотеки возвращается при выходе из подпрограммы в аккумуляторе АХ. Таким образом, для приема и сохранения результата можно использовать такие команды:

MOVbх,ах; Копирование внутрисегментного адреса

FLDqwordptr[bx];Пересылка результата в сопроцессор

FSTPимя области приемника результата

На первый взгляд может показаться, что такая динамически изменяемая нумерация регистров может вызвать серьезные осложнения при программировании. Но большинство вычислений над действительными числами выполняются по алгебраическим формулам, которые достаточно легко программируются с использованием стека из регистров с динамически изменяемыми номерами. Вычисления над данными, динамически занесенными в стек приводят к тому, что одинаковые комплексы действий программируются одинаковыми ко­мандами с одинаковыми регистровыми операндами.

Таблица 2

Команда

1-й операнд

2-й операнд

Стек

Fxxx память

верхушка стека

операнд из команды

без изменений

FIxxx память

верхушка стека

целый операнд из команды

без изменений

Fxxx st,st[i]

верхушка стека

регистр стека

без изменений

Fxxx st[i],st

регистр стека

верхушка стека

без изменений

FxxxP st[i],st

регистр стека

верхушка стека

удаление из верхушки

Команды арифметических операций включают 5 базовых форматов команд, сохраняющих результат в первом операнде.

Безоперандная команда Рхххреализуется какFxxxP st[i],st. Здесь ххх – означает содержание операции из следующего списка:

  • ADD– сложение;

  • SUB– вычитание второго аргумента из первого;

  • MUL– умножение;

  • DIV– деление первого аргумента на второй;

  • SUBR– реверсивное вычитание (первого аргумента из второго);

  • DIVR– реверсивное деление.

Если промежуточные результаты предыдущих вычислений помещены в области памяти f1 и f2, то фрагмент программы для суммирования имеет вид:

FLD f1 ;Загрузка первого слагаемого

FLDf2;3агрузка второго слагаемого

FADD;Суммирование и освобождение стека сопроцессора

FSTP result; Запоминание результата в памяти