m68k プロセッサ用の gcc を使用してコンテキスト スイッチを実装しようとしています。すべてのレジスタ d0、d1...d7 および a0、...a7 を保存するには、インライン アセンブリを使用する必要があります。レジスタごとに別のコード行を書く代わりに、これらのレジスタを保存できるインライン gcc でループを使用できるかどうか疑問に思っていました。
たとえば。
move.l %d0、一時 pcb.cpuregs.d0 = 一時
ループカウンターのようにd0内を0にしたい。
m68k プロセッサ用の gcc を使用してコンテキスト スイッチを実装しようとしています。すべてのレジスタ d0、d1...d7 および a0、...a7 を保存するには、インライン アセンブリを使用する必要があります。レジスタごとに別のコード行を書く代わりに、これらのレジスタを保存できるインライン gcc でループを使用できるかどうか疑問に思っていました。
たとえば。
move.l %d0、一時 pcb.cpuregs.d0 = 一時
ループカウンターのようにd0内を0にしたい。
どうぞ:
MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack.
スタックを使用する必要はありません。他のアドレスを使用できます。
プリ デクリメント モードは必須のように感じます
が、68k マシンを持っていないため、現時点ではテストできません。
私がそのコードを書いたときにはgccが存在しなかったので、おそらくgccの方言ではありませんが、あなたはそれを理解できると確信しています.
setjmp
インラインアセンブリの代わりにppsを使用しないのはなぜですか?
そうすれば、コンテキストスイッチャーはセミポータブルになります。
マクロを検討することをお勧めします。
#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
ブロックC
内で-styleforループを使用することはできません。asm
ただし、Cコードを使用して文字列を作成し、それをに渡すことができますasm
。