Hilfe - Übersetzung - YACC > Asm

26/04/2009 - 11:18 von Jens Kallup | Report spam
Hallo,

so, nun ist es soweit .. Auswertung von Ausdrücken:

ident '=' expr

wie kann ich das geschickt anstellen?
als Hintergrund dient die YACC Datei für den Compiler:

http://nopaste.info/a874a22aff.html

für Infos bin ich wie immer sehr dankbar!

Gruß
Jens

P.S.: Als C-C dient yacc von "Albert Graef"
- google Ergebnis 1 - Musikwissenschaften.
 

Lesen sie die antworten

#1 Jens Kallup
26/04/2009 - 21:20 | Warnen spam
So,

unter http://nopaste.info/d1bdafadc6.html
könnt Ihr eine etwas überarbeitete Version vorfinden.
Was mir komisch vorkommt ist, das Stack nicht gleich
Stack ist.
Zum Beispiel beginnend ab Zeile 256 hochrangelnd auf
Zeile 216 -> expr (Zeile 88) -> weiter bei Zeile 118.
Warum wird dann folgender Code erzeugt:

Für Ideen und Vorschlàge bin ich jedem dankbar!
Gruß
Jens


BITS 32
cpu 486

extern _exit, _show_message
extern _set_vergleichswert_A1
extern _set_vergleichswert_A2
extern _set_vergleichswert_byvar
extern _vergleiche_cmpeq

@var_var1: dd 10
@Pshow_message0: db "ist 5",0
@Pshow_message1: db "juhu 5",0
@Pshow_message2: db "nuja halt 7",0
@Pshow_message3: db "ok",0
@Pshow_message4: db "ist nicht 5",0


segment .text
global _start_main
_start_main:
push ebp
mov ebp, esp

; die folgende Zeilen müssten doch theoretisch
; unter push [@var_var2] stehen?
; mache ich einen Programmierfehler oder liegt
; das Problem am Yacc?
call _set_vergleichswert_byvar
add esp, 8

push dword [@var_var1]
push dword [@var_var2]
call _vergleiche_cmpeq
cmp eax, 1
jne near Le0
push @Pshow_message0
call _show_message
jmp near Lj0
Le0:
call _vergleiche_cmpeq
cmp eax, 1
jne near Le2
push @Pshow_message1
call _show_message
jMP near Lj2
Le2:
call _vergleiche_cmpeq
cmp eax, 1
jne near Le4
push @Pshow_message2
call _show_message
push @Pshow_message3
call _show_message
jMP near Lj4
Le4:
push @Pshow_message4
call _show_message
jmp near Lj4
Lj4:
jmp near Lj2
Lj2:
jmp near Lj0
Lj0:
push dword 0
call _exit
leave
ret


der QuellCode schaut wie folgt aus:

...
var1 = 10
//var2 = 1

if var1 = var2
showmessage("ist 5")
elseif 5 = 7
showmessage("juhu 5")
elseif 5 = 5
showmessage("nuja halt 7")
showmessage("ok")
else
showmessage("ist nicht 5")
endif
...

Ähnliche fragen