Forum: Compiler & IDEs Register reservieren


von AndreasH (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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?

von AndreasH (Gast)


Lesenswert?

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

von AndreasH (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, r21 gehört zu den Arbeitsregistern des Compilers.  Das kann
man nicht permanent reservieren.

von AndreasH (Gast)


Lesenswert?

Danke, dann werde ich mich wohl ans umschreiben geben

von peter dannegger (Gast)


Lesenswert?

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

von AndreasH (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

Z.B. R3:

register unsigned char my_reg asm("r3");

in ein h-file schreiben und überall includen.


Peter

von A.K. (Gast)


Lesenswert?

"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).

von AndreasH (Gast)


Lesenswert?

Danke Euch allen für die Info

von Fritz G. (fritzg)


Lesenswert?

Wenn du dem Compiler ein Register wegnimmst, nimmt natürlich die
Gesamtperformance vom ganzen Programm ab.

von AndreasH (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.