2012-01-12 2 views
3

ARMASM으로 컴파일 된 일부 코드를 gcc (code sourcery GCC-4.6.2 eabi)로 변환해야합니다. 나는이 코드가 그 컴파일되지 않습니다 내 파일 중 하나에서ARM7TDMI가 요청한 특수 목적 레지스터를 지원하지 않습니다

(... 나는 -I 및 -D 인수를 생략)는 ARM7TDMI 내 컴파일 인수

arm-none-eabi-gcc -c -march=armv4t -mcpu=arm7tdmi -mlittle-endian -g -O1 

은 사용

나는 BU (이 게시물 Re: trouble building linux-linaro-3.0-2011.08-0에 따라

C:\DOCUME~1\MALLAR~1.ISC\LOCALS~1\Temp\ccA9cCgQ.s: Assembler messages: 
C:\DOCUME~1\MALLAR~1.ISC\LOCALS~1\Temp\ccA9cCgQ.s:267: Error: selected processor does not support requested special purpose register -- `msr r3,CPSR' 
make: *** [cdbini.o] Error 1 

:

extern inline void ngEnable(void) 
{ 
    int tmp; 
    asm volatile(
     "msr %[tmp], CPSR\n\t" 
     "bic %[tmp], %[tmp], #0xC0\n\t" 
     "msr CPSR_c, %[tmp]" 
     : [tmp] "+r" (tmp) 
    ); 
} 

나는이 오류 Windows에서 ild하지만 문제는 동일 할 수 있습니까?) - march = all을 사용하지 않는 해결 방법을 이미 사용하고 있습니다 ...

내 문제는 무엇입니까?

+0

엄지 또는 팔 명령 세트로 컴파일합니까? Thumb 모드는 레지스터에 액세스 할 때 몇 가지 제한이 있으므로 팔 명령을 시도 할 수 있습니다. – Zuljin

답변

3

는 특수 목적 레지스터를 읽으려면, 당신은 mrs 명령을 사용한다 :이 수정 후

extern inline void ngEnable(void) 
{ 
    int tmp; 
    asm volatile(
    "mrs %[tmp], CPSR\n\t" 
    "bic %[tmp], %[tmp], #0xC0\n\t" 
    "msr CPSR_c, %[tmp]" 
    : [tmp] "=r" (tmp) 
); 
} 

를 코드는 나를 위해 잘 작동합니다. 당신이 tmp의 값을 사용하지 않고, 당신도 설정할 사실에 있지 않기 때문에 또한

, 당신은 =r (출력 전용) 대신 +r (입출력)를 사용합니다.

+0

코드를 컴파일 해 주셔서 감사합니다. 나는 당신의 변화에 ​​면밀한 관찰을 가질 것이다! –

+0

당신을 진심으로 환영합니다. 그건 그렇고, 대답이 좋다고 생각한다면, 받아들이는 것 외에는 그것을 상향 표시 할 수 있습니다;) – Fanael

관련 문제