· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Эмуляция FPU

Посл.отвђт Сообщенiе


Дата: Июл 16, 2003 15:03:02 · Поправил: Dr.Golova

Есть кусочек кода:
.xlok__:004493CA                 push    ecx             ; ecx == 11h
.xlok__:004493CB                 or      eax, ecx
.xlok__:004493CD                 fild    dword ptr [esp]
.xlok__:004493D0                 btr     eax, 14h
.xlok__:004493D4                 push    ecx             ; ecx == 11h
.xlok__:004493D5                 shrd    eax, ecx, 1Ch
.xlok__:004493D9                 fld     real4 ptr [esp]
.xlok__:004493DC                 not     eax
.xlok__:004493DE                 fsubrp  st(1), st
.xlok__:004493E0                 dec     eax
.xlok__:004493E1                 fistp   dword ptr [esp]
.xlok__:004493E4                 dec     eax
.xlok__:004493E5                 pop     ecx             ; ecx == 0xFFFFFFEF


Как бы мне его переписать на C - как я не парился, всегда числа конвертятся в 80 битные вещественные, и соответсно в результате получается ноль, а не 0xFFFFFFEF :(


Дата: Июл 16, 2003 17:19:01

У инвижуальных сей это вроде бы делает ключик
/Op (Improve Float Consistency).

Но он не у всех редакций есть, только Professional и Enterprise...


Дата: Июл 17, 2003 02:37:12

так?
int main()
{
int a;
a=0x11;

a=*(double*)&a-*(int*)&a;
...
}


А вот с "eax" я что-то не понял.


Дата: Авг 1, 2003 19:06:58

ох, ошибка :( в строке
a=*(double*)&a-*(int*)&a;
вместо 'double' должно быть 'float', а то размер не совпадает:
a=*(float*)&a-*(int*)&a;


Извиняюсь.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.049