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


von Mark .. (mork)


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

von Johannes M. (johnny-m)


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)!

von Mark .. (mork)


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.

von Der Zeiger (Gast)


Lesenswert?

Doch, Zeiger auf 0.

von Johannes M. (johnny-m)


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.

von Mark .. (mork)


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.

von Johann L. (gjlayde) Benutzerseite


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.

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.