FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Technische Informatik

T3 Aufgabenblatt 4

T3 Aufgabenblatt 4 2002-11-20 19:24
Faleiro
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 ;-)



Re: T3 Aufgabenblatt 4 2002-11-20 19:54
Slater
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]



Re: T3 Aufgabenblatt 4 2002-11-20 19:58
Cyrax
Wieso eigentlich T2 Aufgabenblatt 4?? Hatten wir damals so ne Aufgabe gestellt bekommen? *g*

Re: T3 Aufgabenblatt 4 2002-11-20 22:36
Faleiro
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…

Re: T3 Aufgabenblatt 4 2002-11-20 22:38
Slater
Aus der Aufgabenstellung ist kein Verbot einer doppelten Funktionsausfuehrung ersichtlich. :-)
ne wenns die gleiche ist, nicht, aber 2x die gleiche wird dir nicht helfen ;)




Re: T3 Aufgabenblatt 4 2002-11-20 22:50
Faleiro
Nein, auch fuer eine leicht veraenderte zweite Funktion kann ich kein Verbot entdecken :-)

Re: T3 Aufgabenblatt 4 2002-11-21 00:11
Fred
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…


Re: T3 Aufgabenblatt 4 2002-11-21 00:15
TriPhoenix
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]

Re: T3 Aufgabenblatt 4 2002-11-21 00:42
Fred
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"


Re: T3 Aufgabenblatt 4 2002-11-21 00:45
Fred
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]


Re: T3 Aufgabenblatt 4 2002-11-21 12:04
TriPhoenix
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]

Re: T3 Aufgabenblatt 4 2002-11-27 16:59
Slater
gibts einen befehl, um ohne bedingung zu einer marke zu springen?
(ohne ein hilfskonstrukt ala cmp %g0, %g0)



Re: T3 Aufgabenblatt 4 2002-11-27 17:06
Zaphod
hmm… wofür brauchst du das denn?

Re: T3 Aufgabenblatt 4 2002-11-27 17:14
Slater
für die schleife in weinberger ;)

Re: T3 Aufgabenblatt 4 2002-11-27 17:20
Zaphod
..aber da musst du doch überprüfen, ob die schleifenbedingung erfüllt ist, oder?

Re: T3 Aufgabenblatt 4 2002-11-27 17:23
Slater
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


Re: T3 Aufgabenblatt 4 2002-11-28 00:59
Fred
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]



Re: T3 Aufgabenblatt 4 2002-11-28 08:22
Anonymer User
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

Re: T3 Aufgabenblatt 4 2002-11-28 15:43
Fred
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]



Re: T3 Aufgabenblatt 4 2002-11-28 16:58
Fred
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]

Re: T3 Aufgabenblatt 4 2002-11-28 17:06
Fred
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]


Re: T3 Aufgabenblatt 4 2002-11-28 23:46
Faleiro
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.

Re: T3 Aufgabenblatt 4 2002-11-29 02:05
TriPhoenix
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]

Re: T3 Aufgabenblatt 4 2002-11-29 13:22
Fred
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]