Hat jemand eine Idee, wie man *zwei* Zahlen anstatt einer aus dem Unterprogramm zurueckholen kann? Eine Funktion hat ja nun mal nur einen Rueckgabewert.
Man koennte natuerlich noch eine Funktion schreiben, die das gleiche tut, aber dann den zweiten Ergebniswert zurueckliefert. Pro Aufruf waere dann die Arbeit zweimal zu erledigen, das kommt mir nicht sehr elegant vor ;-)
wieso willst du die irgendwie zurückgeben?,
du musst eh nur 'sehen' was das für zahlen sind,
also per printf ausgeben,
das kann genausogut in der funktion/ operation geschehen, die die zahlen als erste von der unbekannten operation geliefert bekommt
edit
alternativ könntest natürlich auch ein paar/ 2-tupel/ array zurückgeben, aber wir sind hier in assembler! [img]
http://www.sternenvolk.de/symb/23.gif[/img]
edit 2
du willst dir wohl das printf in assembler ersparen, was?
dafür haben sie bestimmt extra 2 ergebnisse eingebaut, und ob 2 unter-prozeduren mit der aufgabenstellung verträglich sind.. [img]
http://www.sternenvolk.de/symb/28.gif[/img]
Wieso eigentlich T2 Aufgabenblatt 4?? Hatten wir damals so ne Aufgabe gestellt bekommen? *g*
Leider kann man offenbar als Normal-User den Titel des Topics nicht nachtraeglich veraendern, hier waere Bjoern gefragt…
Aus der Aufgabenstellung ist kein Verbot einer doppelten Funktionsausfuehrung ersichtlich. :-)
Ja, ich will mir das printf in Assembler ersparen, so richtig verstanden habe ich das immer noch nicht. Aber ich kann mir ja das alte Beispiel anschauen bzw. ein C-printf kompilieren…
Aus der Aufgabenstellung ist kein Verbot einer doppelten Funktionsausfuehrung ersichtlich. :-)
ne wenns die gleiche ist, nicht, aber 2x die gleiche wird dir nicht helfen ;)
Nein, auch fuer eine leicht veraenderte zweite Funktion kann ich kein Verbot entdecken :-)
Hat jemand eine Idee, wie man *zwei* Zahlen anstatt einer aus dem Unterprogramm zurueckholen kann? Eine Funktion hat ja nun mal nur einen Rueckgabewert.
Mir sind da spontan zwei Moeglichkeiten eingefallen, wobei ich die zweite bevorzuge:
1) int hilfsroutine(int a, int b)
wobei a und b die Eingabeparameter sind und zurueck eine 32-Bit-Zahl kommt, welche zwei 16-Bit-Zahlen nebeneinander speichert. Dabei muss man halt hoffen, dass die Ergebnisse nicht groesser als 64k werden… keine Angst, bei dieser Aufgabe reichen 16 Bit.
2) void hilfsroutine(int *ergebnis, int a, int b)
wobei ergebnis hier ein Zeiger auf ein Array von Integern ist, sinnvollerweise der Groesse 2. So habe ich es implementiert und es klappt hervorragend. Lustige Funktion uebriegens, testet mal a=0, da kommt ne ziemlich hohe Zahl bei raus…
Ehrlichgesagt ist es wesentlich einfacher printf in asm aufzurufen als es hinzubekommen dass das C-Programm 2 Werte bekommt [img]
http://www.sternenvolk.de/symb/28.gif[/img]
Nein, auch fuer eine leicht veraenderte zweite Funktion kann ich kein Verbot entdecken :-)
Streng logisch gesehen hast Du recht. Da steht, dass man eine Funktion in C schreiben soll, die eine Hilfsfunktion aufruft. Dass es GENAU EINE sein soll steht da tatsaechlich nicht [img]
http://www.sternenvolk.de/symb/23.gif[/img] aber so ist es mit Sicherheit gemeint.
Ehrlichgesagt ist es wesentlich einfacher printf in asm aufzurufen als es hinzubekommen dass das C-Programm 2 Werte bekommt
Beides ist etwa gleich schwer wuerde ich sagen. Trotzdem ist das Rueckgeben von zwei Werden sauberer, da im Aufgabentext ja von "Funktionen" die Rede ist (oder etwa nicht? habe den Aufagenzettel gerade nicht zur Hand). Und eine Funktion sollte i.d.R. etwas sinnvolles zurueckliefern…
Ja, ich will mir das printf in Assembler ersparen, so richtig verstanden habe ich das immer noch nicht.
Dazu nochmal ein kleines Beispiel mit den erforderlichen Programmzeilen. Ich habe hier keine Moeglichkeit, das zu compilen, vielleicht ist irgendwo noch ein kleiner Fehler drin.
Du musst einfach den Text, den printf ausgeben soll, in %o0 laden, genauer gesagt: die Adresse, an der der Text anfaengt. Und diese Adresse ist durch das Label
nettertext festgelegt. Falls Dir die Notwendigkeit des sethi/or noch nicht klar ist bitte laut schreien. Die zusaetzlichen Parameter hinter dem Text kommen dann in %o1 und %o2 und so weiter, je nachdem, wieviele Prozentzeichen in dem Text drinstehen. Dann musst Du printf nur noch per
call printf aufrufen. Man beachte bitte die verzoegerte Sprungausfuehrung!
Falls Du das fuer den aktuellen Aufgabenzettel verwenden willst musst Du nur noch die beiden mov-Befehle abaendern. Es soll ja nicht konstant 123 und 456 ausgegeben werden [img]
http://www.sternenvolk.de/symb/7.gif[/img]
.section ".text"
! ... schnipp
sethi %hi(nettertext), %o0 ! die oberen 22 Bit der Labeladresse laden
or %o0, %lo(nettertext), %o0 ! die unteren 10 Bit dazu addieren
mov 123, %o1 ! den zweiten Parameter von printf in %o1 laden
call printf
mov 456, %o2 ! den dritten Parameter von printf in %o2 laden
! ... schnapp
.section ".data"
nettertext: .asciz "Die beiden Ergebnis-Zahlen lauten %d und %d\n"
Ehrlichgesagt ist es wesentlich einfacher printf in asm aufzurufen als es hinzubekommen dass das C-Programm 2 Werte bekommt [img]http://www.sternenvolk.de/symb/28.gif[/img]
Also hast Du es so gemacht mit printf in asm? Schaem Dich [img]
http://www.sternenvolk.de/symb/25.gif[/img]
Uebrigens Dein Avatar ist cool, ist das aus Anthology Of Interest 2 (oder sogar 3?), wo der Ausserirdische ein Space Invaders Raumschiff lenkt und Fry es nicht schafft, ihn abzuschiessen? [img]
http://www.sternenvolk.de/symb/7.gif[/img][img]
http://www.sternenvolk.de/symb/7.gif[/img][img]
http://www.sternenvolk.de/symb/7.gif[/img]
Also hast Du es so gemacht mit printf in asm? Schaem Dich [img]http://www.sternenvolk.de/symb/25.gif[/img]
Uebrigens Dein Avatar ist cool, ist das aus Anthology Of Interest 2 (oder sogar 3?), wo der Ausserirdische ein Space Invaders Raumschiff lenkt und Fry es nicht schafft, ihn abzuschiessen? [img]http://www.sternenvolk.de/symb/7.gif[/img][img]http://www.sternenvolk.de/symb/7.gif[/img][img]http://www.sternenvolk.de/symb/7.gif[/img]
Wieso schaemen, die Aufgabe war doch ein asm-Prog zu schreiben [img]
http://www.sternenvolk.de/symb/28.gif[/img]
Klaro, das ist Lrrr aus AOI 2 (3 gibts meines Wissens nach nicht) wo die Space Invaders die Quarters pluendern wollen [img]
http://www.sternenvolk.de/symb/7.gif[/img]
gibts einen befehl, um ohne bedingung zu einer marke zu springen?
(ohne ein hilfskonstrukt ala cmp %g0, %g0)
hmm… wofür brauchst du das denn?
für die schleife in weinberger ;)
..aber da musst du doch überprüfen, ob die schleifenbedingung erfüllt ist, oder?
ja am anfang eh schon, da entschieden werden muss,
ob überhaupt einmal durch die schleife gelaufen wird,
am ende dann nochmal der ganz vergleich-kram
oder ein sprung zum vergleich-kram oben
Also hast Du es so gemacht mit printf in asm? Schaem Dich
Ich ziehe meine voreilige Bemerkung zurueck, printf in asm haette gemacht werden sollen [img]
http://www.sternenvolk.de/symb/7.gif[/img]
gibts einen befehl, um ohne bedingung zu einer marke zu springen?
Ja sicher, den Befehl verwendet man ja immer zum Beenden eines Unterprogramms -> jmp
am ende dann nochmal der ganz vergleich-kram
So ist es richtig.
oder ein sprung zum vergleich-kram oben
Bloss nicht, Du willst doch optimierten Code! Man sollte so wenig unbedingte Spruenge machen wie moeglich.
NP: Helge Schneider - Tiere [die kleine Guenther, 4 Jahre alt]
naja wollte auch ausgeloggt lieber an codezeilen und kompliziertheit sparen, dann lass ich es mal so,
jmp also mit label?, werd ich eh mla testen heute
Christian
jmp also mit label?, werd ich eh mla testen heute
Was natuerlich auch geht ist ba (branch always), das ist wenigstens kein syntethischer Befehl [img]
http://www.sternenvolk.de/symb/6.gif[/img]
Zu den CC-Befehlen: man kann sie sich so vorstellen, dass sie wie der normale entsprechende Befehl ohne cc funktionieren mit anschliessendem cmp reg, 0. Lustigerweise ist cmp selbst ein syntethischer Befehl, welcher per subcc realisiert ist [img]
http://www.sternenvolk.de/symb/7.gif[/img]
Wie viele Assemblerbefehle habt Ihr fuer die Streufunktion gebraucht ohne den normalen Rumpf (also save und jmp/restore)? Hier sinds 21+2 nops = 23. Ob das nur ein Zufall ist? [img]
http://www.sternenvolk.de/symb/22.gif[/img]
Unser Programm liess sich lustigerweise so lange nicht kompilieren, wie wir einen jmp drin hatten fuer einen unconditional branch. Mit ba (erst nach einigem Ueberlegen gefunden :-) gings dann.
Wie viele Assemblerbefehle habt Ihr fuer die Streufunktion gebraucht ohne den normalen Rumpf (also save und jmp/restore)? Hier sinds 21+2 nops = 23. Ob das nur ein Zufall ist? [img]http://www.sternenvolk.de/symb/22.gif[/img]
Also ich hab 19+2 nops = 21 [img]
http://www.sternenvolk.de/symb/24.gif[/img]
Also ich hab 19+2 nops = 21 [img]http://www.sternenvolk.de/symb/24.gif[/img]
Mit einem BA statt den drei Befehlen fuer die Schleife? Das ist ja keine Kunst [img]
http://www.sternenvolk.de/symb/7.gif[/img]