混合編程總結(jié)_第1頁
混合編程總結(jié)_第2頁
混合編程總結(jié)_第3頁
混合編程總結(jié)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、1. 一個(gè)C程序模塊被編譯后,其中的每一個(gè)函數(shù)以“?PR?函數(shù)名? 模塊名”為命名規(guī)則被分配到一個(gè)獨(dú)立的CODE段。例如:如果模塊“FUNC51”內(nèi)包含了一個(gè)名為“func”的函數(shù),則在CODE段的名字為“?PR?FUNC? FUNC51”。如果一個(gè)函數(shù)包含DATA和BIT對(duì)象的局部變量,則編譯器將按“?函數(shù)名? BYTE”和“?函數(shù)名? BIT”命名規(guī)則建立一個(gè)DATA段和BIT段,它們代表所要傳遞的參數(shù)的起始位置,器偏移量為零。這些段是公開的,因而它們的地址是可以被其他模塊訪問。另外,這些段被編譯器賦予“OVERLAYABLE”標(biāo)志,故可被L51鏈接/定位器作覆蓋分析。2. 匯編程序中,你

2、的每一個(gè)功能函數(shù)都有自己的代碼段。如果有局部變量的話,它們也是有相應(yīng)的存儲(chǔ)空間(DATA,XDATA).例如,你有一個(gè)需要快速尋址的變量,你可以把它定義在DATA段中,如果你有函數(shù)查詢表格的話,你可以把它申明在CODE段中。關(guān)鍵是局部變量只對(duì)當(dāng)前使用它們的程序段是可以見的。各種存儲(chǔ)器模式下函數(shù)相關(guān)段的命名規(guī)則數(shù)據(jù)段類型段名程序代碼CODE?PR?函數(shù)名? 模塊名(所有存儲(chǔ)器模式)局部變量DATAPDATAXDATA?DT?函數(shù)名? 模塊名(SMALL模式)?PD?函數(shù)名? 模塊名(COMPACT模式)?XD?函數(shù)名?模塊名(LARGE模式)局部bit變量BIT?BI?函數(shù)名? 模塊名(所有存儲(chǔ)

3、器模式)3.有參數(shù)傳遞的函數(shù)調(diào)用 記住哦,c文件和A51文件不能使用同一個(gè)文件名,不過我還不知道為什么會(huì)這樣,有高手知道得話請(qǐng)告知。              今天說說帶參數(shù)傳遞的函數(shù)調(diào)用,在C51和匯編之間傳遞參數(shù)的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實(shí)參會(huì)存入相應(yīng)的寄存器,在匯編中只需對(duì)相應(yīng)寄存器進(jìn)行操作,即達(dá)到傳遞參數(shù)的目的。寄存器參數(shù)傳遞的規(guī)則參數(shù)數(shù)目Char1字節(jié)指針I(yè)nt 1字節(jié)指針Long,float一般指針第一個(gè)參數(shù)R7R6,R7R4-R7R1,R2,R3第二

4、個(gè)參數(shù)R5R4 ,R5R4,R7R1,R2,R3第三個(gè)參數(shù)R3R2,R3無R1,R2,R3函數(shù)返回值傳遞的規(guī)則返回類型使用寄存器說明bitCarry_Flag單個(gè)位經(jīng)由累加器返回(unsigned)char, 1字節(jié)指針R7單字節(jié)類型由R7返回(unsigned)int, 2字節(jié)指針R6,R7高位在R6,低位在R7(unsigned)longR4R7高位在R4,低位在R7FloatR4R732為IEEE格式一般指針R1R3存儲(chǔ)器類型在R3,高位在R2,低位在R1 4.下面是幾個(gè)說明參數(shù)傳遞規(guī)則的例子:Fubc1(int a)a在R6/R7中傳遞,高8位在R6中,低8為在R7中。Func2(in

5、t b, int c,int *d)b和c分別在R6/R7和R4/R5中傳遞,d在R1/R2/R3中傳遞Func3(long e, long f)e在R4/R5/R6/R7中傳遞,最高位8位在R4中,最低位在R7中,f不能在寄存器中傳遞,須通過局部數(shù)據(jù)段傳遞。Func4(float g, char h, bit i)g在R4/R5/R6/R7中傳遞,指數(shù)和符號(hào)位在R7中,尾數(shù)最高位在R6中,最低位在R4中。h和i不能在寄存器中傳遞。h在局部數(shù)據(jù)段,i在局部位段中傳遞。 注意:不能被寄存器傳遞的參數(shù)只能通過局部段或局部位段傳遞。用著這些局部段的別名可確定其起始地址,所以非寄存器傳遞的參數(shù),看根據(jù)

6、其數(shù)據(jù)類型分別置于以這些起始地址開始的存儲(chǔ)器中。5.1實(shí)例解析 NAME IDCNTL /函數(shù)模塊名 ?PR?IDCNTL?IDCNTL SEGMENT CODE /定義功能函數(shù)段(程序段) ?DT?IDCNTL?IDCNTL SEGMENT DATA OVERLAYABLE /定義局部數(shù)據(jù)段,以及該段可以被優(yōu)化連接器覆蓋 PUBLIC idcntl /定義公共符號(hào),即申明函數(shù)是公共函數(shù) PUBLIC ?idcntl?BYTE /定義局部變量段是公共段 RESG ?DT?IDCNTL?IDCNTL /?DT?表示局部變量,函數(shù)可被連接器放置在任何地方 ?idcntl?BYTE: /定義局部變量

7、 TEMP: DS 1 /TEMP為局部變量,DS 1表示此變量為一個(gè)字節(jié) COUTNT: DS 1 VAL1: DS 2 VAL2: DS 2 RSEG ?PR?IDCNTL?IDCNTL /?PR?表示函數(shù)名,此句表示此函數(shù)段可被覆蓋Idcntl: /函數(shù)從這里開始 RETDATA數(shù)據(jù)段中的標(biāo)號(hào)想?yún)R編程序中的變量一樣,連接器在連接的時(shí)候會(huì)賦予它們物理地址。段的覆蓋屬性將允許連接器進(jìn)行覆蓋分析。沒有這個(gè)屬性,?idcntl?BYTE段中的變量將一直占用這些空間,就像C中的靜態(tài)變量一樣,這樣將使內(nèi)存的效率降低。5.2匯編函數(shù)接受從C51程序傳遞過來的參數(shù)v_a,v_b,v_c和v_d,并依次放

8、入它自己的局部變量a,b,c,d中。函數(shù)調(diào)用時(shí)須傳遞4個(gè)函數(shù),按照傳遞法則規(guī)定,只有參數(shù)v_a在寄存器R6和R7中傳遞(高位在R6,低位在R7),參數(shù)v_b在寄存器R5中傳遞,而v_c和v_d則在參數(shù)傳遞段中傳遞。在small編譯模式下,參數(shù)傳遞段位于8051單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)DATA區(qū),因此匯編函數(shù)語言應(yīng)按照C51編譯器關(guān)于SAMLL模式下段名的規(guī)定在DATA區(qū)建立相應(yīng)的局部數(shù)據(jù)段。由于被調(diào)用的函數(shù)afunc()具有int類型,按照返回值的規(guī)定,函數(shù)返回值將在工作寄存器R6(高位),R7(低位)中。#program code samll#include<reg51.h>#inc

9、lude"huibian.h"*說明被調(diào)用的匯編函數(shù)的語言函數(shù)*extern int afunc (int v_a,char v_b,long v_c,bit v_d) *void main( void) /*主函數(shù)*/*說明被調(diào)用的匯編語言函數(shù)* unsigned int v_a=0; char v_b=0; long v_c=0; bit v_d=0; int a_ret;*帶參數(shù)調(diào)用* a_ret=afunc(v_a,v_b,v_c,v_d) ; * 匯編函數(shù)AFUNC.A51程序文件如下:NAME AFUNC /定義模塊名?PR?_AFUNC?AFUNC SEGME

10、NT CODE /定義程序代碼名?PR?_AFUNC?AFUNC SEGMENT DATA OVERLAYABLE /定義可覆蓋局部數(shù)據(jù)段?PR?_AFUNC?AFUNC SEGMENT BIT OVERLAYABLE /定義可覆蓋局部位段 ?PR?_AFUNC?AFUNC SEGMENT DATA /定義全局?jǐn)?shù)據(jù)段段名/*定義公共符號(hào)*/PUBLIC ?_AFUNC?BITPUBLIC ?_AFUNC?BYTEPUBLIC _AFUNC*RESG ?DT?_AFUNC?AFUNC /*可覆蓋局部數(shù)據(jù)段*/ ?_AFUNC?BYTE:: /*起始地址*/ v_a:DS 2 /*定義參數(shù)傳遞字節(jié)

11、*/ v_b:DS 1 v_c:DS 4 a:DS 2 /*定義其它局部變量*/ b:DS 1 c:DS 4 retval:DS 2 RESG ?BI? _AFUNC?AFUNC /*可覆蓋局部位段*/ _afunc? BIT: /*起始地址*/ v_d: DBIT 1 /*定義參數(shù)傳遞位*/ d: DBIT 1 /*定義其它局部位變量*/ RESG ?PR?_afunc?AFUNC /*可覆蓋程序代碼段*/ _afunc /*程序起始地址*/mov a,r6 /*a=v_a*/mov a+01h,r7mov b,r5 /*b=v_b*/mov c+03h,v_c+03h /*c=v_c*/mov c+02h,v_c+03hmov c+01h,v_c+01hmov c,v_cmov C,v_d /*d=v_d,*/mov d,cmov r6,retval /*返回值高位*/mov r7,retval+1 /*返回值低位*/ret /*子程序返回*/end 對(duì)于以上兩個(gè)模塊文件C_FUNC.C和AFUNC.A51分別用C51編譯器和A51匯編器進(jìn)行編譯和匯編,再對(duì)所生產(chǎn)的目標(biāo)文件用鏈接定位器L51進(jìn)行鏈接,即可生成一個(gè)完整的應(yīng)用程序。上述編程原理可推廣

溫馨提示

  • 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)論