在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

混合編程的基本方式, 在C51中嵌入?yún)R編程序

2oON_changxuemc ? 來源:lp ? 2019-04-15 11:41 ? 次閱讀

單片機應(yīng)用系統(tǒng)設(shè)計中,過去主要采用匯編語言開發(fā)程序。匯編語言編寫的程序?qū)纹瑱C硬件操作很方便,編寫的程序代碼短,效率高,但系統(tǒng)設(shè)計的周期長,可讀性和可移植性都很差。C語言程序開發(fā)是近年來單片機系統(tǒng)開發(fā)應(yīng)用所采用的主要開發(fā)方式之一,C語言功能豐富、表達能力強、使用靈活方便、開發(fā)周期短、可讀性強、可移植性好。但是,采用C語言編程還是存在著如對硬件沒有匯編方便、效率沒有匯編高、編寫延時程序精確度不高等缺點,因而現(xiàn)在單片機系統(tǒng)開發(fā)中經(jīng)常用到C語言與匯編語言混合編程技術(shù)。混合編程技術(shù)可以把C語言和匯編語言的優(yōu)點結(jié)合起來,編寫出性能優(yōu)良的程序。單片機混合編程技術(shù)通常是,程序的框架或主體部分用C語言編寫,對那些使用頻率高、要求執(zhí)行效率高、延時精確的部分用匯編語言編寫,這樣既保證了整個程序的可讀性,又保證了單片機應(yīng)用系統(tǒng)的性能。

1、混合編程的基本方式

C語言與匯編語言混合編程通常有兩種基本方法:在C語言中嵌入?yún)R編程序和在C語言中調(diào)用匯編程序。

1.1 在C51 中嵌入?yún)R編程序

在C51中嵌入?yún)R編程序主要用于實現(xiàn)延時或中斷處理,以便生成精練的代碼,減少運行時間。嵌入式匯編通常用在當匯編函數(shù)不大,且內(nèi)部沒有復(fù)雜的跳轉(zhuǎn)的時候。在單片機C語言程序中嵌入?yún)R編程序是通過C51中的預(yù)處理指令#pragmaasm/endasm語句實現(xiàn),格式如下:

#pragmaASM

;匯編程序代碼

#pragmaENDASM

通過#pragmaasm和#pragmaendasm告訴C51編譯器它們之間的語句行不用編譯成匯編程序代碼。

1.2 在C51 中調(diào)用匯編程序

在C51中調(diào)用匯編程序的方法應(yīng)用較多,C模塊與匯編模塊的接口較簡單,分別用C51與A51對源程序進行編譯,然后用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語言程序中通過#pragmaasm和#pragmaendasm嵌入的匯編程序,C51編譯器在編譯時只是將當中的匯編程序不編譯,而不做其他任何處理,因此不存在函數(shù)調(diào)用時的參數(shù)傳遞和返回值問題。如果要在C程序中和匯編程序中實現(xiàn)數(shù)據(jù)傳遞,可以通過變量或特殊功能寄存器來實現(xiàn),例如,在C程序的變量定義部分定義Z變量,在C語言程序和匯編程序中共同訪問Z變量,這樣,C語言程序可以通過Z變量把參數(shù)傳遞給匯編程序,匯編程序可以通過Z變量把參數(shù)返回給C語言程序。

2.2在C51 中調(diào)用匯編程序的參數(shù)傳遞

在C51中調(diào)用匯編程序是通過函數(shù)調(diào)用的形式來實現(xiàn)的。由于C51程序函數(shù)有明確的參數(shù)和返回值約定,因此在C51中調(diào)用匯編程序進行參數(shù)傳遞時都必須嚴格遵守C51函數(shù)的參數(shù)和返回值相關(guān)約定。

在C51中調(diào)用匯編程序進行參數(shù)傳遞關(guān)鍵在于要弄清C51函數(shù)的參數(shù)傳遞規(guī)則。在C51中調(diào)用匯編程序進行參數(shù)傳遞的方式有兩種:一種是通過寄存器傳遞參數(shù);一種是通過固定存儲區(qū)傳遞。

2.2.1通過寄存器傳遞參數(shù)。

FranklinC51規(guī)定調(diào)用函數(shù)最多可通過51單片機的工作寄存器傳遞3個參數(shù),余下的通過固定存儲區(qū)傳遞。可以用“NOREGPARMS”命令取消用寄存器傳遞參數(shù),如果用寄存器傳遞參數(shù)取消或參數(shù)太多,參數(shù)通過固定存儲區(qū)傳遞。用寄存器傳遞參數(shù)的函數(shù),在生成代碼時被Cx51編譯器在函數(shù)名前加上一個下劃線“_”的前綴,在固定存儲區(qū)傳遞參數(shù)的函數(shù)則沒有下劃線。不同的參數(shù)用到的寄存器不一樣,不同的數(shù)據(jù)類型用到的寄存器也不同。通過寄存器傳遞的參數(shù)如表1所示。

表1中,int型和long型數(shù)據(jù)傳遞時高位數(shù)據(jù)在低位寄存器中,低位數(shù)據(jù)在高位寄存器中;float型數(shù)據(jù)滿足32位的IEEE格式,指數(shù)和符號位在R7中;通用指針存儲類型在R3中,高位在R2中。函數(shù)參數(shù)傳遞舉例情況如表2所示。

2.2.2通過固定存儲區(qū)傳遞。

用固定存儲區(qū)傳遞參數(shù)給匯編程序,參數(shù)段首地址用段名“function-nAMEBYTE”和“function-name?BIT”保存,function-name為函數(shù)的名稱,其中“,?function-name?BIT”保存位參數(shù)段首地址,“function-nameBYTE”保存別的參數(shù)段首地址,即使通過寄存器傳遞參數(shù),參數(shù)也將在這些段中分配空間,參數(shù)按聲明的先后在每個段中順序保存。

用做參數(shù)傳遞的固定存儲區(qū)可在內(nèi)部數(shù)據(jù)區(qū)或外部數(shù)據(jù)區(qū),這由存儲模式?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編程序的實現(xiàn)方法

通常,在C51程序中嵌入?yún)R編程序的處理方法如下:

第一步,在C文件中以如下方式嵌入?yún)R編程序。

#pragmaASM

;匯編程序

#pragmaENDASM

第二步,在keilC51軟件的Project窗口右鍵單擊嵌入?yún)R編程序的C文件,選擇“Optionsfor?”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài)。

第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時,是Keil\C51\Lib\C51S。Lib)加入工程中,該文件必須作為工程的最后文件。

庫文件與編譯模式的關(guān)系如下:

C51S.LIB - 沒有浮點運算的Small model

C51C.LIB - 沒有浮點運算的Compact model

C51L.LIB - 沒有浮點運算的Large model

C51FPS.LIB - 帶浮點運算的Small model

C51FPC.LIB - 帶浮點運算的Compact model

C51FPL.LIB - 帶浮點運算的Large model

第四步,編譯,即可生成目標代碼。

keil軟件中c編程如何制作一個庫函數(shù)并在其他地方隨意調(diào)用?

在項目的Output設(shè)置中選擇輸出lib而不是可執(zhí)行目標文件。

4、C51 中調(diào)用匯編程序的實現(xiàn)方法

為了能夠在C語言中調(diào)用匯編程序,要求匯編程序的編寫必須符合C語言的相關(guān)命名規(guī)則。

C51程序在調(diào)用匯編程序時,除了前面參數(shù)傳遞的相關(guān)規(guī)則外,函數(shù)及其相關(guān)段也需要滿足一定的規(guī)則。

一個C51源程序模塊被編譯后,其中的每一個函數(shù)以“?PR?函數(shù)名?模塊名”為名的命名規(guī)則被分配到一個獨立的CODE段。例如,如果模塊“FUNC51”內(nèi)包含一個名為“func”的函數(shù),則其CODE段的名字是“?PR?FUNC?FUNC51”,如果函數(shù)中還包含有data和bit對象的局部變量,編譯器將按“?函數(shù)名?BYTE和?函數(shù)名?BIT”命令規(guī)則建立一個data和bit段,它們代表所要傳遞參數(shù)的起始位置,其偏移值為零。段內(nèi)代碼與數(shù)據(jù)定義也遵循一定的規(guī)則。這些段是公開的,它們的地址可被其他模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標志,其可被L51連接P定位器做覆蓋分析。

下面是一個簡單的C51程序編譯時形成的匯編程序。

C語言源程序如下:

#defineucharunsignedchar

ucharmax(ucharx,uchary){

ucharz;

z=(x>=y)?x:y;

return(z);

}

匯編后形成的SRC文件(只須擴展名改為.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#5

MOVA,R7;R7中為第二個字節(jié)參數(shù)

CLRC

SUBBA,R5;R5中為第一個字節(jié)參數(shù)

JC?C0001

SJMP?C0002

?C0001:

MOVR7,AR5;R7中為返回值

?C0002:

;??Variable’z?042’assignedtoRegister’R7’??

;return(z);

;SOURCELINE#6

;SOURCELINE#7

;}

?C0003:

RET

;ENDOF-max

END

可以看出,要編寫為C51調(diào)用的匯編程序,除了參數(shù)必須按前面規(guī)定的寄存器或存儲器傳送外,程序格式也有相應(yīng)的規(guī)則。這些規(guī)則比較繁瑣,在實際處理中往往按下面方式處理:

第一步,先用C語言程序編寫出程序框架,如文件名為a1.c(注意參數(shù))。

第二步,在keilC51的Project窗口中用右鍵單擊該C語言文件,在右鍵菜單中選擇“Optionsfor?”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài)。

第三步,根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時,是Keil\C51\Lib\C51S.Lib)加入工程中,該文件必須作為工程的最后文件。庫文件與編譯模式的關(guān)系如前面所述。

第四步,編譯后將會產(chǎn)生一個SRC的文件,將這個文件擴展名改為ASM。這樣就形成了可供C51程序調(diào)用的匯編程序。隨后可在該文件的代碼段中加入所需指令代碼。

第五步,將該匯編程序與調(diào)用它的主程序一起加到工程文件中,這時工程文件中不再需要原來的C語言文件和庫文件,主程序只需要在程序開始處用EXTERN對所調(diào)用的匯編程序中的函數(shù)作聲明,主程序中可調(diào)用匯編程序中的函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6040

    文章

    44594

    瀏覽量

    636924
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120806
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137249

原文標題:51單片機asm與C混合編程

文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C匯編混合編程

    協(xié)議的內(nèi)容如下:1、由于C編譯器產(chǎn)生的所有標號都以下劃線(_)為前綴,而C程序調(diào)用匯編程序時要求匯編程
    發(fā)表于 09-21 09:24

    Keil C51C51程序匯編程序的接口方法

    為函數(shù)的調(diào)用,只不過此函數(shù)是采用不同語言編寫的而已。當C51模塊程序編譯成目標文件后,其中的函數(shù)名依據(jù)其定義的性質(zhì)不同會轉(zhuǎn)換為不同的函數(shù)名,因此,C
    發(fā)表于 03-04 15:18

    Keil C51匯編混合編程詳解

    [table][tr][td] 一、C51嵌入匯編 在這個例子里,闡述了編寫c51
    發(fā)表于 07-13 09:35

    混合編程嵌入式系統(tǒng)軟件優(yōu)化中有什么優(yōu)勢?

    及硬件底層管理,就可以把兩者的優(yōu)點有效地結(jié)合起來。C匯編語言的混合編程有三種形式:一是對C程序編譯后形成的
    發(fā)表于 08-23 07:59

    ARM匯編C混合編程的相關(guān)資料分享

    慕課電子科技大學(xué).嵌入式系統(tǒng).第五章.ARM匯編程序設(shè)計.ARM匯編C混合編程0 目錄5 ARM匯編程
    發(fā)表于 11-09 06:17

    keil創(chuàng)建C51匯編工程

    keil創(chuàng)建C51匯編工程,并編寫程序proteus
    發(fā)表于 12-01 06:49

    51 系列匯編程序設(shè)計的優(yōu)化1

    51 系列匯編程序設(shè)計的優(yōu)化1
    發(fā)表于 05-15 14:55 ?24次下載

    KeilC51C51程序匯編程序的接口方法

    C語言程序匯編語言程序的相互調(diào)用可視為函數(shù)的調(diào)用,只不過此函數(shù)是采用不同語言編寫。C
    發(fā)表于 07-09 17:49 ?74次下載

    AD和DA轉(zhuǎn)換的c程序和對應(yīng)的匯編程序

    有關(guān)AD和DA轉(zhuǎn)換的c程序和對應(yīng)的匯編程序
    發(fā)表于 11-19 16:43 ?27次下載

    51單片機匯編程序

    51單片機匯編程序包。
    發(fā)表于 01-06 14:12 ?16次下載

    淺談關(guān)于DSP6000C/C++語言和匯編語言的混合編程的方法

    /C++程序進行編譯生成相應(yīng)的匯編程序,手工對生成的匯編程序進行修改。 (4)C/
    發(fā)表于 10-24 10:10 ?1次下載

    51單片機匯編程序有哪些?51單片機匯編程序集詳細資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是51單片機匯編程序有哪些?51單片機匯編程序集詳細資料免費下載。
    發(fā)表于 09-06 16:31 ?55次下載
    <b class='flag-5'>51</b>單片機<b class='flag-5'>匯編程序</b>有哪些?<b class='flag-5'>51</b>單片機<b class='flag-5'>匯編程序</b>集詳細資料免費下載

    如何使用KEIL C51和proteus實現(xiàn)C51匯編程序的設(shè)計實例

    本文檔的主要內(nèi)容詳細介紹的是如何使用KEIL C51和proteus實現(xiàn)C51匯編程序的設(shè)計實例。
    發(fā)表于 07-30 17:35 ?19次下載
    如何使用KEIL <b class='flag-5'>C51</b>和proteus實現(xiàn)<b class='flag-5'>C51</b><b class='flag-5'>匯編程序</b>的設(shè)計實例

    慕課嵌入式系統(tǒng)(第五章.ARM匯編C混合編程)

    慕課電子科技大學(xué).嵌入式系統(tǒng).第五章.ARM匯編程序設(shè)計.ARM匯編C混合編程0 目錄5 ARM匯編程
    發(fā)表于 11-04 10:21 ?16次下載
    慕課<b class='flag-5'>嵌入</b>式系統(tǒng)(第五章.ARM<b class='flag-5'>匯編</b>與<b class='flag-5'>C</b><b class='flag-5'>混合編程</b>)

    51單片機-asm與C混合編程

    KEILC語言與匯編語言混合編程 一是源程序中直接混合嵌入
    發(fā)表于 11-23 16:20 ?20次下載
    <b class='flag-5'>51</b>單片機-asm與<b class='flag-5'>C</b><b class='flag-5'>混合編程</b>
    主站蜘蛛池模板: 久久福利影视| v视界影院最新地址| 亚洲人成网站999久久久综合| 成年人黄色片视频| 夜夜se| 天天激情| 亚洲成a人片7777| 综合色视频| 性色网站| 日本免费黄色网| 巨乳色最新网址| 多男一女一级淫片免费播放口| 波多野结衣在线观看一区| 伊人网在线视频| 日日做夜夜爽夜夜爽| 丁香综合网| 亚洲欧美一区二区三区四区| 中国业余老太性视频| 四虎最新影院| 免费公开视频人人人人人人人| 精品国产乱码久久久久久浪潮 | 8050网| 亚欧洲乱码专区视频| 亚洲已满18点击进入在线观看| 四虎在线最新地址公告| 美女毛片免费看| 在线天天干| 国产精品资源在线观看网站| 中文字幕一区二区三区在线不卡| jizz免费一区二区三区| 色.com| 五月香婷婷| 日本资源在线| 国产激烈床戏无遮挡在线观看| 天天综合色天天综合色sb| fenfencao在线观看免费视频| 双性受粗大撑开白浊| 四虎影院成人在线观看| 黄色二级视频| 日本免费黄色网址| 亚洲深夜|