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