4

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

たとえば。

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

ループカウンターのようにd0内を0にしたい。

4

3 に答える 3

4

どうぞ:

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

スタックを使用する必要はありません。他のアドレスを使用できます。
プリ デクリメント モードは必須のように感じます
が、68k マシンを持っていないため、現時点ではテストできません。


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

setjmpインラインアセンブリの代わりにppsを使用しないのはなぜですか?
そうすれば、コンテキストスイッチャーはセミポータブルになります。

于 2009-06-27T22:33:57.560 に答える
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
于 2009-06-27T22:29:08.723 に答える
1

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

于 2009-06-27T21:29:48.937 に答える