Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 25 - Архитектура и программирование сопроцессора.ppt
Скачиваний:
42
Добавлен:
18.02.2023
Размер:
539.14 Кб
Скачать

Пример 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