Guest User

Untitled

a guest
Jan 5th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. _float_razy_float proc
  2.     push ebp
  3.     mov ebp, esp
  4.     pusha
  5.  
  6.     mov esi, [ebp+8] ; float a
  7.     mov edi, [ebp+12] ; float b
  8.  
  9.     ; dodawanie wykladnikow
  10.     mov eax, esi
  11.     shl eax, 1 ; usuniecie bitu znaku
  12.     shr eax, 24 ; wyodrebnij sam wykladnik
  13.     sub eax, 127 ; konwersja na nkb
  14.     ; to samo nizej
  15.     mov ebx, edi
  16.     shl ebx, 1
  17.     shr ebx, 24
  18.     sub ebx, 127
  19.  
  20.     add ebx, eax ; wykladnik wynikowy w ebx
  21.  
  22.     ; mnozenie mantys
  23.     mov eax, edi
  24.     shl eax, 9 ; przesuniecie mantysy na najstarszy bit
  25.     stc ; ustawienie cf = 1
  26.     rcr eax, 1 ; wrzucenie cf = 1 na najstarszy bit
  27.     shr eax, 8 ; powrot mantysy do stanu pierwotnego
  28.     ; to samo nizej
  29.     mov ecx, esi
  30.     shl ecx, 9
  31.     stc
  32.     rcr ecx, 1
  33.     shr ecx, 8
  34.  
  35.     mov edx, 0
  36.     mul ecx ; mantysa w edx:eax
  37.  
  38.     ; konwersja mantysy 46bitowej z edx:eax na 23bit w eax
  39.     mov ecx, edx ; temp
  40.     shl ecx, 9 ; z eax musimy wziac tylko 9 bitow, bo 46-32=14, 23-14 = 9
  41.     shr eax, 18 ; usuniecie z eax 18 najmlodszych bitow bo ich nie potrzebujemy
  42.     or ecx, eax ; zlaczenie ecx i eax do ecx
  43.     mov eax, ecx ; eax = ecx
  44.  
  45.     ; normalizacja
  46.     shr edx, 14 ; usuniecie ze starego edx wszystkich bitow ktore nas interesuja
  47.     mov ecx, 0 ; licznik przesuniec
  48.     loop1:
  49.         cmp edx, 0 ; jesli jest 0 to nie ma juz co przesuwac i wychodzimy, else zliczamy o ile trzeba zwiekszyc wykladnik
  50.         je loop1_end
  51.         shr edx, 1
  52.         inc ecx
  53.         jmp loop1
  54.     loop1_end:
  55.     dec ecx ; zmniejszamy cl ze wzgledu na dopisana jedynke
  56.     shr eax, cl ; przesuwamy eax o zliczona ilosc przesuniec
  57.     and eax, 11111111011111111111111111111111b ; usuwamy dopisana jedynke
  58.  
  59.     ; ogarnianie wykladnika
  60.     add ebx, ecx ; dodajemy do wykladnika z normalizacji
  61.     add ebx, 127 ; exponent bias
  62.     shl ebx, 23 ; przesuwamy na pozycje odpowiednia we floacie
  63.  
  64.     ;znak
  65.     xor esi, edi ; uzyskujemy znak cyfry
  66.     shr esi, 31 ; wywalamy wszystko poza znakiem
  67.     shl esi, 31 ; wracamy na stara pozycje
  68.     or ebx, esi ; laczymy znak z wykladnikiem
  69.     or ebx, eax ; laczymy mantyse z wykladnikiem
  70.  
  71.     ; wrzucamy na stos koprocesora i koniec
  72.     mov dword ptr [float], ebx
  73.     finit
  74.     fld dword ptr [float]
  75.     popa
  76.     pop ebp
  77.     ret
  78. _float_razy_float endp
Advertisement
Add Comment
Please, Sign In to add comment