FLDCW
- это инструкция, которая загружает 16-битное управляющее слово для FPU x87. Битовая компоновка управляющего слова может быть найдена, например, на this Intel web page.
Нижние восемь бит управляющего слова содержат маски для определенных исключений IEEE-754. ORing 0x7F
таким образом маскирует все исключения с плавающей запятой, поскольку биты 6 и 7 не используются.
Верхние восемь бит слова управления содержат контроль точности в битах 8 и 9, а управление округлением в битах 10 и 11. В соответствии с ANDing с 0x300
, точный контроль PC
, который в настоящее время в силе, передается через нетронутый, а управление округлением RC
вынуждено 0, что соответствует режиму округления IEEE-754 «круглый до ближайшего или даже».
Невозможно сказать, какова именно цель этой функции. Ему передается целое число в 4 байта в стеке: [esp+4]
, которое удаляется вызывающим абонентом, предлагая соглашения о вызовах C. Пронумерованное 4-байтовое число, по-видимому, является сохраненным предыдущим значением управляющего слова FPU, сохраненным с FSTCW
и нулевым расширением от двух до четырех байтов. Значения, введенные для управления округлением и исключениями, маски предлагают, что эта функция используется для восстановления значений по умолчанию для математической библиотеки компилятора для управляющего слова x87, но нет никакого способа узнать это точно без дополнительного контекста.
спасибо. Я читаю статью. Однако, прямо сейчас, мне интересно, если эта функция эквивалентна «round (x)», почему входной аргумент составляет 4 байта вместо 8 байтов? – barej
Поскольку код, который вы показали, устанавливает управление округлением 'RC' в 0 (от раунда до ближайшего или даже), я не вижу, как этот код будет связан с' floor() '. Функция 'floor()' округляется вниз, то есть к отрицательной бесконечности, что соответствует значению «RC» 1, а не 0. Код здесь выглядит так, что он устанавливает значения по умолчанию для x87 для библиотеки компилятора, но без дополнительного контекста это чисто спекуляция. Управляющее слово FPU представляет собой 16-битовое целое число, предположительно, код, приведенный выше, относится к подпрограмме, которая передает значение управляющего слова в качестве аргумента с четырьмя байтами с нулевым числом в [esp + 4], но это также предположение – njuffa
, прежде чем эта подпрограмма будет называется строка 'fstcw word ptr [esp]'. Наверное, это связано с тем, что вы имеете в виду. Если управляющее слово FPU передается функции, где число с плавающей запятой округляется? это в 'ST (0)' 'FPU'? – barej