C與匯編語言溷合編程PPT課件_第1頁
C與匯編語言溷合編程PPT課件_第2頁
C與匯編語言溷合編程PPT課件_第3頁
C與匯編語言溷合編程PPT課件_第4頁
C與匯編語言溷合編程PPT課件_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1第1頁/共48頁2第第6章章 C51與匯編語言混合編程與匯編語言混合編程、C51與匯編語言混合編程概述、C51和A51程序接口基礎(chǔ)、混合編程的實(shí)現(xiàn)第2頁/共48頁36.1 C51與匯編語言混合編程概述 在一個(gè)應(yīng)用程序中,根據(jù)每個(gè)任務(wù)的具體特點(diǎn)和要求,用不同的編程語言編寫源程序,最后通過編譯/連接器生成一個(gè)可執(zhí)行的完整程序,這種編程方式稱為混合編程。 匯編語言特點(diǎn):匯編語言特點(diǎn):優(yōu)點(diǎn):執(zhí)行速度快、效率高、實(shí)時(shí)性強(qiáng)、與硬件結(jié)合緊密。優(yōu)點(diǎn):執(zhí)行速度快、效率高、實(shí)時(shí)性強(qiáng)、與硬件結(jié)合緊密。缺點(diǎn):編程難度大、可讀性差,不便于移植、開發(fā)時(shí)間長(zhǎng)。缺點(diǎn):編程難度大、可讀性差,不便于移植、開發(fā)時(shí)間長(zhǎng)。C語言特點(diǎn)

2、:語言特點(diǎn):優(yōu)點(diǎn):編程容易、可移植性強(qiáng)、支持多種數(shù)據(jù)類型,能直優(yōu)點(diǎn):編程容易、可移植性強(qiáng)、支持多種數(shù)據(jù)類型,能直 接對(duì)硬件進(jìn)行操作,效率高。接對(duì)硬件進(jìn)行操作,效率高。缺點(diǎn):實(shí)時(shí)處理弱于匯編語言,無法準(zhǔn)確定時(shí)。缺點(diǎn):實(shí)時(shí)處理弱于匯編語言,無法準(zhǔn)確定時(shí)?;旌暇幊烫攸c(diǎn):混合編程特點(diǎn):效率高、速度快、易于編程、可讀性、可移植性好,效率高、速度快、易于編程、可讀性、可移植性好,使用范圍廣使用范圍廣第3頁/共48頁4單片機(jī)程序的編譯過程 : 無論是C語言還是匯編語言,源程序都要被轉(zhuǎn)換成目標(biāo)代碼(機(jī)器語言),單片機(jī)才能識(shí)別。在Keil中程序的編譯過程如圖 61所示。 圖61 程序編譯連接過程在單片機(jī)混合編程

3、中, C模塊與匯編模塊的接口簡(jiǎn)單,分別用C51和A51對(duì)源文件進(jìn)行編譯,然后經(jīng)連接定位器L51產(chǎn)生可下載到程序存儲(chǔ)器的十六進(jìn)制可執(zhí)行文件。第4頁/共48頁56.2 C51 和A51程序接口基礎(chǔ) C語言與匯編語言程序的連接,在技術(shù)上有兩個(gè)問題:一個(gè)是C語言程序與匯編語言程序如何相互調(diào)用;另一個(gè)是C語言程序和匯編語言程序如何實(shí)現(xiàn)相互之間的數(shù)據(jù)傳遞。 混合編程中,必須約定兩個(gè)規(guī)則,即命名規(guī)則和參數(shù)傳遞規(guī)則。6.2.1 C51函數(shù)名的轉(zhuǎn)換及其命名規(guī)則 C51程序模塊編譯成目標(biāo)文件后,其中的函數(shù)名要依據(jù)其定義的性質(zhì)轉(zhuǎn)換為相應(yīng)不同的函數(shù)名。因此,在C和匯編程序的相互調(diào)用中,要求匯編程序必須服從這種函數(shù)名的

4、轉(zhuǎn)換規(guī)則,否則將無法調(diào)用到所需的函數(shù)甚至出現(xiàn)錯(cuò)誤。 C51中函數(shù)名的轉(zhuǎn)換規(guī)則如表61所示,其匯編符號(hào)名全部轉(zhuǎn)換為大寫。第5頁/共48頁6表61 C51中函數(shù)名的轉(zhuǎn)換規(guī)則C51函數(shù)聲明匯編符號(hào)名說 明void func1(void)FUNC1無參數(shù)傳遞或不含寄存器的函數(shù),名稱不作改變直接轉(zhuǎn)入目標(biāo)文件中。void func2(char)_FUNC2通過寄存器傳遞參數(shù),函數(shù)名加前綴“_”void func3(void) reentrant_?FUNC3重入函數(shù),通過堆棧傳遞參數(shù),函數(shù)名加前綴“_?”第6頁/共48頁76.2.2 C51函數(shù)及其相關(guān)段的命名規(guī)則 一個(gè)C51源程序模塊被編譯后,其中的每個(gè)

5、函數(shù)以“?PR?函數(shù)名?模塊名”為命名規(guī)則被分配到一個(gè)獨(dú)立的CODE段。 例如,如果模塊“FUNC51”內(nèi)包含一個(gè)名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”。 如果一個(gè)函數(shù)包含有data或bit類型的局部變量,編譯器將按“?函數(shù)名?BYTE”或“?函數(shù)名?BIT”命名規(guī)則建立一個(gè)data或bit段,它們代表所要傳遞參數(shù)的起始位置,其偏移量為0。這些段是公開的,因而它們的地址可以被其它模塊訪問。 這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,可被L51連接/定位器作覆蓋分析。依據(jù)所使用的存儲(chǔ)器模式,這些段按表62所列規(guī)則命名,在相互調(diào)用時(shí),匯編語言必須服

6、從C51有關(guān)段名的命名規(guī)則。 第7頁/共48頁8表62 各種存儲(chǔ)模式下C51函數(shù)段名的命名規(guī)則數(shù)據(jù)段類型段名程序代碼CODE?PR?函數(shù)名?模塊名(所有存儲(chǔ)器模式)局部變量DATA?DT?函數(shù)名?模塊名(SMALL模式)PDATA?PD?函數(shù)名?模塊名(COMPACT模式)XDATA?XD?函數(shù)名?模塊名(LARGE模式)局部bit變量BIT?BI?函數(shù)名?模塊名(所有存儲(chǔ)器模式)第8頁/共48頁96.2.3 C51函數(shù)的參數(shù)傳遞規(guī)則 C51中調(diào)用匯編程序時(shí)參數(shù)傳遞有兩種方式,一種是通過寄存器傳遞,一種是通過固定存儲(chǔ)區(qū)傳遞。1通過寄存器傳遞參數(shù) Keil C51規(guī)定,調(diào)用函數(shù)時(shí),通過寄存器最多

7、可傳遞3個(gè)參數(shù),余下的通過固定存儲(chǔ)區(qū)傳遞。 如果在源程序中采用了編譯控制命令“#pragma NOREGPARMS”,則所有參數(shù)傳遞都發(fā)生在固定的存儲(chǔ)區(qū)域,所使用的地址空間依賴于所選擇的存儲(chǔ)模式。 用寄存器傳遞參數(shù)的函數(shù)在編譯時(shí)被C51編譯器在函數(shù)名前加了一個(gè)“_”的前綴,用固定存儲(chǔ)區(qū)傳遞參數(shù)的函數(shù)轉(zhuǎn)換成的函數(shù)名沒有下劃線,如表61所示。 不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。表63是利用寄存器傳遞參數(shù)的規(guī)則。第9頁/共48頁10表63 C51利用寄存器傳遞參數(shù)規(guī)則參數(shù)類型charintlong/float通用指針第1個(gè)參數(shù)R7R6、R7R4R7R1R3第2個(gè)參數(shù)R5

8、R4、R5無R1R3第3個(gè)參數(shù)R3R2、R3無R1R3 其中,int型和long型數(shù)據(jù)傳遞時(shí),低地址寄存器中放數(shù)據(jù)的高位字節(jié),高地址寄存器中放數(shù)據(jù)的低位字節(jié);float型數(shù)據(jù)滿足IEEE格式,R4中存放階碼和符號(hào)位,尾數(shù)按從高位到低位的順序依次存放在寄存器R5、R6和R7中;通用指針的存儲(chǔ)類型存放在R3中,高位在R2,低位在R1。 如果某一函數(shù)的形式參數(shù)有兩個(gè)或更多,當(dāng)發(fā)生寄存器沖突時(shí),后者改為通過固定存儲(chǔ)區(qū)傳遞。第10頁/共48頁11【例61】函數(shù)參數(shù)傳遞舉例。 func1(int a) a是第一個(gè)參數(shù),在R6,R7中傳遞。 func2 (int b, int c, int *d ) “b”

9、是第一個(gè)參數(shù),在R6,R7中傳遞;“c”是第二個(gè)參數(shù),在R4,R5中傳遞;“d”是第三個(gè)參數(shù),在R1,R2和R3中傳遞。 func3(long e , long f ) “e”是第一個(gè)參數(shù),在R4R7中傳遞;“f”是第二個(gè)參數(shù),不能在寄存器中傳遞,只能在固定存儲(chǔ)區(qū)中傳遞。 func4(float g , char h ) “g”是第一個(gè)參數(shù),在R4R7中傳遞;“h”是第二個(gè)參數(shù),必須在固定存儲(chǔ)區(qū)中傳遞。第11頁/共48頁122通過固定存儲(chǔ)區(qū)傳遞 通過固定存儲(chǔ)區(qū)傳遞參數(shù)的優(yōu)點(diǎn)是傳遞途徑非常清晰,缺點(diǎn)是代碼效率不高,速度較慢。 用固定存儲(chǔ)區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址通過名為“?函數(shù)名?BYT

10、E”的符號(hào)確定。當(dāng)傳遞位值時(shí),使用名為“?函數(shù)名?BIT”的符號(hào)保存位參數(shù)段首地址。所有傳遞的參數(shù)存放在以首地址開始遞增的存儲(chǔ)區(qū)內(nèi),即使通過寄存器傳遞參數(shù),參數(shù)也將在這些段中分配空間,參數(shù)按聲明的先后在每個(gè)段中順序保存。 用作參數(shù)傳遞的固定存儲(chǔ)區(qū)可能在內(nèi)部數(shù)據(jù)區(qū)或外部數(shù)據(jù)區(qū),由存儲(chǔ)模式?jīng)Q定。SMALL模式的參數(shù)段用內(nèi)部數(shù)據(jù)區(qū),COMPACT和LARGE模式用外部數(shù)據(jù)區(qū)。第12頁/共48頁133函數(shù)返回值當(dāng)函數(shù)具有返回值時(shí),也需傳遞參數(shù),這種返回值的傳遞是通過51內(nèi)核單片機(jī)內(nèi)部寄存器完成的,其傳遞規(guī)則如表64所示。 第13頁/共48頁14表64函數(shù)返回值所用寄存器分配返回值類型寄存器說明bitC

11、Y 進(jìn)位標(biāo)志char,unsigned char,或1字節(jié)指針R7int,unsigned int,或2字節(jié)指針R6、R7高位字節(jié)在R6,低位字節(jié)在R7long或unsigned longR4R7高位字節(jié)在R4,低位字節(jié)在R7 floatR4R732位IEEE格式,階碼和符號(hào)位在R4,尾數(shù)高位字節(jié)在R5,低位字節(jié)在R7 通用指針R1R3R3存放存儲(chǔ)器類型,高位字節(jié)在R2,低位字節(jié)在R1第14頁/共48頁15【例62】C51的函數(shù)名轉(zhuǎn)換規(guī)則、段命名規(guī)則及參數(shù)傳遞規(guī)則舉例。/*文件名:功能:計(jì)算x/y*/#include #define uchar unsigned char uchar func

12、(uchar x,uchar y); /函數(shù)func原型聲明 void main(void)/主函數(shù) func(0 x12,0 x34); /調(diào)用函數(shù)funcwhile(1); uchar func(uchar x,uchar y) return (x/y); /計(jì)算x/y并返回結(jié)果第15頁/共48頁16/*文件名:說明:此文件是編譯后的匯編輸出文件(限于篇幅,有所省略)*/?PR?main?DIV SEGMENT CODE ;主函數(shù)main代碼段聲明?PR?_func?DIV SEGMENT CODE ;函數(shù)func代碼段聲明EXTRNCODE (?C_STARTUP);使用其它模塊中的符號(hào)

13、?C_STARTUPPUBLIC_func;公開函數(shù)名,以便可以被其它模塊調(diào)用PUBLICmain; #include ; #define uchar unsigned char ; uchar func(uchar x,uchar y); ; void main(void) RSEG ?PR?main?DIV第16頁/共48頁17main: ;主函數(shù)代碼段起始USING0; SOURCE LINE # 4; ; SOURCE LINE # 5; func(0 x12,0 x34); ; SOURCE LINE # 6MOV R5,#034H;R5傳遞第二個(gè)char參數(shù)MOV R7,#012H

14、;R7傳遞第一個(gè)char參數(shù)LCALL_func;調(diào)用函數(shù)func?C0001:; while(1); SOURCE LINE # 7SJMP ?C0001; END OF main; 第17頁/共48頁18; uchar func(uchar x,uchar y)RSEG ?PR?_func?DIV_func: ;函數(shù)func代碼段起始USING0; SOURCE LINE # 9; Variable y?141 assigned to Register R5 ; Variable x?140 assigned to Register R7 ; ; SOURCE LINE # 10; ret

15、urn (x/y ); ; SOURCE LINE # 11MOV A,R7;計(jì)算x/yMOV B,R5DIV ABMOV R7,A ;結(jié)果經(jīng)R7返回第18頁/共48頁19; ; SOURCE LINE # 12?C0004:RET ;返回; END OF _funcEND;結(jié)束 上面給出了一個(gè)C51程序及其編譯后的程序清單,可以看出,函數(shù)func有2個(gè)char型參數(shù),通過R7,R5傳遞,所以轉(zhuǎn)換成匯編函數(shù)名_func,返回值通過R7傳遞回主函數(shù)。 如果在前述的源文件中使用“#pragma NOREGPARMS”控制命令,禁止寄存器內(nèi)參數(shù)傳遞,則所有參數(shù)均通過固定的存儲(chǔ)區(qū)傳遞。其編譯后的匯編輸

16、出文件如下: 第19頁/共48頁20?PR?main?DIV SEGMENT CODE ;主函數(shù)main代碼段聲明?PR?func?DIV SEGMENT CODE ;函數(shù)func代碼段聲明?DT?func?DIV SEGMENT DATA OVERLAYABLE ;局部變量?jī)?nèi)部數(shù)據(jù)段聲明EXTRNCODE (?C_STARTUP) ;使用外部模塊?C_STARTUPPUBLIC ?func?BYTE;公開函數(shù)func中的data區(qū)的局部變量PUBLICfunc;公開函數(shù)名,以便可以被其它模塊調(diào)用PUBLICmainRSEG ?DT?func?DIV?func?BYTE:;局部變量?jī)?nèi)部存儲(chǔ)區(qū)首

17、地址 x?140: DS 1ORG 1 y?141: DS 1第20頁/共48頁21; #include ; #define uchar unsigned char ; #pragma NOREGPARMS; uchar func(uchar x,uchar y); ; void main(void)RSEG ?PR?main?DIVmain: ;主函數(shù)代碼段起始USING0; SOURCE LINE # 5; ; SOURCE LINE # 6; func(0 x12,0 x34); ; SOURCE LINE # 7MOV ?func?BYTE,#012H;固定存儲(chǔ)區(qū)首地址單元傳遞第一個(gè)參

18、數(shù)MOV ?func?BYTE+01H,#034H;固定存儲(chǔ)區(qū)首地址加1單元傳遞第二個(gè)參數(shù)LCALLfunc ;調(diào)用函數(shù)func第21頁/共48頁22?C0001:; while(1); SOURCE LINE # 8SJMP ?C0001; END OF main; ; uchar func(uchar x,uchar y)RSEG ?PR?func?DIVfunc: ;函數(shù)func代碼段起始USING0; SOURCE LINE # 10; ; SOURCE LINE # 11; return (x/y); ; SOURCE LINE # 12第22頁/共48頁23MOV A,x?140;

19、計(jì)算x/yMOV B,y?141DIV ABMOV R7,A;結(jié)果經(jīng)R7返回; ; SOURCE LINE # 13?C0004:RET ;返回; END OF funcEND;結(jié)束第23頁/共48頁246.3 混合編程的實(shí)現(xiàn)Keil C51編譯器支持在C51程序中直接插入?yún)R編語言,也可以調(diào)用以匯編語言編寫的子程序。6.3.1 C51程序中嵌入?yún)R編程序 有時(shí)需要在C51程序中嵌入用匯編語言編寫的一個(gè)小程序段,來對(duì)硬件進(jìn)行操作,提高程序的可靠性和靈活性。 下面是C51文件中嵌入?yún)R編語言的一般步驟。第一步:通過預(yù)編譯命令“#pragma asm”和“#pragma endasm”在C語言代碼中插入

20、匯編語言代碼。第24頁/共48頁25#include sbit P1_1=P11; void main( ) while(1)P1_1=1;#pragma asmMOV R7,#12;2TDEL:MOV R6,#250;2TDJNZR6,$;4TDJNZ R7,DEL;4T#pragma endasmP1_1=0;【例63】用C語言程序中插入?yún)R編語言延時(shí)程序的方法,編程實(shí)現(xiàn)從引腳輸出周期為2ms的方波(設(shè)STC12C5A60S2單片機(jī)系統(tǒng)時(shí)鐘頻率為12MHz)。#pragma asmMOVR7,#12DEL:MOVR6,#250DJNZR6,$DJNZR7,DEL#pragma endasm

21、第25頁/共48頁26 第二步:在Keil C51環(huán)境下,在Project窗口中包含匯編代碼的C文件上單擊右鍵,在彈出的快捷菜單中選擇“Options for”命令,再點(diǎn)擊選中右邊的“Generate Assembler SRC File”和“Assembler SRC File”復(fù)選框,使檢查框由灰色(無效)變成黑色(有效)狀態(tài)。 第三步:根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是)加入到工程中,該文件必須作為工程的最后文件。如果沒有做這一步編譯,則會(huì)出現(xiàn)如下警告“UNRESOLVED EXTERNAL SYMBOL”。 第26頁/共48頁27庫文件與編譯模式的關(guān)系如下: 沒

22、有浮點(diǎn)運(yùn)算的 Small 模式?jīng)]有浮點(diǎn)運(yùn)算的 Compact 模式?jīng)]有浮點(diǎn)運(yùn)算的 Large 模式帶浮點(diǎn)運(yùn)算的 Small 模式帶浮點(diǎn)運(yùn)算的 Compact 模式帶浮點(diǎn)運(yùn)算的 Large 模式 第四步:編譯,生成目標(biāo)代碼。第27頁/共48頁286.3.2 C51與匯編函數(shù)的相互調(diào)用 在匯編代碼比較短的場(chǎng)合,可以使用在C51程序中直接嵌入?yún)R編語言的方法。 如果需要匯編語言實(shí)現(xiàn)的功能比較復(fù)雜,就需要用匯編語言編寫函數(shù),此時(shí)就要用到C51程序調(diào)用匯編函數(shù)的方法。當(dāng)然,有時(shí)候也需要用匯編調(diào)用C51函數(shù)。 無論是C51調(diào)用匯編函數(shù),還是匯編調(diào)用C51函數(shù),其操作是完全一致的。當(dāng)我們需要利用函數(shù)進(jìn)行混合編

23、程時(shí),只需分別用C語言和匯編語言把函數(shù)寫好,然后在C語言程序(匯編程序)中調(diào)用匯編函數(shù)(C函數(shù))。也可以先用C語言編寫所有的代碼,包括需要匯編語言實(shí)現(xiàn)的部分,然后采用編譯控制指令SRC對(duì)需要匯編語言實(shí)現(xiàn)的函數(shù)進(jìn)行編譯,編譯后將產(chǎn)生一個(gè)與C文件同名的匯編語言源文件,該文件的擴(kuò)展名為.SRC,根據(jù)需要再對(duì)該文件進(jìn)行精煉、修改。 下面分別介紹這兩種方法。第28頁/共48頁291.混合項(xiàng)目文件編程 混合項(xiàng)目文件編程就是把用C語言編寫的程序保存為擴(kuò)展名為.C的C語言文件,把用匯編語言編寫的程序保存為擴(kuò)展名為.asm、.SRC或者.A51的匯編語言文件,然后把這些文件導(dǎo)入到同一個(gè)工程下進(jìn)行編譯連接的方法。

24、 在C語言中調(diào)用匯編程序時(shí),對(duì)被調(diào)用函數(shù)(匯編語言函數(shù))要在主調(diào)函數(shù)(C語言函數(shù))所在文件中作出聲明,并且對(duì)匯編語言程序有以下要求: 要使用SEGMENT偽指令定義可再定位的CODE段。 要根據(jù)不同情況對(duì)函數(shù)名進(jìn)行轉(zhuǎn)換,見表61。 要使用PUBLIC偽指令將被調(diào)用函數(shù)說明為外部可用函數(shù)。 若有參數(shù)傳遞,按照表63所列的規(guī)則使用參數(shù)。 若有返回值,按照表64所列規(guī)則存入寄存器。第29頁/共48頁30【例64】編程實(shí)現(xiàn)從單片機(jī)引腳輸出周期為4ms的方波,同時(shí)從引腳輸出周期為8ms的方波(設(shè)單片機(jī)系統(tǒng)時(shí)鐘頻率為12MHz)。分析:分別用匯編語言和C語言設(shè)計(jì)3個(gè)模塊程序如下:模塊1:用C語言編寫主程序

25、,使引腳輸出周期為8ms的方波;模塊2:用C語言編程,使引腳輸出周期為4ms的方波;模塊3:用匯編語言編寫延時(shí)1ms的程序。程序執(zhí)行時(shí)用模塊1調(diào)用模塊2獲得8ms方波,模塊2調(diào)用模塊3,并向匯編程序傳遞字符型參數(shù)(x=2),實(shí)現(xiàn)2ms延時(shí)。程序如下:第30頁/共48頁31模塊1(文件名):#include#define uchar unsigned charsbit P1_1=P11;extern void delay4ms(void); /外部函數(shù)delay4ms()聲明void main()while(1)P1_1=0;delay4ms ();/調(diào)用模塊2延時(shí)4msP1_1=1;delay

26、4ms ();/調(diào)用模塊2延時(shí)4ms第31頁/共48頁32模塊2(文件名):#include#define uchar unsigned charsbit P1_0=P10;extern delay1ms(uchar x); void delay4ms(void)P1_0=0;delay1ms (2P1_0=1;delay1ms (2); 第32頁/共48頁33模塊3(文件名):PUBLIC _DELAY1MS;用PUBLIC聲明_DELAY1MS為其它函數(shù)調(diào)用,以“_”為前綴的函數(shù)名,表示該函數(shù)通過寄存器傳遞參數(shù)DELAY SEGMENTCODE;定義DELAY段為再定位程序段 ,DELAY

27、是用戶任意起的段名RSEGDELAY ;選擇DELAY為當(dāng)前段_DELAY1MS:DELA:MOVR6,#12;2TLOP1:MOVR5,#250;2T DJNZR5,$;4T DJNZR6,LOP1;4T DJNZR7,DELA;R7中數(shù)值為C;程序傳遞過來的參數(shù),參數(shù)為2則延時(shí)2msEXIT: RETEND第33頁/共48頁34 本例用Keil軟件對(duì)程序進(jìn)行編譯、調(diào)試時(shí),先新建一個(gè)項(xiàng)目,再建立3個(gè)文件,在文件中編輯好各個(gè)模塊代碼并保存,然后將這3個(gè)文件加入項(xiàng)目中,進(jìn)行編譯和調(diào)試。 本例只有1個(gè)傳遞參數(shù),用寄存器傳遞即可。如果參數(shù)個(gè)數(shù)多于3個(gè),則需通過固定存儲(chǔ)區(qū)傳遞。通過固定存儲(chǔ)區(qū)傳遞參數(shù),

28、可以在C程序中建立數(shù)組,將數(shù)組首地址(數(shù)組名)作為參數(shù)傳遞給被調(diào)用的匯編函數(shù),匯編函數(shù)即可使用從該首地址開始的存儲(chǔ)區(qū);也可以在匯編程序中建立C程序變量所需數(shù)據(jù)段以供參數(shù)傳遞。 現(xiàn)舉例說明。第34頁/共48頁35【例65】C程序提供5個(gè)參數(shù),匯編完成該5個(gè)數(shù)的求和運(yùn)算,并將和保存在片內(nèi)RAM 30H單元并供C程序使用。 方法一:通過數(shù)組傳遞參數(shù)模塊1:C語言程序(文件名)#include#define uchar unsigned charextern uchar asmadd1(uchar*);/定義外部匯編函數(shù)asmadd1void main()uchar idata buf5=1,2,3,

29、4,5;/數(shù)組中存放待計(jì)算的數(shù)據(jù)uchar *pp,sum;pp=0 x30; /pp指針變量指向片內(nèi)RAM 30H單元asmadd1(buf);/調(diào)用匯編函數(shù),傳遞參數(shù)為數(shù)組首地址sum=*pp; /sum存放模塊2傳遞過來的參數(shù)while(1);第35頁/共48頁36模塊2:匯編語言程序(文件名asmadd1.asm)PUBLIC _ASMADD1;_ASMADD1為其它模塊調(diào)用 DTE SEGMENT CODE;定義DTE段為再定位程序段RSEG DTE;選擇DTE為當(dāng)前段_ASMADD1:PUSH ACC;保護(hù)現(xiàn)場(chǎng)MOVA,R0PUSH ACCMOV A,R2PUSH ACCMOV A

30、,R7;取BUF地址MOVR0,A;R0指向存放地址MOV A,#0MOV R2,#5第36頁/共48頁37LOOP:ADD A,R0INC R0DJNZ R2,LOOPMOV 30H,A;和存片內(nèi)RAM 30H單元POP ACC;恢復(fù)現(xiàn)場(chǎng)MOVR2,APOP ACCMOV R0,APOP ACCRETEND第37頁/共48頁38方法二:在匯編程序中建立數(shù)據(jù)段傳遞參數(shù)模塊1:C語言程序(文件名)#include#define uchar unsigned charextern uchar asmadd2(uchar x1,uchar x2,uchar x3,uchar x4,uchar x5)

31、; /外部函數(shù)說明void main()uchar x1=0 x01; /傳遞參數(shù)賦值 uchar x2=0 x02; uchar x3=0 x03; uchar x4=0 x04; uchar x5=0 x05; uchar *pp,sum;pp=0 x30;/pp指針變量指向片內(nèi)RAM 30H單元asmadd2(x1,x2,x3,x4,x5);/調(diào)用匯編函數(shù)sum=*pp;/sum存放模塊2傳遞過來的參數(shù)while(1);第38頁/共48頁39模塊2:匯編語言程序(文件名asmadd2.asm)PR_ASMADD2 SEGMENT CODE;名為ASMADD2段為代碼;段(PR)在CODE

32、區(qū)可再定位DT_ASMADD2 SEGMENT DATA OVERLAYABLE;名為;ASMADD2段為數(shù)據(jù)段(DT)在DATA區(qū)可再定位,可以覆蓋PUBLIC ?_ASMADD2?BYTE ;公共符號(hào)定義PUBLIC _ASMADD2RSEG DT_ASMADD2?_ASMADD2?BYTE:;數(shù)據(jù)段保留參數(shù)傳遞區(qū)x1: DS 1x2: DS 1x3: DS 1x4: DS 1x5: DS 1第39頁/共48頁40RSEG PR_ASMADD2_ASMADD2:;程序段開始MOVA,R7;取R7中的x1ADDA,R5;取R5中的x2ADD A,R3;取R3中的x3ADD A,x4ADD A

33、,x5MOV 30H,A;和存進(jìn)片內(nèi)RAM 30H單元RETEND 使用方法二,3個(gè)以內(nèi)的參數(shù)還是通過R7 R5 R3傳送,多于3個(gè)的參數(shù)才通過定義的數(shù)據(jù)區(qū)傳送。第40頁/共48頁412.借助SRC文件實(shí)現(xiàn)混合編程(1)先用C語言編寫所有的代碼,包括需要匯編語言實(shí)現(xiàn)的部分。 下面所舉的例子中,延時(shí)子程序用匯編語言編寫,其余程序用C語言編寫。程序如下:/*文件名:功能:亮燈控制程序*/#includesbit L1=P13;void main(void)L1=0; /點(diǎn)亮燈delay02s();/延時(shí)第41頁/共48頁42L1=1;/熄滅燈delay02s(); /延時(shí)/*文件名:功能:延時(shí)*/delay02s(void)char i,j,k;for(i=151;i0;i)for(j=24;j0;j)for(k=244;k0;k);第42頁/共48頁43(2)建立項(xiàng)目文件,將和都包含進(jìn)項(xiàng)目。(3)在Keil C51環(huán)境下,在Project窗口右擊.c文件,在彈出的快捷菜單中選擇“Options for”命令,選中右邊的“Generate Assembler SRC Fi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論