Dann versuch ich mich erst mal am Neuschreiben, aber ob das wirklich einfacher ist und schneller geht, als die cc-erzeugte Version abzuändern, bezweifel ich noch stark.
Ich schliesse mich der Meinung von TriPhoenix an, die merkwuerdige Wahl der Register erschwert das Umschreiben erheblich. Das Neuschreiben ist viel weniger fehleranfaellig, und man macht sich auch automatisch mehr Gedanken (z.B. ueber das if in der Schleife… hint!).
Bei einem Assemblerprogramm kannst Du allerdings nicht einfach so drauflos programmieren, wie man es vielleicht manchmal in Java tut. Du musst Dir von vornherein klarmachen, welche Variablen in dem C-Programm in welchen Registern landen sollen bzw. welche Register dann noch fuer Zwischenergebnisse herhalten koennen (Wie lange brauchen wir das Zwischenergebnis noch? Meist kann man das Register nach wenigen Zeilen Code bereits wieder fuer etwas anderes verwenden).
Z.B. habe ich fuer folgende Variablen lokale Register von %l0-%l3 reserviert: p, g, h, (*p). Und die Konstante 0xF0000000, welche man ja staendig braucht, steht in %l7. Das schoene an der Sparc-Architektur ist, dass Du Quellregister nie zerstoerst (es sei denn, Du moechtest das). Bei intel muesste man immer umstaendlich "Sicherheitskopien" anlegen, bevor man z.B. h um 4 nach links schiebt, weil das Original-h sonst weg waere.
Also ueberlege Dir auch immer gut, welches Zielregister Du bei den Operationen verwendest. Bei der letzten Subtraktion z.B. ist es sinnvoll, die Differenz gleich in %i0 zu speichern, denn diese soll ja zurueckgegeben werden und muss daher in %i0 stehen. Und ueberlege Dir auch mal, wie Du die drei NOPs nach dem Loeschen des y-Registers wegbekommen kannst (dazu muss man natuerlich wissen, warum die ueberhaupt notwendig sind).
Wie gesagt wuerde mich mal von anderen Leuten interessieren, wie viele Befehle letzten Endes noch bei Euch uebrig geblieben sind. Da ich das erst in dem Thread zum Zettel 4 geschrieben hatte hier nochmal mein Ergebnis:
Richtige Befehle: 21 (innerhalb von save… und jmp…/restore)
NOPs: 2 (die kann man auch weglassen, weil der jeweils nachstehende Befehl nicht gefaehrlich ist, ich habe sie aber dringelassen, damit der Uebungsgruppenleiter nicht denkt, ich sei mir nicht ueber die verzoegerte Sprungausfuehrung im klaren)
Labels: 2 (ohne das Label der Funktion selbst)
Bedingte Spruenge: 2
Die Schleifenbedingung pruefe ich in meinem Code einmal vor Eintritt der Schleife (um den Fall abzufangen, dass ein Null-String uebergeben wird) sowie nach jedem Iterationsschritt. Da kann man noch zwei Befehle sparen, indem man wieder per BA nach oben springt, aber das ist langsamer.
Theoretisch ergibt sich so ein Minimum von 19 Befehlen (mit Einsatz des BA und weglassen der NOPs), zwei Labels, einem bedingten Sprung und einem unbedingten. Oder hat jemand noch kompakteren Code?
P.S.: haettest Du nicht spaetestens gestern abgeben muessen??