ARM彙編和C混合程式設計 筆記

2021-07-24 22:10:02 字數 2446 閱讀 9021

arm復位啟動先執行彙編指令,完成硬體的初始化(為什麼不用c語言?因為c語言無法訪問arm內部的暫存器,例如棧,所以需要彙編來進行初始化)

c語言能不能跟彙編相互並且反覆呼叫?

不能,因為這樣容易導致區域性變數的混用。

彙編呼叫c程式

.global _start

_start:

@將gpj2_3 --->output

ldr r0, =0xe0200280 //r0=0xe0200280

ldr r1, [r0] //r1=0xe0200280位址下的內容

bic r1,r1,#(0xf<<12) //r1 &= ~(0xf<<12)

orr r1, r1, #(1<<12) //r1 |= (1<<12)

str r1,[r0] //將r1 儲存到 0xe0200280

loop:

@將gpj2_3 output 0,led4-->on

ldr r0, =0xe0200284 //r0=0xe0200284

ldr r1, [r0] //r1=0xe0200284位址下的內容

bic r1,r1,#(1<<3) //r1 &= ~(1<<3)

str r1,[r0] //將r1 儲存到 0xe0200284

movr0, #0x300000 //r0作為引數,傳遞給delay()

bl delay //bl -- 在跳轉之前,儲存了返回位址-->r14

@將gpj2_3 output 1,led4-->off

ldr r0, =0xe0200284 //r0=0xe0200284

ldr r1, [r0] //r1=0xe0200284位址下的內容

orr r1, r1, #(1<<3) //r1 |= (1<<3)

str r1,[r0] //將r1 儲存到 0xe0200284

movr0, #0x300000 //r0作為引數,傳遞給delay()

bl delay

b loop //while(1) b--branch

c

void delay(int

time) //time

<---r0

這裡傳參按照atpcs,r0~r3給予相應的值那麼就作為相應的子程式的傳參,需要幾個就設定幾個,多了的話就需要壓棧,如果引數是8個的話引數1~引數4還是通過r0~r3進行傳遞,而引數5~引數8則是通過壓入堆疊的方式進行傳遞,注意這四個入棧引數的入棧順序,是以引數8->引數7->引數6->引數5的順序入棧的。

編譯器的優化和volatile

gcc有幾個優化等級:

o0,o1,o2,o3

-o0表示沒有優化,-o1為預設值,-o3優化級別最高。

通過優化之後可以通過 size filename.c指令看出相關的文字大小的變化,但是優化不一定是往好的方向發展,如果我們寫了延時是用

for(i=0;i

<100;i++)

這樣實現的話那麼編譯器就會幫我們優化刪除**,因為編譯器認為這是無意義的操作,那麼避免被優化,上面的例子,初始化i語言變為

volatile

int i;

volatile用來修飾乙個「易變的」變數,每次使用這個變數的時候都重新從記憶體中讀取它的值,防止被編譯器優化。

voltale的應用場合:

**1)中斷服務程式和應用程式之間共享的全域性變數

2)兩個執行緒之間共享的全域性變數

3)定義硬體暫存器的記憶體**

c呼叫彙編

c**

#define rgpj2con (*( volatile unsigned int *)

0xe0200280)

#define rgpj2dat (*( volatile unsigned int *)

0xe0200284)

//gpj2_3 ----> led4

extern void delay(int dat);

void _start(void) //相當於main()

}

彙編**

.global delay

delay:

subr0,r0,#1 // r2=r2-1

teq r0, #0 //compare if(r2 == 0)

bne delay //b--branch,ne -- not equal

bx lr // r15=r14, delay返回

arm-linux-gcc支援c內嵌彙編。

ARM彙編與C混合程式設計

內聯彙編即在c中直接使用彙編語句進行程式設計,使程式可以在c程式中實現c語言不能完成的一些工作,例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編 程式中使用飽和算術運算 saturating arithmetic 程式需要對協處理器進行操作 在c程式中完成對程式狀態暫存器的操作 asm volat...

ARM彙編 C語言 混合程式設計

主函式main 第一次實驗 12月4 這是我見過最坑爹的問題 main這個字段不能使用。在release模式下怎麼編譯都過不去,報錯如下 原因 不能使用main這個識別符號。用main main main1 mai都行,就是main不行。原來在debugrel模式下,使用main僅僅是乙個警告,沒想...

C和彙編混合程式設計

c和彙編混合程式設計 嵌入式裡面用到彙編的地方 開機時的硬體系統的初始化,包括cpu的狀態設定,中斷使能主頻設定,以及ram控制引數以及初始化一些中斷處理方面涉及一些彙編。c中內嵌彙編大多數為arm和thumb指令,其中注意 1 不能直接向pc賦值,程式跳轉用b或者bl指令 2 使用物理暫存器不能使...