c和彙編混合程式設計
嵌入式裡面用到彙編的地方:
開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。『
c中內嵌彙編大多數為arm和thumb指令,其中注意:
1:不能直接向pc賦值,程式跳轉用b或者bl指令
2:使用物理暫存器不能使用過於複雜的c表示式,避免物理暫存器衝突
3:r12和r13可能被編譯器用來存放中間編譯結果,計算表示式可能將r0~r3,r12~r14用於程式呼叫,避免直接用這些暫存器。
4:一般不要直接指定暫存器,最好讓編譯器自動分配。
c和彙編引數呼叫問題,彙編檔案如果過大,一般單獨作為乙個檔案,所以引數傳遞一般用全域性變數來進行。
c中呼叫彙編中的函式,一般注意:
1:在c中宣告函式原型,並加extern關鍵字
2:彙編export匯出函式名,並用該函式作為彙編**段標識,最後用
mov pc lr返回
原因是因為c函式名起到了函式**起始位址作用,和彙編的lable是一致的。
c中呼叫彙編
c語言
#include extern void strcopy(char *d, const char *s);
int main()
彙編**
.global strcopy
strcopy: @r0 指向目的字串
@r1 指向源字串
ldrb r2, [r1],#1 @載入位元組並更新源字串指標位址
strb r2, [r0],#1 @儲存位元組並更新目的字串指標位址
cmp r2, #0 @判斷是否為字串結尾
bne strcopy @如果不是,程式跳轉到 strcopy 繼續複製
mov pc,lr @程式返回
彙編用c語言
;prog1_asm.asm
.extern prog1_c @ 宣告prog1_c函式
.text
_start:
.global prog1_asm
prog1_asm:
str lr, [sp, #-4]! @ 儲存當前lr
ldr r0,=0x1 @ 引數1
ldr r1,=0x2 @ 引數2
ldr r2,=0x3 @ 引數3
bl prog1_c @ 呼叫c函式
ldr pc, [sp], #4 @ 將lr裝進pc(返回main函式)
.end
//prog1_c.c
void prog1_c(int p1,int p2,int p3)
int main()
C和彙編混合程式設計 do while
環境 vc do while 會先執行do裡面的迴圈體,執行完去執行while的條件判斷,如果為真,繼續執行do裡面的迴圈體,如果為假,則結束迴圈 c程式 上面先執行sum i i 接著執行i 100,如果為true,則繼續執行do迴圈,否則,結束迴圈。反彙編 5 int i 1,sum 0 004...
C 彙編的混合程式設計
aptcs arm thumb 程式呼叫規範 pcs規定了應用程式的函式可以如何分開地寫,分開地編譯,最後將它們連線在一起,所以它實際上定義了一套有關過程 函式 呼叫者與被呼叫者之間的協議。協議規定 呼叫函式如何傳遞引數 即壓棧方法,以何種方式存放引數 被呼叫函式 如何獲取引數,以何種方式傳遞函式返...
ARM彙編和C混合程式設計 筆記
arm復位啟動先執行彙編指令,完成硬體的初始化 為什麼不用c語言?因為c語言無法訪問arm內部的暫存器,例如棧,所以需要彙編來進行初始化 c語言能不能跟彙編相互並且反覆呼叫?不能,因為這樣容易導致區域性變數的混用。彙編呼叫c程式 global start start 將gpj2 3 output l...