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
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)!
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.