@AmateurProfi:
Ja habe ich schon gemerkt.
Deswegen habe ich den output meines Compilers so abgeändert:
Code:
cmp eax, ebx
setne ah
movsx eax, ah
push eax
Beim parsen des Ausdrucks haben die einzelnen Bausteinfunktionen, keinerlei ahnung, was die anderen machen oder gemacht haben.
wenn ich also folgendes habe:
Delphi-Quellcode:
if (4+3*5 = 3) or (12/2 < 7)then
....
Dan gehts als erstes so:
4 auf stack packen
3 auf stack packen
mul op kommt, wert von stack holen
mul mit 5
ergebnis auf stack packen
addition:
2 werte vom stack holen
addieren
auf den stack packen
3 auf den stack packen
vergleich durchführen
2 werte vom stack holen
vergleichen
ergbenis auf stack packen
jetzt wird als erstes mit der formel rechts vom or weiter gemacht, und danach ver-oderd
Die ungünstigen push/pop combis werden später nachträglich durch moves ersetzt.
Keine funktion weiß was die vorherige oder nächste macht. Aber jede weiß, dass sie ihre werte zum operieren auf dem stack findet und ihr ergebnis auf den stack pushen muss.
Variablen/konstanten: hier wird natürlich nichts gepopt, hier wird der wert direkt gepushed
Deswegen ist es nicht so leicht in einer komplexen formel beziehungen zwischen den einzelnen bausteinen schon im voraus zu optimieren
MFG
Memnarch