课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位: 自动化学院
题 目: 图形变换程序设计(要程序加扣扣二五九零其物流而肆意)
初始条件:
掌握8086汇编语言程序设计方法,设计一个图形变换显示程序。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1. 程序运行后,键盘输入不同进行不同处理:
(1)输入‘Q’,显示‘Thank You !’并结束程序;
(2)输入‘E’,显示一个用不同颜色填充且带有边框的矩形图案;输入‘F’,显示一个用不同颜色填充的圆形图案。
2. 撰写课程设计说明书。内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:
12月30日-----12月31日 查阅资料及方案设计
1月2日-----1月3日 编程
1月6日 调试程序
1月7日-----1月8日 撰写课程设计报告
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目录
摘要................................................................................................................................................. I
图形变换程序设计......................................................................................................................... 1
1 设计意义..................................................................................................................................... 1
2 设计内容..................................................................................................................................... 1
2.1程序的内容与要求..................................................... 1
2.2 程序运行条件......................................................... 1
3 方案设计..................................................................................................................................... 1
3.1 设计思路............................................................. 1
3.1.1 显示字符程序................................................... 1
3.1.2 显示圆形....................................................... 2
3.1.3 显示矩形....................................................... 2
3.2 程序流程图........................................................... 3
4 程序分解..................................................................................................................................... 3
4.1 字符显示程序......................................................... 3
4.2 圆形显示程序......................................................... 3
4.3 矩形程序显示......................................................... 5
4.4 产生颜色的子程序..................................................... 6
4.5 屏幕初始化子程序..................................................... 6
5 运行结果显示............................................................................................................................. 6
5.1 矩形输出显示......................................................... 6
5.2 圆形输出显示......................................................... 7
5.3 字符串输出显示....................................................... 7
6 设计过程中的问题..................................................................................................................... 8
心得体会......................................................................................................................................... 9
致谢............................................................................................................................................... 10
参考文献....................................................................................................................................... 11
附录............................................................................................................................................... 12
成绩评定表................................................................................................................................... 17
摘要
进入21世纪,信息社会发展的脚步越来越快,对人才的的需求也呈现新的变化趋势。计算机成为新世纪高素质人才必须熟练掌握的工具,大学计算机公共课程也面临着新的机遇和挑战。
随着计算机硬件的发展,微机系统的功能越来越强,其价格也越来越便宜,因而拥有各行各业的用户。用户希望通过计算机方便地解决各自领域的问题。基于冯.诺依曼体系结构的计算机要求自动解决任务,必须事先将问题分解为计算机能够处理的各个步骤,用某种语言将这些步骤描述出来,然后让计算机按规定的步骤控制计算机工作。计算机的程序设计语言也是经历了这样的发展过程。
汇编语言是计算机程序设计的语言之一,是在机器语言助记符的形式上完善而来。它改善了及其语言的可读性、可记性,能够利用计算机所有的硬件特征且能直接用来控制硬件,是计算机能够提供给用户的最快且最有效的汇编语言。
本次设计即是在8086汇编语言的基础上,利用Masm for windows集成实验环境,通过应用微机原理中汇编的几个步骤——编辑、汇编、连接、运行或调试运行,使得在doc界面完成图形变换。
关键词:汇编语言 doc 控制 Masm
图形变换程序设计
1 设计意义
(1) 巩固和加深课堂所学知识。
(2) 将课本上的理论知识和实际应用有机的结合起来,培养同学们分析和解决实际问题的能力。
(3) 通过对汇编语言程序代码的阅读、修改、设计,理解和掌握复杂的汇编语言应用程序的编程,提高实践编程能力。
本程序要求按不同的键显示不同的图形,按“q”键退出。实质上通过做这道题目可以检查学生对汇编语言这门课程的基本知识的掌握程度。能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握各个指令的功能,特别是转向指令,能够让我们熟悉并掌握DOS系统功能调方法;同时在程序设计过程中熟悉并掌握各种指令的应用,知道编程的具体流程。
只有掌握汇编语言基本编程方法,掌握程序各部分功能及其相互联系、相互作用,才能把程序写出来,才能把程序写好。
2 设计内容
2.1程序的内容与要求
掌握8086汇编语言程序设计方法,设计一个图形变换显示程序。程序运行后,键盘输入不同进行不同处理:
(1)输入‘Q’,显示‘Thank You !’并结束程序;
(2)输入‘E’,显示一个用不同颜色填充且带有边框的矩形图案;输入‘F’,显示一个用不同颜色填充的圆形图案。
2.2 程序运行条件
本程序可在DOS,windows 98或DOS模拟器上运行。所需要工具软件为MASM5.0及以上版本。
3 方案设计
3.1 设计思路
3.1.1 显示字符程序
显示“Thank You”程序是最易于设计的一部分,只需要定义其字符串为字节型变量,并定义在当键盘输人为‘Q’时显示,并退出运行即
3.1.2 显示圆形
首先,定义x为竖线的列值,Y1和Y2分别为竖线的两端点的行值,并将界面分成LEFT和RIGHT两部分。在LEFT部分,输入值为列数A,给圆的半径R赋具体值,通过算法完成下式求得A对应的行值,从而确定Y2,再利用中间变量实现Y1与Y2的等值,即可画出LEFT部分的一条弦。再用宏定义,使A值从0到R,完成弦在0到R上的积分,就形成左半部分的半圆,同理,可完成右半部分的半圆,两个半圆整合,便形成圆。
图3-1 定义弦 图3-2 计算圆上点的坐标
3.1.3 显示矩形
先确定一点,定义为矩形左上角的列号和行号,即确定了矩形的一个角点坐标,再定义其长度和宽度并赋值,知道左上角角点坐标及矩形长宽,即可画出矩形。边框的设计实际是大小两个矩形的重叠形成的,定义第二个矩形时,其角点及长宽比之前的尺寸少有增加,酌情而定,设置输出时,底层显示尺寸较大的矩形,上层显示尺寸较小的矩形,使得上层矩形显示完整,下层矩形显示多出来的部分,即形成边框,并在输出颜色是设置两个举行的色差,从而明显显示出边框。
3.2 程序流程图
程序流程图如图3-3所示
图3-3 程序流程图
4 程序分解
4.1 字符显示程序
在设计思路中已经提到,显示字符的程序较为简单,只需用字节型变量定义字符串,并定义在接收‘Q’是显示,并退出运行即可。
DB 0DH,0AH,'Q: display "Thank You !" and quit to DOS.',0DH,0AH
MSGQ DB 0DH,0AH,'Thank You !','$'
4.2 圆形显示程序
(1)利用弦的积分方法,定义宏:
LINE MACRO X,Y1,Y2 ;画列值为x,行值从Y1到Y2的直线
LOCAL LL,FIRST
MOV AAAAA
MOV AAAAA
MOV AAAAA
MOV AAAAA
JMP AAAAA
LL: INC AAAAA ;行值加1
FIRST: MOV AAAAA
INT 10H
CMP DX,Y2
JNZ LL ;判断Y1和Y2是否相等,若相等则完成
ENDM
(2)定义坐标:
CIRCLE MACRO
MOV A,0 ;初始化圆的横坐标
AGA: CALL AAA ;计算纵坐标的值
MOV AAA
MOV CL,A
ADD CX,X0
MOV AAA ;右平面弦的列值
MOV AAA
MOV CL,A
NEG CX
ADD CX,X0
MOV AAA
MOV AAA
ADD AAA
MOV AAA ;弦的上端点的行值
MOV AAA
NEG AAA
ADD AAA
MOV AAA ;弦的下端点的行值
LINE AAA
LINE RIGHT,DOWN,UP ;在右平面画弦
INC A
MOV AL,R
(3)计算纵坐标的子程序:
SQRT PROC NEAR ;计算行坐标
MOV
MUL
MOV
MOV
MUL
SUB
MOV CX,0
LAST1: MOV DX
INC D
SUB AX
JC E
INC C
JMP L
EXIT1: MOV H,CX ;计算结果保存在H单元内
RET
SQRT ENDP
4.3 矩形程序显示
产生矩形的子程序:
RECTANGLE PROC NEAR
PUSH ??
PUSH ??
PUSH ??
PUSH ??
PUSH ??
MOV D?? ;矩形左上角行号
MOV CX??
MOV AL,??
MOV DI?? ;矩形的长
ADD DI,CX
MOV SI,??TWID ;矩形的宽
ADD SI,DX
HLINE:
MOV C??MN
HAGAIN:
MOV AHV
MOV ??
INT ??
INC CX
CMP ?? ;是否达到矩形的长?
JL HA??
ADD DX,1
CMP D??E
POP ??
POP ??
POP ??X
POP D??
POP AX
RET
RECTANGLE ENDP
4.4 产生颜色的子程序
RANDOMCOLOR ??OC NEAR
PUSH ??
PUSH BX
PUSH ??X
RANDCOLOR:
IN AL,40H
CMP A??
JA ??OLOR
MOV V??,AL
POP ??
POP BX
POP AX
RET
RANDOMCOLOR ENDP
4.5 屏幕初始化子程序
CLSMENU PROC NEAR
MOV ?? ;设置屏幕显示方式
MOV ?? ;定义成640*480 16色图形模式
INT 10H
LEA B?? ;显示菜单
MOV AH,13H
MOV AL,01
MOV C??
MOV ??
MOV BH,0
MOV ??
INT ??
RET
CLSMENU ENDP
5 运行结果显示
5.1 矩形输出显示
输入‘E’,矩形输出显示如图5-1所示
图5-1(a) 矩形输出显示程序 图5-1(b) 矩形输出显示程序
5.2 圆形输出显示
输入‘F’,圆形输出显示如图5-2所示
图5-2(a)圆形输出显示 图5-2(b)圆形输出显示
5.3 字符串输出显示
输入‘Q’,字符串输出显示如图5-3所示
5-3 字符串输出显示
6 设计过程中的问题
在设计过程中出现的最大问题,就是开始按‘E’后正常显示矩形,再按‘F’后,在显示圆的同时,还会显示矩形,矩形在底层,再按‘E’,在显示矩形的同时还会显示圆形,且圆形在底层,运行结果如图6-1所示。
图6-1(a) 错误运行结果 图6-1(b) 错误运行结果
经分析,出现该问题的原因是没有清屏,导致按下一个键,显示下一个图形的时候,上一个图形依旧不会消失,找到了问题所在,之前是由于在设置输出时,仅在第一次输出矩形之前屏幕初始化。修改后,定义屏幕初始化的子程序,在输出矩形和圆形事,都先有调用清屏的子程序这一步,是的错误得以纠正,屏幕初始化子程序的调用如下:
CALL CLSMENU ;屏幕初始化并显示菜单
CALL RAN?????? ;随机产生颜色
CALL ?? ;画外框矩形
CALL CLSMENU ;屏幕初始化并显示菜单
CALL RANDOMCOLOR ;随机产生颜色
MOV ??
CIRCLE ;在屏幕上画出半径为R的圆
心得体会
本次课程设计题目是图形变换程序设计。初次看到题目,没有任何的思路,情急之下,心神不定地查了一整天的资料,也没有太大的收获。自己完全局限于课本上所学的简单的语言,但那远不足以完成本次课设的任务。最后,我决定通过查阅参考资料,并上网查询各种代码的含义,自己设计画图的算法,实现图形的显示。
在整个过程中,圆的画法是最不易的。开始参考了别人画圆轨迹线,从中得到了启示,做圆上弦的积分由线及面,形成圆面。
这次课程设计对我而言,其难度是之前从未有过的。然而,我还是靠自己的毅力挺了过来。在查阅了大量资料后,掌握了简单图形显示的程序,熟悉了子程序的调用和doc功能的实现,并初步学会了中断在程序中的应用。
两周的汇编语言课程设计结束了,我的收获是很大的。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实提高了我的编程能力,补全了我的不足。
值得庆幸的是,这次课程设计,自己是独立完成的,并未参考他人方案。虽然并未有很多设计上创新的地方,但对我来说,这是一种突破,自己独立解决问题的能力进一步提高。
在今后的课程设计中,我依旧要保持这种独立思考的习惯,将自己的短处变为长处。
致谢
我本次的课程设计是在??老师老师亲切关怀与细心指导下完成的。从题目的选择到设计的最终完成,??老师始终都给予了我细心的指导和不懈的支持,并且在耐心指导之余,?????老师仍不忘关心我们的生活,冷冷寒冬的关怀让我们倍感温暖。值得一提的是,????老师宅心仁厚,闲静少言,不慕荣利,对学生认真负责,在他身上,我们可以感受到一个学者的严谨和务实,这些都让我们获益菲浅,并且将终生受用无穷。毕竟“经师易得,人师难求”,希望借此机会向???老师表示最衷心的感谢!
参考文献
【1】彭虎 周佩玲 付忠谦.《微机原理与接口技术》(第二版) 电子工业出版社 2008.3
【2】张凡.《微机原理与接口技术》(第二版) 清华大学出版社 2010.9
【3】朱定华. 《微机原理、汇编与接口技术》清华大学出版社 1010.1
【4】牟琦 聂建萍. 《微机原理与接口技术》清华大学出版社 1007.12
【5】吴叶兰. 《微机原理与接口技术》机械工业出版社 2009.8
附录
;----------------------------------------------------------------------
;宏功能:画一条竖线
;哑元意义:x为竖线的列值
; Y1和Y2分别为竖线的两端点的行值
;----------------------------------------------------------------------
LINE MACRO X,Y1,Y2 ;画列值为x,行值从Y1到Y2的直线
LOCAL LL,FIRST
MOV ??
MOV ?/???
MOV /???
MOV D/???
JMP /???
LL: INC /??? ;行值加1
FIRST: MOV /???
INT 10H ;写一个像素点
CMP /???
JNZ LL ;判断Y1和Y2是否相等,若相等则完成
ENDM
;----------------------------------------------------------------------
;宏功能:通过分别在左右平面画垂直于x轴的弦来画一个实心圆
;----------------------------------------------------------------------
CIRCLE MACRO
MOV /??? ;初始化圆的横坐标
AGA: CALL/??? ;计算纵坐标的值
MOV /???
MOV /???
ADD /??? ;右平面弦的列值
MOV CH,0
MOV /???
NEG V
ADD C/???
MOV /??? ;左平面弦的列值
MOV DX,H
ADD /???
MOV V/???
NEG DX
ADD /???
MOV /??? ;弦的下端点的行值
LINE LEFT,V/??? ;在左平面画弦
LINE /??? ;在右平面画弦
INC A ;继续画其他弦至画出圆
MOV AL,R
CMP /???
JNZ /???
ENDM
;**********************************************************************
DATA SEGMENT
MENU DB 0DH,0AH,'Please press a key:',0DH,0AH
DB 0DH,0AH,'E: show a rectangle.'
DB 0DH,0AH,'F: show a circle.'
DB 0DH,0AH,'Q: display "Thank You !" and quit to DOS.',0DH,0AH
MENULEN EQU $-MENU
MSGQ DB 0DH,0AH,'Thank You !','$'
ROW /???
COLUMN /???
RECTLEN DW /???
RECTWID DW V
COLOR DB/???
R DB ? /??? DB ? ;存放圆的横坐标
A2 DW /???
H DW /??? ;存放圆的纵坐标
Y0 EQU /??? ;纵坐标的行值
X0 EQU /??? ;横坐标的列值
RIGHT DW ? ;存放右平面的列值
LEFT DW ? ;存放左平面的列值
UP DW ? ;存放上半平面的行值
DOWN DW ? ;存放下半平面的行值
DATA ENDS
;**********************************************************************
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,ES:DATA
;----------------------------------------------------------------------
START: MOV A/???
MOV/???
MOV /???
;----------------------------------------------------------------------
CALL CLSMENU ;屏幕初始化并显示菜单
WAITPRESS: ;等待按键
MOV /??? ;接受命令
INT 1/???
OR A/??? ;转换成小写字母
CMP AL,'e'
JZ DRAWRECT
CMP AL/???
CMP A/???
JZ QuitProc
JMP W/???
DRAWRECT:
CALL CLSMENU ;屏幕初始化并显示菜单
CALL R/??? ;随机产生颜色
CALL RECTANGLE ;画外框矩形
PUSH V/???/???
PUS/???
PUSH RECTLEN
DD ROW,8
ADD/???
SUB /???
S/???
ADD COLOR,8
CALL R/??? ;画内部矩形
POP REC/???
POP R/???
POP ROW
JMPV/???S
DRAWCIRC:
CALL CLV/??? ;屏幕初始化并显示菜单
CALL/??? ;随机产生颜色
MOV /???
CIRCLE ;在屏幕上画出半径为R的圆
JMP /???
QuitProc:
MOV AL,03
MOV AH,0
INT /???
MOV DX,OFFSET MSGQ ;显示信息
MOV /???
INT 21H
MOV /??? ;返回DOS
INT 21H
;----------------------------------------------------------------------
;产生矩形 子程序
RECTANGLE PROC/???
PUSH AX
PUSH /???
PUSH CX
PUSH /???
PUSH /???
MOV DX,ROW ;矩形左上角行号
MOV /??? ;矩形左上角列号
MOV /???
MOV /??? ;矩形的长
ADD DI,CX
MOV /??? ;矩形的宽
ADD SI/???
HLINE:
MOV /???
HAGAIN:
MOV AH/??? ;写像素
MOV /??? INT /???
INC /???
CMP /??? ;是否达到矩形的长?
JL /???
ADD /???
CMP /??? ;是否达到矩形的宽?
JL /???E
POP SI/??? DI
POP /???
POP /???
RET
RECTANGLE ENDP
;----------------------------------------------------------------------
; 计算纵坐标的值辅助画圆子程序
SQRT PROC /??? ;计算行坐标
MOV A/???
MUL /???
MOV /???
MOV /???
MUL /???
SUB A/???
MOV CX,0
LAST1: MOV /???
ADD /???
INC DX
SUB /???
JC EXIT1
INC CX
JMP /???
EXIT1: MOV /??? ;计算结果保存在H单元内
RET
SQRT ENDP
;---------------------------------------------------------------------------------------------------------------------
; 随机产生颜色 子程序
RANDOMCOLOR PROC NEAR
PUSH /???
PUSH BX
PUSH /???
RANDCOLOR:
IN /???
CMP/???
JA RANDCOLOR
MOV /???
POP DX
POP /???
POP AX
RET
RANDOMCOL/???
;---------------------------------------------------------------------------------------------------------------------
;屏幕初始化并显示菜单 子程序
;---------------------------------------------------------------------------------------------------------------------
CLSMENU PROC/???
MOV AH,0 ;设置屏幕显示方式
MOV AL,12H ;定义成640*480 16色图形模式
INT /??? ;调用BIOS显示中断
LEA BP,MENU /???
MOV AL,01
MOV CX,MENULEN
MOV /???
MOV/???
MOV DX,0/???H
RET
CLSMENU ENDP
;**********************************************************************
CODE ENDS
END START
本科生课程设计成绩评定表
指导教师签字:
年 月 日