Forum: Compiler & IDEs gcc Inline Assembler


von Lothar (Gast)


Lesenswert?

Wie kann man in gcc Inline Assembler ein Register nochmals zuweisen? So 
geht es nicht, weil natürlich das zweite Mal eine Re-Definition ist. 
Aber wie dann?

register int _r0 __asm ("r0") = val11;
register int _r1 __asm ("r1") = val12;
_asm_ ("swi " GPIO_WriteMode);

register int _r0 __asm ("r0") = val21;
register int _r1 __asm ("r1") = val22;
_asm_ ("swi " GPIO_WriteData);

Man könnte natürlich jedesmal neue Namen für die Register verwenden, das 
wäre aber unübersichtlich.

Zur Info: Hier sollen vor einem Software-Interrupt jeweils die Register 
bestückt werden.

von Dr. Sommer (Gast)


Lesenswert?

Kannst du nicht einfach die Variable neu zuweisen?
1
_r0 = val21;

Oder halt 1 Syscall/SWI pro Funktion, ggf. eh sauberer.

Die SWI-Instruktion wurde übrigens nach SVC umbenannt

von Carl D. (jcw2)


Lesenswert?

Lothar schrieb:
> Wie kann man in gcc Inline Assembler ein Register nochmals zuweisen? So
> geht es nicht, weil natürlich das zweite Mal eine Re-Definition ist.
> Aber wie dann?
>
> register int _r0 __asm ("r0") = val11;
> register int _r1 __asm ("r1") = val12;
> _asm_ ("swi " GPIO_WriteMode);
>
> register int _r0 __asm ("r0") = val21;
> register int _r1 __asm ("r1") = val22;
> _asm_ ("swi " GPIO_WriteData);
>
> Man könnte natürlich jedesmal neue Namen für die Register verwenden, das
> wäre aber unübersichtlich.
>
> Zur Info: Hier sollen vor einem Software-Interrupt jeweils die Register
> bestückt werden.

Dazu gibt es was, das nennt sich Scope. Geschweifte Klammer drum und die 
Variablen _r<n> existieren nur innerhalb.
Es ist auch nicht gut diese Register-Reservierung zu weitreichend und zu 
umfangreich (auf Vorrat) zu machen, denn irgendwann gehen dem Compiler 
die Register aus.
Und da die Aufrufkonventionen bei ARM (erkennbar am SWI) genau so 
aussehen, erste 4 bis zu 32Bit große Parameter in r0..3, kann man auch 
einfach für jede "SWI-Funktion" eine naked-(inline-)Funktionen, die die 
richtigen Parameter hat und nur aus SWI besteht. Dann ist die ganze 
Register-Magic überflüssig.

von Jim M. (turboj)


Lesenswert?


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.