gcc Inline Assembler

Gast #5590431
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.
#5590588
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.
#5593873
Lesenswert?

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