2009-06-27 15 views
4

m68kプロセッサ用のgccを使用してコンテキストスイッチを実装しようとしています。私はすべてのレジスタd0、d1 ... d7とa0、... a7を保存するためにインラインアセンブリを使用する必要があります。私はインラインgccでループを使って各レジスタのコードを別々に書くのではなく、これらのレジスタを保存できるかどうか疑問に思っていました。コンテキスト切り替えのgccインラインアセンブリ

たとえば、

move.lの%のD0、一時 pcb.cpuregs.d0 =一時

私はループカウンタのようD0内の0を作りたいです。

答えて

1

asmブロック内には、ループ用にCスタイルを使用することはできません。しかし、Cコードを使って文字列を作成し、それをasmに渡すことができます。

2

あなたがマクロを検討する必要があります。

#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

をここに行く:

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

あなたは、スタックを使用する必要はありません、あなたはいくつかの他のアドレスを使用することができます。
プリデクリメントモードが強制的であると感じていますが、
ですが、私は68kマシンを持っていないので、今はテストできません。

p.s.それはおそらくgccの方言ではなく、gccが存在しなかったからです。
私はそのコードを書いていますが、私はあなたがそれを理解できると確信しています。

p.p.sなぜインラインアセンブリの代わりにsetjmpを使用しないのですか?
あなたのコンテキストスイッチャーは準ポータブルです。

+1

はい、実際には、setjmpを使用してください。アセンブリコードを避けることができる場合は、そうしてください。 –

+0

私はコルーチンのスタックポインタを独自のスタック空間に設定してから、 'setjmp'だけでは不十分です。関数呼び出し(および保存したいレジスタの関連する突然変異)を避けるために、このようにasmをインライン関数に入れるか、インライン化する必要があるか、マクロを使用する必要がありますか? – Alexander

+0

コンパイラに依存しますが、インラインアセンブリを使用するのとまったく同じです。 –

関連する問題