Last active
January 3, 2016 04:29
-
-
Save typeofweb/8409574 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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