Autor Thema: Kompilieren von Bedingungen  (Gelesen 4518 mal)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« am: 11. February 2006, 19:13 »
Ich habe folgendes C Statement (i ist eine Integer Variable):
if (i == 5 || (i > 3 && i < 7)) { }
Welchen Parsetree sollte ich daraus erstellen? Ich hatte mir sowas gedacht:
IF
OR
EQUALS
i
5
AND
GREATER
i
3
LESS
i
7

Was wäre der beste x86 Code, den man daraus erstellen kann? (Angenommen i befindet sich in einem Register)
Ich finde keinen guten Weg, den Parsetree in x86 Code umzuwandeln. Hat jemand eine Idee? :/

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 11. February 2006, 20:19 »
Als allererstes mal das i == 5 wegoptimieren. ;)

Im Ernst: Warum schaust du dir nicht einfach mal das an, was der gcc oder irgendein anderer Compiler erzeugt?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 11. February 2006, 20:35 »
Habe ich schon, aber mein Problem liegt eher darin, den Code aus dem Parsetree zu erstellen. Der gcc macht das so:
cmp eax, 5
je label1
cmp eax, 3
jle label2
cmp eax, 7
jge label2

label2:
; hier steht der code innerhalb des ifs

label1:
; der code nach dem if

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 11. February 2006, 21:02 »
Hmm, scheint tatsächlich so üblich zu sein, AND- und OR-Verknüpfungen durch jede Menge Jumps zu berechnen. Das wird ja nicht nur in diesem Fall mit dem if so gemacht, sondern auch bei einem "int x = (i == 5 || (i > 3 && i < 7))".

Ich habe dasselbe nochmal kurz mit FreePascal probiert, da kommt auch so etwas ähnliches raus:
# [3] if (i = 5) or ((i > 3) and (i < 7)) then begin
  cmpl  $5,%eax
  je  .L3
  jmp .L5

.L5:
  cmpl  $3,%eax
  jg  .L6
  jmp .L4

.L6:
  cmpl  $7,%eax
  jl  .L3
  jmp .L4

.L3:
# then-Zweig

.L4:
# else-Zweig
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen