lect30-31.ppt
- Количество слайдов: 44
Лекции 30 – 31 Архитектура и программирование сопроцессора
Возможности сопроцессора n Полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Эти стандарты описывают как форматы данных, так и набор реализуемых функций. n Поддержка численных алгоритмов для вычисления значений тригонометрических функций, логарифмов и др. n Обработка десятичных чисел с точностью до 18 разрядов, что позволяет сопроцессору выполнять арифметические операции без округления над целыми десятичными числами со значениями до 10^18. n Обработка вещественных чисел из диапазона ±(3. 37 E-4932 … 1. 18 E+4932).
Архитектура сопроцессора Восемь регистров R 0 – R 7, составляющих программную модель сопроцессора – стек сопроцессора. Размерность каждого регистра – 80 бит. Три служебных регистра: n регистр состояния сопроцессора – swr (Status Word Register) – отражает информацию о текущем состоянии сопроцессора; n управляющий регистр сопроцессора – cwr (Control Word Register) – управляет режимами работы сопроцессора; n регистр слова тегов – twr (Tag Word Register) – используется для контроля за состоянием каждого из регистров R 0 – R 7. Два регистра указателей – данных dpr (Data Point Register) и команд ipr (Instruction Point Register). Они предназначены для запоминания информации об адресе команды, вызвавшей исключительной ситуации и адресе ее операнда.
Регистры сопроцессора Регистры стека сопроцессора R 0 – R 7 Знак Порядок Регистр тегов twr Мантисса R 0 0 R 1 2 R 2 4 R 3 6 R 4 8 R 5 10 R 6 12 R 7 14 79 78 64 63 0
Регистр состояния SWR c 3 15 n n n n n top 14 13 11 c 2 c 1 c 0 es sf 10 6 9 8 7 pe ue oe ze de 5 4 3 2 1 ie 0 IE (Invalidate operation error) – недействительная операция, DE (Denormalized operand error) – денормализованный операнд, ZE (divide by zero Error) – ошибка деления на нуль, OE (Overflow Error) – ошибка переполнения, UE (Underflow Error) – ошибка антипереполнения, PE (Precision Error) – ошибка точности, SF (Stack Fault) – ошибка работы стека сопроцессора, ES (Error Summary) – суммарная ошибка работы сопроцессора, C 0 – C 3 (Condition Code) – кода условия, TOP – указатель регистра текущей вершины стека.
Регистр управления CWR RC 15 12 11 PC 10 9 P 8 7 6 U O Z D I 5 4 3 2 1 0 PC (Precision Control) – поля управления точность: n 00 – длина мантиссы 24 бита, n 10 – длина мантиссы 53 бита, n 11 – длина мантиссы 64 бита. RC (Rounding Control) – поля управления округлением: n 00 – значение округляется к ближайшему числу; n 01 – значение округляется в меньшую сторону; n 10 – значение округляется в большую сторону; n 11 – производится отбрасывание дробной части. Биты P, U, O, Z, D, I – составляют маску исключений. Если бит в маске установлен в единицу, то обработку соответствующей исключительной ситуации осуществляет сопроцессор. В противном случае – генерируется аппаратное прерывание ошибки сопроцессора, и запускается обработчик ОС или пользователя.
Регистр тегов TWR Возможны следующие значения в полях регистра тегов: n n 00 – регистр стека сопроцессора занят допустимым ненулевым значением. 01 – регистр стека сопроцессора содержит нулевое значение. 10 – регистр стека сопроцессора содержит одно из специальных численных значений. 11 – регистр пуст и в него можно производить запись.
Форматы данных Сопроцессор может работать со следующими типами данных: n двоичные целые числа – 16, 32 и 64 бита; n упакованные целые десятичные числа (BCD) – максимальная длина 18 упакованных десятичных цифр (9 байт); n вещественные числа в трех форматах – коротком (32 бита), длинном (64 бита), расширенном (80 бит).
Форматы данных Специальные численные значения: n n n денормализованные значения – это числа меньшие минимального нормализованного числа для каждого вещественного формата, поддерживаемого сопроцессором; нуль; положительная и отрицательная значения бесконечности; нечисла; неопределенности и неподдерживаемые форматы.
Форматы вещественных чисел Формат Короткий Длинный Расширенный Длина числа (бит) 32 64 80 Размерность мантиссы 24 53 64 1 E-38 … 1 E+38 1 E-308 … 1 E+308 1 E-4952 … 1 E+4932 8 11 15 Значение фиксированного смещения +127 +1023 +16383 Диапазон характеристик q 0… 255 0… 2047 0… 32767 -126…+127 -1022… +1023 -16382…+16383 Диапазон значений Размерность характеристики q Диапазон порядков p
Форматы данных Директивы описания данных: n n n n Целое число 16 бит – dw Целое число 32 бит - dd Целое число 64 бит - dq Упакованное десятичное целое число - dt Короткое вещественное число – dd Длинное вещественное число – dq Расширенное вещественное число – dt
Форматы данных Минимальное положительное денормализованнное число 0 00. . 00 79 78 00000…………… 001 64 63 0 Минимальное отрицательное денормализованнное число 1 00. . 00 79 78 00000…………… 001 64 63 0 Максимальное положительное денормализованнное число 0 00. . 00 79 78 11111…………… 111 64 63 0 Максимальное отрицательное денормализованнное число 1 00. . 00 79 78 11111…………… 111 64 63 0
Форматы данных Нуль 0 00. . 00 79 78 Сигнальное не число 00000………… 000 64 63 0 Нуль 1 00. . 00 79 78 00000………… 000 64 63 79 78 0 1 11. . 11 79 78 10000………… 000 64 63 0 11 xxx…………xxx 64 63 0 Спокойное не число Отрицательная бесконечность 1 11. . 11 x 11. . 11 79 78 10000………… 000 64 63 10 xxx…………xxx Сигнальное не число Положительная бесконечность 0 11. . 11 x 11. . 11 0 11000………… 000 64 63 0
Система команд сопроцессора Все команды сопроцессора можно разделить на следующие группы: n n команды передачи данных, арифметические команды, команды сравнения данных, команды управления.
Система команд сопроцессора Правила мнемоники команд сопроцессора: Все мнемонические обозначения начинаются с символа f. Вторая буква мнемонического обозначения определяет тип операнда в памяти с которым работает программа: n i – целое двоичное число, n b – целое десятичное число, n отсутствие буквы – вещественное число. Последняя буква мнемонического обозначения команды p означает, что последним действием команды обязательно является извлечение операнда из стека. Последняя или предпоследняя буква r означает реверсивное следование операндов при выполнении команд вычитания и деления.
Команды передачи данных n n n n fld источник – загрузка вещественного числа из памяти в вершину стека. fst приемник – сохранение вещественного числа из вершины стека в память. fstp приемник – сохранение вещественного числа из вершины стека в память с выталкиванием из стека. fild источник – загрузка двоичного целого числа из памяти в вершину стека. fist приемник – сохранение двоичного целого числа из вершины стека в память. fistp приемник – сохранение двоичного целого числа из вершины стека в память с выталкиванием из стека. fbld источник – загрузка десятичного целого числа из памяти в вершину стека. fbstp приемник – сохранение десятичного целого числа из вершины стека в память с выталкиванием из стека.
Команды передачи данных n fxch st(i) – обмен значений между текущей вершиной стека и регистром стека сопроцессора st(i). n fldz – загрузка в вершину стека нуля, fld 1 – загрузка в вершину стека единицы, fldpi – загрузка в вершину стека числа π, fldl 2 t – загрузка в вершину стека двоичного логарифма десяти, fldl 2 e – загрузка в вершину стека двоичного логарифма числа e, fldlg 2 – загрузка в вершину стека десятичного логарифма двух, fldln 2 – загрузка в вершину стека натурального логарифма двух. n n n
Целочисленные арифметические команды n n n fiadd источник – команда складывает значение st(0) и целочисленного источника. Результат записывается в st(0). fisub источник – команда вычитает значение целочисленного источника из st(0). Результат записывается в st(0). fimul источник – команда умножает значение целочисленного источника на st(0). Результат записывается в st(0). fidiv источник – команда делит содержимое st(0) на значение целочисленного источника. Результат записывается в st(0). fisubr источник – команда вычитает значение st(0) из целочисленного источника. Результат записывается в st(0). fidivr источник – команда делит содержимое целочисленного источника на st(0). Результат записывается в st(0).
Вещественные арифметические команды n n fadd – складывает значения st(0) и st(1). Результат в st(0). fadd источник – команда складывает значения st(0) и источника в памяти. Результат в st(0). fadd st(i), st – команда складывает значения st(0) и st(i). Результат в st(i). faddp st(i), st – команда складывает значения st(0) и st(i). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1).
Вещественные арифметические команды n n n fsub – вычитает значение st(1) из st(0). Результат в st(0). fsub источник – команда вычитает значение источника в памяти из st(0). Результат в st(0). fsub st(i), st – команда вычитает значение st(0) из значения st(i). Результат в st(i). fsubp st(i), st – команда вычитает значение st(0) из значения st(i). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1). fsubr st(i), st – команда вычитает значение st(i) из значения st(0). Результат в st(0). fsubrp st(i), st – команда вычитает значение st(i) из значения st(0). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1).
Вещественные арифметические команды n n fmul – умножает значения st(0) и st(1). Результат в st(0). fmul st(i) – команда умножает значения st(0) и st(i). Результат в st(0). fmul st(i), st – команда умножает значения st(0) и st(i). Результат в st(i). fmulp st(i), st – команда умножает значения st(0) и st(i). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1).
Вещественные арифметические команды n n n fdiv – делит значение st(0) на st(1). Результат в st(0). fdiv st(i) – команда делит значение st(0) на значение st(i). Результат в st(0). fdiv st(i), st – команда делит значение st(0) на значение st(i). Результат в st(i). fdivp st(i), st – команда делит значение st(0) на значение st(i). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1). fdivr st(i), st – команда делит значение st(i) на значение st(0). Результат в st(0). fdivrp st(i), st – команда делит значение st(i) на значение st(0). Далее осуществляется выталкивание значения из стека, результат, таким образом, остается в регистре st(i-1).
Вещественные арифметические команды n n n fsqrt – вычисление квадратного корня st(0). Результат в st(0). fabs – вычисление модуля числа в st(0). Результат в st(0). fchs – изменение знака значения в st(0). Результат в st(0). fxtract – выделение мантиссы и порядка числа из st(0). Результат: st(0) – мантисса, st(1) – порядок. fscale – команда масштабирования – изменяет порядок значения, находящегося в st(0) на величину в st(1). frndint – команда округления до целого значения – округляет значение находящееся в st(0) согласно состоянию RC.
Команды сравнения Все команды сравнения устанавливают значения бит C 0 – C 3 в SWR в соответствии с результатом сравнения. n n n fcom [операнд в памяти] – команда без операндов сравнивает два значения: st(0) и st(1). Если операнд указан, то сравнивается st(0) и значение в памяти. fcomp операнд – сравнивает значение st(0) и значение в памяти. После выталкивает из стека значение st(0). fcompp – сравнивает значение st(0) и st(1). После выталкивает из стека st(0) и st(1). ficom операнд – сравнивает значение st(0) и значение в памяти. ficomp операнд – сравнивает значение st(0) и значение в памяти. После выталкивает значение st(0).
Команды сравнения n n n ftst – сравнивает значение st(0) с нулем. fucom st(i) – команда сравнения (без учета порядка) в регистрах st(0) и st(i). fucomp st(i) – команда сравнения (без учета порядка) в регистрах st(0) и st(i). Выталкивание из стека. fucompp st(i) – команда сравнения (без учета порядка) в регистрах st(0) и st(i). Двойное выталкивание из стека. fxam – команда анализирует значение в st(0) и формирует значения бит c 0 – c 3 в регистре состояния SWR. По состоянию этих бит можно судить о знаке мантиссы, корректности записи вещественного числа, типе специального численного значения (не число, бесконечность, нуль, денормализованное значение).
Команды трансцендентных функций n n n fcos – вычисление косинуса значения st(0). Результат в st(0). fsin – вычисление синуса значения st(0). Результат в st(0). fsincos – вычисление синуса и косинуса значения st(0). Результат: st(0) – sin, st(1) – cos. fptan – вычисление частичного тангенса для значения в st(0). Результат в st(0) и st(1). Истинное значение тангенса в st(0). fpatan – вычисление частичного арктангенса для значения st(1)/st(0). Результат в st(0).
Команды трансцендентных функций n f 2 xm 1 – команда вычисления выражения Y=2^X-1. Исходное значение Х должно находится в st(0) и должно лежать в диапазоне -1≤X≤ 1. Результат помещается в регистр st(0). n fyl 2 x – команда вычисления выражения Z=Y*log 2(X). Исходное значение Х размещается в st(0), а Y – st(1). X>0. Перед записью результата значения X и Y выталкиваются из стека, а результат записывается в st(0). n fyl 2 xp 1 – команда вычисления выражения Z=Y*log 2(X+1). Исходное значение Х размещается в st(0), а Y – st(1). 0≤|X| ≤ 1. Перед записью результата значения X и Y выталкиваются из стека, а результат записывается в st(0).
Команды управления сопроцессором n n n wait (fwait) – команда синхронизации с сопроцессором. finit (fninit) – инициализация сопроцессора: CWR=037 h, SWR=0, TWR=11… 11 b; DPR и IPR = 0. fstsw / fnstsw ax – команда сохранения регистра swr в регистре ax. fstsw / fnstsw назначение – команда сохранения регистра swr в ячейке памяти. fstcw / fnstcw назначение – команда сохранения регистра cwr в ячейке памяти. fldcw источник – команда загрузки регистра cwr из ячейки памяти.
Команды управления сопроцессором n n n fclex / fnclex – команда сброса флагов исключений в регистре swr сопроцессора. fincstp – команда увеличения указателя стека на единицу. Псевдо выталкивание значения из стека. fdecstp – команда уменьшения указателя стека на единицу. Псевдо помещение значения в стек. ffree st(i) – команда освобождения регистра стека st(i). fnop – пустая команда.
Команды управления сопроцессором n n fsave / fnsave приемник – команда сохранения полного состояния сопроцессора в памяти. Размер блока памяти зависит от режима адресации: use 16 – 94 байта, use 32 – 108 байт. frstor источник – команда восстановления полного состояния среды сопроцессора из области памяти. fstenv / fnstenv приемник – команда сохранения частичного состояния сопроцессора в памяти. Размер блока памяти зависит от режима адресации: use 16 – 14 байт, use 32 – 28 байт. fldenv источник – команда восстановления частичного состояния среды сопроцессора из области памяти.
Пример 1 Написать программу для вычисления значения выражения:
Пример 1 include masm 32includemasm 32 rt. inc. data? val. X dq ? val. Y dq ? val. Z dq ? . data mess 1 db 'Input X: ', 0 mess 2 db 'Input Y: ', 0 mess 3 db 'Result: ', 0 buff db 50 dup(0) endl db 0 dh, 0 ah, 0 ; Приглашение к вводу Х ; Приглашение к вводу У ; Сообщение о выводе результата ; Буфер для ввода данных ; Перевод строки
Пример 1 start: call main inkey exit main proc cls invoke Std. Out, ADDR mess 1 invoke Std. In, ADDR buff, 50 invoke Str. To. Float, ADDR buff, ADDR val. X jz func 1 jnc func 2 jmp func 3 func 1: call Func 01 jmp toquit func 2: call Func 02 jmp toquit func 3: invoke Std. Out, ADDR mess 2 invoke Std. In, ADDR buff, 50 invoke Str. To. Float, ADDR buff, ADDR val. Y fld qword ptr val. X fcomp qword ptr val. Y fstsw ax sahf call Func 03 toquit: fstp qword ptr val. Z invoke Float. To. Str, val. Z, ADDR buff invoke Std. Out, ADDR mess 3 invoke Std. Out, ADDR buff invoke Std. Out, ADDR endl ret main endp
Пример 1 Func 01 proc fld qword ptr val. Y ; Заносим Y в st(0) fmul st(0), st ; Вычисление Y*Y в st(0) fld qword ptr val. X ; Заносим X в st(0) fld st(0) ; Копируем st(0) в st(1) fmul st(1), st ; Вычисление X*X в st(1) fptan ; Вычисление тангенса fincstp ; Удаление 1 из вершины стека faddp st(1), st ; Сложение st(1) и st и выталкивание st ret ; Выход Func 01 endp
Пример 1 Func 02 fld fsub fld fmulp fld fsin faddp ret Func 02 proc qword ptr val. X qword ptr val. Y st(0) st(1), st qword ptr val. X st(1), st endp Func 03 fld fsub fld fmulp fld fcos faddp ret Func 03 proc qword ptr val. Y qword ptr val. X st(0) st(1), st qword ptr val. X st(1), st endp
Пример 2 Вывести на экран таблицу значений функции: Y=X^K Все параметры задает пользователь: n K – степень (вещественное значение); n X – вещественное значение, задается диапазоном [A; B], 0≤A
Пример 2 (данные программы). data? val. A val. B val. K val. X val. Y val. H val. N. data mess 01 mess 02 mess 03 mess 04 tblhead endl delim err 00 err 01 err 02 buff dq dq dq dd ? ? ? ? ; Левая граница интервала ; Правая граница интервала ; Степень ; Текущий аргумент функции ; Текущее значение функции ; Шаг приращения аргумента ; Количество строк в таблице db db db 'Input A: ', 0 'Input B: ', 0 'Input K: ', 0 'Input N: ', 0 ' X Y', 0 dh, 0 ah, '------+------', 0 dh, 0 ah, 0 09 h, ' | ', 09 h, 0 'Incorrect A!', 0 dh, 0 ah, 0 'Incorrect A and B!', 0 dh, 0 ah, 0 'Incorrect N!', 0 dh, 0 ah, 0 50 dup(0)
Пример 2 (ввод интервала) main proc invoke fldz fcomp fstsw sahf jna invoke ret next 00: invoke fld fcom fstsw sahf ja invoke ret Std. Out, ADDR mess 01 Std. In, ADDR buff, 50 Str. To. Float, ADDR buff, ADDR val. A ; Загрузка нуля qword ptr val. A ; Сравнение с A ax ; Сохранение слова состояния FPU ; Запись состояния в регистр флагов next 00 ; Переход, если 0
Пример 2 (ввод K и N) next 01: invoke Std. Out, ADDR mess 03 Std. In, ADDR buff, 50 Str. To. Float, ADDR buff, ADDR val. K invoke Std. Out, ADDR mess 04 Std. In, ADDR buff, 50 atol, ADDR buff cmp jg invoke ret eax, 0 next 02 Std. Out, ADDR err 02 ; Проверка N>0
Пример 2 (подготовка к выводу таблицы) next 02: mov fsub fild fld 1 fsubp fdivp fstp mov mov invoke таблицы mov dword ptr val. N, eax qword ptr val. A ; Вычисление B - A dword ptr val. N ; Загрузка количества строк ; Загрузка единицы st(1), st ; Вычисление N - 1 st(1), st ; Вычисление (B-A)/(N-1) qword ptr val. H ; Сохранение шага eax, dword ptr val. A dword ptr val. X, eax, dword ptr val. A + 4 dword ptr val. X + 4, eax Std. Out, ADDR tblhead ; Инициализация X ecx, dword ptr val. N ; Установка количества ; итераций ; Вывод заголовка
Пример 2 (цикл вывода таблицы) loop 01: push push call fstp invoke invoke fld fadd fstp pop dec or jz jmp next 03: ret main endp ecx dword ptr val. K+4 ; Передача K в параметре dword ptr val. K ; процедуры dword ptr val. X+4 ; Передача X в параметре dword ptr val. X ; процедуры Pow. XK ; Вызов процедуры qword ptr val. Y ; Запись в ячейку val. Y Float. To. Str, val. X, ADDR buff Std. Out, ADDR delim Float. To. Str, val. Y, ADDR buff Std. Out, ADDR endl qword ptr val. X ; Загрузка X qword ptr val. H ; Сложение с шагом qword ptr val. X ; Сохранение X ecx ; Уменьшение счетчика ecx, ecx ; Проверка на ноль next 03 ; Выход из цикла loop 01 ; Переход к следующей итерации
Пример 2 (Вычисление X^K начало) Pow. XK push mov fld fxam fstsw sahf jnz pop ret next 00: xor fld fxch proc ebp, esp qword ptr [ebp+8] ax next 00 ebp 16 ; Загрузка X ; Анализ X ; Сохранение слова состояния FPU ; Перенос в регистр флагов ; Если не ноль, то переход ; Завершение процедуры ecx, ecx qword ptr [ebp+16] st(0) st(2) ; Очистка ecx ; Загрузка K ; Дублирование K ; Обмен K и X
Пример 2 (Вычисление X^K - цикл) loop 01: fld 1 fcom fstsw sahf ja inc fadd fdivp jmp next 01: ffree fincstp fyl 2 x or jz push fild pop fmulp faddp jmp next 02: fxch ffree fincstp st(1) ax next 01 ecx st(0), st st(1), st loop 01 ; Загрузка 1 ; Сравнение 1 c Х ; Сохранение слова состояния FPU ; Перенос в регистр флагов ; Переход, если 1>X ; Увеличение счетчика ; Сложение 1 + 1 ; Деление X на 2 ; Переход на следующую итерацию st(0) ; Очистка вершины стека FPU ; «Выталкивание» из стека ; Вычисление K*log 2(X) ecx, ecx ; Проверка ecx на 0 next 02 ; Переход, если 0 ecx ; Сохранение ecx в стеке dword ptr [ebp-4] ; Загрузка счетчика в FPU ecx ; Восстановление ecx из стека st(2), st ; Умножение K на счетчик st(1), st ; Вычисление K*log 2(X)+K*ECX next 03 ; Переход на вычисление 2^ st(1) st(0) ; Обмен K и K*log 2(X) ; Освобождение вершины стека ; «Выталкивание» из стека
Пример 2 (Вычисление X^K - цикл) next 03: fld frndint fsub fld 1 fscale fxch ffree fincstp fxch f 2 xm 1 fld 1 faddp fmulp pop ret Pow. XK st(0) st(1), st st(1), st ebp 16 endp ; Дублирование степени ; Округление до целого ; Получение дробной части ; Загрузка 1 ; Вычисление 1*2^ ; Обмен с вершиной стека ; Очистка вершины ; «Выталкивание» из стека ; Обмен с вершиной стека ; Вычисление 2^X-1 ; Загрузка 1 ; Вычисление (2^X-1)+1=2^X ; Завершение вычислений


