module fastmath segment FASTMATH_TEXT("CODE",00029H) public __Sin: fld st(0), qword [esp][4] fsin st(0) ret 8 public __Cos: fld st(0), qword [esp][4] fcos st(0) ret 8 public __Tan: (* Replace ST(0) with its tangent and push 1 onto the FPU stack. *) fld st(0), qword [esp][4] fptan st(0) fstp st(0), st(0) ret 8 public __SinCos: (* Compute the sine and cosine of ST(0); replace ST(0) with the sine, and push the cosine onto the register stack. *) push eax fld st(0), qword [esp][8] fsincos st(0) mov eax, [esp][20] (* cosine *) fstp qword [eax], st(0) mov eax, [esp][16] (* sine *) fstp qword [eax], st(0) pop eax ret 16 public __ATan2: (* FPATAN: Replace ST(1) with arctan(ST(1)/ST(0)) and pop the register stack. *) (* fld and fild push the loaded value onto the x87 stack. This push always puts the value in st0, moves the old value of st0 to st1, the old st1 to st2, and so on. *) (* Стек – это область памяти, адресуемая регистром esp *) (* FPU register stack – st(i) *) (* [esp][0] адрес следующей после call near инструкции (4 байта) *) (* [esp][4] X, второй параметр функции (8 байт) *) (* [esp][12] Y, первый параметр функции (8 байт) *) fld st(0), qword [esp][12] (* Помещает Y в st(0) *) fld st(0), qword [esp][4] (* Помещает X в st(0), заталкивая Y в st(1) *) fpatan st(1), st(0) (* pops the register stack - то есть выталктвает st(1) на место st(0), st(0) теряется *) ret 16 (* pops 16 bytes from stack esp - 2 по 8 байт для X и Y *) public __Sqrt: fld st(0), qword [esp][4] fsqrt st(0) ret 8 end