介紹一下KEIL C51所支持的C語言和匯編語言混合編程的方法!:51單片機是最早的單片機,也是在國內應用最廣泛的單片機,為大家所喜愛!但執行速度較其它單片機較慢。因此在編程時更加要注重程序的執行效率及編程上的技巧處理,最大限度的發揮其性能,滿足項目開發的實際需要。在嵌入式開發中,C語言具有可移植性強和可讀性好等優點,而匯編語言的高效、快速及可直接對硬件進行操作等優點又是C語言所難以達到的,本帖就為大家介紹一下KEIL C51所支持C和匯編混合編程的方法,將這兩種語言的優點完美的結合,更大限度的發揮51單片機的性能,加快我們的產品開發周期!
如用此方法實現6時鐘(6T)的51單片機對320kbps mp3文件的流暢播放,就是這種混合編程的方法的一個很好的應用實例!下面就為大家介紹一下混合編程的方法。
所謂混合編程,就是在一個項目中,同時使用C和匯編兩種語言。 C語言和匯編語言混合編程的方法形式多樣,可以是以匯編語言為主體,在其中內嵌部分C語言;也可以是以C語言為主體在其中加入部分匯編語言(此方法實用價值較高,而被工程師們廣泛的采用)。在此方法中,用匯編語言編寫對有關硬件的驅動和處理、復雜的算法、實時性要求較高等底層的東西,來滿足單片機對某些硬件高效、快速、精確的處理等性能上的要求。用C語言來編寫程序的主體部分。這樣就將C語言的可移植性強和可讀性好與匯編語言的高效、快速及可直接對硬件進行操作等優點相結合。兩者優劣互補、相得益彰,加快我們產品的開發周期,具有極高的現實意義和實用價值!
在KEIL C51中加入的匯編代碼需按照其編譯器中約定的規則才可以實現C語言程序對匯編代碼的調用。即KEIL C51的命名規則和參數傳遞規則。
一. KEIL C51的命名規則
在KEIL C51中,編譯器對C語言程序中的函數會自動的進行轉換,轉換規則如下表:
函數屬性 函數舉例 段中的函數名
無參數或無寄存器參數傳遞的函數 void func1(void) func1
含通過寄存器傳遞的參數 void func2(int) _func2
可重入函數 void func3(char)reentrant _?func3
二. KEIL C51函數的參數傳遞規則
(一)通過寄存器傳遞的函數參數表
參數長度 第1個形參 第2個形參 第3個形參
1字節(char) R7 R5 R3
2字節(int) R6(H) R7 R4(H) R5 R2(H) R3
3字節(通用指針) R1(H)~R3
4字節(long) R4(H)~R7
(二)函數返回值使用的寄存器列表
返回類 使用的寄存器
位數據(bit) 位累加器CY
1字節(char) R7
2字節(int) R6(H) R7
3字節(通用指針) R3(類型)R2(H) R1
4字節(long) R4(H)~R7
4字節(float) R4(H)~R7,32位IEEE格式,指數和符號位在R7
在混合編程中,最常用也是最實用的方法是在C語言中加入部分匯編語言的代碼,分為兩種方法。
方法1)在Keil C51的函數中直接插入匯編語句
方法2)按照Keil C51接口規則,編寫匯編模塊
方法1是利用編譯控制命令#pragma asm(用來標識所插入的匯編語句的起始位置) 和 #pragma endasm (用來標識所插入的匯編語句的結束位置) ,這兩條命令必須成對出現,并可以多次出現。在Keil C51中不對插入的匯編代碼做任何的處理。
方法2編寫匯編模塊,需對KEIL編譯器的編譯過程做些了解。Keil編譯器的編譯過程是首先將項目中的一個個源文件編譯為目標代碼(obj文件),然在再通過連接器產生為最終可執行的hex文件。
目標代碼將其中的代碼、數據、常量放在不同的“段”中,保存程序的段稱為“代碼段”,保存數據的段稱為“數據段”,最終目標代碼經過Keil的連接器按照“段”的要求轉換為程序和數據地址固定的可執行文件。
在Keil軟件中,“段”按定位屬性分為:“可重定位段”和“絕對段”。
“可重定位段”:程序和數據在其分別所對應的存儲單元(FLASH和RAM)中的存儲地址是浮動的、可重定義的、相對可變的。
“絕對段”:其地址在連接前就已確定不變,連接器據此為它分配地址。