Forum: Mikrocontroller und Digitale Elektronik Inline ASM: Clobberlist - kein vollständiges push/pop


von Curby23523 N. (Gast)


Lesenswert?

Hallo,

ich habe eine zeitkritische Anwendung in meinem Inline-Assembler, wo ich 
alle Register benutze, die mir mein Controller (Xmega128A4U) zur 
Verfügung stellt. Natürlich kann man jetzt dadrüber streiten, dass ich 
die Zuweisung nicht von Hand vornehmen soll, darum gehts mir jetzt aber 
nicht.

In der Clobberlist gebe ich jedes Register an, da ich jedes benutze. In 
meinem .lss File aber sehe ich, dass er nicht alle Regiister mit 
push/pop sichert.

Das führt dazu, dass nachfolgender Code teilweise nicht mehr richtig 
funktioniert. Wenn ich alle Register von Hand push/pop zuweise gibts 
keine Probleme. Warum wird die Clobberliste nicht komplett beachtet?

Danke euch!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nils H. schrieb:
> Warum wird die Clobberliste nicht komplett beachtet?

Die clobber-Liste ist i.W. eine Anweisung für den Register-Allokator, 
welche Register im Inline Asm verändert werden.  R0 und R1 werden 
allerdings nicht vom Register-Allokator verwaltet, sondern quasi 
händisch.  Das wurde damals so entschieden und implementiert. 
Entsprechend muss man sich um R0 + R1 selbst kümmern, dito R16 + R17 bei 
avrtiny.

Gleiches gilt für Flags im SREG.  cc in die Clobber-Liste aufzunehmen 
hat auch keine Auswirkung bzw. ist bereits implizit in der Clobber-Liste 
drin.  Dennoch sichert der Compiler SREG nicht vor Inline Asm und stellt 
es danach wieder her.

Und Y kann auch nur dann geklabbert werden, wenn kein Frame-Pointer 
gebraucht wird.  Und SP zu clobber (also Register 33 + 34) hat auch 
keinen Effekt, weil SP nur intern verwaltet wird aber nicht vom 
Register-Allokator.

von Curby23523 N. (Gast)


Lesenswert?

Ok, also alles händisch sichern!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nils H. schrieb:
> Ok, also alles händisch sichern!

Wenn du das aus meiner Anwort schließen willst...

Beitrag #5027749 wurde von einem Moderator gelöscht.
Beitrag #5027767 wurde von einem Moderator gelöscht.
Beitrag #5027786 wurde von einem Moderator gelöscht.
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.