NASM mögliche Lösung -> 2 float's vergleichen

02/10/2009 - 21:36 von Jens Kallup | Report spam
Hallo Newsgroup,

als Quelltext liegt mir folgender Code vor:

var1 = 2 + 3
if var1+2 = var1+2
? "if ok"
else
? "Ist nicht"
endif

Dieser wird in folgenden Assembler Code
transformiert:

fld qword [_var1]
fld qword [LC8]
fadd st0, st1
fld st0 ; richtig ?
fld qword [_var1]
fld qword [LC9]
fadd st1, st2 ; richtig ? Fehler!
fcomp
fstsw ax
sahf
jne near Le0
push dword LC10
call _printf
add esp, 4
jmp near Lj0
Le0:
push dword LC11
call _printf
add esp, 4
jmp near Lj0
Lj0:


Leider erhalte ich im NASM Ausgabe die
Meldung:
2.asm:46: error: invalid combination of opcode and operands

Was kann der Fehler sein?
Ist eine derartige AsmCodeStruktur überhapt
machbar?

Für Infos dankend ...
Jens
 

Lesen sie die antworten

#1 Markus Wichmann
02/10/2009 - 23:33 | Warnen spam
Jens Kallup () schrieb:
Hallo Newsgroup,

als Quelltext liegt mir folgender Code vor:

var1 = 2 + 3
if var1+2 = var1+2
? "if ok"
else
? "Ist nicht"
endif

Dieser wird in folgenden Assembler Code
transformiert:

fld qword [_var1]
fld qword [LC8]
fadd st0, st1
fld st0 ; richtig ?



Nein, dein Code ist komplett was anderes als im Quelltext steht. Hier
wird der Wert von var1 benutzt, um irgendwas zu berechnen, im Quelltext
aber ist der Wert von var1 irrelevant. Folgender Code passt vielleicht
besser. Ich benutze das Typensystem von C. Die Berechnung kann mit
immediate data bytes als integers erfolgen, anschließend muss man den
Typ des Ganzen auf "float" casten, um das Ergebnis var1 zuweisen zu
können.

;2 + 3
mov eax, 2
add eax, 3

;cast zu float
push eax
fild dword [esp]
pop eax

:Zuweisung an var1
fstp qword [_var1]

Übrigens kann "_var1" auch ein Makro mit dem Inhalt "ebp-12" oder so
sein, wenn var1 eine lokale Variable ist.

fld qword [_var1]
fld qword [LC9]
fadd st1, st2 ; richtig ? Fehler!



Man blicke in die Doku zu fadd: Es geht nur

fadd st0, sti

und

fadd sti, st0

nicht aber

fadd sti, stj

Man kann das aber àquivalent umformen zu:

fxch sti
fadd st0, stj
fxch sti

fcomp
fstsw ax
sahf
jne near Le0
push dword LC10
call _printf
add esp, 4
jmp near Lj0
Le0:
push dword LC11
call _printf
add esp, 4
jmp near Lj0
Lj0:


Leider erhalte ich im NASM Ausgabe die
Meldung:
2.asm:46: error: invalid combination of opcode and operands

Was kann der Fehler sein?
Ist eine derartige AsmCodeStruktur überhapt
machbar?

Für Infos dankend ...
Jens



Am besten erstmal den Compiler ohne Optimizer bauen. Den Optimizer
kannst du dann schließlich immer noch einbauen, wenn der eigentliche
Codegenerator funktioniert.

Dein Programm:
var1 = 2 + 3
if var1+2 = var1+2
? "if ok"
else
? "Ist nicht"
endif



Würde ich vermutlich so hier compilieren:

funktion:
push ebp
mov ebp, esp
sub esp, 8
;ebp-8 = double var1
;Erste Zeile: Parse Tree:
; ; / \
; var1 +
; / \
; 2 3
;von unten nach oben arbeiten:
mov eax, 2
mov edx, 3
add eax, edx
push eax
fild dword [esp]
pop eax ;Stackbereinigung
fstp qword [ebp-8]

;Parse Tree des Bool-Ausdruckes:
; =; / \
; + +
; / \ / \
; var1 2 var1 2
fld qword [ebp-8]
mov eax, 2
push eax
fiadd dword [esp]
pop eax

fld qword [var1]
mov eax, 2
push eax
fiadd dword [esp]
pop eax

fucompp
fnstsw ax
sahf

;Definitionssache: Ich sage, bei Unordnung ist der Ausdruck falsch ->
;else-Zweig
jc .else
jnz .else
push [Str0]
call puts
add esp, 4
jmp .endif

.else:
push [Str1]
call puts
add esp,4

.endif:
ret

HTH,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.

Ähnliche fragen