2015-08-08 5 views
2

Я следил за этим скомпилированным кодом (я не знаю компилятора и не имею исходного кода).Что делает следующий код сборки?

Sub1: 
mov edx,[esp+04h] 
and edx,00000300h 
or edx,0000007Fh 
mov [esp+06h],dx 
fldcw word ptr [esp+06h] 
retn 

Мое понимание:

Sub1(4byte param1) 
edx=param1&0x00000300|0x0000007F 
higher 2 bytes of param1 = lower 2 bytes of edx 
fldcw ??????? 

fldcw загружает управляющее слово. Но каково контрольное слово с плавающей точкой?

Результат сохраняется в более высоких 2 байтах param1. Я прав?

Что может быть целью этой подпрограммы?

ответ

5

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, но нет никакого способа узнать это точно без дополнительного контекста.

+0

спасибо. Я читаю статью. Однако, прямо сейчас, мне интересно, если эта функция эквивалентна «round (x)», почему входной аргумент составляет 4 байта вместо 8 байтов? – barej

+0

Поскольку код, который вы показали, устанавливает управление округлением 'RC' в 0 (от раунда до ближайшего или даже), я не вижу, как этот код будет связан с' floor() '. Функция 'floor()' округляется вниз, то есть к отрицательной бесконечности, что соответствует значению «RC» 1, а не 0. Код здесь выглядит так, что он устанавливает значения по умолчанию для x87 для библиотеки компилятора, но без дополнительного контекста это чисто спекуляция. Управляющее слово FPU представляет собой 16-битовое целое число, предположительно, код, приведенный выше, относится к подпрограмме, которая передает значение управляющего слова в качестве аргумента с четырьмя байтами с нулевым числом в [esp + 4], но это также предположение – njuffa

+0

, прежде чем эта подпрограмма будет называется строка 'fstcw word ptr [esp]'. Наверное, это связано с тем, что вы имеете в виду. Если управляющее слово FPU передается функции, где число с плавающей запятой округляется? это в 'ST (0)' 'FPU'? – barej

 Смежные вопросы

  • Нет связанных вопросов^_^