Hallo, ich habe ein Modul welches ich in Assembler geschrieben habe. Um nicht alles neu zu schreiben möchte ich dieses Modul jetzt mit dem gcc dazu linken. Das funktioniert auch einwandfrei. Hier benötige ich aber bestimmte Register, die vom Hauptprogramm nicht verändert werden dürfen. Ich habe mir das vom Compiler erzeugte Assembler-programm angesehen. Da wird genau dieses Register im Hauptprogramm benutzt. Irgendwo habe ich gelesen, ich kann dem Compiler mitteilen, dass er ein bestimmtes Register nicht benutzen soll. Das finde ich aber nicht mehr. Kann mir jemand sagen wie ich das machen muss? Danke Andreas
> Hier benötige ich aber bestimmte Register, die vom Hauptprogramm > nicht verändert werden dürfen. Generell 'ne schlechte Idee. Wenn man mit einem Compiler arbeitet, sollte man sich an sein ABI halten. Ansonsten: beim Eintritt in die Assemblerfunktion das entsprechende Register retten. > Irgendwo habe ich gelesen, ich kann dem Compiler mitteilen, > dass er ein bestimmtes Register nicht benutzen soll. Geht aber nicht für alle Register. Um welches handelt es sich denn?
Hallo Jörg, danke für die Antwort. > Generell 'ne schlechte Idee. Wenn man mit einem Compiler arbeitet, > sollte man sich an sein ABI halten. ja, Du hast recht. Aber es ist unheimlich viel Arbeit das jetzt alles zu ändern. Es handelt sich um r21 Danke Andreas
Nachtrag, zu schnell geklickt. Die Sache mit dem Register-retten hatte ich mir auch überlegt. wollte ich mir aber für den Fall wenn gar nichts geht vornehmen. Beim Rücksprung muss ich die auch wieder sichern. Es gibt aber mehrere Stellen mit einem "ret". Das müsste dann jedesmal an dieser Stelle gemacht werden. Wenn es aber keine andere Möglichkeit gibt, werde ich es wohl so machen müssen
Ja, r21 gehört zu den Arbeitsregistern des Compilers. Das kann man nicht permanent reservieren.
R2 .. R17 können reserviert werden. Wichtig ist es auch in jedem C-Objekt bekannt zu machen, sonst kracht es. Aber wenns nicht wirklich auf den letzten Zyklus ankommt, ist PUSH/POP vorzuziehen. Peter
bis jetzt hat mir aber noch keiner gesagt wie ich die reservieren kann :-) Vielleicht nehme ich ein anderes Register statt r21. Dann brauche ich nicht alles umschreiben. Danke andreas
Z.B. R3: register unsigned char my_reg asm("r3"); in ein h-file schreiben und überall includen. Peter
"Irgendwo habe ich gelesen, ich kann dem Compiler mitteilen, dass er ein bestimmtes Register nicht benutzen soll." Das muss dann auch wirklich der gesamte Code wissen. Jedes Sourcefile das irgendwo benutzt wird. Wirklich alles. Auch die avr-libc. Geht also nur, wenn man die entweder garnicht benutzt, neu übersetzt, oder im LSS-File genau kontrolliert welche Register wo verwendet werden. Tu dir das also nur an, wenn's absolut nicht anders geht. Ansonsten wird's eher eine böse Falle (ein Upgrade von Compiler oder Libc wär so ein Moment).
Wenn du dem Compiler ein Register wegnimmst, nimmt natürlich die Gesamtperformance vom ganzen Programm ab.
Auf Grund der vielen Warnungen habe ich es jetzt anders gemacht bzw. so wie Jörg vorgeschlagen hatte. Ich sichere die Registerinhalte in Variablen. Vor dem Aufruf der Assembler-Funktionen werden die Register mit den Variableninhalten belegt. Nach dem Rücksprung umgekehrt. Ist zwar nicht ganz so schön. Spart mir aber jede Menge Arbeit beim umschreiben der Assember-Routinen. Ist noch in der Mache. Daher kann ich über Ergebnisse noch nichts sagen. Trotzdem allen Danke für die Informationen. Andreas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.