FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.)

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:

Nasm
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