2012-01-12 29 views
3

我需要轉換與ARMASM編譯gcc的一些代碼(代碼的Sourcery GCC-4.6.2 EABI)。我使用的是ARM7TDMI和我的編譯參數是ARM7TDMI不支持請求的特殊用途寄存器

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

(我省略了-I和-D參數...)

在我的文件我有這樣的代碼,將不能編譯:

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

我得到這個錯誤:根據這個帖子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 

(我卜ILD Windows版本,但問題可能是一樣的嗎?)我已經使用不使用-march =所有的解決辦法...

我的問題是什麼你知道嗎?

+0

你用拇指或ARM指令集的編譯它? Thumb模式可能對訪問寄存器有一些限制,所以你可以嘗試使用arm指令。 – Zuljin 2012-01-12 16:34:52

回答

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

感謝代碼現在編譯好了。我會仔細看看你的改變! – 2012-01-12 16:40:18

+0

不客氣。順便說一句,如果你認爲答案是好的,除了接受它之外,你可以放棄它;) – Fanael 2012-01-12 16:42:38