2017-02-22 7 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 =親指を設定することにより、Thumbモードで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は 'mrs'を' msr'とは言いませんか? –

+0

こんにちはDavidさん、今、私の質問を修正しました。これを忘れて申し訳ありません。 – kvnsk

答えて

2

コード内のMSR命令の構文が正しくありません。 MSR命令では、ステータスレジスタの名前(場合によってはCPSR)に、更新すべきフィールドの接尾辞を付ける必要があります。次へmtcpsrのマクロを変更するのであれば、あなたは、コンパイラは、ARMおよびThumbモードで異なる動作をしますか、なぜそれが警告を発行しませんが、それはおそらく、なぜ私は推測することができ期待出力

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

を取得しますバグ。

割り込みの有効化のみを行う場合は、CPSIE if命令または__enable_interrupts()組み込み関数を使用できます。

+0

こんにちはヨハン、私はいくつかのコードを貼り付けて逃した。ごめんなさい。今すぐクエリを修正しました。 – kvnsk

関連する問題