- •Программирование блока fpu в ia-32. Регистры блока обработки чисел с плавающей точкой
- •Базовые команды математического сопроцессора
- •Административные команды
- •Циклы и ветвления при работе с сопроцессором
- •Inc cntr ; Инкремент счетчика
- •Программирование сопроцессора с использованием операций вычисления частичных математических функций
Базовые команды математического сопроцессора
Регистры сопроцессора доступны для программиста через номер, определенный относительно текущей верхушки стека регистров. В языке Ассемблера есть специальная группа команд, которая генерирует коды сопроцессора и организует его взаимодействие с главным процессором. Названия этих команд начинаются с буквы 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 ; Запоминание результата в памяти
