kostenloser Webspace werbefrei: lima-city


Assembler - Zahl in Gleitkommadarstellung

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Hallo!
    Ich wollte mir eine effiziente Routine schreiben, welche Zahlen (Integer) in deren Gleitkommadarstellung umwandelt. Folgender Auszug sollte diese Identität im EBX-Register vornehmen:
    verbessert:
    elemzr:
        XOR ECX,ECX
        TEST EBX,EBX
        JNZ elemzr0
        RET
    elemzr0:
        ROL EBX,1
        MOV EDX,EBX
        AND EDX,1
        TEST EDX,EDX
        JZ elemzr1
        NEG EBX
    elemzr1:
        INC ECX
        ROL EBX,1
        MOV EAX,EBX
        AND EAX,1
        TEST EAX,EAX
        JNZ elemzr2
        JMP elemzr1
    elemzr2:
        SUB EBX,1
        CMP ECX,256
        JGE elemzr3
        AND EBX,2147483648
        ADD EBX,ECX
        ROR EBX,8
        TEST EDX,EDX
        JZ elemzr5
        JMP elemzr4
    elemzr3:
        MOV EBX,8
    elemzr4:
        ROL EBX,1
        ADD EBX,1
        ROR EBX,1
    elemzr5:
        RET
    Dabei handelt es sich um den FASM-Dialekt, dürfte aber dennoch allgemein verständlich sein.
    Nun mein Problem: Jede Zahl, die ich mit dieser Routine getestet habe kam unverändert wieder heraus...

    Kurze Erklärung: Der Exponent ist 8 Bit breit, die Zahl soll 4 Byte breit sein... Vielleicht habe ich mich auch irgendwo mit den Konstanten verrechnet...

    Wo ist also mein Fehler?

    Beitrag zuletzt geändert: 31.12.2012 17:27:01 von toolz
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Kommentare wären ganz hilfreich…

    TEST
    führt ein bitweises UND durch, also kommt bei
    TEST EBX,0
    immer ZF=1 heraus (x ∧ 0 = 0) und dein Sprung wird nie ausgeführt. Meinst du etwa
    TEST EBX,EBX
    ?
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Huch! Danke. Alle TEST X,0 sind falsch gesetzt, da muss TEST X,X hin.
    Gut. Jetzt bleibt allerdings die Mantisse leer. Es sind also noch weitere Fehler drin...

    Kommentare: Ja... Ich dachte das stimmt. Umso blöder als ich das Fehlverhalten bemerkt habe. Die Kommentare nachträglich anzubringen kann in Assembler dauern - Ich bin noch nicht so gut darin. Eventuell kann ich die im neuen Jahr nachreichen.

    Edit: Im Grunde ist mir das zu fehleranfällig. Spricht etwas gegen folgende Methode?
    fild qword[ebx]
    fstp qword[ebx]
    Wenn nicht, dann werde ich wohl dieses verwenden. Aber irgendetwas stimmt selbst da nicht, denn allein diese zwei Zeilen erzeugen einen Speicherzugriffsfehler...

    Beitrag zuletzt geändert: 31.12.2012 18:39:08 von toolz
  5. Hallo toolz,

    was steht den bei Dir in ebx? Es klingt ja fast so, als ob sich dort der Integer befindet. Für fild muss sich in ebx aber die Adresse des Speicherbereiches befinden in welchem der Integer liegt und für fstp die Adresse des Speicherbereiches in dem der float abgelegt werden soll. Die Speicherbereiche müssen jeweils 4 Byte groß sein.
    Das sollte in FASM ungefähr so aussehen, wenn Du vorher zwei Variablen int_val und float_val angelegt hast:
    label int_val
    dd 0
    label float_val
    dd 0
    ...
    mov ebx, int_val
    fild dword[ebx]
    mov ebx, float_val
    fstp dword[ebx]

    Edit: Evtl. kannst Du es auch mit SSE machen:
    label int_val
    dd 0
    label float_val
    dd 0
    ...
    mov eax, dword[int_val]
    cvtsi2ss xmm0, eax
    mov eax, float_val
    movss dword[eax], xmm0

    Mehr dazu kannst Du hier und hier nachlesen.

    Edit2: Es müssen natürlich Doppelworte und keine Quadworte sein.

    Beitrag zuletzt geändert: 31.12.2012 23:26:37 von darkpandemic
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!