2009-06-27 139 views
4

我想實現上下文切換使用gcc的m68k處理器。我需要使用內聯彙編保存所有寄存器d0,d1 ... d7和a0,... a7。我想知道是否可以在我的內聯gcc中使用一個循環,這將允許我保存這些寄存器,而不是爲每個寄存器寫一行代碼。gcc內聯彙編上下文切換

例如。

move.l%D0,溫度 pcb.cpuregs.d0 =臨時

我要讓0內部就像一個循環計數器D0。

回答

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.這可能不是海灣合作委員會的方言,看到因爲海灣合作委員會不存在
我寫了代碼,但我相信你可以弄明白。

p.p.s爲什麼不使用setjmp代替內聯彙編?
那麼你的上下文切換器將是半便攜式的。

+1

是的,真的,使用setjmp。如果你可以避免彙編代碼,那就這樣做。 – 2009-07-02 00:28:18