-
О том что такое FPU и его команды, обзор принципов взаимодействия
Fpu это математический сопроцессор который позволяет легко работать с числами с плавающей запятой и с обычными числами, совершать операции типа умножения и деления. Он может работать с любыми значениями 4 и 8 байт размера и любыми типами, float, double, int32, int64.
Все операции Fpu производятся в его стеке, в который сначала нужно загрузить значения, после вычислений значения нужно выгрузить если вам нужно получить результат и что бы не портить стек, если вы делаете инъекцию в код игры и она использует fpu.Некоторые команды сопроцессора:
//Если команда не имеет *, значит она работает с числом в стеке и не принимает переменных. //Почти все команды могут быть использованы на регистрах стека fpu с уже загруженными значениями, например fld st(0) продублировать последнее загруженное значение, или fadd st(0), st(1), сложить два последних загруженных значения в стеке и тому подобное. //Для выгрузки значения из стека вникуда используйте fstp st(0) //Почти все команды с f поддерживают вариант с fi, например fadd - fiadd, что указывает сопроцессору что сложение надо производить сначала сконвертировав число в число с плавающей запятой, например используйте fiadd если добавляете целое число int32. //Команды загрузки и выгрузки fld * - Загрузить вещественное число fild * - Загрузить в стек целое число fst * - Скопировать из стека в переменную fstp * - Выгрузить из стека в переменную fist * - Скопировать из стека в переменную и преобразовать в целое fistp * - Выгрузить из стека в переменную и преобразовать в целое fldpi - Поместить в стек число Пи fldz - Поместить 0 fld1 - Поместить 1 //Команды арифметический операций fadd * - Складывает значение в стеке и переменную fsub * - Вычитает из значения в стеке переменную fsubr * - Вычитает из переменной значение в стеке, и помещает в стек. fmul * - Выполняет умножение числа в стеке на переменную fdiv * - Выполняет деление fdivr * - Делит переменную на число в стеке и помещает результат в стек. fsqrt - Извлекает квадратный корень из числа в стеке. fabs - Убирает минус у числа в стеке (делает положительным) //Команды проверок fcom * - Сравнить значение в стеке с переменной ftst - Сравнить с нулём fstsw ax сохраняет флаги в приёмник (ax) sahf загружает флаги после команды выше.
Рассмотрим пример использования FPU в скрипте для конвертации в разные типы, из int32 во float и double: