2017-02-22 5 views
0

J'ai un code assembleur en ligne pour le bras cortex-R5IAR 7,40 compilateur générant assemblage incorrect

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

Cette fois compilé avec le compilateur IAR 7,40 en mode de pouce en définissant --cpu_mode = pouce comme indicateur de compilateur, génère assemblage sous la forme

   `.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 est l'assemblage invalide. Je m'attends à ce que MSR CPSR_fc, R0 (que j'ai obtenu ceci sans option de pouce). Pouvez-vous aider les gars à localiser le problème.

+1

Votre asm dit 'mrs' pas' msr'? –

+0

Salut David, a corrigé ma question maintenant. Désolé d'avoir manqué ça. – kvnsk

Répondre

2

La syntaxe de l'instruction MSR dans votre code est incorrecte. L'instruction MSR requiert que le nom du registre d'état, CPSR dans votre cas, soit suffixé par les champs qui doivent être mis à jour. Donc, si vous modifiez la macro mtcpsr à ce qui suit, vous obtenez le résultat attendu

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

Je ne peux que deviner pourquoi le compilateur se comporte différemment dans le bras et le mode pouce ou pourquoi il ne délivre pas un avertissement, mais il est probablement punaise. En même temps, si vous voulez uniquement activer les interruptions, vous pouvez utiliser l'instruction CPSIE if ou la fonction intrinsèque __enable_interrupts().

+0

Salut Johan, j'ai manqué de coller du code. Pardon. Corrigé la requête maintenant. – kvnsk