資料介紹
在單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,過去主要采用匯編語言開發(fā)程序。匯編語言編寫的程序?qū)纹瑱C(jī)硬件操作很方便,編寫的程序代碼短,效率高,但系統(tǒng)設(shè)計(jì)的周期長,可讀性和可移植性都很差。C語言程序開發(fā)是近年來單片機(jī)系統(tǒng)開發(fā)應(yīng)用所采用的主要開發(fā)方式之一,C 語言功能豐富、表達(dá)能力強(qiáng)、使用靈活方便、開發(fā)周期短、可讀性強(qiáng)、可移植性好。但是,采用C 語言編程還是存在著如對硬件沒有匯編方便、效率沒有匯編高、編寫延時(shí)程序精確度不高等缺點(diǎn),因而現(xiàn)在單片機(jī)系統(tǒng)開發(fā)中經(jīng)常用到C 語言與匯編語言混合編程技術(shù)。混合編程技術(shù)可以把C 語言和匯編語言的優(yōu)點(diǎn)結(jié)合起來,編寫出性能優(yōu)良的程序。單片機(jī)混合編程技術(shù)通常是,程序的框架或主體部分用C 語言編寫,對那些使用頻率高、要求執(zhí)行效率高、延時(shí)精確的部分用匯編語言編寫,這樣既保證了整個(gè)程序的可讀性,又保證了單片機(jī)應(yīng)用系統(tǒng)的性能。1、混合編程的基本方式C 語言與匯編語言混合編程通常有兩種基本方法:在C 語言中嵌入?yún)R編程序和在C 語言中調(diào)用匯編程序。1.1 在C51 中嵌入?yún)R編程序在C51 中嵌入?yún)R編程序主要用于實(shí)現(xiàn)延時(shí)或中斷處理,以便生成精練的代碼,減少運(yùn)行時(shí)間。嵌入式匯編通常用在當(dāng)匯編函數(shù)不大,且內(nèi)部沒有復(fù)雜的跳轉(zhuǎn)的時(shí)候。在單片機(jī)C 語言程序中嵌入?yún)R編程序是通過C51 中的預(yù)處理指令# pragmaasm/endasm 語句實(shí)現(xiàn),格式如下:#pragmaASM;匯編程序代碼#pragmaENDASM通過# pragma asm 和# pragma endasm 告訴C51 編譯器它們之間的語句行不用編譯成匯編程序代碼。1.2 在C51 中調(diào)用匯編程序在C51 中調(diào)用匯編程序的方法應(yīng)用較多,C 模塊與匯編模塊的接口較簡單,分別用C51 與A51 對源程序進(jìn)行編譯,然后用L51 將obj 文件連接即可,關(guān)鍵問題在于C 函數(shù)與匯編函數(shù)之間的參數(shù)傳遞和得到正確返回值,以保證模塊間的數(shù)據(jù)交換。2、C51 與匯編程序的參數(shù)傳遞在C51 中嵌入?yún)R編程序或調(diào)用匯編程序,其參數(shù)傳遞的過程是不一樣的。2.1在C51 中嵌入?yún)R編程序的參數(shù)傳遞對于在C 語言程序中通過# pragma asm 和#pragma endasm 嵌入的匯編程序,C51 編譯器在編譯時(shí)只是將當(dāng)中的匯編程序不編譯,而不做其他任何處理,因此不存在函數(shù)調(diào)用時(shí)的參數(shù)傳遞和返回值問題。如果要在C 程序中和匯編程序中實(shí)現(xiàn)數(shù)據(jù)傳遞,可以通過變量或特殊功能寄存器來實(shí)現(xiàn),例如,在C 程序的變量定義部分定義Z 變量,在C 語言程序和匯編程序中共同訪問Z 變量,這樣,C 語言程序可以通過Z 變量把參數(shù)傳遞給匯編程序,匯編程序可以通過Z 變量把參數(shù)返回給C語言程序。2.2在C51 中調(diào)用匯編程序的參數(shù)傳遞在C51 中調(diào)用匯編程序是通過函數(shù)調(diào)用的形式來實(shí)現(xiàn)的。由于C51 程序函數(shù)有明確的參數(shù)和返回值約定,因此在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞時(shí)都必須嚴(yán)格遵守C51 函數(shù)的參數(shù)和返回值相關(guān)約定。在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞關(guān)鍵在于要弄清C51 函數(shù)的參數(shù)傳遞規(guī)則。在C51 中調(diào)用匯編程序進(jìn)行參數(shù)傳遞的方式有兩種:一種是通過寄存器傳遞參數(shù);一種是通過固定存儲(chǔ)區(qū)傳遞。2.2.1 通過寄存器傳遞參數(shù)。Franklin C51 規(guī)定調(diào)用函數(shù)最多可通過51 單片機(jī)的工作寄存器傳遞3 個(gè)參數(shù),余下的通過固定存儲(chǔ)區(qū)傳遞。可以用“NOREGPARMS”命令取消用寄存器傳遞參數(shù),如果用寄存器傳遞參數(shù)取消或參數(shù)太多,參數(shù)通過固定存儲(chǔ)區(qū)傳遞。用寄存器傳遞參數(shù)的函數(shù),在生成代碼時(shí)被Cx51 編譯器在函數(shù)名前加上一個(gè)下劃線“_”的前綴,在固定存儲(chǔ)區(qū)傳遞參數(shù)的函數(shù)則沒有下劃線。不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。通過寄存器傳遞的參數(shù)如表1 所示。表1 中,int 型和long 型數(shù)據(jù)傳遞時(shí)高位數(shù)據(jù)在低位寄存器中,低位數(shù)據(jù)在高位寄存器中;float型數(shù)據(jù)滿足32 位的IEEE 格式,指數(shù)和符號位在R7 中;通用指針存儲(chǔ)類型在R3 中,高位在R2 中。函數(shù)參數(shù)傳遞舉例情況如表2 所示。2.2.2 通過固定存儲(chǔ)區(qū)傳遞。用固定存儲(chǔ)區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址用段名“ function-nAMEBYTE”和“function-name ? BIT”保存,function-name 為函數(shù)的名稱,其中“, ? function-name ? BIT”保存位參數(shù)段首地址,“ function-name BYTE”保存別的參數(shù)段首地址,即使通過寄存器傳遞參數(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ū)。2.2.3 函數(shù)返回值。函數(shù)返回值通常用寄存器傳遞,表3 列出了可能的返回值和所用的寄存器。3、C51 中嵌入?yún)R編程序的實(shí)現(xiàn)方法通常,在C51 程序中嵌入?yún)R編程序的處理方法如下:第一步,在C 文件中以如下方式嵌入?yún)R編程序。#pragmaASM;匯編程序#pragmaENDASM第二步,在keil C51 軟件的Project 窗口右鍵單擊嵌入?yún)R編程序的C 文件,選擇“Options for ?”,點(diǎn)擊右邊的“Generate Assembler SRC File”和“AssembleSRC File”,使檢查框由灰色變成黑色(有效) 狀態(tài)。第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small 模式時(shí), 是Keil \ C51 \ Lib \ C51S。Lib) 加入工程中, 該文件必須作為工程的最后文件。庫文件與編譯模式的關(guān)系如下:C51S.LIB - 沒有浮點(diǎn)運(yùn)算的Small modelC51C.LIB - 沒有浮點(diǎn)運(yùn)算的Compact modelC51L.LIB - 沒有浮點(diǎn)運(yùn)算的Large modelC51FPS.LIB - 帶浮點(diǎn)運(yùn)算的Small modelC51FPC.LIB - 帶浮點(diǎn)運(yùn)算的Compact modelC51FPL.LIB - 帶浮點(diǎn)運(yùn)算的Large model第四步,編譯,即可生成目標(biāo)代碼。keil軟件中c編程如何制作一個(gè)庫函數(shù)并在其他地方隨意調(diào)用?在項(xiàng)目的Output設(shè)置中選擇輸出lib而不是可執(zhí)行目標(biāo)文件。4、C51 中調(diào)用匯編程序的實(shí)現(xiàn)方法為了能夠在C 語言中調(diào)用匯編程序,要求匯編程序的編寫必須符合C 語言的相關(guān)命名規(guī)則。C51 程序在調(diào)用匯編程序時(shí),除了前面參數(shù)傳遞的相關(guān)規(guī)則外,函數(shù)及其相關(guān)段也需要滿足一定的規(guī)則。一個(gè)C51 源程序模塊被編譯后,其中的每一個(gè)函數(shù)以“ ? PR ? 函數(shù)名? 模塊名”為名的命名規(guī)則被分配到一個(gè)獨(dú)立的CODE 段。 例如,如果模塊“FUNC51”內(nèi)包含一個(gè)名為“func”的函數(shù), 則其CODE 段的名字是“ ? PR ? FUNC ? FUNC51”,如果函數(shù)中還包含有data 和bit 對象的局部變量,編譯器將按“ ? 函數(shù)名? BYTE 和? 函數(shù)名? BIT”命令規(guī)則建立一個(gè)data 和bit 段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。段內(nèi)代碼與數(shù)據(jù)定義也遵循一定的規(guī)則。這些段是公開的,它們的地址可被其他模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,其可被L51 連接P定位器做覆蓋分析。下面是一個(gè)簡單的C51 程序編譯時(shí)形成的匯編程序。C 語言源程序如下:#defineucharunsignedcharucharmax(ucharx,uchary){ucharz;z=(x>=y)?x:y;return(z);}匯編后形成的SRC 文件(只須擴(kuò)展名改為.a51就變成匯編程序) 如下:NAMEA1;定義模塊名稱?PR?_max?A1SEGMENTCODE;定義程序代碼PUBLIC_max;定義公共符號;#defineucharunsignedchar;ucharmax(ucharx,uchary)RSEG?PR?_max?A1;程序代碼段_max:;起始地址USING0;SOURCELINE#2;??Variable’y?041’assignedtoRegister’R5’??;??Variable’x?040’assignedtoRegister’R7’??;{;SOURCELINE#3;ucharz;;z=(x>=y)?x:y;;SOURCELINE#5MOVA,R7;R7中為第二個(gè)字節(jié)參數(shù)CLRCSUBBA,R5;R5中為第一個(gè)字節(jié)參數(shù)JC?C0001SJMP?C0002?C0001:MOVR7,AR5;R7中為返回值?C0002:;??Variable’z?042’assignedtoRegister’R7’??;return(z);;SOURCELINE#6;SOURCELINE#7;}?C0003:RET;ENDOF-maxEND可以看出,要編寫為C51 調(diào)用的匯編程序,除了參數(shù)必須按前面規(guī)定的寄存器或存儲(chǔ)器傳送外,程序格式也有相應(yīng)的規(guī)則。這些規(guī)則比較繁瑣,在實(shí)際處理中往往按下面方式處理:第一步,先用C 語言程序編寫出程序框架,如文件名為a1.c (注意參數(shù)) 。第二步,在keil C51 的Project 窗口中用右鍵單擊該C 語言文件,在右鍵菜單中選擇“Options for?”,點(diǎn)擊右邊的“Generate Assembler SRCFile”和“Assemble SRC File”,使檢查框由灰色變成黑色(有效) 狀態(tài)。第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small 模式時(shí),是Keil \ C51 \ Lib \ C51S.Lib) 加入工程中,該文件必須作為工程的最后文件。 庫文件與編譯模式的關(guān)系如前面所述。第四步,編譯后將會(huì)產(chǎn)生一個(gè)SRC 的文件,將這個(gè)文件擴(kuò)展名改為ASM。這樣就形成了可供C51程序調(diào)用的匯編程序。隨后可在該文件的代碼段中加入所需指令代碼。第五步,將該匯編程序與調(diào)用它的主程序一起加到工程文件中,這時(shí)工程文件中不再需要原來的C 語言文件和庫文件,主程序只需要在程序開始處用EXTERN 對所調(diào)用的匯編程序中的函數(shù)作聲明,主程序中可調(diào)用匯編程序中的函數(shù)。(mbbeetchina)
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 51單片機(jī)C語言編程入門學(xué)習(xí)資料
- "單片機(jī)r6/r7c語言怎么用,第5章MCU混合編程與C語言和匯編語言"
- 51單片機(jī)-asm與C混合編程
- 模擬IC與80C51單片機(jī)的接口資料下載 12次下載
- 單片機(jī)C語言和匯編語言混合編程實(shí)例詳解 227次下載
- 單片機(jī)基礎(chǔ)及應(yīng)用|80C51單片機(jī)的結(jié)構(gòu)及信號引腳資料下載
- 單片機(jī)C51編程的警告提示說明
- 單片機(jī)教程之如何進(jìn)行單片機(jī)內(nèi)部資源的C51編程 21次下載
- 51單片機(jī)匯編程序有哪些?51單片機(jī)匯編程序集詳細(xì)資料免費(fèi)下載 55次下載
- ARM Bootloader 的實(shí)現(xiàn)C 和 ASM 混合編程 15次下載
- MSP430單片機(jī)的C語言和匯編語言混合編程 24次下載
- 基于MSP430單片機(jī)C語言和匯編語言混合編程 18次下載
- 51單片機(jī)C編程 0次下載
- MSP430單片機(jī)C語言和匯編語言混合編程
- 單片機(jī)C語言編程應(yīng)注意的若干問題
- 51、STM32單片機(jī)的編程方式一樣嗎? 2397次閱讀
- 基于51單片機(jī)的電子鐘鬧鐘溫度顯示設(shè)計(jì) 2506次閱讀
- 51單片機(jī)的基礎(chǔ)知識 1.1w次閱讀
- C與C++混合編程是什么 1747次閱讀
- 51單片機(jī)的匯編程序庫 9740次閱讀
- 使用51單片機(jī)讀寫AT29C040的C語言程序免費(fèi)下載 4814次閱讀
- 51單片機(jī)讀寫AT29C040的C51程序 4991次閱讀
- HD44780讀寫單片機(jī)C51程序免費(fèi)下載 4387次閱讀
- 使用HD44780讀寫單片機(jī)的C51程序詳細(xì)概述 3306次閱讀
- DS18B20和51單片機(jī)連接的匯編程序免費(fèi)下載 4614次閱讀
- 80C51單片機(jī)與8051單片機(jī)的區(qū)別是什么 9021次閱讀
- 51單片機(jī)引腳簡介 5.4w次閱讀
- 51單片機(jī)編程環(huán)境的搭建及代碼編寫的方法 2.3w次閱讀
- 80C51單片機(jī)與8051單片機(jī)的主要差別在哪里 7965次閱讀
- 51單片機(jī)串口通信編程 1.3w次閱讀
下載排行
本周
- 1DC電源插座圖紙
- 0.67 MB | 3次下載 | 免費(fèi)
- 2AN-1267: 使用ADSP-CM408F ADC控制器的電機(jī)控制反饋采樣時(shí)序
- 1.41MB | 3次下載 | 免費(fèi)
- 3AN158 GD32VW553 Wi-Fi開發(fā)指南
- 1.51MB | 2次下載 | 免費(fèi)
- 4AN148 GD32VW553射頻硬件開發(fā)指南
- 2.07MB | 1次下載 | 免費(fèi)
- 5AN111-LTC3219用戶指南
- 84.32KB | 次下載 | 免費(fèi)
- 6AN153-用于電源系統(tǒng)管理的Linduino
- 1.38MB | 次下載 | 免費(fèi)
- 7AN-283: Σ-Δ型ADC和DAC[中文版]
- 677.86KB | 次下載 | 免費(fèi)
- 8SM2018E 支持可控硅調(diào)光線性恒流控制芯片
- 402.24 KB | 次下載 | 免費(fèi)
本月
- 1ADI高性能電源管理解決方案
- 2.43 MB | 450次下載 | 免費(fèi)
- 2免費(fèi)開源CC3D飛控資料(電路圖&PCB源文件、BOM、
- 5.67 MB | 138次下載 | 1 積分
- 3基于STM32單片機(jī)智能手環(huán)心率計(jì)步器體溫顯示設(shè)計(jì)
- 0.10 MB | 130次下載 | 免費(fèi)
- 4使用單片機(jī)實(shí)現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
- 2.96 MB | 44次下載 | 免費(fèi)
- 5美的電磁爐維修手冊大全
- 1.56 MB | 24次下載 | 5 積分
- 6如何正確測試電源的紋波
- 0.36 MB | 18次下載 | 免費(fèi)
- 7感應(yīng)筆電路圖
- 0.06 MB | 10次下載 | 免費(fèi)
- 8萬用表UT58A原理圖
- 0.09 MB | 9次下載 | 5 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935121次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420062次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191367次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73810次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論