mikrocontroller.net

Forum: Compiler & IDEs Register reservieren


Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, dann werde ich mich wohl ans umschreiben geben

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. R3:

register unsigned char my_reg asm("r3");

in ein h-file schreiben und überall includen.


Peter

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Euch allen für die Info

Autor: Fritz Ganter (fritzg)
Datum:

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

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.