汇编语言课程设计绘制三角形图形程序.docx
- 文档编号:12588166
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:16
- 大小:121.59KB
汇编语言课程设计绘制三角形图形程序.docx
《汇编语言课程设计绘制三角形图形程序.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计绘制三角形图形程序.docx(16页珍藏版)》请在冰豆网上搜索。
汇编语言课程设计绘制三角形图形程序
课程设计说明书
课程名称:
汇编语言
班级:
姓名:
___
学号:
____
设计题目:
绘制三角形图形程序
设计时间:
2010/6/21至2010/7/2
指导教师:
李永飞
评语:
_________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:
评阅教师:
一、课程设计目的
进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
三、课程设计题目:
绘制三角形图形程序
四、课题分析
编写程序.使PC机显示一个三角形。
对于图形设计,要通过BIOSINT10H调用,用菜单选择三角形的输出。
三角形可分割为3条直线,因此显示三角形就可分解为根据两点画直线的程序。
五、流程图:
Q
六、核心代码展示:
1、主函数
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACKS
START:
MOVAX,DATA
MOVDS,AX
MOVAX,0A000H
MOVES,AX
MOVAX,0012H;设置640*480*16图形模式
INT10H
reset:
;02文字模式显示主界面
MOVAX,0002H;根据用户输入调用相关功能
INT10H
dispdesk
movah,01h
int21h
cmpal,'A'
jzzj
cmpal,'B'
jzdy
cmpal,'C'
jzzdy
cmpal,'Q'
jzgoover
jmpreset
zj:
;输出直角三角形
CALLINPUTCOLOR
dispcrlf
leasi,zhijiao
jmpnext
dy:
;输出等腰三角形
CALLINPUTCOLOR
dispcrlf
leasi,dengyao
jmpnext
zdy:
;调用input函数自定义三角形
CALLINPUTCOLOR
dispcrlf
CALLinput
leasi,point
jmpnext
next:
;调用output函数输出指定的三角形
MOVAX,0012H
INT10H;设置640*480*16图形模式
MOVAL,2
CALLSET_WRITE_MODE
MOVAX,BKCOLOR
CALLCLEAR
calloutput
MOVAH,1
INT21H
JMPRESET
goover:
;程序结束
MOVAH,0;清屏
MOVAL,12H
INT10H
RET
MAINENDP
2、Bresenham画线算法
PIXELprocnear
PUSHBP
PUSHBX
PUSHCX
PUSHDS
MOVBP,SP
MOVAX,80
MOVBX,WORDPTR[BP+12];BX<=Y
MULBX;(DX:
AX)<=80*Y
MOVBX,AX
MOVAX,WORDPTR[BP+14];AX<--X
MOVCL,8;
DIVCL;AL<=商(X/8),AH<=余数(X%8)
MOVCL,AH;CL<=AH
MOVAH,0;
ADDBX,AX;BX(OFFSET)<=80*Y+X/8
MOVAL,80H;
SHRAL,CL;AL(MASK)<=(80H>>CL)
PUSHAX
MOVDX,3CEH
MOVAL,8
OUTDX,AL
MOVDX,3CFH
POPAX
OUTDX,AL
MOVAL,ES:
[BX]
MOVAX,WORDPTR[BP+10];AX<=COLOR
MOVBYTEPTRES:
[BX],AL
POPDS
POPCX
POPBX
POPBP
RET6
pixelendp
;------------------------------
;Bresenham画线算法
LINEprocnear
PUSHBP
MOVBP,SP
SUBSP,16
MOVWORDPTR[BP-6],0;X=0
MOVWORDPTR[BP-8],0;Y=0
MOVWORDPTR[BP-14],1;INCX=1
MOVWORDPTR[BP-16],1;INCY=1
MOVAX,WORDPTR[BP+6];AX<=X2
SUBAX,WORDPTR[BP+10];AX<=X2-X1
JNCL1;IFX2>=X1,JMPL1
NEGAX;IFX2 MOVWORDPTR[BP-14],-1;INCX<=-1 L1: CMPAX,0;IFDELTA_X! =0,JMPL11 JNEL11 MOVWORDPTR[BP-14],0;INCX<=0 L11: MOVWORDPTR[BP-10],AX;DELTA_X<=AX MOVAX,WORDPTR[BP+4];AX<=Y2 SUBAX,WORDPTR[BP+8];AX<=Y2-Y1 JNCL2;IFY2>=Y1,JMPL2 NEGAX;IFY2 MOVWORDPTR[BP-16],-1;INCY<=-1 L2: ; CMPAX,0;IFDELTA_Y! =0,JMPL22 JNEL22; MOVWORDPTR[BP-16],0;INCY<=0 L22: MOVWORDPTR[BP-12],AX;DELTA_Y<=AX LP4: MOVAX,WORDPTR[BP-10];AX<=DELTA_X CMPAX,WORDPTR[BP-12]; JGLP5;DELTA_X>DELTA_Y MOVAX,WORDPTR[BP-12]; MOVWORDPTR[BP-4],AX;DISTANCE<=DELTA_Y JMPLP51; LP5: MOVAX,WORDPTR[BP-10]; MOVWORDPTR[BP-4],AX;DISTANCE<=DELTA_X LP51: INCAX MOVWORDPTR[BP-2],AX LP6: PUSHWORDPTR[BP+10] PUSHWORDPTR[BP+8] PUSHCOLOR CALLPIXEL MOVAX,WORDPTR[BP-6];AX<=X ADDAX,WORDPTR[BP-10];AX<=X+DELTA_X MOVWORDPTR[BP-6],AX;X=X+DELTA_X MOVAX,WORDPTR[BP-8];AX<=Y ADDAX,WORDPTR[BP-12];AX<=Y+DELTA_Y MOVWORDPTR[BP-8],AX;Y=Y+DELTA_Y MOVAX,WORDPTR[BP-6];AX<=X CMPAX,WORDPTR[BP-4] JLELP7;IFX<=DISTANCE,JMPLP7 MOVAX,WORDPTR[BP-6];X>DISTANCE SUBAX,WORDPTR[BP-4];AX<=X-DISTANCE MOVWORDPTR[BP-6],AX;X=X-DISTANCE MOVAX,WORDPTR[BP+10];AX<=X1 ADDAX,WORDPTR[BP-14];AX<=X1+INCX MOVWORDPTR[BP+10],AX;X1=X1+INCX LP7: MOVAX,WORDPTR[BP-8];AX<=Y CMPAX,WORDPTR[BP-4] JLELP8;IFY<=DISTANCE,JMPLP8 MOVAX,WORDPTR[BP-8];Y>DISTANCE SUBAX,WORDPTR[BP-4];AX<=Y-DISTANCE MOVWORDPTR[BP-8],AX;Y=Y-DISTANCE MOVAX,WORDPTR[BP+8];AX<=Y1 ADDAX,WORDPTR[BP-16];AX<=Y1+INCY MOVWORDPTR[BP+8],AX;Y1=Y1+INCY LP8: DECWORDPTR[BP-2];IFT! =0,JMPLP6 JZLP9 JMPLP6 LP9: MOVSP,BP POPBP RET8 lineendp 3、自定义三角形顶点位置 INPUTPROCNEAR leasi,point DISPinputINFO_1;显示输入提示信息 xx1: dispx CALLgetchar;调用getchar输入3位数 cmpdx,0;验证输入数字在要求的范围内 jlwx1 cmpdx,600 jgwx1 mov[si],dx;验证通过,输入下一个数 mov[si+8],dx jmpyy1 wx1: dispinputwrong;验证失败,显示提示信息并重新输入 jmpxx1 yy1: dispy CALLgetchar cmpdx,0 jlwy1 cmpdx,400 jgwy1 mov[si+2],dx mov[si+10],dx DISPinputINFO_2 jmpxx2 wy1: dispinputwrong jmpyy1 xx2: dispx CALLgetchar cmpdx,0 jlwx2 cmpdx,600 jgwx2 mov[si+4],dx mov[si+16],dx jmpyy2 wx2: dispinputwrong jmpxx2 yy2: dispy CALLgetchar cmpdx,0 jlwy2 cmpdx,400 jgwy2 mov[si+6],dx mov[si+18],dx DISPinputINFO_3 jmpxx3 wy2: dispinputwrong jmpyy2 xx3: dispx CALLgetchar cmpdx,0 jlwx3 cmpdx,600 jgwx3 mov[si+12],dx mov[si+20],dx jmpyy3 wx3: dispinputwrong jmpxx3 yy3: dispy CALLgetchar cmpdx,0 jlwy3 cmpdx,400 jgwy3 mov[si+14],dx mov[si+22],dx ret wy3: dispinputwrong jmpyy3 INPUTENDP 4、置堆栈并调用LINE画线 outputprocnear movcx,3 DDD: ;将指定三角形的三顶点坐标压栈 PUSHCX;压栈按照line函数要求的规则 PUSHSI MOVAX,[SI] PUSHAX MOVAX,[SI+2] PUSHAX MOVAX,[SI+4] PUSHAX MOVAX,[SI+6] PUSHAX CALLLINE;调用Line函数画线 POPSI ADDSI,8 POPCX LOOPDDD ret outputendp 七、结果显示 八、感想、收获及体会 本程序的核心在于Bresenham画线算法,有了画线算法后添加以输入输出,用户界面等模块既得到最终的程序。 程序多次在图形模式和文本模式下切换,充分考虑到与用户的互动性,界面比较友好,功能简单实用。 程序在windowsxp下测试通过。 程序首先在文本模式下显示欢迎界面,要求用户输入选项。 程序可以根据用户选项直接输出直角三角形和等腰三角形,或者输出用户自定义三顶点的三角形,每次输出图形都可由用户自定义输出颜色。 输出完成后按下任意键清屏,显示选项,用户可以继续输出三角形或者按下Q退出。 在BIOS调用方面本程序采用了多种写屏方式,力求每种功能实现采用相应的最简算法。 设计程序初考虑过使用Int33h调用鼠标,是程序更加人性化,但是由于技术原因和设备显示难以实现,实在遗憾。 下面分析Bresenham画线算法。 对于直线方程Y=kX+b; A: 0 1: 输入线段的两个端点Point1和Point2,并且存储到Point1(x1,y1)和Point2(x2,y2)中; 2: 将Point1载入桢缓存,绘画第一个起始点; 3: 计算常量△x、△y、2△y和2(△y-△x),并且获得一个决策参数的第一个值: P=2△y-△x; 4: 从n=0开始,在沿线经过每个Xn处,进行下面的检测: 如果Pn<0,下一个点绘制的是(Xn+1,yn),并且Pn+1=Pn+2△y 如果P0>=0,下一个点绘制的是(Xn+1,Yn+1),并且Pn+1=Pn+2(△y-△x) 5: 重复执行△x-1次步骤4; B,斜率k=1或斜率k=0时候的算法 对于斜率等于0或者斜率等于1时候,不需要通过算法直接的对于其中单一坐标变量进行处理。 C: 斜率k<0的情况算法 将起始点和中止点坐标Point1和Point2交换,可以转化到斜率为0和1之内的算法去实现 用汇编语言实现该算法的代码已经在上面贴出。 以下是两个子函数的堆栈结构。 通过这个程序,我更加熟练了利用堆栈处理问题的方法,深入了对计算机图形显示技术的认识,掌握了BIOS调用的方法,对于子程序、顺序结构、循环结构、宏定义等的应用更加融会贯通。 通过这次课程设计培养了我设计完成中小型程序的能力,加深了对汇编语言的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 课程设计 绘制 三角形 图形 程序