aptcs(arm/thumb
程式呼叫規範),
pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程(函式)呼叫者與被呼叫者之間的協議。協議規定:呼叫函式如何傳遞引數(即壓棧方法,以何種方式存放引數),被呼叫函式
如何獲取引數,以何種方式傳遞函式返回值。
1. aptcs
使用規則
最主要的一條:
子程式通過
暫存器r0~r3來傳遞引數
. 這時暫存器可以記作
:a1~a4 ,
被呼叫的子程式在返回前無需恢復暫存器
r0~r3
的內容.
如果需要更多的引數,將使用堆疊。
2. 彙編呼叫c語言,流程如下:
1) 必須初始化棧
2) b main
3)如果要傳參,r0 --->給main()的第1個引數,依次類推
4)c函式的返回值也通過r0、r1、r2依次類推返回
3. c語言呼叫彙編,流程如下:
1)彙編函式要 .global mystrcpy
2)c檔案要extern intmystrcpy(char *,char*);
3)如果要傳遞引數
第1個引數-----》r0
第2個引數-----》r1
如果引數超過4個 多餘的引數就壓棧
4)彙編函式有返回值 通過r0返回
示例**:
c檔案**:
extern void mystrcopy(char *d,const char *s);
int main(void)
s檔案**
:.global mystrcopy
.text
mystrcopy:
ldrbr2, [r1], #1
strbr2, [r0], #1
cmpr2, #0
bnemystrcopy
movpc, lr
end4. gcc
內聯彙編1)
gcc通過關鍵字「
asm」來宣告內聯彙編
2)允許使用一些不能由編譯器自動生成的指令:
msr / mrs
新的指令
協處理器指令
3)通常在關聯的內嵌函式中使用
4)使用
c變數代替暫存器
5)內嵌彙編語法格式:
內嵌彙編語法如下:
__asm__(彙編語句模板: 輸出部分: 輸入部分: 破壞描述部分)
共四個部分:彙編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用「:」格開,彙編語句模板必不可少,其他三部分可選,如果使用了後面的部分,而前面部分為空,也需要用「:」格開,相應部分內容為空。例如:
__asm__ __volatile__("cli": : :"memory")
1、彙編語句模板
彙編語句模板由彙編語句序列組成,語句之間使用「;」、「/n」或「/n/t」分開。指令中的運算元可以使用佔位符引用c語言變數,運算元佔位符最多10個,名稱如下:%0、 %1 ...... %9。
2、輸出部分
輸出部分描述輸出運算元,不同的運算元描述符之間用逗號格開,每個運算元描述符由限定字串和c 語言變數組成。每個輸出運算元的限定字串必須包含「=」表示他是乙個輸出運算元。
3、輸入部分
輸入部分描述輸入運算元,它的語法跟輸出部分一樣,只不過不需帶「=」。
4、限制字元
具體來看一下示例**學習:
intsum,a,b;
a = 1;
b = 2;
asm
volatile(
"add%0,%1,%2\n\t"
:"=r"
(sum)
:"r"
(a),
"r"(b)
:"memory"
);printf(
"sum =%d\n"
,sum);
列印結果為3。注1
:volatile
用於告訴編譯器,這裡嚴禁優化。注2
:sum
對應%0,a
對應%1,b
對應%2注3
:memory
強制gcc
編譯器假設
ram
所有記憶體單元均被彙編指令修改,這樣
cpu
中的registers
和cache
中已快取的記憶體單元中的資料將作廢。
cpu
將不得不在需要的時候重新讀取記憶體中的資料。這就阻止了
cpu
又將registers, cache
中的資料用於去優化指令,而避免去訪問記憶體。
C和彙編混合程式設計
c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...
c與彙編的混合程式設計
場景1 c內嵌彙編 vim main.c include int main int argc,char ar 形式2 asm volatile mrc p14,0,0,c0,c1,0 r status c a b return 0 注 內嵌彙編的限制 1.匯程式設計序跳轉只能用b或bl指令,不能直接...
C語言與彙編混合程式設計
c語言是乙個系統級的語言,是乙個可以直接深入到硬體最底層操作的語言。在前邊的部分部落格中,我們提到過,對硬體的操作實際上是對硬體控制器中的暫存器或儲存單元進行操作,而在arm架構中,這些暫存器或儲存單元一般是以記憶體對映的方式進行訪問的。在c語言中,指標剛好提供了訪問任意的記憶體位址的方式,因此從語...