Register reservieren

Gast #284957
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
Moderator Persönliche Seite #284958
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?
Gast #284959
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
Gast #284960
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
Gast #284963
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
Gast #284966
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).
Gast #284969
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren