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

FPU

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

    О том что такое 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
    1 из 1
    • Первое сообщение
      1/1
      Последнее сообщение