.686 .model flat public _float2double .code ; void float2double(float*f,double*d); _float2double PROC push ebp mov ebp,esp; push esi; push edi; mov esi,[ebp+8] ; pobranie f mov edi,[ebp+12] ; pobranie d mov eax,[esi] ; pobranie liczby w float; mov edx,eax ; kopia w edx ; dobieramy się do wykładnika shr edx,23 ; przesuwamy w prawo do końca and edx,000000ffH ; tylko wykładnik - 8b ;-127 + 1023 = zamiana na format double sub edx,127; add edx,1023; shl edx,21 ; będzie w starszym bajcie, mantysa w double: 52 bity, 52-32 = 20 ; przesuwamy o 1 więcej, aby zaraz móc dostawić bit znaku z CF bt eax,31 ; test bitu znaku, bit ląduje w CF rcr edx,1 ; wrzucamy bit znaku na początek and eax,007FFFFFH ; wybieramy tylko mantysę shl eax,3 or edx,eax; ; wynik w edx mov [edi],dword PTR 0 mov [edi+4],edx; pop edi pop esi pop ebp; ret _float2double ENDP END