C和彙編混合程式設計

2021-08-13 07:59:11 字數 1489 閱讀 6380

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...