Hochsprache für Ein-Adress-Maschine umschreiben

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Hochsprache für Ein-Adress-Maschine umschreiben
Folgende Aufgabenstellung:

Konvertieren Sie folgende Hochsprachen Funktion in semantisch äquivalenten HochsprachenCode,so dass dieser möglichst leicht in Assembler Code für Ein-Adress-Maschinen umwandeln lässt!

int test(int n)
{
int i;
for(i=0;i<2n;i++){
if (func(n+i
i)){
return i}
}
return -1;
}

Habe null Plan wie sowas gehen soll und wie man bei sowas überhaupt ansetzt… :wand:


ein

c = a + b;

würde sowas sein:

load a // a in akku
add b // add b zu akku
stor m// schreibt c in m (speicher)

generell musst du dir einen akkumulator vorstellen zu dem addiert wird, von dem subtrahiert wird, der zähler einer division ist,… der erste operant ist also dein akku, den zweiten gibst du zusammen mit dem befehl mit an.
hoffe du schaffst die aufgabe jetzt alleine


ich soll die Aufgabe ja wieder in Hochsprache hinschreiben…wie vereinfache ich denn die for schleife??


verstehe.

ich denke schleifen vars ausserhelb initialisieren, increment am ende d. schleifenrumpfes, die parameter von func() auch sequenziell vor dem call berechnen. so denke ich ist das gemeint. das du halt pro zeiel am besten nur ein operanden hast der mit a = a + b; usw. geändert wird


schleifen immer durch
if … goto … - anweisungen ersetzen


hab da mal ein paar Aufgaben gemacht…vielleicht kann mir wer sagen ob die Lösung richtig ist…

for(i=0;i<10;i++){
if(i<5){
if(a[ i ]+10<i|| !(i<y)){
break;
}
}
else {
y+=a[ i ]*(b+c)/d;
}
}

Lösung von mir:

int i=0;
int akku;

loop:
akku=a[ i ] ; //keine Ahnung ob das überhaupt geht mit Ein-Adressmaschinen//
akku+=10;
if(i>=10)goto end;
if(i>=5) goto else;
if(akku>=i)goto next;
if(i<y) goto next;
break;

next:
i++;
goto loop;

else:
akku =b;
akku+=c;
akku*=a[ i ];
akku /=d;
akku +=y;
y=akku;
//keine Ahnung wo das y herkommt aber scheint ja vorher initialisiert worden zu sein :wink: //
goto next;

end: ;

dann die nächste:

int test(int n)
{
int i;
for(i=0;i<2n;i++){
if(func(n+i
i)){
return i;
}
}
return -1;
}

meine Lösung:

int test(int n)
{
int i=0;
int akku;

loop:
akku=2;
akku*=n;

if(i>= akku)goto else;
akku=i;
akku=*=akku;
akku+=n;

if (func(akku))goto irgendwas;
i++;
goto loop;

irgendwas:
return i;
goto end;

else:
return -1;
goto end;

end: ;


wenn wir schon dabei sind:

wie muss des eigentlich gehen, wenn man ne funktion aufruft mit mehreren paramtern? die kommen doch eigentlich sowieso aufn stack, muss ich da also gross fummeln oder kann ich das 1:1 uebernehmen? ich check das naemlich nicht:

         ungetc(c, fp)

ich hab da sowas dann draus gemacht:

akku = fp
push_akku();
akku = c
push_akku();
ungetc();

aber des stimmt wohl so nich? ich hab keine ahnung, bitte um hilfe


in ner hochsprache brauchst du das nicht machen.

da reicht
ungetc(c, fp);

in assembler waere das
pushl fp
pushl c
call ungetc

parameter werden immer von hinten nach vorne auf den stack gepusht, damit sie, vom esp aus gesehen, wieder in der richtigen reihenfolge liegen.

gruss chris


gut zu wissen :wink: danke!