汇编语言课程设计绘制三角形图形程序.docx
《汇编语言课程设计绘制三角形图形程序.docx》由会员分享,可在线阅读,更多相关《汇编语言课程设计绘制三角形图形程序.docx(16页珍藏版)》请在冰点文库上搜索。
![汇编语言课程设计绘制三角形图形程序.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/b980a14d-288a-4962-bc01-fa13b639bcc2/b980a14d-288a-4962-bc01-fa13b639bcc21.gif)
汇编语言课程设计绘制三角形图形程序
课程设计说明书
课程名称:
汇编语言
班级:
姓名:
___
学号:
____
设计题目:
绘制三角形图形程序
设计时间:
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;IFX2MOVWORDPTR[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;IFY2MOVWORDPTR[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调用的方法,对于子程序、顺序结构、循环结构、宏定义等的应用更加融会贯通。
通过这次课程设计培养了我设计完成中小型程序的能力,加深了对汇编语言的认识。