2012-03-27 2 views
0

컨텍스트 스위칭과 관련된 인라인 어셈블리 명령에 대한 또 다른 질문이 있습니다. 이 코드는 작동하지만 100 %에서 확신 할 수 없으므로이 코드를 stackoverflow()의 전문가에게 제출하십시오.암 인라인 어셈블리를 사용하는 컨텍스트 스위치

arm7TDMI에 대해 gcc (최적화 안 함)를 사용하여 컴파일 중입니다. 어떤 시점에서 코드는 컨텍스트 스위칭을 수행해야합니다. 내가 컴파일 된 코드를 검사 할 때

/* Software Interrupt */ 
/* we must save lr in case it is called from SVC mode */ 
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr") 
// Note : code = 0x23 

는,이 결과를 얻을 :

svc 0x00000023 

이 "우리는 LR을 저장해야합니다"하지만 컴파일 된 코드에서, 난 몰라 쓴 코드 내 앞에있는 사람 lr이 저장되는 흔적을 봅니다.

내가 그 코드가 잘못 될 수 있다고 생각 그 이유는 리셋 예외 코드를 실행할 수있는 마지막 일 중 하나 컨텍스트 스위치가에 가기 전에 몇 시간 동안 프로그램 실행 ...

답변

0

__asm__ 문 clobbered 레지스터로 lr을 나열합니다. 이것은 컴파일러가이 필요한 경우 레지스터 을 저장한다는 것을 의미합니다.

저장이 보이지 않으므로 컴파일러가 해당 레지스터를 사용하지 않는다고 추측 할 수 있다고 생각합니다 (최소한 테스트 케이스에서).

0

사용자 모드에서 SWI 명령을 호출해야한다고 생각합니다. 이것이 옳다면. 이 명령어 다음에 ARM 모드가 SVC 모드로 전환됩니다. ARM 코어는 CPSR이 SPSR_svc에 복사되고 LR이 LR_svc에 복사되는 복사 작업을 수행합니다. 이것은 svc 모드에서 돌아 가기 위해 사용자 모드 cpu의 컨텍스트를 저장하는 데 사용해야합니다. svc 예외 핸들러가 다른 함수를 호출하는 것처럼 lr을 사용하면 lr 레지스터는 모드 변경 사이에 스택을 사용하는 것처럼 보존되어야합니다. 나는 네가이 상황에 대해 이야기하기 전에 이렇게 쓴 사람이 맞을 것 같아.

관련 문제