Facebook
From Gentle Stork, 9 Years ago, written in x86 Assembler.
Embed
Download Paste or View Raw
Hits: 575
  1. .686
  2. .model flat
  3.  
  4. public _float2double
  5.  
  6. .code
  7.  
  8. ; void float2double(float*f,double*d);
  9. _float2double PROC
  10.         push ebp
  11.         mov ebp,esp;
  12.         push esi;
  13.         push edi;
  14.        
  15.         mov esi,[ebp+8] ; pobranie f
  16.         mov edi,[ebp+12] ; pobranie d
  17.        
  18.         mov eax,[esi] ; pobranie liczby w float;
  19.         mov edx,eax ; kopia w edx
  20.        
  21.         ; dobieramy się do wykładnika
  22.         shr edx,23                                      ; przesuwamy w prawo do końca
  23.         and edx,000000ffH ; tylko wykładnik - 8b
  24.         ;-127 + 1023  =  zamiana na format double
  25.         sub edx,127;
  26.         add edx,1023;
  27.         shl edx,21                                      ; będzie w starszym bajcie, mantysa w double: 52 bity, 52-32 = 20
  28.         ; przesuwamy o 1 więcej, aby zaraz móc dostawić bit znaku z CF
  29.         bt eax,31                                       ; test bitu znaku, bit ląduje w CF
  30.         rcr edx,1                                       ; wrzucamy bit znaku na początek
  31.        
  32.         and eax,007FFFFFH ; wybieramy tylko mantysę
  33.         shl eax,3
  34.         or edx,eax;
  35.         ; wynik w edx
  36.        
  37.         mov [edi],dword PTR 0
  38.         mov [edi+4],edx;
  39.        
  40.         pop edi
  41.         pop esi
  42.         pop ebp;
  43.         ret
  44. _float2double ENDP
  45. END