Пример программы с циклом и условным переходом.
СОПРОЦЕССОР И ЕГО ПРОГРАММИРОВАНИЕ
Сопроцессор (FPU, Floating Point Unit) как модуль для выполнения операций над числами с плавающей запятой представляет из себя специальное устройство, имеющее общий с основным процессором (CPU) доступ к потоку команд и памяти данных. Начиная с модели 80486DX сопроцессор исполняется на одной микросхеме с процессором, но остаётся логически отдельным устройством. С точки зрения программиста сопроцессор представляет из себя множество регистров и набор команд, предназначенных для обработки собственных типов данных: три целых двоичных, один целый десятичный и три – с плавающей запятой.
Независимо от типа обрабатываемых данных, при загрузке в регистры сопроцессора все они преобразуются к внутреннему формату данных сопроцессора – 10-байтному вещественному формату. При сохранении результатов в память выполняется обратное преобразование в соответствии с сохраняемым типом. В следующей таблице даны сведения о типах данных сопроцессора.
Тип данных
| Число бит
| К-во знач.
цифр
| Диапазон
| Целое слово
|
|
| –32768…32767
| Короткое целое
|
|
| –2х109…2х109
| Длинное целое
|
|
| –9х1018…9х1018
| Упаков. десятичное
|
|
| –99..99…+99..99 (18 цифр)
| Короткое веществ.
|
|
| 1.18х10-38…3.40х1038
| Длинное веществ.
|
| 15-16
| 2.23х10-308…1.79х10308
| Расшир. веществ.
|
|
| 3.37х10-4932…1.18х104932
|
Кроме обычных чисел, формат IEEE сопроцессора предусматривает несколько специальных случаев, которые могут получаться в результате математических операций, и над которыми модно выполнять отдельные операции:
· Положительный и отрицательный ноль;
· Положительная и отрицательная бесконечность;
· Денормализованные числа;
· Неопределённость;
· Сигнальные не-числа (SNAN);
· Спокойные (тихие) не-числа (QNAN);
· Неподдерживаемые числа.
Регистры FPU. FPU предоставляет восемь регистров для хранения данных и 5 вспомогательных регистров.
Регистры данных (R0-R7) не адресуются по физическим именам, а рассматриваются в качестве стека, вершина которого называется ST (или ST(0)), и которая может находиться в любом физическом регистре. Её положение указывается полем TOP регистра SWR. Остальные регистры доступны программисту под именами ST(1) – ST(7).Операции могут выполняться либо между двумя операндами в вершине стека (в этом случае используется команда без операндов), либо между вершиной стека и операндом в памяти. Загрузка и выгрузка операндов всегда идет через вершину стека, при этом устанавливается новое соответствие физических и логических регистров (но программисту не надо об этом задумываться).
Регистр SWR – 16-битный регистр состояния.
№ бита
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Название
| B
| C3
| TOP
| C2
| C1
| C0
| ES
| SF
| PE
| UE
| OE
| ZE
| DE
| IE
|
Здесь B –бит занятости сопроцессора, C3–C0 – условные флаги, ESиSF –флаги ошибок, PE– IE – флаги состояния (неточный результат, антипереполнение, переполнение, деление на ноль, денормализация результата, недопустимая операция).
Регистр CWR –16-битный регистр управления.
№ бита
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Название
| |
| RC
| PC
| | | PM
| UM
| OM
| ZM
| DM
| IM
|
Здесь RC –управление округлением, PC –управление точностью, PM – IM– маски состояний, соответствующих битам регистра SWR.
Регистр TWR – регистр тегов, каждая пара бит описывает соответствующий физический регистр данных (11 – пуст, 00 – содержит число, 01 – 0, 10 – всё остальное).
Регистр FIP – 48-битный физический адрес последней выполненной команды;
Регистр FDP – 48-битный физический адрес операнда этой команды.
Команды FPU. FPU может выполнять команды загрузки-сохранения данных, команды базовой арифметики, команды сравнения и команды вычисления трансцендентных функций (расширенная арифметика). Независимо от типов исходных данных вычисления в регистрах сопроцессора всегда выполняются над величинами в расширенном вещественном формате. На выполнение команд влияют биты управляющего регистра CWR, а индикация состояний ведётся в регистре SWR.
CPU и FPU одновременно «видят» очередную команду выполняемого потока. Сопроцессор распознаёт «свои» команды по битам 11011 в начале кода, а прочие – пропускает. Если команда содержит операнд, то сопроцессор может обратиться к процессору за требуемыми данными. После этого CPU и FPU могут работать параллельно. Для синхронизации работы CPU и FPU может потребоваться команда FWAIT, которая сейчас встроена в большинство команд сопроцессора.
Сравнения и условные переходы. Нужно помнить, что условия команд сравнения для сопроцессора записываются не в регистр флагов, а помещаются в биты C3,C2,C0регистра SWR. С помощью команды FSTSW AX можно сохранить регистр SWRв регистре AX.Далее можно проанализировать командами логической обработки соответствующие биты в регистре AXнепосредственно, организовав по ним условный переход, или же переписать регистр AHв младший байт регистра FLAGS, при этом установится следующее соответствие битов и условий:
УСЛОВИЕ
| C3
| C2
| C0
| ZF
| PF
| CF
| | ST(0) > источник
|
|
|
| ST(0) < источник
|
|
|
| ST(0) = источник
|
|
|
| Несравнимы
|
|
|
|
Пример программы. Ниже даётся фрагмент программы для вычисления функции y=sin(πx2).
Команда комментарий
…….………………………………………..……………………………………………
finit; инициализация сопроцессора.
fld x; x→st(0).
fmul x ; st(0):=st(0)*x, st(0)=x2.
fldpi; загрузка в st(0) константы π,x2 проталкивается в st(1).
fmul; перемножение st(0) и st(1); в вершине стека – πx2.
fsin; вычисление синуса от операнда в вершине стека.
fstp y; запись результата в память.
…………………………………………………………………………………………..
Пример программы с циклом и условным переходом.
Приводим полный текст программы, вычисляющей таблицу функции
,
на отрезке [-1,1] с шагом 0.1
assume cs:codes,ds:dates,ss:mystack
codes segment para
start: push ds ; Эта и следующие 4 команды
xor ax,ax ; называются прологом.
push ax
mov ax,seg dates
mov ds,ax
; Начало собственно алгоритма
finit ; начальная подготовка сопроцессора
xor di,di ; установка нулевого индекса
mov cx,n ; установка цикла
cycl: fld x
fsub z ; вычитание нуля, чтобы установить признаки ; результата
fstsw ax
sahf ; перезапись AH в мл. биты FLAGS
jc less0
; если больше нуля
fsqrt ; извлечение корня; операнд х уже был в стеке
jmp next
less0: fmul x ; умножить х на х
next: fstp r[di]
fld x
fadd x,h ; x+h
fstp x
add di,4
loop cycl
; retf ; завершение программы (эпилог).
codes ends
dates segment para
x dd -1.0
h dd 0.1
n dw 21
c4 dw 4
z dd 0.0
r dd 21 dup(?)
dates ends
mystack segment para stack ‘stack’
dw 100 dup (?) ; резервируется место для стека.
mystack ends
end start
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|