汇编语言程序设计报告
更新时间:2023-04-23 00:44:01 阅读量: 实用文档 文档下载
目 录
目 录………………………………………………………………1 课程设计的目的…………………………………………………..2 课程设计的内容…………………………………………………..2 基本要求…………………………………..…………….…………2 具体内容…………………………………………….……………..2
第2题……………………………………………….……………..3
设计思想和实施方案……………………………….……………..3 程序清单和程序注释…………………………….………………..3 典型程序模块和典型编程技巧分析………….…………………..4 程序框图……………………………………….…………………..5
第3题…………………………………………….………………..6
设计思想和实施方案…………………………….………………..6 程序清单和程序注释……………………………….……………..6 典型程序模块和典型编程技巧分析…………….………………..9 程序框图…………………………………………….…………….10
第4题…………………………………………….……………….11
设计思想和实施方案…………………………….……………….11 程序清单和程序注释……………………………….…………….11 典型程序模块和典型编程技巧分析…………….……………….13 程序框图…………………………………………….…………….14 课程设计中遇到的问题及解决方法……………….…………….15 收获与体会………………………………………….…………….16
一.课程设计的目的:
课程设计是本科教学过程中的重要环节。本课程设计主要目的是使计算机专业学生深入学习汇编语言知识,进一步提高学生汇编语言综合变成能力和程序调试技能,锻炼运用汇编语言编程解决实际问题的能力。
二.课程设计的内容:
1.从键盘输入任意的十进制表达式,计算表达式的结果,并将该表达式及结果显示在屏幕上。(数值取值范围-32768~32767)
2.编写一个能与当前运行程序分时操作的生日程序,将当日生日同学的信息显示在屏幕的右上角。 3.在屏幕上开三个窗口:
(
(
(15,30 (15,70)
(22,65)
用“←”和“→”键选择左窗口或右窗口为当前活动窗口,从键盘输入字符,字符就会从当前活动窗口的最下行开始显示,同时也在下窗口显示。当一行字符显示满后(左右窗口一行显示20和字符,下窗口显示50个字符),窗口自动向上卷动一行,输入的字符仍显示于最低一行,窗口最高一行向上卷动后消失,输入命令串“END”后程序运行结束。
4.用汇编语言调用C语言实现:通过键盘输入对角线坐标,在屏幕上开设一个窗口,并设定热键控制窗口的颜色,要求屏幕上自上到下颜色由浅到深变化。
三.基本要求:
1.学生应任选择三题,经教师确认后进行课程设计。
2.学生应人真查阅资料,独立完成设计任务,每道题都必须上机通过。
3.学生应注重培养自己独立思考,综合分析问题解决问题和调试程序的能力。
4.按时完成课程设计,写出课程设计报告(报告要要用统一的报告纸写)。
四.具体内容:
本人编写的是第2,3,4题的程序,各程序具体内容如下:
第2题
1. 设计思想和实施方案:
这个程序要求在屏幕的右上角显示当日过生日的同学,这就要求要把一部分程序驻留在内存当中,从而即时的检测当日的日期,然后比较看看在这个日期下有没有同学过生日,有则打印在屏幕的右上角,没有就不显示。这就是这个程序的基本思想。
也就是说这个程序的关键就在于实现检测生日和显示生日的程序的驻留。要实现驻留,就需要使用中断,也就是在保留各寄存器的原始内容后,用sti开中断,然后进行比较和显示的操作,再用cli关中断,读回压入堆栈中各寄存器原来的数据,恢复中断现场。同时用install部分来控制中断的类型和决定驻留区的大小,这里设置为I/O设备中断向量。 2.程序清单和程序注释: code segment
assume cs:code,ds:code ;段定义 start: jmp install
msg db 'Today is birthday of Li',? ;定义要显示的字符串
old dd ? new:
push ax push bx push cx
push dx ;保留各寄存器原始内容 push si push di push es
sti ;中断标志置1,开中断 mov ah,2ah int 21h
cmp dh,1 ;比较月份 jnz case0
cmp dl,18 ;比较日期 jnz case0
mov ax,0b800h mov es,ax mov di,54*2d
lea si,msg ;把要输出的msg字符串置入si
case: mov al,cs:[si] inc si
or al,al ;判断是否为“?”作为显示结束的标志 jz case1
cld ;设置地址自动增量 stosb
inc di ;把字符串存入附加段中 jmp case ;跳转以实现逐个存入字符
case0:
mov ax, 0600h mov bh, 07h
mov cx, 002eh ;在屏幕右上角初始化窗口 mov dx,0279h int 10h
case1: cli ;中断标志置0,关中断 pop es pop di pop si
pop dx ;取回各寄存器的原始内容 pop cx pop bx pop ax
jmp cs:old ;指令回到old地址处
install: push cs ;通过install部分实现驻留 pop ds
mov ax,351ch ;取中断向量(al=中断类型) int 21h
mov word ptr old,bx ;存储bx和es内容到存储器old mov word ptr old+2,es lea dx,new
mov ax,251ch ;设置中断向量(al=中断类型号) int 21h
mov dx,offset install+120h ;通过dx设置驻留区的大小 mov cl,04h
shr dx,cl ;逻辑右移4位
mov ah,31h ;结束并驻留(al=返回码,dx=驻留区大小) int 21h code ends
end start ;程序结束
3.典型程序模块和典型编程技巧分析:
这个程序中关键是驻留的实现,这里驻留是通过保存现场,开关中断,恢复现场,设置中断类型,设置驻留区大小几个步骤实现的,这里开中断后只检测了是不是1月18号,如果是则显示是李的生日,不是则不显示。
另外,程序中的case0部分的作用是在屏幕的右上角初始化了一个显示窗口,用于显示当天过生日的同学。这里有CH,CL表示左上角的坐标,DH,DL表示右上角的坐标。
而case部分则是一种逐个输出字符的显示字符串的方法,用?作为字符串结束的标志,利用循环,每次输出一个字符,di加1,直到or al,al语句检测到?输出结束,跳出循环。 4.程序框图:
第3题:
1.设计思想和实施方案:
这个程序要求在屏幕上开3个窗口,在键盘输入字符的时候下面的第3个窗口始终显示,上面2个窗口用户可以选择一个显示,对于3个窗口当列数显示满时都会自动向上卷行。三个窗口显示字符和卷行的操作实际上是完全相同
的,现在还需要做的就是上面1,2两个窗口的切换问题,在这里,本人用“1”,“2”来作为2个窗口切换的功能键,也即当在2中显示时按1就转到了1窗口,当在1中显示时按2就转到了2窗口。另外,用ST1,ST2,ST3分别给3个窗口的输入字符计数,以及时的进行卷行操作。 2.程序清单和程序注释: DATA SEGMENT
ST1 DB 0 ST2 DB 0 ST3 DB 0 DATA ENDS
PROGNAM SEGMENT MAIN PROC FAR
ASSUME CS:PROGNAM,DS:DATA START:
PUSH DS SUB AX,AX PUSH AX
MOV AX,DATA MOV DS,AX
CALL CLEAR_SCREEN ;调用设置显示方式的子程序 MOV DI,0 ;置初始状态的DI为0
INPUT:
MOV AH,0
INT 16H ;从键盘读字符,存在AL中 CMP AL,'2'
JE YI ;设定如果按数字2键则跳转到在2号窗口操作 CMP AL,'1'
JE ER ;设定如果按数字1键则跳转到在1号窗口操作 CMP AL,0DH ;设定如果输入回车则结束程序 JE QUIT
CALL SHANG CALL XIA JMP INPUT YI:
MOV DI,1 ;这里置DI为1 JMP INPUT ER:
MOV DI,0 ;这里置DI为0 JMP INPUT
QUIT:
RET
MAIN ENDP
SHANG PROC NEAR
CMP DI,0 ;DI为0在1号窗口输入字符 JNE OUT3 MOV CL,ST1 ADD CL,10
MOV MOV MOV MOV INT
MOV MOV MOV MOV INT
INC CMP JL PUSH MOV MOV MOV MOV MOV MOV MOV MOV INT
POP
OUT2:
JMP OUT3:
MOV ADD
MOV AH,2 DH,15 DL,CL BH,0
10H AH,0EH
BH,0 BL,70H CX,1
10H ST1 ST1, 20 OUT2
AX ST1,0 AH,6
AL,1 CH,5
CL,10 DH,15
DL,30 BH,7 10H AX EXIT CL,ST2 CL,50 AH,2
;置光标位置1号窗口中 ;BH表示页号 ;BL置前景色 ;显示AH中的字符在光标位置;ST1计在窗口1输入字符数目 20则继续输入 ;存储AX的初始植 ;表示屏幕上卷一行 ;CH,CL表示左上角坐标 ;DH,DL表示右上角坐标
;实现字符显示上卷一行 ;如果字符数小于
MOV DL,CL MOV BH,0
INT 10H ;置光标在2号窗口中
MOV AH,0EH
MOV BH,0 ;BH表示页号 MOV BL,70H ;BL置前景色 MOV CX,1
INT 10H
INC ST2 CMP ST2 , 20 JL OUT1 PUSH AX MOV ST2,0 MOV AH,6
MOV AL,1 MOV CH,5
MOV CL,50 MOV DH,15
MOV DL,70 MOV BH,7 INT 10H
POP AX OUT1: EXIT: RET
SHANG ENDP
XIA PROC NEAR MOV CL,ST3 ADD CL,15
MOV AH,2 MOV DH,22 MOV DL,CL MOV BH,0
INT 10H
MOV AH,0EH
MOV BH,0 MOV BL,70H ;显示AH中的字符在光标位置 ST2计在窗口2输入字符数目 ;如果字符数小于20则继续输入 ;表示屏幕上卷一行 ;CH,CL表示左上角坐标 ;DH,DL表示右上角坐标
;实现字符显示上卷一行 ;读出AX的原值 ;在1,2窗口显示字符子程序结束 ;置光标在3号窗口中 ;BH表示页号 ;BL置前景色
;
INT 10H
INC ST3 ;ST3计在窗口2输入字符数目 CMP ST3, 50 ;如果字符数小于50则继续输入 JL EXT MOV ST3,0 MOV AH,6
MOV AL,1 ;表示屏幕上卷一行 MOV CH,18
MOV CL,15 ;CH,CL表示左上角坐标 MOV DH,22
MOV DL,65 ;DH,DL表示右上角坐标 MOV BH,7
INT 10H ;实现字符显示上卷一行 EXT: RET
XIA ENDP
CLEAR_SCREEN PROC NEAR ;设置显示方式和光标初始位置的子程序 PUSH AX
PUSH BX ;保存寄存器的原始内容 PUSH CX PUSH DX
MOV AX,0003H
INT 10H ;设置显示方式为80X25 16色文本 MOV DX,0 MOV AH,2
INT 10H ;置光标位置为(0,0) POP DX
POP CX ;取出寄存器的原内容 POP BX POP AX RET
CLEAR_SCREEN ENDP
PROGNAM ENDS
END START ;程序结束 3.典型程序模块和典型编程技巧分析:
在这个程序里,显示字符主要涉及的就是卷行操作,INT 10h,AH=6时有AL为上卷行数,BH为卷入行属性,CH/CL表示左上角行/列号,DH/DL=右上角行/列。此处用ST1,ST2,ST3分别做3个窗口显示字符数的计数器,以在正确的时候进行卷行操作。
在这个程序中控制光标的位置和窗口顶点位置的部分也是图形控制和在适当位置显示字符等操作中很有用的编程技巧。
4.程序框图:
第4题:
1. 设计思想和实施方案:
在这个程序中要实现按键控制一个窗口的颜色变化,同时还要使窗口的背景自下到上颜色由浅到深变化,设置显示方式为320x200 256色图形,也就是说满屏是320列200行,在输出背景图时,就用到这组数据,每13行颜色值加1,就可以实现由浅到深的变化。 在实现象素显示的时候,用了write子程序,知道了对角线的坐标(x1,y1),(x2,y2),就可以把这个方形窗口区域逐个象素的上色。
另外,在实现窗口颜色变化的时候,通过键盘输入一个字符,检测如果字符为回车则跳出,结束程序,如果是其他任意字符,则颜色值加1,也就是说除去回车键以外,其他任意键按一次,窗口的颜色就变化1次。 2.程序清单和程序注释: data segment
buff dw 20 dup(?) x1 dw ?
y1 dw ? ;定义存储单元 x2 dw ? y2 dw ? data ends
;---------------------------- code segment
;---------------------------- main proc far
assume cs:code,ds:data
start: push ds
sub ax,ax ;ax置0 push ax mov ax,data mov ds,ax
;---------------------------- mov ah,0 mov al,13h
int 10h call bj
mov x1,0 mov y1,0 mov x2,70 mov y2,70 mov al,01h
call write loop1:
push ax mov ah,0
int 16h cmp al,0dh
je exit pop ax inc al call write jmp loop1 mov ah,0 exit:
mov aX,0003
int 10h ret
main endp
;--------------------------- bj proc near mov dx,0
mov al,0 push bx mov bx,0 mov al, 1fh
case1:
;设置显示方式为320x200 256色图形(VGA) ;设置变色窗口的顶点坐标 ;输出变色窗口的颜色 ;存储原来的ax ;从键盘输入任意字符 ;如果输入的是回车则跳出 ;调出原来的ax ;颜色值加1 ;读光标位置 ;把dx,al置0
;存储bx原来的值
cmp bx,13 ;每13行改变一次颜色 jl case2
dec al ;颜色值减1 mov bx,0
case2:
mov cx,0
rotate:
mov ah,0ch ;显示渐变背景的部分 int 10h inc cx
cmp cx,320 ;0到320列写像素 jl rotate add dx,1 inc bx
cmp dx,200 ;0到200行写像素 jl case1
pop bx ;读取bx原来的值 ret
bj endp
;----------------------------
write proc near ;在方形区域显示像素的子程序 mov dx,y1 line:
mov cx,x1 point:
mov ah,0ch
int 10h ;在(x1,y1)点上写像素 inc cx ;向左移动一列
cmp cx,x2 ;cx小于x2的时候继续写像素 jl point
inc dx ;向下移动一行
cmp dx,y2 ;dx小于y2的时候继续写像素 jl line ret
write endp
;--------------------------- code ends
end start ;结束程序
3.典型程序模块和典型编程技巧分析:
在这个程序里,在实现背景颜色渐变的时候,需要设置每多少行使颜色变化一次,这里本人的程序中用的值13是多次实验得出的最好显示效果的,如果更多或更少行,则可能会显示出彩色的条纹,不符合题目的要求。
另外,利用(x1,y1)和(x2,y2)来限定一个窗口,以对其进行上色等操作,也是图形编程中经常用到的一种手法。 4.程序框图:
五.课程设计中遇到的问题及解决方法:
在第二题中,设置中断类型和驻留区大小的install部分比较难于实现,其
实本人是第一次接触驻留这个概念,在以往的编程中,基本所有程序都是即时运行,即时结束的,并没有驻留到内存中,以时刻调用的例子。因而,一开始很不知该如何下手,后来在网上查阅了一些信息,了解了驻留的实现其实就是一个中断控制的过程,实际上install这部分程序也是原版引用的一份资料中的内容。可以说这部分是实现驻留必不可少的。
在第四题中,要求背景的颜色是渐变的,而一开始设置多少行颜色变化一次就成了一个问题,本人实验了许多组数值,最后发现只有当13行变化一次的时候背景显示的效果最好,完全是灰度色彩变化。如果大一些或这小一些,都会使屏幕上出现彩色的条纹,也就不再是严格定义上的色彩由浅到深变化了。
还有,在第三题和第四题中,其实都涉及到了在窗口显示字符或像素点的问题,起初这对于我来说也是很陌生的,对于如何开设窗口,如何控制卷行,如何逐行逐列的显示像素点又控制在所要求的窗口中,这些问题起初都很让我为难,后来对这部分进行了相对进一步的学习和研究,也就有了一点浅显的认识,又经过多次实验调试,终于实现了这些窗口中的操作。其实,这种课程设计的过程也就是一种学习的过程,如果真的认真的去完成每一步程序,每一条指令,一定会颇为受益的。
六.收获与体会:
这次汇编语言的课程设计虽然说内容并不是很多,只是从四道题目中任选
三道编写程序而已,但还是很有收获的。在这几道题目中,有很多我以前根本就没有接触到过的东西,如程序的驻留,DOS环境下窗口的显示等….....因而在写程序的过程中还是遇到了很多问题的,但通过在网上查阅资料,和同学一起讨论研究,最终还是写出了我认为可以算是不错的程序。而这些查资料和讨论的过程本身就是一种学习和提高的过程,完成了程序的编写后,回过头来再看看,觉得自己对汇编语言的认识真的在一定程度上加深了,而且也了解了许多新的知识领域里的问题。几天的辛苦没有白费。
正在阅读:
汇编语言程序设计报告04-23
人体寄生虫学习题11-29
王茂华,谭良才02-19
安全生产检讨书02-11
年度保安个人工作总结参考模板08-01
二级计算机基础选择题(不含windows和word等)06-08
2015红领巾监督岗实施方案12-22
2018年中国奥特莱斯开发行业分析及发展趋势预测(目录)09-04
欲扬先抑的写人作文200字03-24
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 汇编语言
- 程序设计
- 报告
- 鲅鱼圈-营口旅游攻略
- Excel版本调查问卷模板
- 上市公司社会责任会计信息披露
- 安徽干部教育在线学习体会
- 【2022年12月】四季度_国脉科技(002093)_分析报告
- 百仕达大厦超高层建筑综合施工技术
- 上海建工第一季度季报
- 初中物理课堂评价.15.5.机械能及其转化
- 第六章 热水供应系统
- 机械变速器试验技术及联调试验台设计
- 鲁教版思想品德七年级上册复习提纲
- 第一章。平面构成概论
- 人教版二年级数学上册《加减混合》说课稿
- 2012年国家火炬计划重点高新技术企业名单
- 中考作文五种类型---写人写事篇
- 2010年河南省小学教师资格考试B卷打印版
- 真假苹果售后,你会鉴别么?
- 基于反馈控制的仿人机器人步态规划
- 工程造价全过程跟踪审计方案
- 张掖实验中学《体育与健康》教学计划