mikrocontroller.net

Forum: Compiler & IDEs Darf man R0 in ASM-Funktionen frei benutzen?


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

irgendwie wer ich aus der avr-libc FAQ nicht schlau - darf man R0 in 
Funktionen, die in Assembler geschrieben wurden,  benutzen, ohne es zu 
sichern?

Zitat aus den FAQ:
>r0 - temporary register, can be clobbered by any C code (except interrupt 
>handlers which save it), may be used to remember something for a while within 
>one piece of assembler code

So wie ich das verstanden habe darf man das, aber im Assembler-Listing 
vom gcc kann man oft sehen, dass R0 auch auf dem Stack gesichert wird.

MfG Mark

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in r0 und r1 werden u.a. Ergebnisse von Rechenoperationen und 
Zeigeroperationen abgelegt (v.a. Multiplikationen). Deshalb sollte r0 
immer gesichert werden (gleiches gilt natürlich auch für r1)!

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das verstehe ich nciht ganz, wenn eine Funktion aufgerufen wird, dann 
muss r1 null sein, und wenn es null ist, dann kann auch keine Zeiger 
dort gespeichert werden.

Autor: Der Zeiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, Zeiger auf 0.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark P. wrote:
> Das verstehe ich nciht ganz, wenn eine Funktion aufgerufen wird, dann
> muss r1 null sein, und wenn es null ist, dann kann auch keine Zeiger
> dort gespeichert werden.
Es wird auch kein Zeiger da abgelegt, sondern das, was der 
Speicherzugriff zurückliefert. Die Zeiger selbst liegen am anderen Ende 
des Registersatzes.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mir gerade das Assembler-listing von einer bestimmten Funtkion 
angeguckt, welche mul verwendet - und dort wird R0 nicht gespeichert. 
Dass es wo anders doch der Fall war, hing damit zusammen, dass einfach 
ein Byte auf dem Stack reserviert werden sollte und die manuelle 
Dekrementierung des Stackpointers zu umständlich wäre.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
R0: muss nicht gesichert werden. Ausnahme steht oben: innerhalb einer 
ISR. Eine C-ISR erzeugt den entsprechenden Prolog/Epilog. (ausser sie 
ist "naked" oder man schreibt ne eigene asm-ISR)

R1: kann man verwenden, aber nach der Operation muss bei avr-gcc immer 
0 drinstehen. Ein clobbern von R1 hilft nicht, das Wiederherstellen von 
0 in R1 muss man händisch machen, weil R1 in avr-gcc implizit verwendet 
wird; der COmpiler hat von dem Register keine Ahnung und verwaltet es 
nicht. Für ISR gilt das gleiche wie für R0: es muss gesichert und wieder 
hergestellt werden.

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.