Assembler - Zahl in Gleitkommadarstellung
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
adresse
bit
byte
code
effiziente routine
exponent
fehler
fehlverhalten
folgende methode
folgender auszug
grund
http
kommentar
label
problem
register
sprung
test
url
zahl
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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?
Wenn nicht, dann werde ich wohl dieses verwenden. Aber irgendetwas stimmt selbst da nicht, denn allein diese zwei Zeilen erzeugen einen Speicherzugriffsfehler...fild qword[ebx] fstp qword[ebx]
Beitrag zuletzt geändert: 31.12.2012 18:39:08 von toolz -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage