10 ARM程式設計

2022-11-30 02:42:08 字數 3977 閱讀 5604

● arm工程

● arm程式框架

啟動**:用於硬體初始化,彙編

初始化:應用程式初始化,c

啟動**之後,主應用程式之前,編譯系統提供了乙個函式__main(),它主要負責完成庫函式的初始化工作。編譯器在__main()中宣告了使用者函式的名稱為main().

● c和彙編之間的函式呼叫

arm工程中,c程式呼叫彙編函式和匯程式設計序呼叫c函式時經常的事情,遵守arm-thumb過程呼叫標準atpcs(arm-thumb procedure call standard)。

atpcs標準——arm編譯器使用的函式呼叫規則(詳見下面)

(溫故知新)c語言程式中的呼叫

int main()

請編寫sum函式,實現兩個數的相加。

int sum(int x,int y)

c程式呼叫匯程式設計序函式

要點:1. 在組合語言中,用該函式名作為彙編**段的標識,定義函式**,最後用mov pc,lr返回

2. 在組合語言中用export匯出函式名

3. 在c語言中用extern關鍵詞宣告函式原型。

4. 函式呼叫時引數傳遞規則:暫存器組中的作為引數傳遞和結果返回暫存器,如果引數數目超過4個,則使用堆疊進行傳遞。

;工程exp10_1_2

;彙編函式檔案

;把r1指向的資料塊複製到r0指向的儲存塊。

area strcopy,code,readonly

export strcopy

strcopy

ldrb r2,[r1],#1

strb r2,[r0],#1

cmp r2,#0

bne strcopy

mov pc,lr

end;c檔案

;呼叫strcopy函式

extern void strcopy(char *d,const char *s); //宣告strcopy為外部引用符號

int main(void)

根據atpcs的c語言程式呼叫彙編函式規則,引數由左向右依次傳遞給暫存器r0~r3,可知彙編函式strcopy在c程式中的原型應該為:

void strcopy(char *d,const char *s);

其中,引數d對應r0,引數s對應r1。函式沒有返回值,型別為void。函式名稱與彙編函式標號名稱一致。

匯程式設計序呼叫c程式函式

(工程exp10_1_3,與實驗三類似)

c函式int g(int a,int b,int c,int d,int e)

彙編函式f中呼叫c函式g(),以實現下面的功能:

int f(int i)

整個彙編函式f的**如下:

export f

area f,code,readonly

import g

str lr,[sp,#-4]

add r1,r0,r0

add r2,r1,r0

add r3,r1,r2

str r3,[sp,#-4]

add r3,r1,r1

bl g

add sp,sp,#4

rsb r0,r0,#0

ldr pc,[sp],#4

end;由於函式g()有5個引數,所以該函式用暫存器r0~r3來傳遞a~d,而用堆疊來傳遞第5個引數e。

匯程式設計序訪問c程式變數

實際上是引用不同檔案定義的變數:

import:宣告符號為外部引用符號

export:宣告符號為匯出符號

例子:area globals,code,readonly

export asmsubroutine ;宣告可匯出符號,以供外程式呼叫

import globvar宣告引用外部符號

asmsubroutine

ldr r1,= globvar

ldr r0,[r1]

add r0,r0,#2

str r0,[r1]

mov pc,lr

end atpcs標準(arm-thumb procedure call standard)

arm編譯器使用的函式呼叫規則。

1. 暫存器的使用規則

r0 ~r3用來傳遞引數;

r4~r11用來儲存區域性變數;

r12用做子程式內部呼叫的scratch暫存器

r13堆疊指標,儲存當預處理器模式的堆疊的棧頂

r14鏈結暫存器

r15程式計數器

進入函式時,必須儲存r4~r11中被函式破壞的暫存器。

2. 堆疊的使用規則

fd型別。

3. 引數的傳遞規則

<4個:r0~r3

>4個:堆疊

4. 函式返回值

r0,r1

● c/c++語言和組合語言之間的混合程式設計

c程式嵌入彙編指令

內聯彙編inline assemble

嵌入式彙編embedded assemble

c/c++語言程式中需要對協處理器進行操作。

c/c++語言程式中完成對程式狀態暫存器的操作。

c/c++語言程式中內嵌彙編指令由兩種方法,分別是內聯彙編和嵌入式彙編,他們都是包含在c/c++編譯器中的彙編器,可以實現一些高階語言沒有的功能。不僅如此,在c/c++語言程式中靈活使用內聯彙編和嵌入式彙編,還有助於提高程式的執行效率。

關鍵字__asm

告訴編譯器,下面的**是用組合語言來編寫的。

內聯彙編

在c函式定義中插入彙編語句。

使用關鍵字__asm來定義乙個內聯匯程式設計序段,當arm編譯器遇到這個關鍵字時,就會啟動內聯彙編器對關鍵字下面的程式進行彙編工作。

__asm

內嵌內聯彙編的兩個整型數相加的c語言程式。(工程exp10_1,檔案exp10_

#include <>

int sum(int i,int j)

return total;

}int main()

嵌入式彙編

在形式上表現為獨立定義的函式。

嵌入式匯程式設計序時乙個編寫在c程式外的單獨匯程式設計序段,可以像函式那樣被c程式呼叫。可以又引數和返回值。定義嵌入式彙編函式的語法格式為:

__asm return-type function-name(parameter-list)

例子:__asm int add(int i, int j)

注意引數名只允許在引數列表中,不能用在嵌入式彙編函式體內。

在c中呼叫嵌入式匯程式設計序的方法與呼叫c函式的方法相同。

void main()

內嵌嵌入式彙編的兩個整型數相加的c語言程式。(工程exp10_1,檔案exp10_

??????編譯出現錯誤

課堂補充實驗:

實驗目的

掌握c程式中內嵌彙編指令的使用方法。

掌握c程式呼叫匯程式設計序函式的方法。

掌握匯程式設計序呼叫c程式函式和變數的方法。

實驗一允許和禁止中斷程式(arm7)

本實驗使用內聯彙編完成允許和禁止中斷程式設計,採用armulator方式除錯,選用arm7作為目標處理器。

;工程exp10_1,檔案exp10_1_

單步除錯程式,觀察c程式的執行過程,將暫存器的變化情況記錄在下表中。

實驗二偽隨機數程式(arm7)

本實驗使用c程式呼叫彙編函式的方法設計偽隨機數程式。本實驗中的偽隨機數並不是真正的隨機數,而只是足夠分散的一系列資料,因為它足夠分散,所以看起來是隨機的。真正的隨機數,需要由物理方式來產生。

本實驗通過移位操作和「異或」運算來產生偽隨機數,並採用armulator方式除錯,選用arm7作為目標處理器。

(工程exp10_

實驗三驗證匯程式設計序呼叫c程式函式和訪問c程式變數的執行過程(arm9)

本實驗在匯程式設計序中呼叫c程式函式和訪問c程式變數,採用armualtor方式除錯,選用arm9作為目標處理器。(工程exp10_

思考:1. 分別概述c程式呼叫彙編函式和匯程式設計序呼叫c函式的步驟。

2. 在c程式中內嵌彙編指令有哪幾種方法?適用於哪些情況。

10月15日編冬季施工措施

冬季施工安全質量保證措施 根據湖大線總體施工進度安排,由我專案部施工的部分工程專案將進入冬季施工,為保證在此期間的施工質量和施工安全,特制定本措施,施工中嚴格遵照執行。一 預計冬季施工專案 1 路基土方工程 左線並行段 k13 500 k16 800 右線繞行段 k16 100 k366 400 大...

精編題目6 電學計算題 10題

電學計算題精編 10題 1 如圖所示,甲圖為一簡易檯燈電路,電源電壓為9v且保持不變,小燈泡標有 6v 6w 的字樣,小燈泡的電流隨它兩端電壓的變化曲線如圖乙所示,求 1 小燈泡正常發光時,小燈泡的電阻 2分 2 當電流為0.5a時,小燈泡的電功率 2分 3 當電壓表的示數為6v時,求整個電路10s...

暑期三下鄉支教心得10編二薛夢琪

暑期三下鄉支教心得 10編二薛夢琪 無意中翻出下鄉支教的 看著孩子們的笑臉,不禁的又想起了那段亦苦亦樂的美好時光。第一次站上講台,第一次聽別人叫我老師,第一次給孩子們上課,這次下鄉經歷了太多的第一次。看著他們稚嫩的臉孔,聽著他們脆生生的喊著老師,而今回首,內心那陣悸動仍記憶猶新。此次下鄉我做了許多的...