- •Лекция 25
- •Возможности сопроцессора
- •Архитектура сопроцессора
- •Регистры сопроцессора
- •Регистр состояния SWR
- •Регистр управления CWR
- •Регистр тегов TWR
- •Форматы данных
- •Форматы данных
- •Форматы вещественных
- •Форматы данных
- •Форматы данных
- •Форматы данных
- •Система команд сопроцессора
- •Система команд
- •Команды передачи данных
- •Команды передачи данных
- •Целочисленные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Вещественные арифметические команды
- •Команды сравнения
- •Команды сравнения
- •Команды трансцендентных функций
- •Команды трансцендентных функций
- •Команды управления сопроцессором
- •Команды управления сопроцессором
- •Команды управления сопроцессором
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 2
- •Пример 2 (данные
- •Пример 2 (ввод интервала)
- •Пример 2 (ввод K и N)
- •Пример 2 (подготовка к выводу таблицы)
- •Пример 2 (цикл вывода
Пример 2 (цикл вывода
таблицы) |
|
|
||
loop01: |
ecx |
|
|
|
push |
|
|
;Передача K в параметре |
|
push |
dword ptr valK+4 |
|||
push |
dword ptr valK |
;процедуры |
||
push |
dword ptr valX+4 |
;Передача X в параметре |
||
push |
dword ptr valX |
;процедуры |
||
call |
PowXK |
;Вызов процедуры |
||
fstp |
qword ptr valY ;Запись в ячейку valY |
|||
invoke |
FloatToStr, valX, ADDR buff |
|||
invoke |
StdOut, ADDR buff |
|
||
invoke |
StdOut, ADDR delim |
|
||
invoke |
FloatToStr, valY, ADDR buff |
|||
invoke |
StdOut, ADDR buff |
|
||
invoke |
StdOut, ADDR endl |
|
||
fld |
qword ptr valX ;Загрузка X |
|||
fadd |
qword ptr valH ;Сложение с шагом |
|||
fstp |
qword ptr valX ;Сохранение X |
|||
pop |
ecx |
;Уменьшение счетчика |
||
dec |
ecx |
|||
or |
ecx, ecx |
;Проверка на ноль |
||
jz |
next03 |
;Выход из цикла |
|
|
jmp |
loop01 |
;Переход к следующей итерации |
||
next03: |
|
|
|
|
ret main endp
Пример 2 (Вычисление X^K
|
начало) |
|
|
|
|
PowXK |
proc |
|
|
|
|
|
push |
ebp |
|
|
|
|
mov |
ebp, esp |
|
|
|
|
fld |
qword ptr [ebp+8] |
;Загрузка X |
||
|
fxam |
|
|
;Анализ X |
|
|
fstsw |
ax |
;Сохранение |
слова состояния FPU |
|
|
sahf |
|
;Перенос в регистр флагов |
||
|
jnz |
next00 |
;Если не ноль, то переход |
||
|
pop |
ebp |
;Завершение |
процедуры |
|
|
ret |
16 |
|
|
|
next00: |
|
|
|
|
|
|
xor |
ecx, ecx |
|
;Очистка ecx |
|
|
fld |
qword ptr [ebp+16] |
;Загрузка K |
||
|
fld |
st(0) |
|
;Дублирование K |
|
|
fxch |
st(2) |
|
;Обмен K и X |
|
|
|
|
|
|
|
Пример 2 (Вычисление X^K
loop01: |
;Загрузка 1 |
|
|
|
fld1 |
|
|
||
- цикл)fcom st(1) |
;Сравнение 1 c Х |
|||
fstsw |
ax |
;Сохранение слова состояния FPU |
||
sahf |
;Перенос в регистр флагов |
|||
ja |
next01 |
;Переход, если 1>X |
||
inc |
ecx |
;Увеличение счетчика |
||
fadd |
st(0), st |
;Сложение 1 + 1 |
||
fdivp |
st(1), st |
;Деление X на 2 |
||
jmp |
loop01 |
;Переход на следующую итерацию |
||
next01: |
st(0) |
|
;Очистка вершины стека FPU |
|
ffree |
|
|||
fincstp |
;«Выталкивание» из стека |
|||
fyl2x |
;Вычисление K*log2(X) |
|
||
or |
ecx, ecx |
;Проверка ecx на 0 |
||
jz |
next02 |
;Переход, если 0 |
||
push |
ecx |
;Сохранение ecx в стеке |
||
fild |
dword ptr [ebp-4] |
;Загрузка счетчика в FPU |
||
pop |
ecx |
;Восстановление ecx из стека |
||
fmulp |
st(2), st |
;Умножение K на счетчик |
||
faddp |
st(1), st |
;Вычисление K*log2(X)+K*ECX |
||
jmp |
next03 |
;Переход на вычисление 2^ |
||
next02: |
st(1) |
;Обмен K и K*log2(X) |
||
fxch |
||||
ffree |
st(0) |
;Освобождение вершины стека |
||
fincstp |
;«Выталкивание» из стека |
|||
|
|
|
|
|
|
|
Пример 2 (Вычисление X^K |
|
||
|
|||||
|
|
- цикл) |
|
|
|
next03: |
|
|
|
||
|
|
fld |
st(0) |
;Дублирование степени |
|
|
|
frndint |
|
;Округление до целого |
|
|
|
fsub |
st(1), st |
;Получение дробной части |
|
|
|
fld1 |
|
;Загрузка 1 |
|
|
|
fscale |
|
;Вычисление 1*2^ |
|
|
|
fxch |
st(1) |
;Обмен с вершиной стека |
|
|
|
ffree |
st(0) |
;Очистка вершины |
|
|
|
fincstp |
|
;«Выталкивание» из стека |
|
|
|
fxch |
st(1) |
;Обмен с вершиной стека |
|
|
|
f2xm1 |
|
;Вычисление 2^X-1 |
|
|
|
fld1 |
|
;Загрузка 1 |
|
|
|
faddp |
st(1), st |
;Вычисление (2^X-1)+1=2^X |
|
|
|
fmulp |
st(1), st |
;Завершение вычислений |
|
|
|
pop |
ebp |
|
|
|
|
ret |
16 |
|
|
PowXK |
endp |
|
|
||
|
|
|
|
|
|