2009-06-27 6 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

컴파일러에 따라 다르지만 인라인 어셈블리를 사용하는 것과 정확히 같습니다. –