пытаюсь переделать: было: Код (Text): fst dword [esp+0CH] fld dword [esp+08H] fld st0 fdivp st2, st0 fxch st1 fst dword [esp+4] стало Код (Text): fst dword [esp+0CH] ; b movss xmm1, [esp+0CH] fld dword [esp+08H] movss xmm0, [esp+08H] ; a rcpss xmm0, xmm0 mulss xmm0, xmm1 movss [esp+04H], xmm0 fld dword [esp+04H] ; b/a здесь вроде считается хорошо, но при этом программа дальше начинает глючить... т.е. например при последующей fld qword [esp+068H] в st0 получается -NotANumber вместо числа из памяти ... похоже что-то случается с состоянием FPU, но после чего ? после применения sse регистров (вроде это не mmx и emms не требуется) или после какого-то нарушения порядка загрузки/выгрузки чисел с одинарной или двойной точностью ?
исходно программа была из странных конструкций типа Код (Text): fstp DWORD PTR [esp+0ch] fld DWORD PTR [esp+0ch] - зачем так ??? fld DWORD PTR [esp+08h] fld st(0) fdivp st(2), st(0) fxch st(1) fstp DWORD PTR [esp+04h] fld DWORD PTR [esp+04h] - зачем так ??? fcom QWORD PTR [esp+068h] - а тута уже с Real8 работа... имхается странные пуши стека таки зачем-то нужны ? если да - где почитать когда/зачем/сколько их надо делать ?
в книге В Пирогова Ассемблер и Дизассемблирование написано на стр 49 Расширение mmx включает 8 регистров общего пользования (ММ0-ММ7). Размер регистров составляет 64 бита. Физически эти регистры пользуются младшими битами рабочих регистров сопроцессора (R0-R7). Комманды MMX портят регистр состояния и регистр тегов. по этой причине совместное использование команд MMX и команд сопроцессора может вызвать определенные трудности. Другими словами, перед каждым применением команд mmx вам придется сохранять контекст сопроессора, а это может весьма замедлить работу программы. Важно отметить также , что комманды mmx работают непосредственно с регистрами сопроцессора, а не с указателями на элементы стека. конец цытаты Для Xmm отчати вышеуказанное справедливо ибо они 128-битные
хмм совсем отдельны от регистров математического сопроцессора... пока что имхается что-то в последовательности пуша из фпу стека зарыто... типа долго и много делать fst низя - надо перебивать fstp или перед переходом на real8 ... если сразу бага неизвестна - буду понемногу натыкивать ссе команд между старыми фпу и смотреть когда начнутся глюки...
>Видимо в коде ЯВУ было приведение ко float, т.е. для снижения точности. хмм - странно... при этом процессор на вроде полностью и сразу кешируемой операции fstp DWORD PTR [esp+0ch] fld DWORD PTR [esp+0ch] аццки тормозит и на загрузке свежезаписанного :/ ... поэтому я сразу сделал fst DWORD PTR [esp+0ch] чтобы в памяти осталось значение для следующих вычислений и чтобы в стеке фпу осталось что было и чтобы лишней операции тормозной небыло... при этом глюки в программе еще не начинались...