我想實現上下文切換使用gcc的m68k處理器。我需要使用內聯彙編保存所有寄存器d0,d1 ... d7和a0,... a7。我想知道是否可以在我的內聯gcc中使用一個循環,這將允許我保存這些寄存器,而不是爲每個寄存器寫一行代碼。gcc內聯彙編上下文切換
例如。
move.l%D0,溫度 pcb.cpuregs.d0 =臨時
我要讓0內部就像一個循環計數器D0。
我想實現上下文切換使用gcc的m68k處理器。我需要使用內聯彙編保存所有寄存器d0,d1 ... d7和a0,... a7。我想知道是否可以在我的內聯gcc中使用一個循環,這將允許我保存這些寄存器,而不是爲每個寄存器寫一行代碼。gcc內聯彙編上下文切換
例如。
move.l%D0,溫度 pcb.cpuregs.d0 =臨時
我要讓0內部就像一個循環計數器D0。
您不能在asm
塊內使用C
-樣式循環。但是你可以使用你的C代碼來構建一個字符串並將其傳遞給asm
。
你可能要考慮的宏:
#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
在這裏你去:
MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack.
您不必使用堆棧,你可以使用一些其他的地址。
我有一種感覺,預先減量模式是強制性的,
但我現在無法測試,因爲我沒有68k機器。
p.s.這可能不是海灣合作委員會的方言,看到因爲海灣合作委員會不存在
我寫了代碼,但我相信你可以弄明白。
p.p.s爲什麼不使用setjmp
代替內聯彙編?
那麼你的上下文切換器將是半便攜式的。
是的,真的,使用setjmp。如果你可以避免彙編代碼,那就這樣做。 – 2009-07-02 00:28:18