




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、*4。8 匯編語言和匯編語言和C語言的混合編程語言的混合編程 本節介紹不同的模塊,不同的語言相結合的編程方本節介紹不同的模塊,不同的語言相結合的編程方法。法。 通常情況下以高級語言編寫主程序,用匯編語言編通常情況下以高級語言編寫主程序,用匯編語言編寫與硬件有關的子程序。不同的編譯程序寫與硬件有關的子程序。不同的編譯程序 高級語言對高級語言對匯編的調用方法不同,在匯編的調用方法不同,在Franklin C51中,是將不同的中,是將不同的模塊模塊(包括不同語言的模包括不同語言的模 塊塊)分別匯編或編譯,再通過連分別匯編或編譯,再通過連接生成一個可執行文件。接生成一個可執行文件。 C語言程序調用匯編
2、語言程序要注意以下幾點:語言程序調用匯編語言程序要注意以下幾點: 1. 被調函數要在主函數中說明,在匯編程序中,要被調函數要在主函數中說明,在匯編程序中,要使用偽指令使使用偽指令使CODE選項有效并聲明為可再選項有效并聲明為可再 定位段類定位段類型,并且根據不同情況對函數名作轉換,見表型,并且根據不同情況對函數名作轉換,見表4.6。 說說 明明 符符 號號 名名 解解 釋釋void func(void) FUNC無參數傳遞或不含寄存器參數的無參數傳遞或不含寄存器參數的函數名不作改變轉入目標文件中,函數名不作改變轉入目標文件中,名字只是簡單的轉為大寫形式。名字只是簡單的轉為大寫形式。 void
3、func(char) _FUNC含寄存器參數的函數名加入含寄存器參數的函數名加入“_”字符前綴以示區別,它表明這類字符前綴以示區別,它表明這類函數包含寄存器內的參數傳遞。函數包含寄存器內的參數傳遞。void func(void)reentrant_? FUNC對于重入函數加上對于重入函數加上“_?”字符前綴字符前綴以示區別,它表明這類函數包含以示區別,它表明這類函數包含棧內的參數傳遞。棧內的參數傳遞。2.對為其他模塊使用的符號進行對為其他模塊使用的符號進行PUBLIC聲明,對外來聲明,對外來符號進行符號進行EXTRN聲明。聲明。3.參數的傳遞。參數的傳遞。 在混合語言編程中,關鍵是入口參數和出
4、口參數的傳在混合語言編程中,關鍵是入口參數和出口參數的傳遞,遞,Franklin C編譯器可使用寄存器傳遞參數,也可編譯器可使用寄存器傳遞參數,也可以使用固定存貯器或使用堆棧,由于以使用固定存貯器或使用堆棧,由于8XX51的堆棧深的堆棧深度有限,因此多用寄存器度有限,因此多用寄存器 或存貯器傳遞。用寄存器傳或存貯器傳遞。用寄存器傳遞最多只能傳遞三個參數,選擇固定的寄存器,見表遞最多只能傳遞三個參數,選擇固定的寄存器,見表4.7 。 表表4.7 參數類型參數類型 char int long ,float一般指針一般指針第一個參數第一個參數第二個參數第二個參數第三個參數第三個參數 R7 R5 R3
5、 R6,R7 R4,R5 R2,R3 R4R7 R4R7 無無R1,R2,R3R1,R2,R3R1,R2,R3例如例如 func1(int a) “a”是第一個參數,在是第一個參數,在R6,R7傳遞傳遞, func2(int b,int c,int *d)“b”在在R6,R7中傳遞,中傳遞,“c”在在R4,R5中傳遞,中傳遞,“d”在在R1,R2 ,R3中傳遞。中傳遞。 如果傳遞參數寄存器不夠用,可以使用存貯器傳如果傳遞參數寄存器不夠用,可以使用存貯器傳送送,通過指針取得參數。通過指針取得參數。 匯編語言通過寄存器或存貯器傳遞參數給匯編語言通過寄存器或存貯器傳遞參數給C語言程序,語言程序,匯編
6、語言通過寄存器傳遞給匯編語言通過寄存器傳遞給C語言的返回值見表語言的返回值見表4.8。返回值返回值寄存器寄存器說明說明bit(unsigned)char(unsigned)int(unsigned)longFloat指針指針CR7R6,R7R4R7R4R7R1,R2,R3進位標志進位標志高位在高位在R6,低位在,低位在R7高位在高位在R4,低位在,低位在R732位位IEEE格式,指數和符號位格式,指數和符號位R7R3放存儲器類型,高位在放存儲器類型,高位在R2,低位,低位R1下面通過兩個實例說明混合編程的方法及參數傳遞過程下面通過兩個實例說明混合編程的方法及參數傳遞過程. 例例4_10 用用P
7、1.0產生周期為產生周期為4ms的方波的方波,同時用同時用P1.1產生產生周期為周期為8ms的方波。的方波。說明:設計三個模塊說明:設計三個模塊模塊一模塊一 C語言編主程序,使語言編主程序,使 P1.1產生周期為產生周期為8ms的方的方波;波;模塊二模塊二 用用C語言編程,使語言編程,使P1.0產生周期為產生周期為4ms的方波;的方波;模塊三模塊三 用匯編語言編寫延時用匯編語言編寫延時1ms 程序。程序。 模塊一調用模塊二獲得模塊一調用模塊二獲得8ms方波,方波, 模塊二調模塊三模塊二調模塊三,向匯編程序傳遞字符型參數,向匯編程序傳遞字符型參數(x=2),延時,延時2ms。各模塊程序如下:各模
8、塊程序如下:模塊一:模塊一: P1.1產生周期為產生周期為8ms的方波的方波#include#define uchar unsigned char sbit P1-1=P11; void delay4ms(void); /* 定義延時定義延時4ms函數函數(模塊二模塊二) */ main( ) uchar i; for(;) P1-1=0; delay4ms();/* 調模塊二延時調模塊二延時4ms */ P1-1=1; delay4ms();/* 調模塊二延時調模塊二延時4ms*/ 模塊二(模塊二(delay4ms) :使:使P1.0產生周期為產生周期為4ms的方波的方波 #include
9、#define uchar unsigned char sbit P1-0=P10; delaylms(uchar x); /* 定義延時定義延時1ms函數函數(模塊三模塊三) */ void delay4ms(void) P1-0=0; delaylms(2);/* 調匯編函數調匯編函數(模塊三模塊三) */ P1-0=1; delaylms(2);/* 調匯編函數調匯編函數(模塊三模塊三)* 模塊三:模塊三: PUBLIC -DELAY1MS ;DE LAY1MS為其他為其他 模塊調用模塊調用 DE SEGMENT CODE ;定義;定義DE段為再定位程序段段為再定位程序段 RSEG DE
10、 ;選擇;選擇DE為當前段為當前段- DELAY1MS: NOP DELA: MOV R1,#0F8H ;延時;延時 LOP1: NOP NOP DJNZ R1,LOP1 DJNZ R7,DELA ;R7為為C程序傳遞程序傳遞 過來的參數過來的參數(x=2) EXIT: RET END上例可見匯編語言程序從上例可見匯編語言程序從R7中獲取中獲取C程序傳遞參數程序傳遞參數(x=2) 。 例例2.在匯編程序中比較兩數大小,將大數放到指定的存儲在匯編程序中比較兩數大小,將大數放到指定的存儲區,由區,由C程序的主調函數取出。程序的主調函數取出。C語言程序語言程序模塊一模塊一: #define ucha
11、r unsigned char void max(uchar a, uchar b); /* 定義匯編函數定義匯編函數 */ main() uchar a=5,b=35,*c,d; c=0 x30; /* c指針變量指向內部指針變量指向內部 RAM 30H單元單元 */ max(a,b); /* 調匯編函數,調匯編函數,a,b為傳遞的參數為傳遞的參數 */ d=*c; /* d存放模塊二傳遞過來的參數存放模塊二傳遞過來的參數 */ 模塊二:匯編語言程序模塊二:匯編語言程序 PUBLIC -MAX MAX為其為其 他模塊調他模塊調 DE SEGMENT CODE ;定義;定義DE段為再定位程序段
12、段為再定位程序段 RSEG DE ;選擇;選擇DE為當前段為當前段 MAX: MOV A,R7 ;取模塊一的參數;取模塊一的參數a MOV 30H,R5 ;取模塊一的參數;取模塊一的參數b CJNE A,30H,TAG1 ;比較;比較a,b的大小的大小TAG1: JC EXIT MOV 30H,R7 ;大數存于;大數存于30H單元單元EXIT: RET END 可見,可見,C語言程序通過語言程序通過R7和和R5傳遞字符型參數傳遞字符型參數a和和b到匯編語言程序,匯編語言程序將返回值到匯編語言程序,匯編語言程序將返回值 放在固定放在固定存貯單元,主調函數通過指針取出返回值。存貯單元,主調函數通過
13、指針取出返回值。 C語言程序調用匯編程序最多只能傳遞三個參數,語言程序調用匯編程序最多只能傳遞三個參數,如果多于三個參數,就需要通過存貯如果多于三個參數,就需要通過存貯qu區傳遞,這就需區傳遞,這就需要在匯編程序中建立數據段,在下例中要在匯編程序中建立數據段,在下例中C語言程序向匯語言程序向匯編傳遞六個參數,匯編程序編傳遞六個參數,匯編程序*C_CALL.C*#pragma code smallextern int afunc(char v_a,char v_b, char v_c, char v_d,char v_e,char v_f); /*外來函數說明外來函數說明void C_call(
14、void) char v_a=0 x11; /*傳遞參數賦值傳遞參數賦值*/char v_b=0 x18;char v_c=0 x33;char v_d=0 x44;char v_e=0 x55;char v_f=0 x98; int data *aa; /*指針變量指向指針變量指向int型型data區區*/int A_ret; /*存匯編返回結果的變量存匯編返回結果的變量*/ aa=0 x30; /*置指針置指針*/A_ret=afunc(v_a,v_b,v_c,v_d,v_e,v_f); /*調匯編函數調匯編函數*/ *aa=A_ret; /*取匯編返回結果取匯編返回結果*/ *aa=(i
15、nt)0; /*為方便觀察改值,強制為方便觀察改值,強制0為為int型型*/ *aa=A_ret; /*再次觀察匯編返回結果再次觀察匯編返回結果*/void main(void) /*主函數主函數*/ char a1,a2,a3; /*為方便觀察設為方便觀察設a1 a2 a3*/ a1=0; a2=2; a3=3; C_call(); a1=1; a2=3; while(1); *AFANC.ASM*PR_AFUNC SEGMENT CODE ;名為名為AFUNC段為代碼段段為代碼段 (PR)在在CODE區可再定位,區可再定位,DT_AFUNC SEGMENT DATA OVERLAYABLE
16、 ;名為名為AFUNC段為數據段段為數據段(DT) 在在DATA區區,可再定位,可以覆蓋可再定位,可以覆蓋PUBLIC ?_afunc?BYTE ;公共符號定義;公共符號定義PUBLIC _afunc RSEG DT_AFUNC?_afunc?BYTE: ;數據段保留參數傳遞區;數據段保留參數傳遞區 v_a: DS 1 v_b: DS 1 v_c: DS 1 v_d: DS 1 v_e: DS 1v_f: DS 1 RSEG PR_AFUNC_afunc: USING0 ;程序段;程序段 MOV A,R7 ;取取R7中的中的v_a ADD A,R5 ;取取R5中的中的v_b ADD A,R3
17、;取取R3中的中的v_c ADD A,v_d ADD A,v_e ADD A,v_f MOV R7,A ;和存和存R7,進位存進位存R6MOV A,#0 ;以便返回以便返回RLC A MOV R6,A RETEND編譯連接方法編譯連接方法 以上各模塊可以先分別匯編以上各模塊可以先分別匯編(A51)和編譯和編譯(C51)(選擇選擇DEBUG編譯控制項編譯控制項),生成的,生成的.OBJ文件,然后運文件,然后運 行行L51將各將各OBJ文件連接,生成一個新的文件。文件連接,生成一個新的文件。 在集成環境下的連接調試可以連續進行,比上面在集成環境下的連接調試可以連續進行,比上面方法更為方便,現使用方
18、法更為方便,現使用wave(偉福偉福)的仿真軟的仿真軟 件件ICExplorerW(ICE For Windows)的編譯連接步驟如下:的編譯連接步驟如下:1.編輯好各個模塊,保存。編輯好各個模塊,保存。2.點擊文件點擊文件/新建項目,彈出項目窗口。新建項目,彈出項目窗口。3.點擊項目菜單,選加入模塊,此時彈出有文件目錄的點擊項目菜單,選加入模塊,此時彈出有文件目錄的對話框,選中要加入剛才編輯好的文對話框,選中要加入剛才編輯好的文 件件(模塊模塊),并打,并打開。此時在項目窗口中可以看到加入的模塊文件。開。此時在項目窗口中可以看到加入的模塊文件。4.點擊項目菜單中的全部編輯,并取名保存項目。于
19、是點擊項目菜單中的全部編輯,并取名保存項目。于是系統對加入各模塊進行編譯,并進行系統對加入各模塊進行編譯,并進行 連連5.編譯連接完成會彈出信息窗口,如編譯連接有錯,信編譯連接完成會彈出信息窗口,如編譯連接有錯,信息窗口將出現錯誤信息。息窗口將出現錯誤信息。6.模塊連接成功,生成二進制文件模塊連接成功,生成二進制文件(.BIN)和十六進制文件和十六進制文件(.HEX)。7.點擊跟蹤或單步按鈕,就可對程序進行跟蹤調試,程點擊跟蹤或單步按鈕,就可對程序進行跟蹤調試,程序運行到不同模塊時,序運行到不同模塊時,wave就會彈就會彈 出相應的模塊源程出相應的模塊源程序窗口,顯示程序運行情況。序窗口,顯示
20、程序運行情況。 4。9 小小 結結 本章介紹了本章介紹了C51的基本數據類型、存貯的基本數據類型、存貯類型及對類型及對C51對單片機內部部件的定義,對單片機內部部件的定義,并介紹了并介紹了C語語 言言 基礎知識,最后通過編程基礎知識,最后通過編程實例介紹了各種結構的程序設計,以上是實例介紹了各種結構的程序設計,以上是利用利用C語言編單片機程序語言編單片機程序 的基礎,都應該的基礎,都應該掌握并靈活應用,只有多編程,多上機才掌握并靈活應用,只有多編程,多上機才能不斷提高編程的能力。能不斷提高編程的能力。 如何編寫高效的如何編寫高效的C語言程序,通常應注語言程序,通常應注意以下問題意以下問題: 1
21、. 定位變量定位變量 經常訪問的數據對象放入在片內數據經常訪問的數據對象放入在片內數據RAM中,這中,這可在任一種模式可在任一種模式(COMPACT/LARGE)下用輸入存貯下用輸入存貯器類型的方法實現。訪問片內器類型的方法實現。訪問片內RAM要比訪問片外要比訪問片外RAM快得多。在片內快得多。在片內RAM由寄存器組、位由寄存器組、位 數據區、數據區、棧和其它由用戶用棧和其它由用戶用“data”類型定義的變量共享。由于類型定義的變量共享。由于片內片內RAM容量的限制容量的限制(128 256)字節,由使用的處理字節,由使用的處理器決定器決定),必須權衡利弊以解決訪問效率和這些對象的,必須權衡利弊以解決訪問效率和這些對象的數量之間的數量之間的 矛盾。矛盾。 2 .盡可能使用最小數據類型盡可能使用最小數據類型 MCS-51系列單片機是系列單片機是8位機,因此對具有位機,因此
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肝病科護理課件教學
- 姑蘇區小學數學試卷
- 高中一模考試數學試卷
- 肝動脈CT檢查技術
- 肌力康復護理課件
- 設備檢修規程培訓課件
- 調音臺培訓課件
- 2025至2030寵物罐頭發展趨勢分析與未來投資戰略咨詢研究報告
- 2024年航天科技校招招聘筆試真題
- 公辦幼兒園中班數學試卷
- 《電動車充電器教材》課件
- 幼兒園食品安全和膳食經費管理制度
- 外貿開發客戶培訓資料課件
- 航天工程質量管理規定
- 消防維保工作計劃
- 圖文跨模態檢索研究綜述
- 高考必背3000高頻英語單詞
- 數字化管理師復習測試卷附答案
- 華西糖尿病專科護士匯報
- 網絡與信息安全管理員(高級技師)資格理論考試題庫大全(附答案)
- 消費者需求導向的改裝車品牌建設-洞察分析
評論
0/150
提交評論