Darf man R0 in ASM-Funktionen frei benutzen?

OP #1006749
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
#1006949
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.
OP #1007016
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.
Persönliche Seite #1008775
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

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