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

Циклы и ветвления при работе с сопроцессором

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

Для организации ветвлений и проверки условий окончания циклов используются группа команд сравнения сопроцессора и команды передачи слова состояния в центральный процессор. FCOM– сравниваетst[0]с операндом, аFICOM– с целым операндом из памяти;FCOMP- сравнивает содержимоеst[0]с операндом, после чего исключает его из стека сопроцессора,aFICOMPделает то же действие при сравнении с целочисленным операндом;FCOMPP- сравнивает два верхних регистра стекаst[0]иst[1]с последующим их исключением из стека.

FTST– сравниваетst[0]с0. Перечисленные команды меняют содержимое регистра состояния в соответствии с результатом вычитания второго операнда из первого и могут быть использованы для организации условной передачи управления по арифметическим отношениям.

Результат

С3

С2

С0

ST[0] > X

0

0

0

ST[0] < X

0

0

1

ST[0] = X

1

0

0

Не сравнимы

1

1

1

Коды результата операции сравнения в регистре SW

С учетом особенностей структуры регистра FLAGSЦП и регистра состояния математического сопроцессора, а также наличием команды сопроцессораFSTSW wrdи центрального процессора.SAHFможно организовать передачу флагов сопроцессора в ЦП.

Регистр управления FPU

15

14

13

12

11

10

9

8

7

.

.

.

0

C3

C2

C1

C0

ИнструкцияFSTSW

SWFPU

FLAGS

C0

CF

C1

---

C2

PF

C3

ZF

Регистр AX (AH,AL)

15

14

13

12

11

10

9

8

7

.

.

.

0

C3

C2

C1

C0

ИнструкцияSAF

РегистрFLAGS

15

.

.

.

8

7

6

5

4

3

2

1

0

ZF

PF

1

CF

Перемещение кодов условий из регистра управления FPUв регистр флаговCPU.

В старших моделях IA-32 реализована группа команд сравненияFCOMIиFCOMIP, которые, выполняют сравнение аналогично командамFCOMиFCOMI, но устанавливают флаги не вFPSR, а прямо в регистреEFLAGSцентрального процессора.

Результат

ZF

PF

CF

ST[0] > X

0

0

0

ST[0] < X

0

0

1

ST[0] = X

1

0

0

Не сравнимы

1

1

1

Коды результата операции сравнения в регистре EFLAGS

Таким образом полностью соблюдается соответствие: C0CF,C2PFиC3ZF.

При программировании условных переходов по результатам работы сопроцессора нужно учитывать, что в режиме эмуляции команды транслируются в модифицированную форму, в которой сохраняется изоморфность к сопроцессорной программе по количеству байтов, а значит и размещению команд, а также сохраняются биты, в которых определены операции сопроцессора. При этом код операции WAITзаменяется наINTс указателем определенной группы уровней прерываний. На листинге эти преобразования не отображаются. Для построения унифицированной программы, пригодной для выполнения на сопроцессоре, и в режиме эмуляции необходимо использовать командуFWAITвместоWAIT.

Условные переходы по результатам сравнений в сопроцессоре можно организовать макроопределением следующего вида:

FJMACROcd,lb; Прототип макровызова

FSTSWstsw; Запись в память регистра состояния

;FPU и команды центрального процессора

FWAIT ; Ожидание окончания пересылки

MOVah,byteptrstsw+1;Копирование регистра состояния

SAHF ; Сохранение содержимого регистра ah

; в регистре флагов

J&CDlb; Условный переход

ENDM

Для программирования условного перехода по результату сравнения программисту достаточно использовать макровызов вида:

[метка:] FJусловие_перехода, метка_перехода

Первый операнд макрокоманды, определяет условие перехода теми же буквами, которые используются в командах условных переходов по результатам беззнаковой арифметики, то есть а– больше,b– меньше,n– отрицание иe– равенство. КомандаFXAMпозволяет получить гораздо больше информации о содержимомst[0], но дает особое кодирование битов признака результатов, и может использоваться также для инициализации кодов условия.

Содержимое st[0]

С3

С2

С0

Поддерживаемый формат

0

0

0

Не-число

0

0

1

Нормализованное число

0

1

0

Бесконечность

0

1

1

Ноль

1

0

0

Пусто

1

0

1

Денормализованное число

1

1

0

Коды результата анализа содержимого регистра st[0], командойFXAMP.

Таким образом, синхронизация параллельной работы центрального процессора и математического сопроцессора реализуется достаточно просто и в большинстве случаев прозрачно для программиста. Другой случай необходимости синхронизации связан с возникновением особых ситуаций в сопроцессоре. Сопроцессор при незамаскированной особой ситуации формирует сигнал прерывания к центральному процессору по одному из трех номеров векторов прерываний 07h- при отсутствии сопроцессора и 10hили 75h- при ошибках и особых случаях в сопроцессоре, в зависимости от структуры аппаратной части.

Для рационального программирования вычислений по формулам разложения в ряд и рекурсивным формулам следует придерживаться следующих рекомендаций по построению программ. После того как четко определена предметная область, ее форматы данных и цели составляемых программ в виде явных аналитических выражений, необходимо выполнить предварительные эквивалентные аналитические преобразования, сокращающие, а в пределе и исключающие выполнение повторных вычислений в программе. Эти действия по сво­ему существу обеспечивают машинно-независимую оптимизацию программ. После этого для получения рациональной программы необходимо выполнить эффективное распределение запоминающих и операционных ресурсов, в случае языка Ассемблера семантически совпадающих с ресурсами центрального процессора и математического сопроцессора.

Для рационального использования запоминающих и операционных ресурсов вычислительной системы необходимо соблюдать следующие принципы:

  • минимизация числа пересылок, для чего данные целесообразно размещать в хранилище, используемом при выполнении требуемых операций;

  • при большом объеме промежуточных вычислении предпочтением для сохранения в регистрах пользуются повторно используемые данные, а при недостатке регистров, редко используемые данные предпочтительнее сохранять в памяти.

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

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

Построим пример реализации программы для экспоненциальной функции еx, вычисляемой по формуле:

, где 0! = 1. В этом случае отношение (i+1)-го члена ряда ai+1кi-муаi имеет вид:R = аi+1i = х/i.

С точки зрения распределения регистров сопроцессора при циклическом выполнении вычислений в верхушке стека целесообразно хранить значение очередного члена ряда, так как оно может использоваться для накопления суммы в регистре из глубины стека и для их обновления путем умножения на отношение членов ряда R. Процедура вычисления функции экспоненты, составленная с учетом соглашений о связях языкаC, может быть представлена в виде:

_Ехр PROC

PUSHBP;Стандартное сохранение базового указателя стека

MOVBP,SP;Установка нового значения базового указателя

FLDQWORDPTR[BP+4]; Загрузка начального значения

; суммы х

FLDst; Загрузка значения 0-го члена ряда

FLD st ; Загрузка х для вычисления постоянного

; множителя

MOVcntr,1; Запись начального значения счетчика

LSi:FMULst[1]; Домножение на - х*x

FIMULcntr; Домножение на 2i-1