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

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

Регистры сопроцессора доступны для программиста через номер, определенный относительно текущей верхушки стека регистров. В языке Ассемблера есть специальная группа команд, которая генерирует коды сопроцессора и организует его взаимодействие с главным процессором. Названия этих команд начинаются с буквы 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), для чего в вызывающей последовательности для одноместной функции можно использовать следующие команды, включая команды сопроцессора:

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

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

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

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

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

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

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

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

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

FLD qword ptr[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 ;Загрузка первого слагаемого

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

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

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