2009-10-21 3 views
1

우리는 장난감 운영 체제를 수업 과제로 사용하고 있습니다. 커널 패닉 기능 작성에 약간의 문제가 있습니다.인라인 어셈블리에 포함

모든 레지스터를 저장하고 printf와 유사한 기능을 호출 한 다음 저장된 레지스터를 인쇄하고 CPU를 중지해야합니다. 지금 당장은 매크로로 정의되어 :

#define panic(...) \ 
    do{ \ 
     asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \ 
     _panic_printk(&_panic_context, __VA_ARGS__); \ 
    while(0) 

_panic_context 스레드 좀 더 물건의 저장 레지스터를 포함하는 전역 변수이다. 문제는 SAVE_REGISTERS입니다. 그것은 어셈블러 헤더 파일의 어딘가에 정의 된 매크로이지만 그것을 포함시키는 방법을 모른다. 파일에있는 간단한 #include는 분명히 작동하지 않습니다. 나는 인터넷 검색을 시도하고 필사적이고 필사적 인 것들을 (어셈블러 문자열에 다음과 같이 포함한다 :-))하지만 아무런 도움이되지 않았다. 이 문제를 해결하는 방법에 대해 아이디어가 있습니까?

우리는 GCC를 사용하고 (시뮬레이터 :-)에서 실행) MIPS를 위해 컴파일하고

편집 : SAVE_REGISTERS.macro SAVE_REGISTERS으로 정의된다 .... 그것은 다른 어셈블리 모듈에서 사용되기 때문에 C 매크로에있을 수 없습니다. 공황이 가변적이어야하므로 .S 파일을 만들 수 없습니다. 아니면 최소한 나는 그것을 할 수있는 다른 방법을 찾지 못했습니다.

+0

을 할 수 있습니까? –

답변

3

을 그림을 이동합니다. 다른 컴파일이 일어나기 전에 확장됩니다. asm을 사용하면 매크로가 확장되지 않으므로 매크로가 포함 된 일부 코드를 내보낼 수 없습니다. 대신

당신이 당신의 어셈블리 코드를 구축하기 위해 asm 문을 사용하는 C 매크로로 SAVE_REGISTERS를 정의하려고 할 수 있습니다

#define SAVE_REGISTERS(x) \ 
    asm volatile ("movx ax, %1", ...); 

는 다음`SAVE_REGISTERS`가 정의 정확히 어떻게

#define panic(...) \ 
do { \ 
    SAVE_REGISTERS(_panic_context); \ 
    _panic_printk(&_panic_context, __VA_ARGS__); \ 
} while(0); 
+0

더미 do-loop는 매크로 다음에 세미콜론이 있는지 확인하는 것입니다. –

+3

dummy do-loop는 다중 문 매크로에서 일반적인 기술로, if 문에서 사용될 때 잘 동작합니다. 그것은 매크로에 남아 있어야합니다 (그러나 닫는 중괄호가 추가되어야합니다). http://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-do-while-if-else-statements-in-cc-macr –

+0

아, 알지 못했습니다. 그 대회. 답변을 수정했습니다. 감사. –

1

나는 주위에 누워 MIPS 시스템이없는,하지만 내 86 loonix 상자에 나는 #include을 시도하고 #이 주석 문자는 것을 발견, 그래서 .include 시도하고 내가 파일 이름을 인용하는 즉시 일 : .include "something.i"를 .

이제 어셈블러 코드에 대한 헤더 파일과 조직화 된 인프라가있는 경우 먼저 인라인 asm을 사용하여이 작업을 수행해야하는 이유가 궁금합니다. 실제 .s 또는 .S 파일을 만들고, 어셈블러 헤더 파일을 포함하고 시스템에서 최상급 모듈로 만드는 것이 어떨까요?

내가 본 작은 걸작도 이미 Makefilelocore.S을 가지고 프로젝트에 ASM 함께 할, 내가 어떻게 매크로 작업을 오해 것 같아요 ...

관련 문제