




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上目錄摘要本繪圖程序人機(jī)交互性好,可以方便的調(diào)節(jié)矩形,三角,圓的大小和形狀。在采用bresenham算法提高了運(yùn)行速度同時(shí),圖形的顯示方法是采用寫像素的方法定位精確軌跡平滑。同時(shí)還增加了動(dòng)態(tài)顯示效果,可以直觀的看到像素點(diǎn)的移動(dòng)。程序在編譯之后只有2KB大小占用內(nèi)存小運(yùn)算快速。關(guān)鍵字:繪圖 動(dòng)態(tài)顯示 任意大小計(jì)算機(jī)圖形顯示軟件設(shè)計(jì)1 方案選擇1.1字符構(gòu)成圖形在圖形由字符構(gòu)成時(shí),屏幕的顯示模式為為文字型。編程簡單但是圖像質(zhì)量和交互性很差1.2在圖片模式下直接導(dǎo)入相關(guān)圖形的圖片程序較易實(shí)現(xiàn),顯示的效果非常好。但是圖片在取模之后很大,在讀取像素寫像素時(shí)較慢。交互性也不好1.3
2、在圖片模式下采用計(jì)算求點(diǎn)寫像素的方法繪圖程序編程復(fù)雜,算法復(fù)雜。繪圖效果較好,程序很靈活可以顯示各種形狀大小的三角,矩形和圓。交互性很好而且還可以改變顏色,添加動(dòng)態(tài)顯示,實(shí)現(xiàn)圖像移動(dòng)等效果。1.4在圖片模式下采用鼠標(biāo)繪圖程序的交互性很好,可以很方便的確定圖形繪制的位置和大小。但是編程太復(fù)雜,查閱了有關(guān)資料。是使用dos中斷來調(diào)用鼠標(biāo),之后對鼠標(biāo)跟蹤控制。在綜合比較之下,程序的性能是首要考慮的指標(biāo)。方案三和方案四比起來較易編寫一些。所以最終采用的是方案三。2 編程思想在程序設(shè)計(jì)時(shí)采用先整體再分塊,模塊化編程的思想。首先整體設(shè)計(jì)出程序的框架,寫好主程序。再分模塊寫好各個(gè)子函數(shù)。調(diào)試好一個(gè)功能后再去
3、編寫下一個(gè)模塊。主函數(shù)的主體是一個(gè)分支選擇程序。包含了三個(gè)繪圖模塊圓,三角,矩形的數(shù)據(jù)定義和分支入口程序段。而三個(gè)繪圖子模塊中又各自包含了若干子函數(shù)。同時(shí)為了使程序緊湊,還編寫了一些各個(gè)子模塊公共使用的子函數(shù)。程序概要框架圖如下圖1:程序概要框架圖3 程序設(shè)計(jì)3.1主程序設(shè)計(jì)主程序主體是一個(gè)分支選擇程序,包含了提示菜單,輸入部分和選擇部分。采用MOV AH,9 INT 21H中斷在屏幕上輸出提示信息。MOV AH,1 INT 21H從鍵盤輸入一個(gè)字符將它的存在AL中再與1,2,3,q相比較跳轉(zhuǎn)到響應(yīng)的子函數(shù)入口程序段中。同時(shí)還設(shè)計(jì)了檢驗(yàn)輸入的程序段再輸入不為1,2,3 q,時(shí)將自動(dòng)跳轉(zhuǎn)提示重新
4、輸入。圖2:主程序流程圖3.2矩形子程序設(shè)計(jì)在矩形子程序中采用寫像素點(diǎn)的方法,點(diǎn)動(dòng)成線將四條線一條一條的畫出來。首先提示輸入信息輸入矩形的長和寬。調(diào)用一個(gè)輸入函數(shù)將輸入數(shù)據(jù)以16進(jìn)制的方式存入AX中,再轉(zhuǎn)存到L_S ,W_S 中。之后將屏幕的模式設(shè)為圖像模式640*480*16色,將長和寬一次存入CX中采用循環(huán)LOOP指令。保持X不變Y依次增加或者Y不變X依次增加將四條直線一一畫出。同時(shí)為了使顯示效果更好一些對線條進(jìn)行了加粗,寬度為兩個(gè)像素。為了使程序結(jié)構(gòu)清晰編寫了WRITE_PIXEL宏指令,每調(diào)用一次就畫出一個(gè)點(diǎn)。而且可以認(rèn)為的設(shè)定點(diǎn)的位置顏色等。在函數(shù)中還加入了延時(shí)子程序,每畫完一個(gè)點(diǎn)之
5、后就調(diào)用一個(gè)延時(shí)子程序。這樣就可以在屏幕上實(shí)現(xiàn)動(dòng)態(tài)顯示。在這部分的程序設(shè)計(jì)中也是采用模塊化的思想,先畫出一條直線。改變參數(shù)就可以畫出另外的三條直線。同時(shí)在屏幕模式設(shè)定時(shí)也編寫宏指令SETMODE。調(diào)用的宏指令如下WRITE_PIXEL MACRO PAGE1,ROW,COLUMN,COLORMOV AH,0CHMOV AL,COLORMOV BH,PAGE1MOV DX,ROWMOV CX,COLUMNINT 10HENDMSETMODE MACRO MODE1MOV AH,0MOV AL,MODE1INT 10HENDM子程序流程圖如下圖3:矩形子程序流程圖3.3三角形子程序設(shè)計(jì)在三角形繪制
6、中程序也分為幾個(gè)部分,首先是三個(gè)頂點(diǎn)的輸入子程序。然后將三個(gè)頂點(diǎn)壓棧,再調(diào)用Bresenham畫線子程序。在Bresenham畫線子程序中依次調(diào)用寫像素子程序和延時(shí)子程序?qū)崿F(xiàn)三條線段的動(dòng)態(tài)顯示。三角部分整體程序框架圖如圖4:三角子程序框架圖Bresenham畫線算法是繪制三角形的核心程序,分析如下Bresenham算法是計(jì)算機(jī)圖形學(xué)中為了“顯示器(屏幕或打印機(jī))系由像素構(gòu)成”的這個(gè)特性而設(shè)計(jì)出來的算法,使得在求直線各點(diǎn)的過程中全部以整數(shù)來運(yùn)算,因而大幅度提升計(jì)算速度。Bresenham算法是計(jì)算機(jī)圖形學(xué)領(lǐng)域使用最廣泛的直線掃描轉(zhuǎn)換方法。其原理是過各行、各列像素中心構(gòu)造一組虛擬網(wǎng)格線,按直線從起
7、點(diǎn)到終點(diǎn)順序計(jì)算直線各垂直網(wǎng)格線的交點(diǎn),然后確定該列像素中與此交點(diǎn)最近的像素。 該算法的優(yōu)點(diǎn)在于可以采用增量計(jì)算,使得對于每一列,只要檢查一個(gè)誤差項(xiàng) 的符號(hào),就可以確定該列所求的像素。例如對于直線方程Y=kX+b;A:0<K<1時(shí)候的算法 1:輸入線段的兩個(gè)端點(diǎn)Point1和Point2,并且存儲(chǔ)到Point1(x1,y1)和Point2(x2,y2)中; 2:將Point1載入楨緩存,繪畫第一個(gè)起始點(diǎn); 3:計(jì)算常量x、y、2y和2(y-x),并且獲得一個(gè)決策參數(shù)的第一個(gè)值:P = 2y-x; 4:從n=0開始,在沿線經(jīng)過每個(gè)Xn處
8、,進(jìn)行下面的檢測: 如果Pn<0,下一個(gè)點(diǎn)繪制的是(Xn+1,yn),并且Pn+1=Pn+2y如果P0>=0,下一個(gè)點(diǎn)繪制的是(Xn+1,Yn+1),并且Pn+1=Pn+2(y-x) 5:重復(fù)執(zhí)行x-1次步驟4;B:斜率k= 1或斜率k=0時(shí)候的算法 對于斜率等于0或者斜率等于1時(shí)候,不需要通過算法直接的對于其中單一坐標(biāo)變量進(jìn)行處理。C:斜率k<0的情況算法將起始點(diǎn)和中止點(diǎn)坐標(biāo)Point1和Point2交換,可以轉(zhuǎn)化到斜率為0和1之內(nèi)的算法去實(shí)現(xiàn)。3.3圓形子程序設(shè)計(jì)圖5:圓形子程序框架圖在圓繪制模塊中同樣是采用Bre
9、senham畫線算法。先由鍵盤輸入圓半徑,再設(shè)置成圖形模式。在調(diào)用圓Bresenham子程序?qū)⑾嚓P(guān)點(diǎn)堆棧,然后再調(diào)用圓畫點(diǎn)子程序在屏幕上下左右四個(gè)點(diǎn)上向兩邊同時(shí)開始畫點(diǎn)。每畫一個(gè)點(diǎn)就調(diào)用一下延時(shí)子程序?qū)崿F(xiàn)繪圖的動(dòng)態(tài)顯示。3.4公共使用子程序設(shè)計(jì)為了使程序結(jié)構(gòu)較清晰,將三個(gè)子模塊和主函數(shù)共同使用的子函數(shù)統(tǒng)一編寫。它們是數(shù)據(jù)輸入子函數(shù)READ可以講鍵盤輸入的數(shù)據(jù)轉(zhuǎn)化為16進(jìn)制存在AX中。在各個(gè)子函數(shù)的數(shù)據(jù)輸入模塊都是調(diào)用的這個(gè)子函數(shù)。還有寫像素子函數(shù)PIXEL。它的作用是把經(jīng)過Bresenham算法堆棧的數(shù)據(jù)用寫像素的方法寫在屏幕上。延時(shí)子函數(shù)DELAY它的作用是延時(shí)使圖像動(dòng)態(tài)顯示。清屏CLEAR
10、它的作用是調(diào)背景色清屏。便于在圖形模式和文字模式之間進(jìn)行轉(zhuǎn)換。在其中的延時(shí)子程序采用了雙層循環(huán)的方法,因?yàn)楦鱾€(gè)子程序運(yùn)行用時(shí)不同為了便于調(diào)試和取得更好的效果。不同的子模塊對應(yīng)不同的延時(shí)子程序。4 硬件原理顯示器有字符顯示模式和圖形顯示兩種工作方式在圖形方式下的屏幕由一個(gè)一個(gè)的像素做成。通過讀寫屏幕上的各個(gè)像素就可以顯示出各種各樣的圖形。在匯編語言中提供了多種圖形顯示模式。設(shè)置模式的方法是:AL=模式號(hào),AH=00H,然后通過BIOS功能調(diào)用INT10H來實(shí)現(xiàn)。表1常見的圖形顯示模式顯示模式號(hào)分辨率色彩數(shù)適用顯卡0DH320*20016EGA VGAOEH640*20016EGA VGA0FH6
11、40*3502EGA VGA10H640*35016EGA VGA11H640*4802MCGA VGA12H640*48016VGA13H320*200256MCGA VGAVGA顯卡上256KB顯存,被劃分為4個(gè)64KB的位平面。比如屏幕上像素的位置是(X,Y),則改像素在顯存位平面中字節(jié)地址的計(jì)算公式為:字節(jié)地址=A0000H+Y*(640/8)+X MOD 8(屏幕中有640列,每字節(jié)8位)5 調(diào)試結(jié)果圖6:主菜單截屏矩形繪制輸入長168,寬100圖7:矩形截屏三角形輸入圖8:三角形截屏圖9:圓形截屏結(jié)束語這次的微機(jī)課設(shè)用的時(shí)間很久,從接到題目分析。到后來的程序編寫調(diào)試費(fèi)了很多的功夫。
12、收獲很多,一方面是專業(yè)知識(shí)。計(jì)算機(jī)怎么來顯示圖形,顯存是怎么工作的。怎樣將內(nèi)容直接寫到內(nèi)存中在屏幕上反映出來。對這些知識(shí)有了更深入的了解,同時(shí)對于分支選擇程序。子程序的調(diào)用壓棧出棧斷點(diǎn)保護(hù)有了更深入的理解。在程序就要調(diào)試完成的時(shí)候突然發(fā)現(xiàn)了一個(gè)致命的錯(cuò)誤。畫完圓之后無法再畫矩形。為了排查這個(gè)問題花了好長的時(shí)間一直沒有解決。后來經(jīng)過請教同學(xué)和仔細(xì)的思考后發(fā)現(xiàn)。在畫圓程序中使用過CX,而在畫矩形時(shí)矩形的大小是由CX來決定的。雖然前面加入了壓棧出棧,但是CX值已經(jīng)被改變了。再寫入數(shù)據(jù)后只是把低位覆蓋高位仍然是有數(shù)據(jù)的。就造成了程序的錯(cuò)誤。類似這樣的錯(cuò)誤還有很多。調(diào)試程序的過程也是一個(gè)不斷檢測錯(cuò)誤不斷
13、反思的過程。而且通過這次課設(shè)更是深入的體會(huì)到匯編語言做為底層語言在速度和大小方面有著很強(qiáng)的優(yōu)勢。程序很小但是運(yùn)行速度很快,功能能夠?qū)崿F(xiàn)的也很多。更重要的是可以直接的控制計(jì)算機(jī)的硬件。在另一方面的收獲就是興趣也許在一開始時(shí)是很重要的,之后讓人堅(jiān)持下去的就是克服困難的勇氣和決心。為了讓程序的功能更加的多樣化,我嘗試著在其中添加各種各樣的子程序。大部分的想法都實(shí)現(xiàn)了,可以畫出任意的三角,矩形和圓。但是原本設(shè)想的圖形移動(dòng)和加入聲音因?yàn)闀r(shí)間的原因沒有再做。算是一點(diǎn)遺憾吧。在這次課設(shè)中自己也犯了一個(gè)錯(cuò)誤,寫比較大的程序時(shí)最好是和別人分工合作。相互討論這樣做的會(huì)更加完美一些,特別是在程序調(diào)試時(shí)有人商量一下是
14、很好的可以發(fā)現(xiàn)一些自己不容易發(fā)現(xiàn)的問題和錯(cuò)誤。在這方面因?yàn)槠渌讼胱鰟e的題目所以沒有這么做。總的來說收獲很多,想起了以前上的一門選修課。夏老師講的先整體再部分來設(shè)計(jì)系統(tǒng)。還有對問題的思考方法在這次課設(shè)中讓我少走了很多彎路。參考文獻(xiàn)1. 新編匯編語言程序設(shè)計(jì),楊文顯2. 微機(jī)原理與接口技術(shù),周佩玲3. 80X86匯編語言程序設(shè)計(jì),王元珍4. 匯編程序三角形畫法,李永飛附錄1主序代碼部分INCLUDE YLIB.HDATAS SEGMENT;*;主函數(shù)菜單使用的提示字符串;* MESS1 DB 0DH,0AH,"Welcom to my program,I'm Gaolingxi
15、ao.NO.:01 $" MESS2 DB 0DH,0AH,"Please input a number(1-3) to chose a program:$" MESS3 DB 0DH,0AH,"Press 1 to draw a squareness $" MESS4 DB 0DH,0AH,"Press 2 to draw a triangle$" MESS5 DB 0DH,0AH,"Press 3 to draw a circle $" MESS6 DB 0DH,0AH,"Your choi
16、ce: $"MESS7 DB 0DH,0AH,"Press 0 to main meue,press q to quit: $"MESS8 DB 0DH,0AH,"sorry! Input erroe. $"MESS9 DB 0DH,0AH,"Press q to quit $"*;各個(gè)子函數(shù)公共使用的數(shù)據(jù)定義部分;*COLOR DW 02 BKCOLOR DW 0 ;黑色為0 BUFFER DB 6,?,6 DUP(?) ;輸入函數(shù)暫存bufferC10 DW 10;*;圓用的數(shù)據(jù)段定義和提示語;*MESS1_C DB 0
17、DH,0AH,"Please input the radius(1-200): $"OL_C DB ? ;保存原來屏幕格式用X DW 280 ;圓心位置Y DW 240RADIUS DW 150 ;半徑長度;*;矩形用的數(shù)據(jù)段定義和提示字符串;*OL_S DB ? ;矩形的原來圖像模式X_S DW 50 ;矩形的起始坐標(biāo)Y_S DW 50 ;矩形的起始坐標(biāo)L_S DW ?W_S DW ?COLOR_S DB 2MESS1_S DB 0DH,0AH,"Please input the length(1-500):$"MESS2_S DB 0DH,0AH,&
18、quot;Please input the width(1-500):$"MESS3_S DB 0DH,0AH,"Press 0 to main menu,1 to draw again,other key to quit.$ "*;三角用的數(shù)據(jù)段定義和提示字符;*POINT DB 24,?,24 DUP(?)OL_T DB ? MESS1_T DB 0DH,0AH,"Please input the frist point $"MESS2_T DB 0DH,0AH,"Please input the second point $&q
19、uot;MESS3_T DB 0DH,0AH,"Please input the third point $ " MESS5_T DB 0DH,0AH,"X:$"MESS6_T DB 0DH,0AH,"Y:$"MESS7_T DB 0DH,0AH,"Input error$"DATAS ENDSSTACKS SEGMENT DW 100 DUP(0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AXLEA
20、DX,MESS1MOV AH,9INT 21H;*;顯示主菜單提示字符串;*DISPLAY: LEA DX,MESS2MOV AH,9INT 21HLEA DX,MESS3MOV AH,9INT 21HLEA DX,MESS4MOV AH,9INT 21HLEA DX,MESS5MOV AH,9INT 21HLEA DX,MESS9MOV AH,9INT 21HLEA DX,MESS6MOV AH,9INT 21H;*;主菜單選擇部分;*INPUT:MOV AH,1INT 21HCMP AL,'1'JB DISPLAYJE SQUARCMP AL,'2'JE T
21、RIACMP AL,'3'JE CRICCMP AL,'q'JE OUTPUTJMP DISPLAYSQUAR: ;矩形子程序的入口部分CALL SQUAR_PJMP OUTPUTTRIA: ;三角子程序的入口部分CALL TRIA_PJMP OUTPUTCRIC: ;圓形子程序的入口部分CALL CRIC_PJMP OUTPUTOUTPUT:;退出程序段MOV AH,9INT 21H MOV AH,4CH INT21H;* ;方塊繪制子程序段;*SQUAR_P PROC NEARPUSH CX LONG:;輸入矩形的長度部分LEA DX,MESS1_SMOV
22、AH,9INT 21HXOR AX,AXCALLREAD;調(diào)用輸入子函數(shù)數(shù)據(jù)放在AXCMP AX,0JB LONG_ERCMP AX,01F4HJA LONG_ERMOV WORD PTR L_S,AXJMP WIDTH_SLONG_ER:;在輸入錯(cuò)誤時(shí)的程序段CALL INPUT_ERJMP LONGWIDTH_S:;輸入矩形的寬度部分LEA DX,MESS2_SMOVAH,9INT 21HXOR AX,AXCALLREAD;調(diào)用輸入子函數(shù)數(shù)據(jù)放在AXCMP AX,0JB WIDTH_ERCMP AX,01F4HJA WIDTH_ERMOV WORD PTR W_S,AXMOV AH,0FH
23、INT 10HMOV OL_S,ALSETMODE 12H;設(shè)置640*480*16圖形模式XOR CX,CX;將CX清零,防止干擾MOV CX,WORD PTR L_SMOVDX,Y_SJMPL1_SWIDTH_ER:;在輸入錯(cuò)誤時(shí)的程序段CALL INPUT_ERJMP WIDTH_SL1_S:;畫第一條直線PUSH CX;壓棧保護(hù)WRITE_PIXEL 0,Y_S,X_S,COLOR_S;調(diào)用寫像素的宏命令CALL DELAY_S;延時(shí)實(shí)現(xiàn)動(dòng)態(tài)效果INC X_SPOP CXLOOPL1_S;循環(huán)畫點(diǎn)XOR CX,CXMOV CX,WORD PTR W_S;將寬度存入CXL2_S:PUSH
24、 CX;畫第二條直線WRITE_PIXEL 0,Y_S,X_S,COLOR_SCALL DELAY_SINC Y_SPOPCXLOOP L2_SXORCX,CXMOV CX,WORD PTR L_SL3_S:;畫第三條直線PUSH CXWRITE_PIXEL 0,Y_S,X_S,COLOR_SCALL DELAY_SDECX_SPOPCXLOOP L3_SXOR CX,CXMOV CX,WORD PTR W_SL4_S:;畫第四條直線PUSH CXWRITE_PIXEL 0,Y_S,X_S,COLOR_SCALL DELAY_SDEC Y_SPOP CXLOOP L4_SMOV AH,0INT
25、16HMOV AH,0MOV AL,OL_S;恢復(fù)原來屏幕格式INT 10HLEA DX,MESS3_S;提示菜單信息MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'1'JE LONGCMP AL,'0'JE DISPLAYCMP AL,'q'JE OUTPUTPOPCXJEOUTPUTRETSQUAR_P ENDP;*;三角繪制子程序;*TRIA_P PROC NEARPUSH CXCALL INPUT_T MOV AH,0FHINT 10HMOV OL_T,AL;保存原來屏幕格式,用來恢復(fù)的MOV AX,0A000
26、H ;顯存MOV ES,AX SETMODE 12H;設(shè)置640*480*16圖形模式 ? LEA SI,POINT NEXT: MOV AX,0012H INT 10H MOV AL,2 CALL SET_WRITE_MODE MOV AX,BKCOLOR CALL CLEAR;將背景清成黑色CALL OUTPUT_T;調(diào)用輸出子函數(shù) MOVAH,0INT 16H MOV AH,0MOV AL,OL_TINT 10H LEA DX,MESS3_S;提示菜單MOVAH,9INT21HMOV AH,1INT 21HCMPAL,'0'JE DISPLAYCMP AL,'q&
27、#39;POP CXJE OUTPUTRETTRIA_P ENDP;*;圓繪制子程序;*CRIC_P PROC NEARMOV AX,DATAS MOV DS,AX INPUT_C:;半徑輸入程序段LEA DX,MESS1_CMOV AH,9INT 21HCALLREADCMP AX,0JB RADIUS_ERCMP AX,0C8HJA RADIUS_ERMOV WORD PTR RADIUS,AXJMPNEXT_CRADIUS_ER:;輸入錯(cuò)誤時(shí)提示CALL INPUT_ERJMP INPUT_CNEXT_C:MOVAH,0FHINT 10HMOV OL_C,AL;保存原來屏幕格式,用來恢復(fù)
28、的MOV AX,0A000H ;顯存MOV ES,AX SETMODE 12HINT 10H ;設(shè)置640*480*16圖形模式 ?MOVAL,2 CALL SET_WRITE_MODE ;將寫模式設(shè)為寫模式2MOV AX,BKCOLOR CALL CLEAR ;將背景清成黑色 MOV AX,WORD PTR X ;將圓心坐標(biāo)和半徑壓棧PUSH AX MOV AX,WORD PTR Y PUSH AX MOV AX,WORD PTR RADIUS PUSH AX CALL CIRCLE;調(diào)用畫圓子程序MOV AH,0;恢復(fù)成文本格式的INT 16H MOV AH,0MOV AL,OL_CINT
29、 10H LEA DX,MESS7;提示菜單MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'0'JE DISPLAYCMP AL,'q'JE OUTPUTRETCRIC_P ENDP;*;畫像素點(diǎn)子程序;*PIXEL PROC PUSH BP ;壓棧保護(hù)PUSH BX PUSH CX PUSH DS MOV BP,SP MOV AX,80 MOV BX,WORD PTRBP+12 ;BX<=Y MUL BX ;(DX:AX)<=80*Y MOV BX,AX MOV AX,WORD PTRBP+14 ;AX<-X MO
30、V CL,8 DIV CL ;AL<=商(X/8),AH<=余數(shù)(X%8) SP-> | | MOV CL,AH ;CL<=AH | DS |<-BP MOV AH,0 ; | CX |<-BP+2 ADD BX,AX ;BX(OFFSET)<=80*Y+X/8 | BX |<-BP+4 MOV AL,80H ; | BP |<-BP+6 SHR AL,CL ;AL(MASK)<=(80H>>CL) |返回地址|<-BP+8 PUSH AX ; | COLOR |<-BP+10 MOV DX,3CEH ; |
31、Y |<-BP+12 MOVAL,8 ; | X |<-BP+14 OUT DX,AL ; | | MOV DX,3CFH ; PIXEL堆棧結(jié)構(gòu) POP AX OUT DX,AL MOV AL,ES:BX MOV AX,WORD PTRBP+10 ;AX<=COLOR MOV BYTE PTR ES:BX,AL POP DS POP CX POP BX POP BP RET 6 PIXEL ENDP ;*;清屏函數(shù) ;*CLEAR PROC NEAR MOV BX,0 CLR1: MOV ES:BX,AL;ES中放的是顯存的地址 INCBX CMP BX,9600H;80*
32、480 JNB CLR2 JMP CLR1 CLR2: RET CLEAR ENDP ;*;Bresenham算法實(shí)現(xiàn)的畫圓函數(shù) ;*CIRCLE PROC NEAR PUSH BP MOVBP,SP SUB SP,6 MOV WORD PTRBP-2,0 ;X<=0 | | MOV AX,WORD PTRBP+4 ; | | MOV WORD PTRBP-4,AX;Y<=R SP-> | | MOV AX,0FFFEH ; | P |<-BP-6 IMUL WORD PTRBP+4 ;AX<=RADIUS*(-2) | Y |<-BP-4 ADD AX,3
33、 ;AX<=3-2*RADIUS | X |<-BP-2 MOV WORD PTRBP-6,AX ;P=3-2*RADIUS | BP |<-BP C0:MOV AX,WORD PTRBP-2 ;AX<=X |返回地址|<-BP+2 CMP AX,WORD PTRBP-4 ;IF X<Y,JMP C00 | RADIUS |<-BP+4 JL C00 ; | YC |<-BP+6 JMP C3 ; | XC |<-BP+8 C00: PUSH WORD PTRBP+8 ; CIRCLE堆棧結(jié)構(gòu) PUSH WORD PTRBP+6 ; PUS
34、H WORD PTRBP-2 PUSH WORD PTRBP-4 CALL CIRCLE_POINT CMP WORD PTRBP-6,0 JGE C1 MOV AX,4 MUL WORD PTRBP-2 ADDAX,6 ADD AX,WORD PTRBP-6 MOVWORD PTRBP-6,AX JMP C2 C1: MOV AX,WORD PTRBP-2 SUB AX,WORD PTRBP-4 MOV BX,4 IMUL BX ADD AX,10 ADD AX,WORD PTRBP-6 MOV WORD PTRBP-6,AX DEC WORD PTRBP-4 C2: INC WORD PT
35、RBP-2 JMP C0 C3: MOV AX,WORD PTRBP-2 CMP AX,WORD PTRBP-4 JNE C4 PUSH WORD PTRBP+8 PUSH WORD PTRBP+6 PUSH WORD PTRBP-2 PUSH WORD PTRBP-4 CALL CIRCLE_POINT C4: MOV SP,BP POP BP RET 6 CIRCLE ENDP ;*;圓畫點(diǎn)子程序;*CIRCLE_POINT PROC NEAR PUSH BP MOV BP,SP SUB SP,16 MOV AX,WORD PTRBP+10 ADD AX,WORD PTRBP+6 MOV
36、WORD PTRBP-2,AX ;XC+X MOV AX,WORD PTRBP+10 SUB AX,WORD PTRBP+6 MOV WORD PTRBP-4,AX ;XC-X MOV AX,WORD PTRBP+10 ; | | ADD AX,WORD PTRBP+4 ; | | MOVWORD PTRBP-6,AX ;XC+Y | | MOV AX,WORD PTRBP+10 ; SP-> | | SUB AX,WORD PTRBP+4 ; | YC-Y |<-BP-16 MOV WORD PTRBP-8,AX ;XC-Y | YC+Y |<-BP-14 MOV AX,W
37、ORD PTRBP+8 ; | YC-X |<-BP-12 ADD AX,WORD PTRBP+6 ; | YC+X |<-BP-10 MOV WORD PTRBP-10,AX ;YC+X | XC-Y |<-BP-8 MOV AX,WORD PTRBP+8 ; | XC+Y |<-BP-6 SUB AX,WORD PTRBP+6 ; | XC-X |<-BP-4 MOV WORD PTRBP-12,AX ;YC-X | XC+X |<-BP-2 MOV AX,WORD PTRBP+8 ; | BP |<-BP ADD AX,WORD PTRBP+4
38、; |返回地址|<-BP+2 MOV WORD PTRBP-14,AX ;YC+Y | Y |<-BP+4 MOV AX,WORD PTRBP+8 ; | X |<-BP+6 SUB AX,WORD PTRBP+4 ; | YC |<-BP+8 MOV WORD PTRBP-16,AX ;YC-Y | XC |<-BP+10 PUSH WORD PTRBP-2 ; | | PUSH WORD PTRBP-14 ; CIRCLE_POINT堆棧結(jié)構(gòu) PUSH COLOR CALL PIXELCALL DELAY_C PUSH WORD PTRBP-4 PUSH WO
39、RD PTRBP-14 PUSH COLOR CALL PIXELCALL DELAY_C PUSH WORD PTRBP-2 PUSH WORD PTRBP-16 PUSH COLOR CALL PIXELCALL DELAY_C PUSH WORD PTRBP-4 PUSH WORD PTRBP-16 PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORD PTRBP-6 PUSH WORD PTRBP-10 PUSH COLOR CALL PIXELCALL DELAY_C PUSH WORD PTRBP-8 PUSH WORD PTRBP-10 PUS
40、H COLOR CALL PIXEL CALL DELAY_CPUSH WORD PTRBP-6 PUSH WORD PTRBP-12 PUSH COLOR CALL PIXELCALL DELAY_C PUSH WORD PTRBP-8 PUSH WORD PTRBP-12 PUSH COLOR CALL PIXEL CALL DELAY_C MOV SP,BP POP BP RET 8 CIRCLE_POINT ENDP ;*;設(shè)置寫模式的函數(shù) ;*SET_WRITE_MODE PROC NEAR PUSH AX MOV DX,3CEH MOV AL,5 OUT DX,AL MOV DX,
41、3CFH POP AX OUT DX,AL MOV DX,3CEH MOV AL,8 OUT DX,AL MOV DX,3CFH MOV AL,0FFH OUT DX,AL RET SET_WRITE_MODE ENDP;*;輸入子函數(shù)READ將數(shù)字轉(zhuǎn)化為二進(jìn)制存入AX中;*READ PROC NEARPUSH CXLEA DX,BUFFERMOVAH,0AHINT 21HMOV AX,0MOV CL,BUFFER+1MOV CH,0LEA BX,BUFFER+2ONE:MUL C10MOV DL,BXAND DL,0FHADD AL,DLADC AH,0INCBXLOOP ONEPOP CX
42、RETREAD ENDP;*;輸入錯(cuò)誤提示子程序共用部分;*INPUT_ER PROC NEAR PUSH CX PUSH AX PUSHDX LEA DX,MESS8MOV AH,9INT 21H POP DXPOP AX POP CX RETINPUT_ER ENDP;* ;三角輸出的子函數(shù);*OUTPUT_T PROC NEAR MOV CX,3DDD: ;將指定三角形的三頂點(diǎn)坐標(biāo)壓棧PUSH CX ;壓棧按照line函數(shù)要求的規(guī)則 PUSH SI MOV AX,SI PUSH AX MOV AX,SI+2 PUSH AX MOV AX,SI+4 PUSHAX MOV AX,SI+6 P
43、USH AX CALL LINE_T;使用延時(shí)函數(shù)實(shí)現(xiàn)動(dòng)畫效果 CALL DELAY_T ;調(diào)用Line函數(shù)畫線 POP SI ADD SI,8 POP CX LOOP DDDRETOUTPUT_T ENDP ;*;三角Bresenham畫線算法 ;*LINE_T PROC NEAR PUSH BP MOV BP,SP SUB SP,16 MOV WORD PTRBP-6,0 ;X=0 MOV WORD PTRBP-8,0 ;Y=0 MOV WORD PTRBP-14,1 ;INCX=1 MOV WORD PTRBP-16,1 ;INCY=1 MOV AX,WORD PTRBP+6 ;AX<=X2 SUB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 紅棗園承包合同
- 2025年上半年宜昌市宜都市住建局招考城管綜合執(zhí)法協(xié)管易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年宜昌市人民政府國資委所屬事業(yè)單位集中招聘擬聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽阜陽阜南縣疾控中心緊急招聘工作人員6人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省亳州市渦陽縣重點(diǎn)局招聘政府雇員6人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2024重慶對外建設(shè)(集團(tuán))有限公司招聘10人筆試參考題庫附帶答案詳解
- 2025年上半年安徽某國企上市公司社會(huì)招聘1人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽宿州靈璧縣公開選調(diào)事業(yè)單位工作人員20人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽事業(yè)單位625聯(lián)考筆試易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波象山縣農(nóng)林局招考編制外人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 社區(qū)工作30個(gè)經(jīng)典案例分析重點(diǎn)推薦
- 食堂傳染病防控管理制度
- GM∕T 0036-2014 采用非接觸卡的門禁系統(tǒng)密碼應(yīng)用指南
- 小學(xué)生勞動(dòng)教育課程 《西紅柿炒雞蛋》公開課課件
- 冷室壓鑄機(jī)電腦操作控制部分操作說明
- 【公開課課件】6.4.3余弦定理、正弦定理1課件-2021-2022學(xué)年高一下學(xué)期數(shù)學(xué)人教A版(2019)必修第二冊
- 防水板臺(tái)車施工方案
- 提高地下室管線一次性安裝合格率
- 小學(xué)三年級數(shù)獨(dú)比賽“六宮”練習(xí)題
- 實(shí)驗(yàn)一、儀器的認(rèn)領(lǐng)、洗滌、干燥及樣品的稱量
- 通橋(2013)8388A常用跨度梁橋面附屬設(shè)施_圖文
評論
0/150
提交評論