Wie wandle ich eine eine Hexadezimalzahl (String) in ein Gleitkommazahl (Double) um?
Die Antwort besteht aus einer Kombination von Hex-zu-Int und Int-zu-Float:
BITS 32 SEGMENT .data hexz: db "72 6B 68 62",0 dbl: dq 0 ; 1919641698.0 = 41dc9ada18800000 SEGMENT .text Hex2Dword: ; Übergabe ESI: Zeiger auf ASCIIZ-String xor edx, edx .Schleife: lodsb cmp al, '0' jb .Leerzeichen ; keine Zahl, Leerzeichen ausprobieren cmp al, '9' ja .Majuskel ; keine Zahl, Großbuchstaben ausprobieren and al, 0Fh shl edx, 4 or dl, al jmp .Schleife .Leerzeichen: cmp al, 32 je .Schleife ; Leerzeichen: nächste Ziffer jmp .Ende ; kein Leerzeichen: Ausstieg aus der Schleife .Majuskel: cmp al, 'A' jb .Ende ; keine Zahl: Ausstieg aus der Schleife cmp al, 'F' ja .Minuskel ; kein Großbuchstabe, Kleinbuchstaben ausprobieren sub al, 55 shl edx, 4 or dl, al jmp .Schleife .Minuskel: cmp al, 'a' jb .Ende ; keine Zahl: Ausstieg aus der Schleife cmp al, 'f' ja .Ende ; keine Zahl: Ausstieg aus der Schleife sub al, 87 shl edx, 4 or dl, al jmp .Schleife .Ende: ret ; Ergebnis EDX: Integer Dword2Double: ; Übergabe EAX: Dword, EDI: Ergebnis (QWord) push 0 ; auf jeden Fall unsigned push eax fild qword [esp] add esp, 8 fstp qword [edi] ret ; Ergebnis: Double in [EDI] Hex2Double: ; Übergabe [hexz]=ASCIIZ, [dbl]=Puffer (8 Byte) mov esi, hexz call Hex2Dword ; Übergabe ESI; Ergebnis EDX mov eax, edx mov edi, dbl call Dword2Double ; Übergabe EAX, EDI; Ergebnis [EDI] ret ; Ergebnis: Double in [dbl]
Ralph 'rkhb' Bauer Aug 2008