Скачать презентацию Лекции 30 31 Архитектура и программирование сопроцессора Скачать презентацию Лекции 30 31 Архитектура и программирование сопроцессора

lect30-31.ppt

  • Количество слайдов: 44

Лекции 30 – 31 Архитектура и программирование сопроцессора Лекции 30 – 31 Архитектура и программирование сопроцессора

Возможности сопроцессора n Полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Возможности сопроцессора n Полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Эти стандарты описывают как форматы данных, так и набор реализуемых функций. n Поддержка численных алгоритмов для вычисления значений тригонометрических функций, логарифмов и др. n Обработка десятичных чисел с точностью до 18 разрядов, что позволяет сопроцессору выполнять арифметические операции без округления над целыми десятичными числами со значениями до 10^18. n Обработка вещественных чисел из диапазона ±(3. 37 E-4932 … 1. 18 E+4932).

Архитектура сопроцессора Восемь регистров R 0 – R 7, составляющих программную модель сопроцессора – Архитектура сопроцессора Восемь регистров 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 Знак Порядок Регистр тегов Регистры сопроцессора Регистры стека сопроцессора 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 Регистр состояния 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 Регистр управления 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 – Регистр тегов TWR Возможны следующие значения в полях регистра тегов: n n 00 – регистр стека сопроцессора занят допустимым ненулевым значением. 01 – регистр стека сопроцессора содержит нулевое значение. 10 – регистр стека сопроцессора содержит одно из специальных численных значений. 11 – регистр пуст и в него можно производить запись.

Форматы данных Сопроцессор может работать со следующими типами данных: n двоичные целые числа – Форматы данных Сопроцессор может работать со следующими типами данных: n двоичные целые числа – 16, 32 и 64 бита; n упакованные целые десятичные числа (BCD) – максимальная длина 18 упакованных десятичных цифр (9 байт); n вещественные числа в трех форматах – коротком (32 бита), длинном (64 бита), расширенном (80 бит).

Форматы данных Специальные численные значения: n n n денормализованные значения – это числа меньшие Форматы данных Специальные численные значения: n n n денормализованные значения – это числа меньшие минимального нормализованного числа для каждого вещественного формата, поддерживаемого сопроцессором; нуль; положительная и отрицательная значения бесконечности; нечисла; неопределенности и неподдерживаемые форматы.

Форматы вещественных чисел Формат Короткий Длинный Расширенный Длина числа (бит) 32 64 80 Размерность Форматы вещественных чисел Формат Короткий Длинный Расширенный Длина числа (бит) 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 бит – Форматы данных Директивы описания данных: n n n n Целое число 16 бит – dw Целое число 32 бит - dd Целое число 64 бит - dq Упакованное десятичное целое число - dt Короткое вещественное число – dd Длинное вещественное число – dq Расширенное вещественное число – dt

Форматы данных Минимальное положительное денормализованнное число 0 00. . 00 79 78 00000…………… 001 Форматы данных Минимальное положительное денормализованнное число 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 Форматы данных Нуль 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 команды Система команд сопроцессора Все команды сопроцессора можно разделить на следующие группы: n n команды передачи данных, арифметические команды, команды сравнения данных, команды управления.

Система команд сопроцессора Правила мнемоники команд сопроцессора: Все мнемонические обозначения начинаются с символа f. Система команд сопроцессора Правила мнемоники команд сопроцессора: Все мнемонические обозначения начинаются с символа f. Вторая буква мнемонического обозначения определяет тип операнда в памяти с которым работает программа: n i – целое двоичное число, n b – целое десятичное число, n отсутствие буквы – вещественное число. Последняя буква мнемонического обозначения команды p означает, что последним действием команды обязательно является извлечение операнда из стека. Последняя или предпоследняя буква r означает реверсивное следование операндов при выполнении команд вычитания и деления.

Команды передачи данных n n n n fld источник – загрузка вещественного числа из Команды передачи данных n n n n fld источник – загрузка вещественного числа из памяти в вершину стека. fst приемник – сохранение вещественного числа из вершины стека в память. fstp приемник – сохранение вещественного числа из вершины стека в память с выталкиванием из стека. fild источник – загрузка двоичного целого числа из памяти в вершину стека. fist приемник – сохранение двоичного целого числа из вершины стека в память. fistp приемник – сохранение двоичного целого числа из вершины стека в память с выталкиванием из стека. fbld источник – загрузка десятичного целого числа из памяти в вершину стека. fbstp приемник – сохранение десятичного целого числа из вершины стека в память с выталкиванием из стека.

Команды передачи данных n fxch st(i) – обмен значений между текущей вершиной стека и Команды передачи данных 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) и Целочисленные арифметические команды 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). Результат в Вещественные арифметические команды 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). Результат Вещественные арифметические команды 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). Результат в Вещественные арифметические команды 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). Результат Вещественные арифметические команды 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). Результат в Вещественные арифметические команды 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 в Команды сравнения Все команды сравнения устанавливают значения бит 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) Команды сравнения 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). Результат в Команды трансцендентных функций 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. Исходное Команды трансцендентных функций 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 Команды управления сопроцессором 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 – команда сброса флагов исключений Команды управления сопроцессором n n n fclex / fnclex – команда сброса флагов исключений в регистре swr сопроцессора. fincstp – команда увеличения указателя стека на единицу. Псевдо выталкивание значения из стека. fdecstp – команда уменьшения указателя стека на единицу. Псевдо помещение значения в стек. ffree st(i) – команда освобождения регистра стека st(i). fnop – пустая команда.

Команды управления сопроцессором n n fsave / fnsave приемник – команда сохранения полного состояния Команды управления сопроцессором n n fsave / fnsave приемник – команда сохранения полного состояния сопроцессора в памяти. Размер блока памяти зависит от режима адресации: use 16 – 94 байта, use 32 – 108 байт. frstor источник – команда восстановления полного состояния среды сопроцессора из области памяти. fstenv / fnstenv приемник – команда сохранения частичного состояния сопроцессора в памяти. Размер блока памяти зависит от режима адресации: use 16 – 14 байт, use 32 – 28 байт. fldenv источник – команда восстановления частичного состояния среды сопроцессора из области памяти.

Пример 1 Написать программу для вычисления значения выражения: Пример 1 Написать программу для вычисления значения выражения:

Пример 1 include masm 32includemasm 32 rt. inc. data? val. X dq ? val. Пример 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 Пример 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 в Пример 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 Пример 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 Пример 2 Вывести на экран таблицу значений функции: Y=X^K Все параметры задает пользователь: n K – степень (вещественное значение); n X – вещественное значение, задается диапазоном [A; B], 0≤A

Пример 2 (данные программы). data? val. A val. B val. K val. X val. Пример 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 Пример 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 Пример 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 Пример 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 Пример 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 Пример 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 Пример 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 Пример 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 ; Завершение вычислений