2017-02-22 71 views
0

У меня есть код для встроенного ассемблера ARM Cortex-R5антиреверс 7,40 компилятора недействительных сборка

#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))); 
} 

Это при компиляции с IAR 7.40 компилятором в режиме большого пальца руки, установив --cpu_mode = большой палец в качестве флага компилятора, генерирует в сборе как

   `.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 говорит 'mrs' не' msr'? –

+0

Привет, Дэвид, теперь исправил мой вопрос. Извините за отсутствие этого. – kvnsk

ответ

2

Неверный синтаксис инструкции MSR в вашем коде. Инструкция MSR требует, чтобы имя регистра статуса, CPSR в вашем случае, должно быть заполнено полями, которые необходимо обновить. Так что если вы измените mtcpsr макрос на следующее вы получите ожидаемый результат

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

Я могу только догадываться, почему компилятор ведет себя по-разному в руки и большого пальца режиме или почему он не выдает предупреждение, но это, вероятно, ошибка.

В качестве примечания, если вы хотите включить прерывания, вы можете использовать команду CPSIE if или встроенную функцию __enable_interrupts().

+0

Привет, Йохан, я пропустил вставку кода. Сожалею. Исправлен запрос. – kvnsk

 Смежные вопросы

  • Нет связанных вопросов^_^