GameHackLab[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    FPU

    Запланировано Прикреплена Закрыта Перенесена Базовая информация
    fpufloatdoubleassembler
    1 Сообщения 1 Posters 222 Просмотры
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • PromisingP
      Promising
      отредактировано Promising

      О том что такое 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:

      1 ответ Последний ответ Ответить Цитировать 2
      • Первое сообщение
        Последнее сообщение