문제

우리는 수업에 대한 과제로 장난감 운영 체제를 연구하고 있습니다. 커널 공황 기능을 작성하는 데 문제가 있습니다.

모든 레지스터를 저장하고 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는 분명히 작동하지 않습니다. 나는 인터넷 검색과 재미 있고 절망적 인 물건을 쓰려고 시도했지만 (어셈블러 문자열의 #include :-)) 아무것도 도움이되지 않았습니다. 이것을 해결하는 방법이 있습니까?

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

편집하다:SAVE_REGISTERS 정의됩니다 .macro SAVE_REGISTERS.... 다른 어셈블리 모듈에 사용되기 때문에 C 매크로에있을 수 없습니다. Panic은 다양해야하기 때문에 .s 파일을 만들 수 없습니다. 아니면 적어도 나는 그것을 할 다른 방법을 생각해 낼 수 없었습니다.

도움이 되었습니까?

해결책

나는 당신이 매크로가 어떻게 작동하는지 오해하고 있다고 생각합니다. 다른 컴파일이 발생하기 전에 확장됩니다. 당신은 사용할 수 없습니다 asm 매크로가 절대 확장되지 않기 때문에 매크로가 포함 된 일부 코드를 방출합니다.

대신 정의를 시도 할 수도 있습니다 SAVE_REGISTERS C 매크로로 사용합니다 asm 어셈블리 코드를 구축하기위한 진술 :

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

그런 다음 할 수 있습니다

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

다른 팁

나는 MIPS 시스템이 없지만 내 x86 loonix 상자에 나는 시도했다. #include 그리고 그것을 발견했습니다 # 주석 문자이므로 시도했습니다 .include 그리고 파일 이름을 인용하자마자 작동했습니다. .include "something.i".

이제 헤더 파일과 어셈블러 코드를위한 체계적인 인프라가 있다면 처음에 인라인 ASM 으로이 작업을 수행하려는 이유가 궁금합니다. 그냥 진짜를 만들지 않겠습니까? .s 또는 .S 파일, 어셈블러 헤더 파일을 포함시키고 시스템의 일류 모듈로 만드시겠습니까?

나는 작은 걸작을 보았다 ASM 이미 가지고있는 프로젝트에서도 locore.S 그들의 Makefile, 그림을 이동...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top