Finde ich ziemlich verwirrend oder zumindest nicht direkt einleuchtend. Was heisst z.B. die -104 im Beispiel mit den Quadratzahlen? Hier zwei nette Seiten, ich hoffe dort finde ich die Antwort [img]
http://www.sternenvolk.de/symb/7.gif[/img]
http://www.sics.se/~psm/sparcstack.htmlhttp://www.cs.indiana.edu/~crcarter/SPARC/save.html
Was heisst z.B. die -104 im Beispiel mit den Quadratzahlen?
Also das Prinzip SAVE/RESTORE ist im Grunde genommen klar, aber ich verstehe nicht, warum wir 104 Bytes auf dem Stack reservieren und nicht nur die minimal benoetigten 64. Wozu die zusaetzlichen 40 Bytes?
Redest du shconwieder von Übungszetteln die fast keiner hat? [img]
http://www.sternenvolk.de/symb/28.gif[/img]
Wenns net allzulang ist poste doch mal das Beispiel, vielelicht kann dir dann wer helfen [img]
http://www.sternenvolk.de/symb/22.gif[/img]
Redest du schon wieder von Übungszetteln die fast keiner hat?
Na ich mein das Uebungsblatt 2, dazu gibt's doch auch nen Post. Hatte nen neuen Thread gemacht, weil ich erst nur auf die sehr guten Links aufmerksam machen wollte, aber damit hat sich meine Frage leider nicht geklaert [img]
http://www.sternenvolk.de/symb/9.gif[/img]
Redest du schon wieder von Übungszetteln die fast keiner hat?
Na ich mein das Uebungsblatt 2, dazu gibt's doch auch nen Post. Hatte nen neuen Thread gemacht, weil ich erst nur auf die sehr guten Links aufmerksam machen wollte, aber damit hat sich meine Frage leider nicht geklaert [img]http://www.sternenvolk.de/symb/9.gif[/img]
Ach ja…dann guck ich mir das doch gleihc mal an (mit meinem eigenen Blatt :)
Mein erster Rateversuch: irgendwelche Internen geschichten, wenn man nämlich mitm gcc kompiliert oder den auch ncoh optimieren lässt, zieht er jeweils andere Werte vom Stack ab
Redest du schon wieder von Übungszetteln die fast keiner hat?
Na ich mein das Uebungsblatt 2, dazu gibt's doch auch nen Post. Hatte nen neuen Thread gemacht, weil ich erst nur auf die sehr guten Links aufmerksam machen wollte, aber damit hat sich meine Frage leider nicht geklaert [img]http://www.sternenvolk.de/symb/9.gif[/img]
Ach ja…dann guck ich mir das doch gleihc mal an (mit meinem eigenen Blatt :)
Naja aufm Blatt steht ja nicht viel, nur der C Code. Hast Du ne Moeglichkeit, den auf intel Rechnern in SPARC Assembler zu uebersetzten, Du meintest da doch mal was von wegen Emu?
Naja aufm Blatt steht ja nicht viel, nur der C Code. Hast Du ne Moeglichkeit, den auf intel Rechnern in SPARC Assembler zu uebersetzten, Du meintest da doch mal was von wegen Emu?
Der emu emuliert das ganze halt nur, kompilieren tu ich atm auch noch auffer sparc
Finde ich ziemlich verwirrend oder zumindest nicht direkt einleuchtend. Was heisst z.B. die -104 im Beispiel mit den Quadratzahlen? Hier zwei nette Seiten, ich hoffe dort finde ich die Antwort [img]http://www.sternenvolk.de/symb/7.gif[/img]
Also bisher hab ich keinen Grund gefunden für Stack-Verschiebungen :> Scheint halt ein Mystery-Grund zu sein :)
.section ".rodata"
quadratstring:
.ascii "Quadrat: %d\n\0"
.section ".text"
.align 8
.global main
unter:
save %sp, -64, %sp
mov 5, %l0
sethi %hi(quadratstring), %l1
or %l1, %lo(quadratstring), %l1
.schleife:
smul %l0, %l0, %o1
call printf
mov %l1, %o0
sub %l0, 1, %l0
cmp %l0, 0
bg .schleife
nop
.fertig:
jmp %i7+8
restore
main:
save %sp, -64, %sp
call unter
nop
jmp %i7+8
restore
Man kann sogar noch das save in main weglassen und es läuft,
nur das restore am ende darf komischerweise nicht weg, auch
wenn das save fehlt [img]
http://www.sternenvolk.de/symb/28.gif[/img]
(spuddliges CODE-Tag)
Nachtrag: ist shcon irgendwo unsicher fällt mir jetzt auf, weil die Unterroutine dasselbe Registerfenster benutzt wie main (wa snun hier nichts ausmacht, soll man aber denke ich nicht unbedingt machen). Trotz allem reihct auch ein save %sp, -64, %sp
Nachtrag: ist shcon irgendwo unsicher fällt mir jetzt auf, weil die Unterroutine dasselbe Registerfenster benutzt wie main
Nee, es werden doch nur lokale Register in unter benutzt.
Nachtrag: ist shcon irgendwo unsicher fällt mir jetzt auf, weil die Unterroutine dasselbe Registerfenster benutzt wie main
Nee, es werden doch nur lokale Register in unter benutzt.
Trotzdem, jeder Call speichert eine Rücksprungaddresse in %i7, d.h. eine eventuelle alte Rücksprungadresse wird geplättet.
jeder Call speichert eine Rücksprungaddresse in %i7, d.h. eine eventuelle alte Rücksprungadresse wird geplättet.
Nein, nach jedem Call wird ja das Registerfenster durch "save" verschoben und vor jedem jmp %i7+8 per restore wieder hergestellt. Da kann nix verloren gehen in Unterprogrammen, jedes hat sein eigenes Registerfenster und damit auch sein eigenes %i7.
jeder Call speichert eine Rücksprungaddresse in %i7, d.h. eine eventuelle alte Rücksprungadresse wird geplättet.
Nein, nach jedem Call wird ja das Registerfenster durch "save" verschoben und vor jedem jmp %i7+8 per restore wieder hergestellt. Da kann nix verloren gehen in Unterprogrammen, jedes hat sein eigenes Registerfenster und damit auch sein eigenes %i7.
Nein, ein call enthält keinen impliziten save, aus dem SPARC-Manual:
Beschreibung von call:
The CALL instruction causes an unconditional, delayed, PC-relative control transfer to address “PC + (4 ´ disp30)”. Since the word displacement (disp30) field is 30 bits wide, the target address can be arbitrarily distant. The PC-relative displacement is formed by appending two low-order zeros to the instruction’s 30-bit word displacement field.
The CALL instruction also writes the value of PC, which contains the address of the CALL, into r[img]
http://www.sternenvolk.de/symb/15.gif[/img] (out register 7).
(Ich korrigiere mich, call speichert in %o7, was wenn die Subroutine sich ein neues Registerfenster holt dann ja %i7 ist)
Seite 53:
Programming Note:
A procedure is invoked by executing a CALL (or a JMPL) instruction. If the procedure requires a register window, it executes a SAVE instruction. A routine that has not allocated a register window of its own (possibly a ‘‘leaf’’ procedure) should not write on any windowed registers except out
registers 0…6.
Ergo: wenn eine Prozedur ein Registerfenster BRAUCHT, soll sie ein save ausführen (und das steht auch immer im generierten Quelltext drin), ansonsten nicht, dann aber nur die Register %o0 bis %o6 benutzen.
Nein, ein call enthält keinen impliziten save
Klar, aber deswegen ist bei unserer Aufgabe der erste Befehl in "main" und "unter" ja ein save.
Nein, ein call enthält keinen impliziten save
Klar, aber deswegen ist bei unserer Aufgabe der erste Befehl in "main" und "unter" ja ein save.
Ja, aber meine aussage war ja auch dass rücksprungaddressen geplättet werden, wenn man das save weglässt [img]
http://www.sternenvolk.de/symb/28.gif[/img]
Nein, ein call enthält keinen impliziten save
Klar, aber deswegen ist bei unserer Aufgabe der erste Befehl in "main" und "unter" ja ein save.
Ja, aber meine aussage war ja auch dass rücksprungaddressen geplättet werden, wenn man das save weglässt [img]http://www.sternenvolk.de/symb/28.gif[/img]
Ach so! Wer lesen kann, ist klar im Vorteil…