|
Ушел с форума
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,761
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15.11.2013, 04:34 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 11 Конструкторы микропроцессоров от i8080 до i80386 не смогли реализовать все математические функции на одном кристалле, так как это оказалось слишком сложным. Вместо этого они создали набор функций более низкого уровня, из которых можно программно построить любые математические функции. Вот так программист должен был вычислять, используя только операции сложения, вычитания и умножения, функции синуса, экспоненты или логарифма:ДОПОЛНИТЕЛЬНЫЕ АРИФМЕТИЧЕСКИЕ КОМАНДЫ И все же, сопроцессор позволял ускорить вычисления, по сравнению с тем, если бы основному микропроцессору пришлось обрабатывать числа с плавающей запятой программным способом. Начиная с микропроцессора i80486 произошло объединение на одном кристалле математического сопроцессора с основным микропроцессором. Поэтому хватит вычислять значения синуса рядами, а воспользуемся командами, специально предназначенными для этого. Каждый FPU (Floating Point Execute Unit – блок обработки чисел с плавающей запятой) имеет собственный набор команд и средства для выполнения операций с плавающей запятой, такие как экспоненциальные, логарифмические и тригонометрические функции. Блок FPU содержит восемь 80-битовых регистров (от ST(0) до ST(7)) для обработки чисел с плавающей запятой, которые могут представлять числовые значения до 10400. Регистры данных блока FPU, в отличие от регистров общего назначения, не независимы, а организованы в стек, то есть операнды считываются в порядке, обратном их записи. Использование команд блока FPU в антихакерских программах совсем недавно было предпочтительным потому, что хакерские программы были ориентированы на слежение за блоком IEU (Integer Execute Unit – блок целочисленной обработки), а действия с FPU оставались в тени. Вычисления с плавающей точкой выполняются блоком FPU параллельно с работой основной программы, иногда даже быстрее вычислений, производимых блоком IEU. И программисты стали перекладывать основную тяжесть вычислений на блок FPU. Блок FPU поддерживает следующие типы данных: Типы данных, обрабатываемых блоком FPU Процессор передает числовые данные в блок FPU, который осуществляет необходимые вычисления и возвращает результат.
Вещественные форматы IEEE, применяемые в микропроцессорах Intel
Для ассемблирования команд FPU, если модель вашего микропроцессора младше i80486, необходимо добавлять параметр – .8087,.287,.387 Названия всех команд FPU начинаются с буквы F. Чтобы вам было легче запомнить назначение команд FPU, обратите внимание на следующую таблицу: Расшифровка аббревиатур в командах FPU Несмотря на большой диапазон вещественных значений, представимых в регистрах данных FPU, значения, например,
Специальные численные значения
Если в результате вычислений мантисса и порядок равны нулю, то, несмотря на скрытую единицу в целой части числа REAL4/8, все число полагается равным нулю. Любой конечный результат операции FPU, который из-за ограниченности поля порядка не может быть представлен в 23/52/64 разрядах для REAL4/8/10, соответственно вызывает особый случай некорректности представления числа. Некоторые особенности арифметических операций Работа с числами с плавающей запятой соответствует работе с дробями (чем собственно они и являются) и при выполнении сложения и вычитания над числами с плавающей запятой эти числа приводятся к общему знаменателю. Пусть: с числами с плавающей запятой При выполнении сложения/вычитания возможны два варианта. Если показатели степени равны ( Теоретически в вашем распоряжении потенциально бесконечное количество разрядов для записи мантиссы и показателя степени, на практике наши ресурсы ограничены – при аппаратной реализации количество разрядов фиксировано, так как регистры имеют конечный и вполне конкретный размер, FPU рассчитано на работу с определённым форматом данных, всё, что в него не помещается, придется так или иначе отбросить. Естественно, это приводит к потере точности и необходимости правильного округления. А иногда и к переполнениям. Переполнение при выполнении операций плавающей арифметики распознается по слишком большому (большему чем максимально представимый при данной разрядности) положительному значению порядка. При получении результата со слишком большим по модулю отрицательным порядком, возникает проблема исчезновения порядка; в этом случае в качестве результата обычно берут 0 и продолжают вычисления дальше. Вследствие ограниченного числа разрядов мантиссы при выполнении большей части операций возникают ошибки округления. Допустим, FPU нашего компьютера работает с десятичными числами (чтобы лучше увидеть результат), может хранить только три десятичных разряда мантиссы и один десятичный разряд показателя степени. Тогда: =(округляем до трёх значащих разрядов) =(округляем до трёх значащих разрядов) Ошибки округления при сложении и вычитании Математически-одинаковые числа, полученные двумя разными способами, на практике могут оказаться разными – из-за различий в последовательности выполнения округления. Складывать большие и маленькие числа нужно осторожно. Например, если нужно с большой точностью сложить много чисел, то начинать стоит с самых маленьких и складывать не всё подряд, а группировать числа так, чтобы всё время суммировать значения приблизительно одного порядка: Вычитаем большое число из большого. 6781,35 – 6774,22 = 7,13 Получается три знака, даже округлять не надо. Но если округление произвести до вычитания, тогда:6781,35 – 6774,22 = 6780 – 6770 = 10,0. Проблема в том, что в результате получается маленькое число с маленькой точностью. Если в исходных числах после округления было триверных знака, то у результата – только один. Если на это число далее будут что-нибудь умножать-делить, то ошибка будет распространяться и расти дальше. Ошибки округления при умножении Умножением в столбик легко проверить – если умножаются два Перемножим 345 на 47,8 – истинный результат равен 16491,0. Как и ожидалось, получили шесть цифр. Теперь перемножим те же числа с точностью до половины младшего разряда числа: Именно так и обрабатывают произведения чисел с плавающей запятой. Старшие Программная модель FPU Блок FPU предоставляет для программирования восемь регистров для хранения данных (R0-R7) и пять вспомогательных регистров: регистр SWR (State Word Register регистр состояния), регистр CWR (Control Word Register регистр управления), регистр TW (Tag Word регистр атрибутов) и регистры FIP (FPU Instruction Pointer) и FDP (FPU Data Pointer).Регистры данных R0-R7 Регистры данных не адресуются по именам, а рассматриваются в качестве стека, вершина которого называется ST(0). Если в какой-то момент вершина стека (поле TOP регистра SWR) указывает на регистр R5 и его считают ST(0), то после записи числа в R5, вершина стека будет указывать на регистр R4 и уже он будет ST(0), а R5 – ST(1) и так далее.Регистр тэгов TW Регистр тэгов хранит состояние содержимого каждого регистра данных (на каждый регистр данных отведено по 2 бита). Содержимое регистра данных может быть
Регистры FIP и FDP Регистр состояний RSW Регистр состояния фиксирует различные ошибки, хранит код условий для некоторых команд, определяет регистр – вершину стека и показывает состояние занятости блока FPU:
Регистр управления RCW Регистр управления содержит слово управления блока FPU:
Рисунок 11.2.1. Регистры блока FPU Любая команда MMX, кроме EMMS, приводит к тому, что поле TOP регистра SR и весь регистр TW в FPU обнуляется. Команда EMMS заполняет регистр TW единицами. Нельзя одновременно пользоваться командами для работы с числами с плавающей запятой и командами MMX, если возникла такая необходимость – применяют команды FSAVE/FRSTOR при переходе от FPU к MMX. Для доступа к регистрам данных (R0-R7) FPU можно использовать команды для доступа к регистрам MM0-MM7. Практическая работа с блоком FPU «Сколько не говори халва – во рту слаще не станет» Напишем первую программу с использованием команд FPUВосточная мудрость
Команда fild X (Integer LOAD) – загружает целое число из ячейки памяти X в ST(0). При загрузке числа блок FPU преобразует входное значение из формата знакового целого (16-, 32-, 64-битного) в формат с плавающей точкой. Следующая команда fsqrt (SQUARE ROOT) – извлекает квадратный корень из числа в ST(0). Команда fist result (Integer STORE) – копирует содержимое регистра ST(0) в ячейку памяти result, при этом выполняется обратное преобразование из внутреннего формата FPU в формат знакового целого с округлением результата. Текущий режим округления – к ближайшему значению – установлен в результате выполнения команды finit (Floating-point unit INITIALIZE). рис. 11.2.2 Обратная польская нотация Набор команд для работы с плавающей запятой в процессорах Intel достаточно разнообразен, чтобы реализовывать весьма сложные алгоритмы, и прост в использовании. Единственное, что может представлять определенную сложность, – почти все команды FPU по умолчанию работают с его регистрами данных как со стеком, выполняя операцию над числами в ST(0) и ST(1) и помещая результат в ST(0), так что естественной формой записи математических выражений для FPU оказывается RPN. Для FPU сначала преобразовывают обычные математические выражения в выражения RPN, а потом на основе RPN пишут программу. Преобразование выражение, записанного в RPN, в процедуру вычисления арксинуса.
Система команд блока FPU Команды блока FPU по выполняемым им функциям делят на шесть групп: передача данных, арифметические, сравнения, трансцендентальные, оперирующие константами и команды управления.Кодировка всех команд блока FPU начинается с 11011xxx (с 0D8h по 0DFh) (ESC1-ESC7 «ESC-коды»). Команды передачи данных Синтаксис команды:Команды FLD (загрузка числа в FPU = ”Floating point LOAD”) FLD <SRC> Алгоритм работы: загрузки числа в регистр данных блока FPU.Возможные варианты команды: fild mem fbld mem fld mem fld st(i) Псевдокод команды: IF SRC =ST(i) THEN temp ENDIF TOP IF SRC is memory-operand THEN ST(0) ELSE ST(0) END IF Применение:
Хотя используется одна и та же инструкция FLD SRC, но по типу имени операнда SRC ассемблер подбирает одну из четырех команд с разными опкодами (в кодах ясно угадывается адрес ячейки памяти 400174h, записанный в обратном порядке 74014000, и индекс регистра FPU), то же можно сказать и о команде FILD SRC.
Команды FST Синтаксис команды:( извлечение числа из FPU в память =”STORE Floating point value”) FST <DEST> Алгоритм работы: сохранение числа из регистра данных блока FPU в ячейку памяти.Возможные варианты команды: fist mem fistp mem fistpp mem fbstp mem fstp mem Псевдокод команды: IF Команда = FSTP THEN DEST ELSE IF Команда = FBSTP THEN DEST ELSE IF Команда = FISTP или FIST THEN DEST ENDIF; IF Команда = FISTP или FSTP или FBSTP THEN Вытолкнуть_содержимое_регистра_из_стека ENDIF; Применение: команда FST извлекает число из вершины стека и записывает его в ячейку памяти DEST. Область памяти DEST должна быть 32-, 64-, 80-битной. Команда FSTP выполняет операцию записи данных из FPU в память и извлекает число из стека.
(обмен значениями в регистрах FPU = ”EXCHGE register contents”) FXCH <SRC> Семантика команды: команда обмена значения в регистре стека ST(0) со значением регистра ST(i)Возможные варианты команды: fxch st(i) fxch Псевдокод команды: IF количество_операндов=1 THEN temp ST(0) SRC ELSE temp ST(0) ST(1) ENDIF
Арифметические команды Синтаксис команды:Команды FADD (сложение значений в регистрах FPU = ” Floating point ADDITION”) FADD <DEST>,<SRC> Семантика команды: команда сложения вещественных чисел.Возможные варианты команды: fadd st(0),st(i) fadd st(i),st(0) fadd mem faddp st(i),st(0) fiaddp mem Псевдокод команды: IF Команда=FIADD THEN DEST ELSE; операнд в SRC представлен в виде числа с плавающей запятой DEST ENDIF IF Команда=FADDP THEN Вытолкнуть_содержимое_регистра_из_стека ENDIF 9-8 биты регистра управления RCW – биты PC (Рrecision Control) определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT .
(вычитание значений в регистрах FPU =”Floating point SUBTRACT”) FSUB <DEST>,<SRC> Семантика команды: команда вычитания вещественных чисел.Возможные варианты команды: fsub fsub st(0),st(i) fsub st(i),st(0) fsub mem fisub st(i),st(0) fsubr fsubr st(0),st(i) fsubr st(i),st(0) fsubr mem fsubrp st(i),st(0) fisubrp mem Псевдокод команды: IF Команда=FISUB THEN DEST ELSE IF Команда=FSUB ; операнд в SRC представлен в виде числа с плавающей запятой DEST ELSE IF Команда=FISUBR DEST ELSE IF Команда=FSUBR ; операнд в SRC представлен в виде числа с плавающей запятой DEST ENDIF IF Команда=FSUBP или FSUBRP THEN Вытолкнуть_содержимое_регистра_из_стека ENDIF Кодировка FSUB команда FSUB mem это
Результаты действия fsubp, fsubrp и fsub st(0),st(1) эквивалентны. Команды FMUL Синтаксис команды: (умножение значений в регистрах FPU = ”Floating point MULTIPLY”) FMUL <DEST>,<SRC> Семантика команды: команда умножения вещественных чиселВозможные варианты команды: fmul fmul st(i),st(0) fmul st(0),st(i) fmul mem fmulp fimul mem Псевдокод команды: IF Команда=FIMUL THEN DEST ELSE; операнд в SRC представлен в виде числа с плавающей запятой DEST ENDIF IF Команда=FMULP THEN Вытолкнуть_содержимое_регистра_из_стека ENDIF Кодировка FMUL Операция деления в FPU происходит дольше, чем операция умножения, поэтому старайтесь заменять деление на константу на умножение на константу в степени –1.
Варианты возведения числа X в квадрат
(деление значений в регистрах FPU = ”Floating point DIVIDE”) FDIV <DEST>,<SRC> Семантика команды: команда деления вещественных чисел.Возможные варианты команды: fdiv mem fdiv st(0),st(i) fdiv st(i),st(0) fdivp st(i),st(0) fdivp fidiv mem Псевдокод команды: IF (Команда=FIDIV или FDIV) и SRC=0 THEN #Z ELSE IF (Команда=FIDIVR или FDIVR) и DEST=0 THEN #Z ELSE IF Команда=FIDIV THEN DEST ELSE IF Команда=FDIV ; операнд в DEST представлен в виде числа с плавающей запятой DEST ENDIF IF Команда=FDIVP или FDIVRP THEN Вытолкнуть_содержимое_регистра_из_стека ENDIF Кодировка FDIV Синтаксис команды:
(вычисления частичного остатка = ”Partial REMAINDER”) FPREM Семантика команды: команда вычисления частичного остатка.Remainder Псевдокод команды: D IF D<64 THEN Q ST(0) C2 C0,C3,C1LeastSignificantBits(Q); Q2Q1Q0 ELSE C2 N ST(0) ENDIF Эта команда за один раз уменьшает содержимое вершины стека максимум на 264. Команда выполняет нахождение истинного остатка от деления ST(0) на ST(1) и требует очень много времени для уменьшения большого числа по очень маленькому основанию. Если функция не завершена, команда FPREM устанавливает флаг C2 равным 1, а когда завершает вычисление остатка, то устанавливает другие три флага C3, C1 и C0 равными трем младшим битам частного. Когда команда FPREM используется в простых тригонометрических функциях для ограничения величины угла, это оказывается необходимым для определения октанта первоначального угла.
Команда FPREM1 Синтаксис команды:FPREM1 Семантика команды: команда вычисления частичного остатка.IF D<64 THEN Q ST(0) C2 C0,C3,C1LeastSignificantBits(Q); Q2Q1Q0 ELSE ENDIF Также как и команда FPREM, команда FPREM1 выполняет деление ST(0) на ST(1) и помещает остаток от деления в ST(0). Деление осуществляется при помощи последовательных вычитаний ST(1) из ST(0), но за один раз выполняется не более 64 таких вычитаний. Команда FRNDINT Синтаксис команды:(округления вещественного числа до целого = ”Floating point ROUND to INTEGER”) FRNDINT Семантика команды: команда округления до целого.Псевдокод команды:
Команда FSQRT Синтаксис команды:(извлечения квадратного корня = ”Floating point SQUARE ROOT”) FSQRT Алгоритм работы: извлечения квадратного корня.Псевдокод команды: ST(0) не должно быть отрицательно. Программа для решения этого уравнения:
Возможная проблема с потерей точности Еще раз вернемся к нашей задаче. Решением квадратного уравнения являетсяи при b, намного большем Команды масштабирования Синтаксис команды:(Возведение числа 2 в произвольную степень) Возведение числа 2 в целую степень. Команда FSCALE (Масштабирование числа=”Floating point SCALE ST(0) by ST(1)”) FSCALE Семантика команды: команда для возведения 2 в степень, равную целому числу, находящемуся в ST(1) и умножение на содержимое ST(0). Результат в ST(0).Псевдокод команды: Возведение числа 2 в дробную степень. Команда F2XM1 Синтаксис команды:(вычисление 2X-1=”Floating point compute 2X-1”) F2XM1 Семантика команды: команда вычисления 2 в степени X минус 1.Псевдокод команды: ST(0) Эта функция выполняет возведение в степень; она возводит число 2 в степень, указанную в ST(0). Исходное число должно находиться в диапазоне 0 ≤ ST(0) ≤0,5 и, чтобы возвести в степень большую 0,5, эту команду нужно использовать вместе с командой FSCALE. С помощью команд FLD, загружающих специальные константы, программа может возвести в степень и числа отличные от 2, для этого можно воспользоваться формулами:Команда FXTRACT (выделения порядка и значащей части = ”EXTRACT exponent and significand”) FXTRACT Семантика команды: выделения порядка и значащей части вещественного числа.Псевдокод команды: Эта команда разбивает текущую вершину стека на компоненты, ее операндом является вершина стека. Значение показателя степени замещает содержимое вершины стека, а затем дробная часть аргумента помещается в стек и становится новой вершиной стека. Действия команды FXTRACT обратные действиям команды FSCALE. Если в вершине стека находится некоторое число, то выполнение последовательно команд FXTRACT и FSCALE оставляет в вершине стека то же число. Но команда FSCALE не удаляет из стека показатель степени, так что теперь в стеке дополнительно окажется еще одно число. Команда FABS Синтаксис команды:(вычисления абсолютного значения = ”Floating point ABSOLUTE value”) FABS Семантика команды: вычисления абсолютного значения вещественных чисел.Псевдокод команды: Знаковый_бит Эта команда сбрасывает знаковый разряд числа в ST(0) (что соответствует положительному значению).Команда FCHS Синтаксис команды:(изменения знака = ”Floating point CHANGE Sign”) FCHS Семантика команды: изменения знака вещественного числа.Псевдокод команды: Знаковый_бит Команда изменяет знаковый разряд числа в ST(0) на противоположный. Кодировка трансцендентальных и прочих функций Операция сравнения чисел FPU отличается от целочисленной операции сравнения. Это отличие в большем количестве ситуаций и возможных результатов сравнения двух чисел. Числа могут быть:
Во второй группе операнды не сравнимы. На пример, пытаются сравнить число и не число, число и денормализованное число и т.д. В третью группу входят ситуации второй группы, но логически переосмысленные. Например, сравнивая число с денормализованным числом, представляют его как сравнение с нулём, или как сравнение числа и бесконечности. Как видите третья группа – условна и зависит от постановки задачи, от её особенностей, и того, что имеет смысл, а что нет. Всё это вызывает достаточно значительные проблемы. Если вы устанавливаете исключения на все случаи, то есть исключаете ситуацию появления «ненормализованных» чисел – то ваш код можно будет реализовывать как обычно, не обращая внимания на ситуации с образованием ненормализованных результатов. Иначе, потребуется дополнительный анализ после сравнения. При этом заметьте, что в вашей задаче может иметь смысл денормализованный операнд, но не имеет смысла бесконечность, или наоборот. Команды FCOM (FCOMP, FCOMPP, FICOM, FICOMP) Синтаксис команды:(сравнение вещественных чисел = ”COMPARE Floating point values”) FCOM <SRC> Семантика команды: команда сравнения вещественных чисел.Возможные варианты команды: fcom mem fcom st(i) fcomp mem fcomp st(i) fcompp mem fcompp st(i) ficom mem ficom st(i) ficomp mem ficomp st(i) Псевдокод команды: CASE (relation of operands) OF В команде FCOM SRC всегда участвует вершина стека ST(0) и явно указанный регистр или операнд в памяти SRC. Команда FCOM SRC выполняет сравнение ST(0) с операндом SRC и устанавливает или сбрасывает биты состояния C3 и C0 (таблица 11.3.1). При этом указатель стека TOP не модифицируется, если это не команда FCOMP. Особой командой сравнения является FCOMPP, которая не имеет операндов. Она всегда сравнивает два верхних элемента стека ST(0) и ST(1), после сравнения они оба исчезают из стека. Команды FICOM/FICOMP сравнивают содержимое регистра ST(0) и 16- или 32-битной переменной SRC, считается что в SRC содержится целое число. В остальном команды FICOM/FICOMP эквивалентны командам FCOM/FCOMP. Флаги состояния C3, C2 и C0 в FPU расположены на тех же местах, что и флаги нуля (ZF), паритета (PF) и переноса (CF) регистра EFLAGS.
Результат выполнения FCOM SRC Синтаксис команды:
(сравнение вещественных чисел без учета порядка = ”Unordered COMPARE Floating point values”) FUCOM<DEST>, <SRC> Алгоритм работы: сравнения вещественных чисел без учета порядка. Возможные варианты команды: fucom st(0),st(i) fucomp st(0),st(i) fucompp st(0),st(i) Псевдокод команды: CASE (relation of operands) OF ENDCASE IF ST(0) or SRC=QNaN, but not SnaN or unsupported format ELSE;ST(0) or SRC=SnaN or unsupported format #IA IF FPUControlWord.IM=1 ENDIF ENDIF Команды FCOMI, FCOMIP, FUCOMI, FCOMIP появились в процессорах P6 и позволяют напрямую заносить результаты сравнения в регистр EFLAGS, не используя команды FSTSW AX/SAHF.
Результат выполнения FUCOM SRC
Команда FTST Синтаксис команды:(сравнение вещественных чисел без учета порядка = ”TEST Floating point values”) FTST Алгоритм работы: команда FTST сравнивает содержимое вершины стека ST(0) с нулём, и устанавливает коды условий.Результат выполнения FTST Синтаксис команды:
Команда FXAM (проверка числа на вершине стека = ”Floating point EXAMINE”) FXAM Алгоритм работы: проверка числа на вершине стека.Команда FXAM устанавливает флаги регистра состояния от C0 до C3, показывая какое число находится на вершине стека.
(Условная пересылка данных =”Floating point Condition MOVE”) FCMOVcc <DEST>, <SRC> Семантика команды: условная пересылка данных.Возможные варианты команды: fcmove st(0),st(i) fcmovne st(0),st(i) fcmovb st(0),st(i) fcmovbe st(0),st(i) fcmovnb st(0),st(i) fcmovnbe st(0),st(i) fcmovu st(0),st(i) fcmovnu st(0),st(i) Псевдокод команды: IF condition TRUE ENDIF Это набор команд, каждая из которых копирует содержимое регистра ST(i)) в ST(0), если выполняется соответствующее условие. Реально, каждое условие соответствует тем или иным значениям флагов регистра EFLAGS, но после команд fcom ; (или другие команды сравнения)
Десятичный логарифм любого целого числа, не изображаемого единицей с нулями (1, 10, 100, 0,1, 0,01) – трансцендентальное число. Трансцендентальные функции – это аналитические функции, не являющиеся алгебраическими. К элементарным трансцендентным функциям относятся:
Тригонометрические функции Синтаксис команды:Команда FCOS (вычисление косинуса =”Floating point COSINE) FCOS Семантика команды: команда вычисления косинуса.Псевдокод команды: ELSE;операнд выходит за пределы ENDIF Косинус числа, находящегося в ST(0). Операнд считается заданным в радианах и имеет пределы 263 и -263. Если операнд выходит за эти пределы, флаг Команда FSIN Синтаксис команды:(вычисление синуса =”Floating point SINE) FSIN Семантика команды: команда вычисления синуса.Псевдокод команды: THEN C2 ELSE;операнд выходит за пределы ENDIF Синус числа, находящегося в ST(0). Операнд считается заданным в радианах и имеет пределы 263 и -263. Если операнд выходит за эти пределы, флаг Имея вычисленный Команда FSINCOS Синтаксис команды:(вычисление косинуса и синуса числа =”Floating point SINE and COSINE) FSINCOS Семантика команды: команда вычисления косинуса и синуса числа.Псевдокод команды: ELSE;операнд выходит за пределы ENDIF Команда FPTAN Синтаксис команды:(вычисление частичного тангенса=”Floating point Partial TANGENT”) FPTAN Семантика команды: команда вычисления частичного тангенса числа.Псевдокод команды: ELSE;операнд выходит за пределы ENDIF Команда FPATAN Синтаксис команды:(вычисление частичного арктангенса = ”Floating point Partial ARCTANGENT”) FPATAN Семантика команды: команда вычисления частичного арктангенса от вещественного числа.Псевдокод команды: THEN PopRegisterStack ENDIF Эта функция дополняет предыдущую, FPTAN. Команда FPATAN вычисляет угол в соответствии с отношением чисел ST(1) и ST(0). Она извлекает из стека число X, а затем записывает результирующий угол вместо числа Y в качестве новой вершины стека. Исходные значения должны подчиняться неравенству Вычисляет арктангенс числа ST(1)/ST(0). Результат записывается в ST(1), а ST(0) выталкивается. Результат имеет знак ST(1) и меньше числа p по абсолютной величине. Для вычисления Обратные тригонометрические функции Логарифмические функции Команда FYL2X Синтаксис команды: FYL2X Алгоритм работы: вычисление Псевдокод команды: PopRegisterStack Эта функция выполняет операцию логарифмирования. Она берет логарифм по основанию 2 от содержимого ST(0) и затем умножает его на содержимое ST(1). Команда FYL2X извлекает из стека число X и замещает результат числом Y. Исходные числа должны удовлетворять следующим соотношениям: Результат размещается в ST(1), а ST(0) выталкивается из стека. При этом ST(0)>0, если ST(0) = 0, тогда результат (ZM = 1) равен бесконечности со знаком, обратным ST(1). Логарифмические функции на основе FYL2X А что делать, если требуется вычислить логарифм по основанию, не равному 2? С помощью формулы Команда FYL2XP1 (вычисление FYL2XP1 Алгоритм работы: вычисление Псевдокод команды: PopRegisterStack Эта функция идентична функции FYL2X, за исключением того, что к X прибавляется 1. Функция FYL2XP1 накладывает более жесткие ограничения на X и предназначена для вычисления логарифмов чисел, значения которых очень близки к 1. Эта функция дает наиболее высокую точность, если Вычисляет Команды загрузки констант Команды загружают в стек заранее известные величины. Все команды загрузки констант не имеют операндов и могут работать только с ST(0).
Команда инициализации FINIT/FNINIT (FPU INITIALIZE) сбрасывает FPU в состояние, в которое он попадает при включении питания. Рекомендуется использовать эту команду перед обращением к FPU. В результате FINIT:
Команда FSTCW/FNSTCW (FPU STORE Control Word) записывает в 16-битную ячейку памяти значение регистра управления FPU. Команда FFREE ST(i) (FPU FREE register) отмечает атрибут регистра ST(i) в регистре TW как незанятый. Команда FCLEX (FPU CLEAR EXCEPTION) сбрасывает признаки особых ситуаций в регистре SWR. Рис. 11.3.3. Структура области памяти с рабочей средой сопроцессора Пустая команда FNOP (FPU Not OPERATION) используется для синхронизации совместных действий процессора и FPU и в отладочных целях. Заменяет некоторые команды управления, унаследованные от i8087, i80287 недействительные в P6. Команды FDECSTP/FINCSTP (FPU DECREMENT/INCREMENT Stack-Top Pointer) уменьшают/увеличивают величину TOP на единицу, «передвигая» по кольцу значения между регистрами ST(i). Команда FSTENV DEST (FPU STORE ENVIRONMENT) считывает в ячейку DEST (m14byte, если use16 либо m28byte, если use32) в системной памяти содержимое регистров TW, RSW, RCW, FIP, FDP. Устанавливает в RCW флаги запрета прерываний по особым ситуациям. Команда FLDENV SRC (FPU LOAD ENVIRONMENT) записывает в FPU образ его регистров из ячейки SRC (m14byte, если use16 либо m28byte, если use32) системной памяти.
Команда FRSTOR SRC (FPU RESTORE State) восстанавливает состояние FPU полностью, в соответствии с образом из ячейки SRC (m94byte, если use16 либо m108byte, если use32) в системной памяти Команда FWAIT/WAIT останавливает центральный процессор до завершения текущей операции в FPU. В P6 имеет смысл только при обработке аппаратных прерываний, возникающих в связи с ошибками в блоке FPU. Опкоды основных команд FPU Для команд с операндом st(i) используется режим регистровой адресации (Mod=11 R/M=st(i)), для команд с другими операндами выбран режим прямой адресации (Mod=00 R/M=101).
**Под командой FLD m80bcd подразумевается команда FBLD m80bcd Формирование программного кода для эмуляции команд Опция /E указывает ассемблеру masm на генерацию кода инструкций для реализацию вычислений с плавающей запятой, эмулирующей сопроцессор Intel x87. Эта опция была введена во времена микропроцессоров Intel 8086 и Intel 80286 для работы на компьютерах, которые не всегда комплектовались сопроцессором. Если программист намеревался на такой машине выполнить программу, использующую инструкции FPU, и при этом располагал библиотеками математических эмуляторов типа тех, которые поставляются с языками высокого уровня (Pascal, Fortran, C/C++/C#), то он должен был применить опцию /E в процессе ассемблирования, а затем скомпоновать полученный в результате объектный файл с библиотекой математических эмуляторов. Такая библиотека содержала стандартные программы, эмулирующие инструкции Intel x87 для выполнения вычислений с плавающей запятой.с плавающей запятой Пример указания на формирование эмулирующего кода для любых обнаруженных в программе file.asm инструкций с плавающей запятой:
Подпрограммы должны также обрабатывать ошибки, связанные с переполнением и потерей значимости. Желательно, чтобы пользователь написал такие подпрограммы самостоятельно, а потом, убедившись в их работоспособности, сравнил бы свои программы с программами, использовавшими библиотеку математических эмуляторов. При написании программ для эмуляции операций над числами с плавающей запятой операнды помещаются в регистры, первый регистр содержит порядок, второй – старшие разряды мантиссы, третий – младшие разряды мантиссы. Перед выполнением подпрограммы первый операнд хранится в регистрах EAX, EBX, ECX. Второй операнд, если он есть, помещается в регистры EDX, ESI, EDI. По окончании работы подпрограммы результат помещается в регистры EAX, EBX, ECX. Условие переполнения и потери значимости обрабатывается подпрограммой OUFLW, которая проверяет, имеет ли место переполнение при возврате из подпрограммы. Регистры результата содержат наибольшее возможное положительное или отрицательное число. Контрольные вопросы и упражнения
6
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
|||
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью.
Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
|
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
|
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма
Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
|