2017-02-22 2 views
0

7.40 컴파일러 피질-R5IAR I가 암을위한 인라인 어셈블리 코드가 생성 잘못 조립

#include <stdio.h> 

#define mtcpsr(v) __asm volatile(\ 
       "msr cpsr,%0\n"\ 
       : : "r" (v)\ 
      ) 

int mfcpsr (void) 
{ 
    int rval; 
    asm("mrs %0, cpsr" : "=r"(rval)); 
    return rval; 
} 


void main(void) 
{ 

    /* 
    * Enable interrupts in the ARM 
    */ 

    mtcpsr(mfcpsr() & ~ ((0x80U) & (0x40U | 0x80U))); 
} 

이것 컴파일러 플래그로서 --cpu_mode = 엄지 설정 엄지 모드 IAR 7.40 컴파일러로 컴파일, 생성되는 어셈블리는

   `.text6`: 
       mfcpsr: 
    0xfffc040c: 0xf3ef 0x8000 MRS  R0, APSR 
    0xfffc0410: 0x4770   BX  LR 
    0xfffc0412: 0x0000   MOVS R0, R0 
       main: 
    0xfffc0414: 0xb580   PUSH {R7, LR} 
    0xfffc0416: 0xf7ff 0xfff9 BL  mfcpsr     ; 0xfffc040c 
    0xfffc041a: 0xf020 0x0080 BIC.W R0, R0, #128   ; 0x80 
    0xfffc041e: 0xf380 0x8000 MSR  ??-0-0, R0 
    0xfffc0422: 0xbd01   POP  {R0, PC} 

MSR ?? - 0-0, R0은 잘못된 어셈블리입니다. MSR CPSR_fc, R0 (엄지 옵션이없는 경우)으로 예상합니다. 문제를 찾을 수 있도록 도와 줄 수 있습니까?

+1

당신의 asm은'msrs'가 아니라'mrs'라고 말합니까? –

+0

안녕하세요. David 님, 지금 제 질문을 수정했습니다. 죄송합니다. – kvnsk

답변

2

코드의 MSR 명령 구문이 올바르지 않습니다. MSR 명령을 사용하려면 상태 레지스터의 이름 인 CPSR에 업데이트해야 할 필드의 접미사가 있어야합니다. 다음에 mtcpsr 매크로를 변경 그렇다면 당신은 예상 출력을 얻을

#define mtcpsr(v) __asm volatile(\ 
      "msr CPSR_cxsf,%0\n"\ 
      : : "r" (v)\ 
     ) 

내가 컴파일러는 ARM 및 Thumb 모드에서 다르게 동작하거나 경고를하지만하지 않는 이유는 아마 이유를 추측 만 할 수 있습니다 곤충.

보조 메모로 CPSIE if 명령어 또는 __enable_interrupts() 내장 함수를 사용할 수 있습니다.

+0

안녕하세요 요한, 몇 가지 코드를 붙여 놓으 셨습니다. 죄송합니다. 지금 쿼리를 수정했습니다. – kvnsk