2014-04-23 31 views
1

我正在編寫一個運行在Cortex-m3上的程序。「svc」是否有任何gcc編譯器原語?

起初我寫了一個執行'svc'的程序集文件。

svc: 
    svc 0 
    bx lr 

我決定用gcc的內聯彙編,所以我寫了如下,但沒有內聯svc功能。

__attribute__((naked)) 
int svc(int no, ...) 
{ 
    (void)no; 
    asm("svc 0\n\tbx lr"); 
} 

int f() { 
    return svc(0,1,2); 
} 

------------------ generated assembly ------------------ 
svc: 
    svc 0 
    bx lr 
f: 
    mov  r0, #0 
    mov  r1, #1 
    mov  r2, #2 
    b  svc 

我想這不是內聯,因爲它是naked,所以我放棄了naked屬性,並寫了這個樣子。

int svc(int __no, ...) 
{ 
    register int no asm("r0") = __no; 
    register int ret asm("r0"); 
    asm("svc 0" : "=r"(ret) : "r"(no)); 
    return ret; 
} 

------------------ generated assembly ------------------ 
svc: 
    stmfd sp!, {r0, r1, r2, r3} 
    ldr  r0, [sp] 
    add  sp, sp, #16 
    svc 0 
    bx  lr 
f: 
    mov  r0, #0 // missing instructions setting r1 and r2 
    svc 0 
    bx  lr 

雖然我不知道爲什麼GCC增加了一些不必要的堆棧操作,svc好。問題是svc沒有正確內聯,可變參數被丟棄。

gcc中是否有任何svc原始碼?如果gcc沒有,我該如何編寫正確的?

+0

內聯函數必須在頭文件中聲明(實現必須在編譯時可用),我猜你沒有做,因爲你沒有標記函數「內聯」(因此會得到定義合併編譯單元時出錯) – IdeaHat

+0

@MadScienceDreams兩者都在同一個編譯單元中定義。即使它們不是,如果使用鏈接時間優化,也可以內聯。我想這裏的'inline'關鍵字不是解決方案。 – kukyakya

+0

編寫彙編語言函數並彙編和鏈接它比處理編譯器特定的內聯彙編語句要簡單得多。 svc需要一個立即的參數,所以你不能傳遞一個參數,除非你使用自我修改代碼,否則它就是svc立即數。 –

回答

0

查看core_cmFunc.h中使用的語法,該語法作爲Cortex-M系列的ARM CMSIS的一部分提供。下面是一個值寫入優先級屏蔽寄存器的例子:

__attribute__ ((always_inline)) static inline void __set_PRIMASK(uint32_t priMask) 
{ 
    __ASM volatile ("MSR primask, %0"::"r" (priMask)); 
} 

但是,在創建可變參數功能像這聽起來很困難。