Not logged in. · Lost password · Register

Bibi
Avatar
Member since Feb 2003
277 posts
Subject: 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<2*n;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:
Eem
staatl. geprüfter Peppeneulenprüfer
Avatar
Member since Oct 2002
435 posts
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
Bibi
Avatar
Member since Feb 2003
277 posts
ich soll die Aufgabe ja wieder in Hochsprache hinschreiben...wie vereinfache ich denn die for schleife??
Eem
staatl. geprüfter Peppeneulenprüfer
Avatar
Member since Oct 2002
435 posts
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
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
schleifen immer durch
if ... goto ... - anweisungen ersetzen
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
Bibi
Avatar
Member since Feb 2003
277 posts
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 ;) //
goto next;

end: ;

dann die nächste:

int test(int n)
{
int i;
for(i=0;i<2*n;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: ;
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
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
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
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
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
gut zu wissen ;) danke!
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen