Skip to content

Instantly share code, notes, and snippets.

@typeofweb
Last active January 3, 2016 04:29
Show Gist options
  • Save typeofweb/8409574 to your computer and use it in GitHub Desktop.
Save typeofweb/8409574 to your computer and use it in GitHub Desktop.
; Michal Miszczyszyn
; program posiadajacy procedure konwertujaca float do double
; na pewno duzo mozna poprawic...
.686
.model flat
public _float2double
.code
_float2double PROC
push ebp
mov ebp, esp
push ebx
push ecx
push edx
; kopiujemy liczbe 3 razy
mov eax, [ebp+8] ; EAX to znak
mov ebx, eax ; EBX to wykladnik
mov ecx, eax ; ECX to mantysa
; float wyglada tak:
; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
; S wykladnik - 8b mantysa - 23b
; S to znak 1b
and eax, 80000000H ; 10000000000000000000000000000000 znak z floata
and ebx, 7F800000H ; 0111 1111 1000 0000 0000 0000 0000 0000 wykladnik z floata
shr ebx, 23 ; przesuwamy wykladnik na najmlodsze bity
sub ebx, 127 ; wykladnik normalnie
and ecx, 007FFFFFH ; 0000 0000 0111 1111 1111 1111 1111 1111 czyli mantysa
; do double
; znak jest OK
; wykladnik
add ebx, 1023
; aktualnie wykladnik jest na najmlodszych bitach rejestru ebx,
; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
; zaczyna sie tutaj ^
; _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
; a powinien tutaj^
; UWAGA w rejestrze sa tylko 32 bity, double ma ich dwa razy wiecej,
; wiec sie nie zmiesci na raz do jednego rejestru!
shl ebx, 20
or eax, ebx ; dopisujemy wykladnik do znaku w eax
; to, co sie teraz stanie jest dosc niesamowite :P
; mianowicie: w double potrzebujemy *czesc* mantysy zapisac na pierwszych 32 bitach,
; reszte na kolejnych 32 bitach
; poniewaz nie ma rejestru 64-bit, musimy czesc mantysy zapisac do rejestru eax,
; a reszte przeslac oddzielnie
; rozkaz SHLD powoduje, ze 20 lewych bitow z ECX zostanie wsuniete do EAX
; z prawej strony (przesuwajac to, co tam jest)
; Po SHLD, ECX pozostaje niezmieniony!!!
shr eax, 20
; sama mantysa ma 23 bity, wiec przesuwamy ja maksymalnie w lewo (9+23 = 32)
shl ecx, 9
shld eax, ecx, 20
shl ecx, 20 ; usuwamy bity, ktore zostaly wsuniete do eax
; adres do ktorego wpiszemy liczbe double
mov edx, [ebp+12]
; wpisujemy pierwsza czesc liczby do wyzszej czesci
; 64-bitowego obszaru pamieci zarezerwowanego dla double
mov [edx+4], eax
; reszte do nizszej
mov [edx], ecx
pop edx
pop ecx
pop ebx
pop ebp
ret
_float2double ENDP
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment