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沒有,我該如何編寫正確的?
內聯函數必須在頭文件中聲明(實現必須在編譯時可用),我猜你沒有做,因爲你沒有標記函數「內聯」(因此會得到定義合併編譯單元時出錯) – IdeaHat
@MadScienceDreams兩者都在同一個編譯單元中定義。即使它們不是,如果使用鏈接時間優化,也可以內聯。我想這裏的'inline'關鍵字不是解決方案。 – kukyakya
編寫彙編語言函數並彙編和鏈接它比處理編譯器特定的內聯彙編語句要簡單得多。 svc需要一個立即的參數,所以你不能傳遞一個參數,除非你使用自我修改代碼,否則它就是svc立即數。 –