C語(yǔ)言上課課件第12章c語(yǔ)言綜合應(yīng)用程序示例_第1頁(yè)
C語(yǔ)言上課課件第12章c語(yǔ)言綜合應(yīng)用程序示例_第2頁(yè)
C語(yǔ)言上課課件第12章c語(yǔ)言綜合應(yīng)用程序示例_第3頁(yè)
C語(yǔ)言上課課件第12章c語(yǔ)言綜合應(yīng)用程序示例_第4頁(yè)
C語(yǔ)言上課課件第12章c語(yǔ)言綜合應(yīng)用程序示例_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第12章C語(yǔ)言綜合應(yīng)用程序示例北京郵電大學(xué)出版社內(nèi)容提要

多模塊編程方法

圖形處理應(yīng)用

操作系統(tǒng)接口應(yīng)用

C語(yǔ)言與匯編語(yǔ)言混合編程

綜合應(yīng)用程序示例--漢字顯示技術(shù)一個(gè)有實(shí)用價(jià)值的C語(yǔ)言應(yīng)用程序往往較大,需要?jiǎng)澐殖刹煌哪K,分配給不同的程序員去完成。因此,在實(shí)用軟件的開(kāi)發(fā)中,往往需要采用多模塊編程技術(shù)。12.1多模塊編程方法

使用多模塊編程技術(shù)的處理過(guò)程大致如下:

1、首先將一個(gè)大的源程序根據(jù)其功能合理地劃分成若干個(gè)小的源程序,每個(gè)小源程序均以程序文件(.C)的形式保存在磁盤上。并建立一個(gè)包括各個(gè)源程序模塊的文件名的工程文件(.prj)。

2、然后用編譯器進(jìn)行編譯,將工程文件中指定的多個(gè)源程序文件進(jìn)行編譯,生成多個(gè)目標(biāo)文件和一個(gè)可執(zhí)行文件。注意,在分模塊單獨(dú)編譯處理的各個(gè)程序模塊中,必須有且只有一個(gè)主函數(shù)

main()。一、程序模塊組織1、使用外部變量即一個(gè)程序文件file1.c中定義一個(gè)外部變量,另一個(gè)程序文件file2.c中的函數(shù)可以通過(guò)外部變量說(shuō)明后來(lái)使用這個(gè)變量,以實(shí)現(xiàn)模塊間的通信。說(shuō)明形式:extern

類型說(shuō)明符

外部變量名

;

注意:只是進(jìn)行了說(shuō)明,并不是變量定義。2、舉例利用外部變量實(shí)現(xiàn)程序模塊f1.c與程序模塊f2.c之間的通信。

二、模塊之間的通信設(shè)程序模塊文件

f1.c的內(nèi)容如下:

#include<stdio.h>intvar=8;/*全局變量的定義*/

main(){printf(“%d”,var);proc1();printf(“%d\n”,var);}

程序模塊文件f2.c的內(nèi)容如下:externintvar;/*外部變量的說(shuō)明*/proc1(){var=25;}程序編譯連接生成可執(zhí)行文件,執(zhí)行結(jié)果為:

825

1、#include命令經(jīng)過(guò)預(yù)處理后,會(huì)將其后有關(guān)文件的內(nèi)容拷貝到命令所在的源程序文件中。

2、在上一個(gè)例子中,程序要能夠編譯運(yùn)行,需建立一個(gè)工程文件f12.prj,其內(nèi)容為:

f1.cf2.c然后對(duì)f12.prj文件編譯運(yùn)行即可。

3、也可以在f1.c文件開(kāi)頭加一預(yù)處理命令:三、預(yù)處理命令#include的應(yīng)用#include<stdio.h>#include<f2.c>intvar=8;main(){……}對(duì)f1.c文件直接編譯運(yùn)行即可。12.2圖形處理應(yīng)用圖形處理是計(jì)算機(jī)應(yīng)用的一個(gè)極具特色的領(lǐng)域,有很好的應(yīng)用前景,可以增強(qiáng)程序的趣味性、實(shí)用性。一、基本圖形處理庫(kù)函數(shù)

TurboC支持多種顯示適配器的各種顯示模式,提供了畫點(diǎn)、線、圓、橢圓、多邊形以及輸出各種字體等功能的函數(shù)。這些函數(shù)包含在圖形頭文件(graphics.h)中,在進(jìn)行目標(biāo)程序連接時(shí),也必須將圖形庫(kù)文件graphics.lib連接到目標(biāo)程序中去,其圖形接口還包括圖形顯示驅(qū)動(dòng)程序(*.BGI)等。作用:將一個(gè)圖形驅(qū)動(dòng)程序裝入內(nèi)存,并將系統(tǒng)設(shè)置成圖形模式;說(shuō)明:gd指定所用的圖形驅(qū)動(dòng)程序,其值可參照書上的圖形驅(qū)動(dòng)程序常量表;

gm說(shuō)明初始化的圖形模式,其取值見(jiàn)附錄;

path指定驅(qū)動(dòng)程序目錄路徑,空字符時(shí)表示驅(qū)動(dòng)程序就在當(dāng)前目錄下。

例如:若已知所用的圖形適配器為CGA,并打算使用

640×200高分辨率模式CGAHI,則圖形初始化部分可寫成:1、圖形系統(tǒng)初始化函數(shù)⑴顯示模式控制函數(shù)initgraph(gd,gm,path)intgd=CGA,gm=CGAHI;initgraph(&gd,&gm,“\\TC”);⑵自動(dòng)檢測(cè)顯示器硬件的函數(shù)detectgraph(gd,gm)

作用:當(dāng)編程者不知所用的圖形適配器的類型,或者需要編寫在不同圖形模式下均能運(yùn)行的圖形程序,使用該函數(shù)可以完成對(duì)適配器的檢查,獲取顯示器類型號(hào)(賦給gd)及相應(yīng)的顯示模式(賦給gm)。

例如:圖形初始化部分可以寫成:

intgd,gm;detectgraph(&gd,&dm);/*自動(dòng)測(cè)試硬件*/initgraph(&gd,&gm,“\\TC”);

/*根據(jù)測(cè)試結(jié)果進(jìn)行圖形初始化*/⑷恢復(fù)顯示方式函數(shù)closegraph()

作用:關(guān)閉圖形系統(tǒng),返回文本工作方式。⑸恢復(fù)工作模式函數(shù)restorecrtmode()

設(shè)置圖形工作模式函數(shù)setgraphmode()

作用:使顯示器工作方式在圖形和文本方式之間來(lái)回切換。⑶清屏函數(shù)cleardevice()

作用:用于畫圖前進(jìn)行清除屏幕;

作用范圍為整個(gè)屏幕。

2、基本圖形函數(shù)⑴三種最基本的圖形函數(shù):畫點(diǎn)、線、圓函數(shù)畫點(diǎn)函數(shù)

putpixel(x,y,color);作用:將在坐標(biāo)x、y指定的位置上畫一點(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)前顏色畫一個(gè)圓心在(x,y)處,半徑大小為radius的圓。⑵畫圓弧、扇形、橢圓函數(shù)

畫圓弧函數(shù)

arc(x,y,start,end,radius);

作用:用當(dāng)前顏色,以(x,y)為圓心,(start,end)為起止角,radius為半徑畫圓弧。畫扇形函數(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)為兩軸半徑畫橢圓。說(shuō)明:start、end均以角度為單位。⑶畫多邊形、矩形和條形圖函數(shù)

畫多邊形函數(shù)drawpoly(numpoints,points);

作用:用當(dāng)前顏色畫一個(gè)多邊形,多邊形的頂點(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)畫一個(gè)矩形。

畫條形圖函數(shù)bar(left,top,right,bottom);

bar3d(left,top,right,bottom,depth,topflag);作用:用當(dāng)前顏色,畫一實(shí)心條形圖;

depth決定bar3d()產(chǎn)生的三維條形圖的厚度,

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

為封閉圖形中的任意一點(diǎn),bordercolor是封閉圖形的邊框顏色。⑶填充模式函數(shù)setfillstyle(pattern,color);作用:來(lái)設(shè)定floodfill()函數(shù)的填充模式。說(shuō)明:參數(shù)pattern的值及其符號(hào)如下表所示。

舉例:利用基本作圖函數(shù)及顏色控制函數(shù)畫圖。#include<graphics.h>#include<stdio.h>#include<conio.h>voidbox(int,int,int,int);main(){intgd=DETECT,gm,i;

/*將圖形模式設(shè)置成缺省模式*/initgraph(&gd,&gm,“\\tc”);

/*根據(jù)測(cè)試結(jié)果進(jìn)行圖形初始化*/cleardevice();

/*清屏幕*/setcolor(1);

/*設(shè)置當(dāng)前畫圖顏色為藍(lán)色*/line(0,0,639,349);

/*畫一條直線*/box(100,100,300,200,1);

/*調(diào)box函數(shù)畫一個(gè)框*/floodfill(110,110,1);

/*填充顏色*/setcolor(2);

/*設(shè)置當(dāng)前畫圖顏色為綠色*/line(50,200,400,125);

/*畫一條直線*/circle(320,175,100);

/*畫一個(gè)圓*/

setcolor(BLUE);

/*設(shè)置當(dāng)前畫圖顏色為藍(lán)色*/circle(100,100,200);

/*再畫一個(gè)圓*/setfillstyle(SILID-FILL,GREEN);

/*設(shè)填充模式*/floodfill(500,250,1);

/*填充*/getch();

for(i=0;i<15;i++){setfillstyle(HATCH-FILL,i);

/*設(shè)填充線為陰影線*/bar(20*i,0,20*(i+1),20);

/*畫矩形條*/}getch();

closegraph();

/*關(guān)閉圖形模式*/}voidbox(x1,y1,x2,y2,color)/*畫一個(gè)封閉框*/intx1,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指定的字符串。說(shuō)明:它能用不同的字型、大小,和不同的顯示方向輸出文字。⑵字符輸出屬性函數(shù)

settextstyle(font,direction,charsize);

作用:改變輸出字符串的字型、大小和方向。說(shuō)明:參數(shù)font確定所用的字型;

direction的值表示字符的顯示方向。它可以是HORIZ-DIR(水平輸出,值為0),或是

VERT-DIR(垂直輸出,值為1)。

charsize是增加字符大小的倍數(shù)(0~10)。⑶字符輸出定位函數(shù)

outtextxy(x,y,str);

作用:將str指向的字符串輸出到窗口位置(x,y)上。5、視口操作函數(shù)

TurboC所有圖形函數(shù)實(shí)際上都是在視口(即窗口)上操作的(在沒(méi)有定義視口的情況下,它是整個(gè)屏幕)。用戶可以同時(shí)建立多個(gè)不同大小的視口,每個(gè)視口操作函數(shù)的參數(shù)都是以其左上角(坐標(biāo)為0,0)為參考點(diǎn)的相對(duì)坐標(biāo)。

⑴設(shè)置視口函數(shù)setviewport(x1,y1,x2,y2,clipflag);

作用:設(shè)置左上角坐標(biāo)為(x1,y1),右下角坐標(biāo)為

(x2,y2)的視口。說(shuō)明:clipflag決定是否顯示超出視口的圖形部分。

0—顯示;1—不顯示。

⑵視口清除函數(shù)clearviewport();

作用:清除視口內(nèi)的圖形。

注意:使用setviewport()函數(shù)可以在屏幕上開(kāi)辟多個(gè)視口,這些視口可以重迭,但最近一次設(shè)置的視口才是當(dāng)前視口。各圖形函數(shù)都是在當(dāng)前視口中操作。其它視口中的內(nèi)容只要不被清除,就可以保持在屏幕上。舉例:通過(guò)改變坐標(biāo)位置移動(dòng)視口,從而實(shí)現(xiàn)一個(gè)立方體的連續(xù)往左移動(dòng)。#include<graphics.h>#include<stdio.h>main(){intgd=DETECT,gm,i;

initgraph(&gd,&gm,“\\tc”);

/*圖形系統(tǒng)初始化*/

cleardevice();

for(i=0;i<10;i++){setfillstyle(1,i);

setviewport(10*i,0,639,199,1);

/*開(kāi)辟一個(gè)視口*/setcolor(5);

bar3d(10,120,60,150,40,1);/*畫一個(gè)三維立方體*/

floodfill(70,130,5);

/*填充側(cè)面顏色*/floodfill(30,110,5);

/*填頂部顏色*/delay(300);

/*延時(shí)*/clearviewport();

/*清除視口*/}closegraph();

}6、建立獨(dú)立運(yùn)行的圖形處理程序

要脫離

TurboC集成環(huán)境,建立可獨(dú)立運(yùn)行的可執(zhí)行圖形程序,必須將圖形驅(qū)動(dòng)程序(有的還要將字體驅(qū)動(dòng)程序)連接到可執(zhí)行的圖形程序中。⑴在\tc子目錄下輸入命令:

C:\TC>BGIOBJEGAVGA↙

作用:將驅(qū)動(dòng)程序EGAVGA.BGI轉(zhuǎn)換成相應(yīng)的目標(biāo)文件EGAVGA.OBJ。⑵在\tc子目錄下輸入命令:

C:\TC>TLIBLIB\graphics.lib+EGAVGA·OBJ↙

作用:將目標(biāo)文件EGAVGA·OBJ添加到

graphics.lib庫(kù)文件中。⑶在用戶程序調(diào)用initgraph()函數(shù)之前應(yīng)加一語(yǔ)句:

registerbgidriver(EGAVGA-driver);

字體驅(qū)動(dòng)程序的連接類似。經(jīng)過(guò)上述處理,經(jīng)編譯連接后的執(zhí)行程序便可在任何目錄或其它兼容機(jī)上運(yùn)行了。

二、圖形處理庫(kù)函數(shù)應(yīng)用示例舉例:設(shè)有一組實(shí)驗(yàn)數(shù)據(jù)存于數(shù)組val中,將它們用曲線表示在

x-y坐標(biāo)平面上。

#include<graphics.h>#include<math.h>main(){floatval[]={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,105.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"};inti,j,x1,x2,y1,y2,n;charstr[10];intgraphdriver=DETECT,graphmode;registerbgidriver(EGAVGA_driver);initgraph(&graphdriver,&graphmode,"");/*圖形系統(tǒng)初始化*/cleardevice();/*清屏*/setviewport(20,20,570,450,1);/*開(kāi)辟一個(gè)圖形視口*/setcolor(1);/*置當(dāng)前畫圖顏色為藍(lán)色*/n=20;x1=80;y1=390-1.5*val[0];for(i=0;i<=n-1;i++){x2=x1+20;y2=390-1.5*val[i];setcolor(12);line(x1,y1,x2,y2);/*在兩坐標(biāo)點(diǎn)間連線,形成曲線*/setcolor(WHITE);circle(x2,y2,1);/*通過(guò)畫小圓圈打點(diǎn)*/x1=x2;y1=y2;}setcolor(WHITE);line(80,390,500,390);/*畫橫軸*/

j=0;for(i=100;i<=80+n*20;i=i+20)/*標(biāo)記橫軸刻度*/{line(i,390,i,400);outtextxy(i-4,405,ch[j]);j++;}outtextxy(200,420,"Everytimes");

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);}

settextstyle(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)用模塊、命令處理模塊等幾個(gè)部分組成。

C語(yǔ)言可以通過(guò)庫(kù)函數(shù)實(shí)現(xiàn)與操作系統(tǒng)接口,即調(diào)用操作系統(tǒng)中的子程序,從而實(shí)現(xiàn)用戶應(yīng)用程序的深層次的開(kāi)發(fā)。一、DOS操作系統(tǒng)簡(jiǎn)介

2、操作系統(tǒng)接口

DOS為用戶引用其功能子程序,利用了系統(tǒng)的軟件中斷。通過(guò)CPU的軟中斷指令I(lǐng)NTn調(diào)用相應(yīng)的程序。指令中的n是中斷調(diào)用號(hào)(也稱中斷類型號(hào)),中斷調(diào)用號(hào)不同,則調(diào)用的程序就不同。通過(guò)軟件中斷調(diào)用

BIOS中的基本I/O服務(wù)子程序,這種方法常被稱為低層接口。常用的有:利用

INT10指令調(diào)用有關(guān)顯示器服務(wù)程序;利用

INT16H指令調(diào)用鍵盤服務(wù)程序。例:設(shè)置顯示器顯示模式為320*200彩色圖形模式的匯編語(yǔ)言程序段如下:MOV AL,4;

設(shè)顯示模式MOV AH,0;

設(shè)功能號(hào)INT 10H ;系統(tǒng)功能調(diào)用通過(guò)軟件中斷調(diào)用IBMDOS模塊中的功能程序,即所謂系統(tǒng)功能調(diào)用,是高層接口。如INT21H指令便是典型的軟件接口,該接口包括了許多子功能。

:向顯示器輸出字符“A”的匯編語(yǔ)言程序段如下:MOV DL,“A”

;

置顯示字符MOV AH,2;

設(shè)功能號(hào)

INT21H ;系統(tǒng)功能調(diào)用

使用這兩種接口,用戶就可以在不與極復(fù)雜的硬件接口打交道的情況下,使用系統(tǒng)資源,開(kāi)發(fā)各種應(yīng)用軟件。

C語(yǔ)言作為一種中級(jí)語(yǔ)言,它的一些庫(kù)函數(shù)實(shí)際上就是調(diào)用了一些系統(tǒng)功能調(diào)用子程序,用戶可以利用它們來(lái)調(diào)用BIOS及DOS軟件接口,以實(shí)現(xiàn)特定功能。二、操作系統(tǒng)接口庫(kù)函數(shù)1、通用軟中斷調(diào)用庫(kù)函數(shù)int86()int86(intintno,unionREGS*inregs,unionREGS*outregs);說(shuō)明:參數(shù)intno表示調(diào)用類型號(hào),相當(dāng)于中斷指令intn調(diào)用的中斷類型號(hào)n;參數(shù)inregs用于接收調(diào)用功能號(hào)及相關(guān)的一些入口參數(shù);參數(shù)outregs用于接收調(diào)用后的返回值,即出口參數(shù)。舉例:在屏幕的35行、20列處顯示字符串“COMPUTER”。

#include<stdio.h>#include<dos.h>#include<conio.h>

#defineVIDEO0x10/*10H號(hào)軟中斷*/main(){unionREGSinregs,outregs;inregs.h.ah=2;/*2號(hào)功能,即設(shè)置光標(biāo)位置*/inregs.h.dh=35;/*置行號(hào)為

35*/inregs.h.dl=20;/*置列號(hào)為

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

intdos()和intdosx()

intdos(unionREGS*inregs,unionREGS*outregs);intdosx(unionREGS*inregs,unionREGS*outregs,structREGS*segregs);說(shuō)明:與DOS的系統(tǒng)功能調(diào)用(INT21H)相對(duì)應(yīng)。參數(shù)inregs是入口參數(shù),表示相應(yīng)的功能號(hào);參數(shù)

outregs是出口參數(shù),保存調(diào)用后的返回值;參數(shù)

segregs是一個(gè)結(jié)構(gòu)SREGS類型的指針,用來(lái)設(shè)置和保存CPU段寄存器的值。3、發(fā)送DOS命令庫(kù)函數(shù)

system()

system(char*cmd);說(shuō)明:cmd為DOS系統(tǒng)下的命令字符串。三、鼠標(biāo)器及其應(yīng)用

安裝好鼠標(biāo)器驅(qū)動(dòng)程序,并進(jìn)行初始化后,然后在應(yīng)用程序中利用

INT33H功能調(diào)用管理鼠標(biāo)器的各種操作。例1:編寫一個(gè)C語(yǔ)言函數(shù),完成鼠標(biāo)器初始化工作,測(cè)試鼠標(biāo)安裝情況,顯示檢查結(jié)果。

#include<dos.h>unionREGSregs;

intMsinit(){intrecored;

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(“MousenotfoundorMousedrivernotinstalled.\n“);

return0;}/*初始化不成功*/elsereturnrecored;

/*初始化成功*/}例2:編寫讀取鼠標(biāo)狀態(tài)和鼠標(biāo)位置的函數(shù)。

voidMsget(int*px,int*py,int*pbuttons){regs.x.ax=3;

/*調(diào)用3號(hào)功能測(cè)試鼠標(biāo)器*/int86(0x33,®s,®s);*px=regs.x.cx;

/*返回鼠標(biāo)位置*/*py=regs.x.dx;

/*返回鼠標(biāo)位置*/*buttons=regs.x.bx;

/*返回鼠標(biāo)狀態(tài)*/}12.4C語(yǔ)言與匯編語(yǔ)言混合編程由C語(yǔ)言程序直接調(diào)用匯編語(yǔ)言程序的方法有兩種:一種是在程序中嵌入?yún)R編代碼或直接調(diào)用匯編語(yǔ)言子程序。一、匯編語(yǔ)言子程序的一般格式

.MODEL內(nèi)存模式.DATA……;定義數(shù)據(jù).CODEPUBLIC_子程序名;說(shuō)明在C中調(diào)用的子程序名_子程序名

PROC過(guò)程類型

……;子程序體RET_子程序名

ENDP;子程序定義結(jié)束

END;程序結(jié)束說(shuō)明:

1、匯編子程序和C語(yǔ)言的內(nèi)存模式應(yīng)一致;

2、過(guò)程類型有FAR和NEAR兩種,表示調(diào)用程序和被調(diào)用程序是否在同一個(gè)段內(nèi);

3、C語(yǔ)言對(duì)應(yīng)的匯編語(yǔ)言中,函數(shù)名和變量名前多加了一個(gè)下劃線(_),因此在匯編語(yǔ)言中,子程序名前應(yīng)有下劃線。舉例:匯編語(yǔ)言子程序示例。

.modelsmall

.datatimedb10;10毫秒.codepublic_delay;延遲10ms_delayprocmovbl,timedelay:movcx,2801wait:loopwaitdecbljnzdelayret_delayendpend二、全局變量的傳遞

C語(yǔ)言程序(extern)和匯編語(yǔ)言程序(public)可以通過(guò)全局變量傳遞信息,其數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系如下表所示。

由于C語(yǔ)言大小寫是有區(qū)別的,從而在與匯編語(yǔ)言混合編程時(shí),最好在options菜單下的Linker子項(xiàng)中將Case-SensitiveLink置成off狀態(tài)來(lái)取消其區(qū)別。

三、參數(shù)和返回值的傳遞

C語(yǔ)言程序和匯編語(yǔ)言程序的參數(shù)傳遞是通過(guò)堆棧來(lái)完成的。所謂堆棧,實(shí)質(zhì)就是一種先進(jìn)后出的內(nèi)存區(qū)域,且只在一端進(jìn)行出棧和入棧操作。對(duì)C語(yǔ)言而言,參數(shù)進(jìn)棧的順序是從右到左。如在C語(yǔ)言程序中有語(yǔ)句power2(intpara1,intpara2),則執(zhí)行該語(yǔ)句時(shí)堆棧中的內(nèi)容如下圖所示,通過(guò)sp便可得到參數(shù)值,從而完成參數(shù)的數(shù)據(jù)傳遞。舉例:設(shè)某C語(yǔ)言程序如下:

#include“stdio.h”

intpower2(int,int);

main()

{printf(“2的4次方乘以8為:%d”,power2(8,4));}當(dāng)匯編語(yǔ)言子程序有返回值時(shí),是通過(guò)ax和dx寄存器來(lái)進(jìn)行傳遞的。

匯編語(yǔ)言子程序如下:

.modelsmall

.code

public_power2

_power2proc

pushbpmovbp,spmovax,[bp+4];將第一個(gè)參數(shù)的值8送到ax中

movcx,[bp+6];將第二個(gè)參數(shù)的值4送到cx中

shlax,cl;將ax的內(nèi)容左移cl次,每移一次表示乘2popbpret

_power2endpend四、匯編語(yǔ)言子程序的匯編及與C程序的連接

1、在集成環(huán)境下,進(jìn)行混合編程的程序編譯連接時(shí),需要先用宏匯編(MASM.EXE)將匯編語(yǔ)言程序進(jìn)行匯編,生成OBJ文件。然后,將此OBJ文件加入到C程序中。最后進(jìn)行連接,生成EXE文件。

2、將OBJ文件加入到C程序,對(duì)TurboC而言,非常簡(jiǎn)單。先編輯一個(gè)工程文件(*.prj),其內(nèi)容是需要連接的匯編OBJ文件和C語(yǔ)言文件名列表,如:

myc.cmymasm.obj3、然后在TurboC的集成環(huán)境中選擇

project主菜單中的

projectname項(xiàng),將上面編輯的工程文件名寫入,便可進(jìn)行連接。

五、內(nèi)嵌匯編指令的C程序結(jié)構(gòu)在C程序嵌入?yún)R編指令的格式為:

asm<操作碼><操作數(shù)><;或換行>

例如:intmax(inta,intb){asmmovax,aasmcmpax,basmjgokasmmovax,b

ok:return_ax;/*_ax為TurboC定義的偽寄存器變量名*/}說(shuō)明:

⑴在匯編語(yǔ)言代碼中使用的C語(yǔ)言變量應(yīng)該初始化且用ptr指明對(duì)應(yīng)的匯編語(yǔ)言類型;

⑵偽指令如

db等不能嵌入;

⑶在_asm塊中的注釋為匯編語(yǔ)言的注釋,即分號(hào);

⑷不應(yīng)在

_asm塊中用

ret指令返回,而應(yīng)用C語(yǔ)言的return返回;

⑸匯編語(yǔ)言指令不需以分號(hào)(;)作語(yǔ)句結(jié)束;

⑹也可用“_asm<操作碼><操作數(shù)><;或換行>”的形式加一行匯編語(yǔ)言指令。例如:

#include"iostream.h"intasmmax(inta,intb){intmaxn=0;/*初始化maxn*/_asm {movax,wordptra;將a的值賦給ax寄存器

movdx,wordptrb;將b的值賦給dx寄存器

cmpax,dx;比較ax和dx的大小

jgok;ax比dx大則轉(zhuǎn)標(biāo)號(hào)ok處

movax,dx};將dx的值賦給axok:

_asmmovwordptrmaxn,ax;將ax的值賦給maxnreturnmaxn;}main(){printf(“%d”,asmmax(10,50));return0;

}六、內(nèi)嵌匯編指令的C程序的編譯和連接對(duì)于TurboC而言,內(nèi)嵌匯編指令的C程序要用TCC命令行來(lái)實(shí)現(xiàn)編譯連接,其形式是:

TCC<命令行選項(xiàng)><文件名>“命令行選項(xiàng)”中與內(nèi)嵌匯編指令程序有關(guān)的選項(xiàng)參考書本。例如:

TCC–Ic:\tc\include–Lc:\tc\lib–B–mlP1P2.asmmylib.lib它表示:在c:\tc\include目錄中找包含文件(-I);

在c:\tc\lib目錄中找?guī)煳募ylib.lib(-L);用大模式(-ml)編譯文件P1.c,調(diào)用TASM對(duì)

P2.asm進(jìn)行編譯,連接生成可執(zhí)行文件P1.exe。12.5綜合應(yīng)用程序示例--漢字顯示技術(shù)

一、漢字顯示的基本原理

1、國(guó)標(biāo)漢字字符集與區(qū)位碼

區(qū)位碼:每個(gè)漢字在漢字庫(kù)中有確定的區(qū)號(hào)和位號(hào)。區(qū)號(hào)在前,位號(hào)在后,合成一個(gè)4位的十進(jìn)制數(shù)字,這就是所謂的區(qū)位碼,用兩個(gè)字節(jié)存放,第一個(gè)字節(jié)表示區(qū)號(hào),第二個(gè)字節(jié)表示位號(hào)。只要知道了區(qū)位碼,就可知道該漢字在字庫(kù)中的地址。每個(gè)漢字在字庫(kù)中以點(diǎn)陣字模形式存儲(chǔ),點(diǎn)陣有16x16

、24x24及32x32等多種。16x16點(diǎn)陣字庫(kù)中,每個(gè)點(diǎn)陣字模用32個(gè)字節(jié)來(lái)描述,其中的每個(gè)點(diǎn)使用一個(gè)二進(jìn)制位。當(dāng)需要顯示時(shí),把某個(gè)漢字的16x16點(diǎn)陣信息直接送到顯示器上,值為1的點(diǎn)可以在屏上顯示一個(gè)亮點(diǎn);值為0的點(diǎn)則不亮,這樣就可顯現(xiàn)出相應(yīng)的漢字。國(guó)標(biāo)碼:與區(qū)位碼之間存在著一種簡(jiǎn)單的換算關(guān)系:國(guó)標(biāo)碼的區(qū)號(hào)=區(qū)位碼的區(qū)號(hào)+32(或20H)國(guó)標(biāo)碼的位號(hào)=區(qū)位碼的位號(hào)+32(或20H)例如,“計(jì)”字的區(qū)位碼為2838(或1C26H),其國(guó)標(biāo)碼為6070(或3C46H)。2、漢字內(nèi)碼

漢字內(nèi)碼是漢字信息處理系統(tǒng)內(nèi)部標(biāo)示漢字的編碼,也稱機(jī)內(nèi)碼。它與國(guó)標(biāo)碼也存在一種簡(jiǎn)單的對(duì)應(yīng)關(guān)系:機(jī)內(nèi)碼區(qū)號(hào)=國(guó)標(biāo)碼的區(qū)號(hào)+128(或80H)機(jī)內(nèi)碼位號(hào)=國(guó)標(biāo)碼的位號(hào)+128(或80H)例如,“啊”字的區(qū)位碼為1602(1002H),國(guó)標(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ù)表示形式為0xkkjj,則相應(yīng)區(qū)位碼的區(qū)號(hào)qh和位號(hào)wh分別為:qh=0xkk-0xa0;

wh=0xjj-0xa0;

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

qh=c1-160;

wh=c2-160;即區(qū)位碼qw為:

qw=100*(c1-160)+(c2-160);反之亦可由區(qū)位碼qw求得區(qū)號(hào)和位號(hào):

qh=qw/100; wh=qw-100*qh;對(duì)于國(guó)標(biāo)2312-80漢字字庫(kù),漢字庫(kù)分成94個(gè)區(qū),每個(gè)區(qū)有94個(gè)位,每個(gè)位存放一個(gè)漢字,當(dāng)漢字點(diǎn)陣為16×16時(shí),每個(gè)漢字的字模大小為(16×16)/8=32個(gè)字節(jié)。因而該漢字在漢字庫(kù)中離起點(diǎn)的偏移位置(以字節(jié)為單位),可由如下表達(dá)式計(jì)算:

offset=(94*(qh-1)+(wh-1))*32L;注意,偏移量對(duì)于不同的漢字庫(kù)是不相同的。下面給出幾種常用漢字庫(kù)中地址碼offset的計(jì)算公式:⑴ucdos中的字庫(kù)CCLIB.DAT存放16x16點(diǎn)陣字模:

offset=((qh-1)*94+(wh-1))*32L;⑵CCDOS2.13中的字庫(kù)HZK16存放16x16點(diǎn)陣字模:

offset=((qh-16)*94+wh-1+15*94)*32L;⑶SPDOS5.0的簡(jiǎn)體字庫(kù)CCLIB.DAT存放16x16點(diǎn)陣字模:

offset=((qh-7)*94+wh-1)*32L;⑷CCDOS2.13中的字庫(kù)hzk24存放24x24點(diǎn)陣字模:

offset=((qh-16)*94+wh-1)*72L;

二、西文DOS環(huán)境下的漢字顯示

1、漢字顯示方法在西文DOS環(huán)境下,可以采用畫點(diǎn)或畫線的方法。⑴利用畫點(diǎn)函數(shù)putpixel()顯示漢字根據(jù)漢字字模點(diǎn)陣信息的各個(gè)字節(jié)每位的狀態(tài)來(lái)判斷是否在相應(yīng)的位置上畫點(diǎn)。若該位為1,則在相應(yīng)的位置上用函數(shù)putpixel()畫一點(diǎn);若是0則跳過(guò)。這樣形成的亮點(diǎn)組合起來(lái)就是一個(gè)漢字的字形。

⑵利用畫線函數(shù)lineto()顯示漢字

根據(jù)漢字字模點(diǎn)陣信息可以確定組成漢字16線每條線的線型參數(shù),用setlinestyle()設(shè)置線型,再由lineto()函數(shù)畫16點(diǎn)長(zhǎng)的線,重復(fù)16次這樣的過(guò)程,畫16條不同的線型的直線,就可組成一個(gè)漢字。設(shè)置線型函數(shù)setlinestyle(line

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論