九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

第12章 C語言綜合應(yīng)用程序示例

上傳人:dfg****19 文檔編號:247455312 上傳時間:2024-10-18 格式:PPT 頁數(shù):61 大小:840KB
收藏 版權(quán)申訴 舉報 下載
第12章 C語言綜合應(yīng)用程序示例_第1頁
第1頁 / 共61頁
第12章 C語言綜合應(yīng)用程序示例_第2頁
第2頁 / 共61頁
第12章 C語言綜合應(yīng)用程序示例_第3頁
第3頁 / 共61頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《第12章 C語言綜合應(yīng)用程序示例》由會員分享,可在線閱讀,更多相關(guān)《第12章 C語言綜合應(yīng)用程序示例(61頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、C,語言程序設(shè)計,C,語言程序設(shè)計,C,語言程序設(shè)計,C,語言程序設(shè)計,上一頁,下一頁,C語言程序設(shè)計教程,第,12,章,C,語言綜合應(yīng)用程序示例,北京郵電大學(xué)出版社,內(nèi)容提要,多模塊編程方法,圖形處理應(yīng)用,操作系統(tǒng)接口應(yīng)用,C,語言與匯編語言混合編程,綜合應(yīng)用程序示例,-,漢字顯示技術(shù),一個有實(shí)用價值的,C,語言應(yīng)用程序往往較大,需要劃分成不同的模塊,分配給不同的程序員去完成。因此,在實(shí)用軟件的開發(fā)中,往往需要采用多模塊編程技術(shù)。,12.1,多模塊編程方法,使用多模塊編程技術(shù)的處理過程大致如下:,1,、,首先,將一個大的源程序根據(jù)其功能合理地劃分成若干個小的源程序,每個小源程序均以程序文件,

2、(.C),的形式保存在磁盤上。,并,建立一個包括各個源程序模塊的文件名的工程文件,(.prj),。,2,、,然后,用編譯器進(jìn)行編譯,將工程文件中指定的多個源程序文件進(jìn)行編譯,生成多個目標(biāo)文件和一個可執(zhí)行文件。注意,在分模塊單獨(dú)編譯處理的各個程序模塊中,必須有且只有一個主函數(shù),main( ),。,一、程序模塊組織,1,、,使用外部變量,即一個程序文件,file1.c,中定義一個外部變量,另一個程序文件,file2.c,中的函數(shù)可以通過外部變量說明后來使用這個變量,以實(shí)現(xiàn)模塊間的通信。,說明形式:,extern,類型說明符,外部變量名,;,注意:只是進(jìn)行了說明,并不是變量定義。,2,、,舉例,利用

3、外部變量實(shí)現(xiàn)程序模塊,f1.c,與程序模塊,f2.c,之間的通信。,二、模塊之間的通信,設(shè)程序模塊文件,f1.c,的內(nèi)容如下:,#include,int var=8; /*,全局變量的定義,*,/,main(), printf(“%d”,var);,proc1();,printf(“%dn”,var);,程序模塊文件,f2.c,的內(nèi)容如下:,extern int var; /*,外部變量的說明,*,/,proc1(),var = 25 ;,程序編譯連接生成可執(zhí)行文件,執(zhí)行結(jié)果為:,8,25,1,、,#include,命令經(jīng)過預(yù)處理后,會將其后有關(guān)文件的內(nèi)容拷貝到命令所在的源程序文件中。,2,、

4、,在上一個例子中,程序要能夠編譯運(yùn)行,需,建立一個工程文件,f12.prj,,其,內(nèi)容為:,f1.c,f2.c,然后對,f12.prj,文件編譯運(yùn)行即可。,3,、也可以在,f1.c,文件開頭,加一預(yù)處理命令,:,三、,預(yù)處理命令,#include,的應(yīng)用,#include,#include,int var=8;,main(),對,f1.c,文件直接編譯運(yùn)行即可。,12.2,圖形處理應(yīng)用,圖形處理是計算機(jī)應(yīng)用的一個極具特色的領(lǐng)域,有很好的應(yīng)用前景,可以,增強(qiáng)程序的趣味性、實(shí)用性。,一、基本圖形處理庫函數(shù),Turbo C,支持多種顯示適配器的各種顯示模式,提供了畫點(diǎn)、線、圓、橢圓、多邊形以及輸出各

5、種字體等功能的函數(shù)。,這些函數(shù)包含在圖形頭文件(,graphics.h,),中,在進(jìn)行目標(biāo)程序連接時,也必須將圖形庫文件,graphics.lib,連接到目標(biāo)程序中去,其圖形接口還包括圖形顯示驅(qū)動程序(*,.BGI,),等。,作用:將一個圖形驅(qū)動程序裝入內(nèi)存,并將系統(tǒng)設(shè)置成,圖形模式;,說明:,gd,指定,所用的圖形驅(qū)動程序,其值可參照書上,的圖形驅(qū)動程序常量表;,gm,說明初始化的圖形模式,其取值見附錄,;,path,指定驅(qū)動程序目錄路徑,空字符時表示驅(qū)動,程序就在當(dāng)前目錄下。,例如:若已知所用的圖形適配器為,CGA,,,并打算使用,640,200,高分辨率模式,CGAHI,,,則圖形初始化

6、,部分可寫成:,1,、,圖形系統(tǒng)初始化函數(shù),顯示模式控制函數(shù),initgraph(gd,gm,path),int gd = CGA, gm = CGAHI;,initgraph(&gd, &gm, “TC” ),;,自動檢測顯示器硬件的函數(shù),detectgraph,(gd,gm),作用:當(dāng)編程者不知所用的圖形適配器的類型,,或者需要編寫在不同圖形模式下均能運(yùn)行,的圖形程序,使用該函數(shù)可以完成對適配,器的檢查,獲取顯示器類型號(賦給,gd,),及相應(yīng)的顯示模式(賦給,gm,)。,例如:圖形初始化部分可以寫成:,int gd, gm;,detectgraph(,/*,自動測試硬件,*,/,init

7、graph(&gd, &gm, “TC” ),;,/*,根據(jù)測試結(jié)果進(jìn)行圖形初始化,*,/,恢復(fù)顯示方式函數(shù),closegraph( ),作用:,關(guān)閉圖形系統(tǒng),返回文本工作方式。,恢復(fù)工作模式函數(shù),restorecrtmode( ),設(shè)置圖形工作模式函數(shù),setgraphmode( ),作用:,使顯示器工作方式在圖形和文本方式,之間來回切換。,清屏函數(shù),cleardevice( ),作用:用于,畫圖前進(jìn)行清除屏幕,;,作用范圍為整個屏幕。,2,、,基本圖形函數(shù),三種最基本的圖形函數(shù):畫點(diǎn)、線、圓函數(shù),畫點(diǎn)函數(shù),putpixel(x, y, color),;,作用:將在坐標(biāo),x,、,y,指定的位

8、置上畫一點(diǎn),,該點(diǎn)的顏色由,color,值決定。,畫線函數(shù),line(startx, starty, endx, endy),;,作用:在,(,startx, starty),和,(,endx, endy),兩點(diǎn),間畫一直線,顏色為系統(tǒng)當(dāng)前顏色。,畫圓函數(shù),circle(x, y, radius),;,作用:用當(dāng)前顏色畫一個圓心在,(,x,y),處,半,徑大小為,radius,的圓,。,畫圓弧、扇形、橢圓函數(shù),畫圓弧函數(shù),arc(x, y,start, end, radius),;,作用:用當(dāng)前顏色,以,(,x,y),為圓心,,(,start,end),為起,止角,,radius,為半徑畫圓弧

9、。,畫扇形函數(shù),pieslice(x, y, start, end, radius),;,作用:用當(dāng)前顏色,以,(,x,y),為圓心,,(,start,end),為起,止角,,radius,為半徑畫扇形,。,畫橢圓函數(shù),ellipse(x,y,start,end,xradius, yradius),;,作用:用當(dāng)前畫線顏色,以,(,x,y),為中心,,(,start,end),為起止角,,(,xradius,yradius),為兩軸半徑畫,橢圓。,說明:,start,、,end,均以角度為單位。,畫多邊形、矩形和條形圖函數(shù),畫多邊形函數(shù),drawpoly(numpoints,points,),

10、;,作用:用當(dāng)前顏色畫一個多邊形,多邊形的頂點(diǎn)數(shù),為,numpoints,,而,points,指向的整形數(shù)組連續(xù),存放著各頂點(diǎn)的,(,x,y),坐標(biāo)。,畫,矩形,函數(shù),rectangle(left,top,right,bottom),;,作用:用當(dāng)前顏色,以,(,left,top),為左上角坐標(biāo),以,(,right,bottom),為右下角坐標(biāo)畫一個矩形。,畫,條形圖,函數(shù),bar(left,top,right,bottom),;,bar3d(left,top,right,bottom,depth,topflag),;,作用:用當(dāng)前顏色,畫一實(shí)心條形圖;,depth,決定,bar3d(),產(chǎn)生

11、的三維條形圖的厚度,,topflag,決定是否加頂蓋。,3,、,顏色控制函數(shù),屏幕上顯示出的點(diǎn)、線、面的顏色稱為前景色,而襯托它們的背景顏色稱為背景色。,在,Turbo C,中常使用的,16,個標(biāo)準(zhǔn)色為:,顏色設(shè)置,函數(shù),setcolor(color),;,作用:,用顏色值,color,設(shè)置當(dāng)前畫圖顏色,。,圖形填充,函數(shù),floodfill(x, y, bordercolor),;,作用:該函數(shù)對任意封閉圖形進(jìn)行填充,其顏色和,模式由設(shè)定的或缺省的顏色與圖形模式?jīng)Q定。,說明:編程時該函數(shù)位于畫圖函數(shù)之后;參數(shù),(x,y),為封閉圖形中的任意一點(diǎn),,bordercolor,是封,閉圖形的邊框顏

12、色。,填充模式,函數(shù),setfillstyle(pattern, color),;,作用:,來設(shè)定,floodfill( ),函數(shù),的填充模式,。,說明:,參數(shù),pattern,的值及其符號如下表所示。,舉例:,利用基本作圖函數(shù)及顏色控制函數(shù)畫圖。,#include,#include,#include,void box(int, int, int, int),;,main( ), int gd=DETECT, gm, i,;,/*,將圖形模式設(shè)置成缺省模式,*,/,initgraph(&gd, &gm, “tc”),;,/*,根據(jù)測試結(jié)果進(jìn)行圖形初始化,*,/,cleardevice(),;,

13、/*,清屏幕,*,/,setcolor(1),;,/*,設(shè)置當(dāng)前畫圖顏色為藍(lán)色,*,/,line(0,0,639,349),;,/*,畫一條直線,*,/,box(100,100,300,200,1),;,/*,調(diào),box,函數(shù)畫一個框,*,/,floodfill(110,110,1),;,/*,填充顏色,*,/,setcolor(2),;,/*,設(shè)置當(dāng)前畫圖顏色為綠色,*,/,line(50,200,400,125),;,/*,畫一條直線,*,/,circle(320,175,100),;,/*,畫一個圓,*,/,setcolor(BLUE),;,/*,設(shè)置當(dāng)前畫圖顏色為藍(lán)色,*,/,circ

14、le(100,100,200),;,/*,再畫一個圓,*,/,setfillstyle(SILID-FILL,GREEN),;,/*,設(shè)填充模式,*,/,floodfill(500,250,1),;,/*,填充,*,/,getch( ),;,for(i=0,;,i15,;,i +), setfillstyle(HATCH-FILL, i),;,/*,設(shè)填充線為陰影線,*,/,bar( 20*i, 0, 20*(i+1),20),;,/*,畫矩形條,*,/,getch( ),;,closegraph( ),;,/*,關(guān)閉圖形模式,*,/,void box(x1, y1, x2, y2, colo

15、r) /*,畫一個封閉框,*,/,int x1, y1, x2, y2, color;,setcolor(color),;,line(x1, y1, x1, y2),;,line(x1, y1, x2, y1),;,line(x2, y1, x2, y2),;,line(x2, y2, x1, y2),;,4,、,圖形模式下字符輸出函數(shù),字符輸出,函數(shù),outtext(str),;,作用:,在當(dāng)前位置輸出由,str,指定的,字符串。,說明:,它能用不同的字型、大小,和不同的顯示,方向輸出文字。,字符輸出屬性函數(shù),settextstyle(font, direction, charsize),;

16、,作用:,改變輸出字符串的字型、大小和方向。,說明:,參數(shù),font,確定所用的字型;,direction,的值表示字符的顯示方向。它可以,是,HORIZ-DIR,(,水平輸出,值為,0,),或是,VERT-DIR,(,垂直輸出,值為,1,)。,charsize,是增加字符大小的倍數(shù)(,0 10,)。,字符輸出定位函數(shù),outtextxy(x, y, str),;,作用:,將,str,指向的,字符串輸出到窗口位置,(x,y),上。,5,、,視口操作函數(shù),Turbo C,所有圖形函數(shù)實(shí)際上都是在視口(即窗口)上操作的(在沒有定義視口的情況下,它是整個屏幕)。用戶可以同時建立多個不同大小的視口,,

17、每個視口操作函數(shù)的參數(shù)都是以其左上角(坐標(biāo)為,0,0,)為參考點(diǎn)的相對坐標(biāo)。,設(shè)置視口,函數(shù),setviewport(x1,y1,x2,y2,clipflag);,作用:設(shè)置,左上角坐標(biāo)為,(x1,y1),,,右下角坐標(biāo)為,(x2,y2),的視口。,說明:,clipflag,決定是否顯示超出視口的圖形部分。,0,顯,示;,1,不,顯示。,視口清除,函數(shù),clearviewport( ),;,作用:,清除視口內(nèi)的圖形,。,注意:,使用,setviewport( ),函數(shù),可以在屏幕上開辟多個視口,這些視口可以重迭,但最近一次設(shè)置的視口才是當(dāng)前視口。各圖形函數(shù)都是在當(dāng)前視口中操作。其它視口中的內(nèi)容

18、只要不被清除,就可以保持在屏幕上。,舉例:,通過改變坐標(biāo)位置移動視口,從而實(shí)現(xiàn)一個,立方體的連續(xù)往左移動。,#include,#include,main( ), int gd=DETECT, gm, i,;,initgraph(&gd,&gm,“tc”),;,/*,圖形系統(tǒng)初始化,*,/,cleardevice( ),;,for(i=0; iBGIOBJ EGAVGA,作用:將驅(qū)動程序,EGAVGA.BGI,轉(zhuǎn)換成相應(yīng)的目標(biāo)文件,EGAVGA.OBJ,。,在,tc,子目錄,下輸入命令:,C:TCTLIB LIBgraphics.lib+EGAVGAOBJ,作用:將目標(biāo)文件,EGAVGA,OBJ

19、,添加到,graphics.lib,庫文件中。,在用戶程序調(diào)用,initgraph(),函數(shù),之前應(yīng)加一語句:,registerbgidriver(EGAVGA-driver),;,字體驅(qū)動程序的連接類似。經(jīng)過,上述處理,經(jīng)編譯連接后的執(zhí)行程序便可在任何目錄或其它兼容機(jī)上運(yùn)行了。,二、圖形處理庫函數(shù)應(yīng)用示例,舉例:設(shè)有一組實(shí)驗(yàn)數(shù)據(jù)存于數(shù)組,val,中,將它們用曲,線表示在,x-y,坐標(biāo)平面上。,#include,#include,main( ), float val = 3.9,5.3,7.2,9.6,12.9,10.0,23.2,31.4,39.8,50.2,62.9,56.0,92.0,1

20、05.7,122.8,125.7,150.7, 179.3,203.2,211.0;, char *ch =1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20;,int i,j,x1,x2,y1,y2,n;,char str10;,int graphdriver=DETECT,graphmode;,registerbgidriver(EGAVGA_driver);,initgraph(,/*,圖形系統(tǒng)初始化,*,/,cleardevice(); /*,清屏,*,/,setviewport(20,20,570,450,1); /*,開辟一個圖形

21、視口,*,/,setcolor(1); /*,置當(dāng)前畫圖顏色為藍(lán)色,*,/,n=20;,x1=80; y1=390-1.5*val0;,for (i=0;i=n-1;i+),x2=x1+20;,y2=390-1.5*vali;,setcolor(12);,line(x1,y1,x2,y2); /*,在兩坐標(biāo)點(diǎn)間連線,形成曲線,*,/,setcolor(WHITE);,circle(x2,y2,1); /*,通過畫小圓圈打點(diǎn),*,/,x1=x2; y1=y2;,setcolor(WHITE);,line(80,390,500,390); /*,畫橫軸,*,/,j=0;,for (i=100;i=

22、80+n*20;i=i+20) /*,標(biāo)記橫軸刻度,*,/, line(i,390,i,400);,outtextxy(i-4,405,chj);,j+;,outtextxy(200,420,Every times);,line(80,390,80,5); /*,畫縱軸,*,/,for (j=0;j=300;j=j+50) /*,標(biāo)記縱軸刻度,*,/, line(70,390-1.5*j,80,390-1.5*j);,sprintf(str,%d,j);,/*,將,j,的值轉(zhuǎn)換成串型存于,str,數(shù)組中,*,/,outtextxy(45,390-1.5*j-3,str);,settextsty

23、le(0,1,1);,outtextxy(30,40,Values);,getch();,closegraph(); /*,關(guān)閉圖形模式,*,/,11.3,操作系統(tǒng)接口應(yīng)用,1,、,DOS,基本組成,由引導(dǎo)程序模塊、基本輸入輸出系統(tǒng)、文件管理和系統(tǒng)調(diào)用模塊、命令處理模塊等幾個部分組成。,C,語言可以通過庫函數(shù)實(shí)現(xiàn)與操作系統(tǒng)接口,即調(diào)用操作系統(tǒng)中的子程序,從而實(shí)現(xiàn)用戶應(yīng)用程序的深層次的開發(fā)。,一、,DOS,操作系統(tǒng)簡介,2,、,操作系統(tǒng)接口,DOS,為用戶引用其功能子程序,利用了系統(tǒng)的軟件中斷。通過,CPU,的軟中斷指令,INT n,調(diào)用相應(yīng)的程序。指令中的,n,是中斷調(diào)用號(也稱中斷類型號),

24、中斷調(diào)用號不同,則調(diào)用的程序就不同。,通過軟件中斷調(diào)用,BIOS,中的基本,I/O,服務(wù)子程序,這種方法常被稱為低層接口,。,常用的有:,利,用,INT 10,指令調(diào)用有關(guān)顯示器服務(wù)程序;利用,INT 16H,指令調(diào)用鍵盤服務(wù)程序。,例:設(shè)置顯示器顯示模式為,320*200,彩色圖形模式的匯編語言程序段如下:,MOVAL,,,4,;,設(shè)顯示模式,MOVAH,,,0,;,設(shè)功能號,INT10H,;,系統(tǒng)功能調(diào)用,通過軟件中斷調(diào)用,IBMDOS,模塊中的功能程序,即所謂系統(tǒng)功能調(diào)用,是高層接口。如,INT 21H,指令便是典型的軟件接口,該接口包括了許多子功能。,例,:向顯示器輸出字符“,A,”,

25、的匯編語言程序段如下:,MOVDL,,“,A,”,;,置顯示字符,MOVAH,,,2,;,設(shè)功能號,INT 21H,;,系統(tǒng)功能調(diào)用,使用這兩種接口,用戶就可以在不與極復(fù)雜的硬件接口打交道的情況下,使用系統(tǒng)資源,開發(fā)各種應(yīng)用軟件。,C,語言作為一種中級語言,它的一些庫函數(shù),實(shí)際上,就是調(diào)用了一些系統(tǒng)功能調(diào)用子程序,,用戶可以利用它們來,調(diào)用,BIOS,及,DOS,軟件接口,,以實(shí)現(xiàn)特定功能。,二、,操作系統(tǒng)接口庫函數(shù),1,、,通用軟中斷調(diào)用庫函數(shù),int86(),int86(int intno,union REGS *inregs,union REGS *outregs),;,說明:參數(shù),in

26、tno,表示調(diào)用類型號,相當(dāng)于中斷指令,int n,調(diào),用的中斷類型號,n,;,參數(shù),inregs,用于接收調(diào)用功能號,及相關(guān)的一些入口參數(shù);參數(shù),outregs,用于接收調(diào)用,后的返回值,即出口參數(shù)。,舉例:在屏幕的,35,行、,20,列處顯示字符串“,COMPUTER,”,。,#include ,#include ,#include ,#define VIDEO 0x10 /* 10H,號軟中斷,*,/,main(), union REGS inregs, outregs;,inregs.h.ah = 2; /* 2,號功能,即設(shè)置光標(biāo)位置,*,/,inregs.h.dh = 35; /*

27、,置行號為,35 */,inregs.h.dl = 20; /*,置列號為,20 */,inregs.h.bh = 0; /*,置顯示頁號為,0 */,clrscr();,int86(VIDEO,/*,調(diào)用,BIOS,的子程序?qū)⒐鈽?biāo)定位,*,/,printf(“COMPUTER”);,/*,在當(dāng)前光標(biāo)位置處輸出字符串,*,/,return(0);,2,、,系統(tǒng)功能調(diào)用庫函數(shù),intdos(),和,intdosx(),intdos(union REGS *inregs, union REGS *outregs );,intdosx(union REGS *inregs, union REGS *

28、outregs,struct REGS *segregs);,說明:與,DOS,的系統(tǒng)功能調(diào)用(,INT 21H,),相對應(yīng)。,參數(shù),inregs,是入口參數(shù),表示相應(yīng)的功能號;參數(shù),outregs,是出口參數(shù),保存調(diào)用后的返回值;參數(shù),segregs,是一個結(jié)構(gòu),SREGS,類型的指針,用來設(shè)置和,保存,CPU,段寄存器的值。,3,、,發(fā)送,DOS,命令庫函數(shù),system(),system(char *cmd);,說明:,cmd,為,DOS,系統(tǒng)下的命令字符串。,三、鼠標(biāo)器及其應(yīng)用,安裝好鼠標(biāo)器驅(qū)動程序,并進(jìn)行初始化后,然后在應(yīng)用程序中利用,INT 33H,功能調(diào)用管理鼠標(biāo)器的各種操作。,

29、例,1,:,編寫一個,C,語言函數(shù),完成鼠標(biāo)器初始化工作,,測試鼠標(biāo)安裝情況,顯示檢查結(jié)果。,#include ,union REGS regs,;,int Msinit( ), int recored,;,regs . x . ax = 0,;,/* 0#,功能,初始化鼠標(biāo),*,/,int86(0x33, ®s, ®s),;,/*,調(diào),BIOS,子程序,*,/,recored = regs . x . ax,;,/*,調(diào)用結(jié)果返回在,AX,寄存器中,*,/,if (recored=0), printf(“Mouse not found or Mouse driver,not in

30、stalled.n“),;,return 0,;, /*,初始化不成功,*,/,else return recored,;,/*,初始化成功,*,/,例,2,:,編寫讀取鼠標(biāo)狀態(tài)和鼠標(biāo)位置的函數(shù)。,void Msget ( int *px , int *py , int *pbuttons ), regs . x . ax = 3,;,/*,調(diào)用,3,號功能測試鼠標(biāo)器,*,/,int86(0x33, ®s, ®s),;,*,px = regs . x . cx,;,/ *,返回鼠標(biāo)位置,*,/,*py = regs . x . dx,;,/*,返回鼠標(biāo)位置,*,/,*buttons

31、 = regs . x . bx,;,/*,返回鼠標(biāo)狀態(tài),*,/,12.4 C,語言與匯編語言混合編程,由,C,語言程序直接調(diào)用匯編語言程序的方法有兩種:一種是在程序中嵌入?yún)R編代碼或直接調(diào)用匯編語言子程序。,一、匯編語言子程序的一般格式,.MODEL,內(nèi)存模式,.DATA,;,定義數(shù)據(jù),.CODE,PUBLIC _,子程序名 ;說明在,C,中調(diào)用的子程序名,_,子程序名,PROC,過程類型,;子程序體,RET,_,子程序名,ENDP,;,子程序定義結(jié)束,END,;,程序結(jié)束,說明:,1,、匯編子程序和,C,語言的內(nèi)存模式應(yīng)一致;,2,、 過程類型有,FAR,和,NEAR,兩種,表示,調(diào)用程序和

32、被調(diào)用程序是否在同一個段內(nèi);,3,、,C,語言對應(yīng)的匯編語言中,函數(shù)名和變量名前多加了一個下劃線(,_,),因此在匯編語言中,子程序名前應(yīng)有下劃線。,舉例:匯編語言子程序示例。,.model small,.data,time db 10 ;10,毫秒,.code,public _delay ;,延遲,10ms,_delay proc,mov bl , time,delay: mov cx, 2801,wait: loop wait,dec bl,jnz delay,ret,_delay endp,end,二、全局變量的傳遞,C,語言程序(,extern,),和匯編語言程序(,public,),

33、可以通過全局變量傳遞信息,其數(shù)據(jù)類型的對應(yīng)關(guān)系如下表所示。,由于,C,語言大小寫是有區(qū)別的,從而在與匯編語言混合編程時,最好在,options,菜單下的,Linker,子項(xiàng)中將,Case-Sensitive Link,置成,off,狀態(tài)來取消,其區(qū)別。,三、參數(shù)和返回值的傳遞,C,語言程序和匯編語言程序的參數(shù)傳遞是通過堆棧來完成的。所謂堆棧,實(shí)質(zhì)就是一種先進(jìn)后出的內(nèi)存區(qū)域,且只在一端進(jìn)行出棧和入棧操作。,對,C,語言而言,參數(shù)進(jìn)棧的順序是從右到左。如在,C,語言程序中有語句,power2(int para1,int para2),,,則執(zhí)行該語句時堆棧中的內(nèi)容如下圖,所示,,通過,sp,便可得

34、到參數(shù)值,從而完成參數(shù)的數(shù)據(jù)傳遞。,舉例:設(shè)某,C,語言程序如下:,#include “stdio.h”,int power2(int,int);,main( ), printf(“2,的,4,次方乘以,8,為,:%d”, power2(8,4) ); ,當(dāng)匯編語言子程序有返回值時,是通過,ax,和,dx,寄存器來進(jìn)行傳遞的。,匯編語言子程序如下:,.model small,.code,public _power2,_power2 proc,push bp,mov bp, sp,mov ax, bp+4 ;,將第一個參數(shù)的值,8,送到,ax,中,mov cx, bp+6 ;,將第二個參數(shù)的值,

35、4,送到,cx,中,shl ax, cl ;,將,ax,的內(nèi)容左移,cl,次,每移一次表示乘,2,pop bp,ret,_power2 endp,end,四、匯編語言子程序的匯編及與,C,程序的連接,1,、在集成環(huán)境下,進(jìn)行混合編程的程序編譯連接時,需要先用宏匯編(,MASM.EXE,),將匯編語言程序進(jìn)行匯編,生成,OBJ,文件。然后,將此,OBJ,文件加入到,C,程序中。最后進(jìn)行連接,生成,EXE,文件。,2,、將,OBJ,文件加入到,C,程序,對,Turbo C,而言,非常簡單。先編輯一個工程文件(,*,.prj,),,其內(nèi)容是需要連接的匯編,OBJ,文件和,C,語言文件名列表,如:,m

36、yc.c,mymasm.obj,3,、,然后在,Turbo C,的集成環(huán)境中選擇,project,主菜單中的,project name,項(xiàng),將上面,編輯的工程文件名寫入,便,可進(jìn)行連接。,五、內(nèi)嵌匯編指令的,C,程序結(jié)構(gòu),在,C,程序嵌入?yún)R編指令的格式為:,asm ,例如:,int max,(,int a,,,int b,),asm mov ax,,,a,asm cmp ax,,,b,asm jg ok,asm mov ax,,,b,ok,:,return _ax,; /*_ax,為,Turbo C,定義的偽寄存器變量名,*,/,說明:,在匯編語言代碼中使用的,C,語言變量應(yīng)該初始化,且用,p

37、tr,指明對應(yīng)的匯編語言類型;,偽指令如,db,等不能嵌入;,在,_asm,塊中的注釋為匯編語言的注釋,即分號;,不應(yīng)在,_asm,塊中用,ret,指令返回,而應(yīng)用,C,語言,的,return,返回;,匯編語言指令不需以分號(;)作語句結(jié)束;,也可用“,_asm ,”,的,形式加一行匯編語言指令。,例如:,#include iostream.h,int asmmax(int a,int b), int maxn=0; /*,初始化,maxn */,_asm, mov ax,word ptr a ;,將,a,的值賦給,ax,寄存器,mov dx,word ptr b ;,將,b,的值賦給,dx,

38、寄存器,cmp ax,dx ;,比較,ax,和,dx,的大小,jg ok ; ax,比,dx,大則轉(zhuǎn)標(biāo)號,ok,處,mov ax,dx ;,將,dx,的值賦給,ax,ok:,_asm mov word ptr maxn,ax ;,將,ax,的值賦給,maxn,return maxn ;,main( ), printf(“%d”,asmmax(10,50);,return 0;,六、內(nèi)嵌匯編指令的,C,程序的編譯和連接,對于,Turbo C,而言,內(nèi)嵌匯編指令的,C,程序要用,TCC,命令行來實(shí)現(xiàn)編譯連接,其形式是:,TCC ,“,命令行選項(xiàng)”中與內(nèi)嵌匯編指令程序有關(guān)的選項(xiàng)參考書本。,例如:,T

39、CC I c:tcinclude L c:tclib B ml P1 P2.asm mylib.lib,它表示:在,c:tcinclude,目錄中找包含文件(,-I,);,在,c:tclib,目錄中找?guī)煳募?mylib.lib,(,-L,);,用大模式(,-ml,),編譯文件,P1.c,,,調(diào)用,TASM,對,P2.asm,進(jìn)行編譯,,,連接生成可執(zhí)行文件,P1.exe,。,12.5,綜合應(yīng)用程序示例,-,漢字顯示技術(shù),一、漢字顯示的基本原理,1,、,國標(biāo)漢字字符集與區(qū)位碼,區(qū)位碼:每個漢字在漢字庫中有確定的區(qū)號和位號。區(qū)號在前,位號在后,合成一個,4,位的十進(jìn)制數(shù)字,這就是所謂的區(qū)位碼,用兩

40、個字節(jié)存放,第一個字節(jié)表示區(qū)號,第二個字節(jié)表示位號。只要知道了區(qū)位碼,就可知道該漢字在字庫中的地址。,每個漢字在字庫中以點(diǎn)陣字模形式存儲,點(diǎn)陣有,16,x,16,、,24,x,24,及,32,x,32,等多種。,16,x,16,點(diǎn)陣字庫中,每個點(diǎn)陣字模用,32,個字節(jié)來描述,其中的每個點(diǎn)使用一個二進(jìn)制位。當(dāng)需要顯示時,把某個漢字的,16,x,16,點(diǎn)陣信息直接送到顯示器上,值為,1,的點(diǎn)可以在屏上顯示一個亮點(diǎn);值為,0,的點(diǎn)則不亮,這樣就可顯現(xiàn)出相應(yīng)的漢字。,國標(biāo)碼:與區(qū)位碼之間存在著一種簡單的換算關(guān)系:,國標(biāo)碼的區(qū)號,=,區(qū)位碼的區(qū)號,+ 32,(或,20H,),國標(biāo)碼的位號,=,區(qū)位碼的位

41、號,+ 32,(或,20H,),例如,“計”字的區(qū)位碼為,2838,(或,1C26H,),,其國標(biāo)碼為,6070,(或,3C46H,)。,2,、,漢字內(nèi)碼,漢字內(nèi)碼是漢字信息處理系統(tǒng)內(nèi)部標(biāo)示漢字的編碼,也稱機(jī)內(nèi)碼。它與國標(biāo)碼也存在一種簡單的對應(yīng)關(guān)系:,機(jī)內(nèi)碼區(qū)號,=,國標(biāo)碼的區(qū)號,+ 128,(或,80H,),機(jī)內(nèi)碼位號,=,國標(biāo)碼的位號,+ 128,(或,80H,),例如,“啊”字的區(qū)位碼為,1602,(,1002H,),,國標(biāo)碼為,3022H,,,機(jī)內(nèi)碼為,B0A2H,。,3,、,區(qū)位碼與內(nèi)碼的轉(zhuǎn)化關(guān)系及字模顯示技術(shù),漢字內(nèi)碼與區(qū)位碼存在著固定的轉(zhuǎn)換關(guān)系:,設(shè)某漢字內(nèi)碼的十六進(jìn)制數(shù)表示形式

42、為,0xkkjj,,,則相應(yīng)區(qū)位碼的區(qū)號,qh,和,位號,wh,分別為:,qh=0xkk - 0xa0,;,wh=0xjj - 0xa0,;,在西文狀態(tài)下,對使用漢字的,C,語言程序采用如下方法:讀出漢字的內(nèi)碼,將其轉(zhuǎn)換成字庫的區(qū)位碼,然后直接到字庫中去找出漢字字模。再用有關(guān)的位操作和循環(huán)語句,對字模各個字節(jié)的每一位進(jìn)行判斷。如果某位是,1,,則按設(shè)置的顏色在屏幕的相應(yīng)位置畫點(diǎn),若該位為,0,則不畫點(diǎn)。這樣就可按預(yù)先設(shè)置的顏色在相應(yīng)的位置顯示出該漢字來。,若用十進(jìn)制數(shù)表示內(nèi)碼為,c1c2,則,qh=c1-160,;,wh=c2-160,;,即區(qū)位碼,qw,為,:,qw=100*(c1-160)

43、+(c2-160),;,反之亦可由區(qū)位碼,qw,求得區(qū)號和位號:,qh=qw/100; wh=qw-100*qh;,對于國標(biāo),2312-80,漢字字庫,,漢字庫分成,94,個區(qū),,,每個區(qū)有,94,個位,每個位存,放,一個漢字,,當(dāng),漢字點(diǎn)陣為,1616,時,每個漢字的字模大小為,(1616)/8=32,個字節(jié)。因而該漢字在漢字庫中離起點(diǎn)的偏移位置(以字節(jié)為單位),可由如下表達(dá)式計算:,offset=(94*(qh-1)+(wh-1)*32L;,注意,偏移量對于不同的漢字庫是不相同的。,下面給出幾種常用漢字庫中地址碼,offset,的計算,公式:,ucdos,中的字庫,CCLIB.DAT,存放

44、,16x16,點(diǎn)陣字模:,offset=(qh-1)*94+(wh-1)*32L;,CCDOS 2.13,中的字庫,HZK16,存放,16x16,點(diǎn)陣字模:,offset=(qh-16)*94+wh-1+15*94)*32L;,SPDOS5.0,的簡體字庫,CCLIB.DAT,存放,16x16,點(diǎn)陣字模:,offset=(qh-7)*94+wh-1)*32L;,CCDOS 2.13,中的字庫,hzk24,存放,24x24,點(diǎn)陣字模:,offset=(qh-16)*94+wh-1)*72L;,二、,西文,DOS,環(huán)境下的漢字顯示,1,、,漢字顯示方法,在西文,DOS,環(huán)境下,可以采用畫點(diǎn)或畫線的

45、方法。,利用畫點(diǎn)函數(shù),putpixel(),顯示漢字,根據(jù)漢字字模點(diǎn)陣信息的各個字節(jié)每位的狀態(tài)來判斷是否在相應(yīng)的位置上畫點(diǎn)。若該位為,1,,則在相應(yīng)的位置上用函數(shù),putpixel( ),畫一點(diǎn);若是,0,則跳過。這樣形成的亮點(diǎn)組合起來就是一個漢字的字形。,利用,畫線函數(shù),lineto(),顯示漢字,根據(jù)漢字字模點(diǎn)陣信息可以確定組成漢字,16,線每條線的線型參數(shù),用,setlinestyle(),設(shè)置線型,再由,lineto(),函數(shù)畫,16,點(diǎn)長的線,重復(fù),16,次這樣的過程,畫,16,條不同的線型的直線,就可組成一個漢字。,設(shè)置線型函數(shù),setlinestyle(linestyle, up

46、attern, thickness);,說明:參數(shù),linestyle,用于指定畫線的線型;,參數(shù),upattern,僅,當(dāng)線型參數(shù)為,USERBIT_LINE,時才,起作用。可用,16,位二進(jìn)制、,4,位,16,進(jìn)制或十進(jìn)制數(shù),來表示。表示成,16,位二進(jìn)制數(shù)時,每位代表一個象,素點(diǎn)。若某位是,1,,則線中的對應(yīng)像素用當(dāng)前顏色畫,出來;否則對應(yīng)的象素點(diǎn)用背景色顯示;,參數(shù),thickness,用于指定畫線的寬度。,2,、,漢字的垂直輸出與放大顯示,漢字的垂直輸出是指將漢字逆時針方向旋轉(zhuǎn),90,度,然后進(jìn)行輸出顯示。即將按行輸出漢字字模改為按列輸出就可以實(shí)現(xiàn)。放大漢字的方法是將字模數(shù)據(jù)中的每一

47、位用一個填充長方形或橢圓來表示。,例題:略。,3,、,小字庫技術(shù),在,C,應(yīng)用程序中使用的漢字量一般都比較少。因此,可以把在程序中用到的漢字制作成小字庫,當(dāng)程序運(yùn)行時,首先把小字庫加載到內(nèi)存,在顯示漢字時可直接從內(nèi)存中讀取漢字字模數(shù)據(jù)。這樣既可提高漢字的顯示速度,又避免了由于加載整個漢字庫所造成的內(nèi)存浪費(fèi)或影響程序的運(yùn)行。,舉例:編寫創(chuàng)建一個名為,USER.LIB,小字庫的程序。,#include,#include,#include,#define MAXNUM 100,/*,小字庫最多可容納的漢字?jǐn)?shù)*,/,unsigned char *hzstring=”;,main(), unsigned

48、 char hzmatrixMAXNUM32;,int hzcdeMAXNUM;,long p;,int i,j;,int quma,weima;,unsigned char buf32;,FILE *fp,*cclibfile;,fp=,fopen(user.lib,”wb,”);,if(fp=NULL),printf(“Cant open write file! Press any key to halt”);,getch();,exit(1);,cclibfile=fopen(“hzk16”,”rb”);,if(cclibfile=NULL),printf(“Cant open hzk1

49、6 file! Press any to halt”);,getch();,exit(1);,i=0;,While(*hzstring), quma=*hzstring-0xa0;,/*,計算區(qū)號*,/,weima=*(hzstring+1)-0xa0;,/*,計算位號*,/,p=(quma-1)*94+weima-1;,/*,計算漢字字模的記錄號*,/,p*=32;,/*,字模首址*,/,hzcodei=100*quma+weima;,/*,保存區(qū)位碼,作為漢字索引*,/,fseek(cclibfile,(long)p,SEEK_SET);,/*,將文件指針指向字模首地址*,/,fread(buf,sizeof(unsigned char),32,cclibfile);,/*,讀取字模數(shù)據(jù)*,/,for(j=0;j32;j+),hzmatrixij=bufj;,/*,將字模數(shù)據(jù)存入,hzmatrix*/,hzstring+=2;,i+;,fwrite(hzcode,sizeof(hzcode),1,fp);,/*,記錄區(qū)位碼*,/,fwrite(hzmatrix,sizeof(hzmatrix),1,fp);,/*,向字庫文件寫入字模 *,/,fclose(fp);,fclose(cclibfile);,例題:小字庫的使用。,參照教材。,本章結(jié)束,再見!,同學(xué)們:,

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!