2009-06-27 6 views
4

Ich versuche, Kontextwechsel mit gcc für M68k-Prozessoren zu implementieren. Ich brauche Inline-Assembly zum Speichern aller Register d0, d1 ... d7 und a0, ... a7. Ich habe mich gefragt, ob ich eine Schleife in meinem Inline-GCC verwenden kann, die mir erlauben würde, diese Register zu speichern, anstatt eine separate Codezeile für jedes Register zu schreiben.gcc Inline-Assembly für Kontextwechsel

für zB.

move.l% d0, Temperatur pcb.cpuregs.d0 = Temp

Ich möchte 0 innerhalb d0 wie ein Schleifenzähler machen.

Antwort

1

Sie können keinen C -Style für die Schleife innerhalb des asm Blocks verwenden. Aber Sie können Ihren C-Code verwenden, um eine Zeichenfolge zu erstellen und diese an asm weiterzugeben.

2

Möglicherweise möchten Sie Makros berücksichtigen:

#define SAVE_REG_DXX(no) __asm__ __volatile__("move.l %%d" #no ", %0" : "=g" (pcb.cpuregs.d ## no)) 

SAVE_REG_DXX(0); 
SAVE_REG_DXX(1); 
SAVE_REG_DXX(2); 

#undef SAVE_REG_DXX 
4

Hier gehen Sie:

MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack. 

Sie müssen den Stapel nicht verwenden, können Sie eine andere Adresse verwenden.
Ich habe das Gefühl, dass der Pre-Dekrement-Modus ist obligatorisch,
aber ich kann das jetzt nicht testen, da ich keine 68k Maschine habe.

p.s. das ist wahrscheinlich nicht gcc dialect, da gcc nicht existiert, wenn
ich diesen Code geschrieben habe, aber ich bin sicher, dass du es herausfinden kannst.

S.p.s Warum nicht setjmp anstelle der Inline-Montage verwenden?
dann wäre Ihr Context Switcher halbportabel.

+1

Ja, wirklich, verwenden Sie setjmp. Wenn Sie den Assemblercode vermeiden können, tun Sie dies. –

+0

Ich mache etwas ähnliches: Setze Stapelzeiger von Coroutinen auf ihre eigenen separaten Stapelräume, bevor sie aufgerufen werden, für die 'setjmp' alleine nicht ausreicht. Kann asm so in eine Inline-Funktion eingefügt werden, die garantiert inline sein kann, oder muss ein Makro verwendet werden, um einen funktionalen Aufruf (und damit verbundene Mutationen in den Registern, die wir speichern wollen) zu vermeiden? – Alexander

+0

Hängt von Ihrem Compiler ab, aber das klingt genau so, wie Sie Inline Assembly für verwenden würden. –