《汇编语言》课程设计报告判断闰年程序.docx
《《汇编语言》课程设计报告判断闰年程序.docx》由会员分享,可在线阅读,更多相关《《汇编语言》课程设计报告判断闰年程序.docx(11页珍藏版)》请在冰豆网上搜索。
《汇编语言》课程设计报告判断闰年程序
《汇编语言》课程设计报告
题目:
判断闰年程序
院(系):
计算机与信息工程学院
班级:
姓名:
学号:
指导教师:
1设计主要任务
通过完成闰年判别程序设计掌握字符输入及、调试过程。
1.1设计任务与目标
软件所实现的任务与目标主要包括:
(1)由键盘输入任意年份,判断输入年份是否在限制区间2000-9999内;
(2)若程序判别输入年份为闰年,显示☺,不是闰年显示△;
(3)根据要求确定解决问题的编程方法;
(4)画出程序框图、设计源程序;
(5)在计算机上汇编、链接所设计的程序;
(6)按照要求调试程序,记录程序运行结果;
(7)写出设计总结报告。
2设计方案
判断某年是否为闰年具体算法为如果该年份的数值正整数若能被400整除,或者不能被100整除,却能被4整除,则该数值代表的年份为闰年。
判断结果的显示符号可用ASCII值来实现。
流程图如下:
4子程序设计
4.1输入判断子程序
该模块是对输入的年份的范围的判断,若是输入不在2000-9999之内,则显示错误Error,若是输入在范围内,则进行下面的操作。
4.2数字转换子程序
将数字字符串转换成数字,以便进行下面的程序操作。
4.3判断闰年子程序
判断输入的年份是否为闰年,若是则输出☺,若不是则输出△,然后退出。
5调试
程序调试主要使用宏汇编程序MASM.EXE、连接程序LINK.EXE、
系统操作界面当输出年份时显示结果
当输入为闰年时显示笑脸并返回操作界面:
6设计总结
通过这几天的汇编课程设计,基本掌握闰年判别程序设计,首先是根据题目要求确定思路,然后根据思路按照题目要求编写相应汇编程序,最后用软件调试结果是否正确。
在此次课程设计中,虽然课本上也讲过年份的判别,但是比较分散,所以刚开始设计时思路不是太清,通过查阅相关资料,清楚了程序设计的基本框架,进而能编写出相应程序,设计中又一个难题是最后屏幕显示的问题,通过查阅相应ASCII值,使最后显示出结果。
一周的课程设计让我收获颇多,虽然调试中遇到不少问题,但通过调试明白程序中存在的问题并改正。
通过本次实验,以后的学习奠定了良好的基础,是对自己综合能力的一种提高。
7程序清单
datasegment
infondb0dh,0ah,'inputayear:
$'
Edb0dh,0ah,'Error!
$'
wdw0;保存年份的数值,因年份是字符串,需要转换数
bufdb8;定义输入缓冲区
db?
db8dup(?
)
dataends
stacksegmentstack
db200dup(0)
stackends
codesegment
assumeds:
data,ss:
stack,cs:
code
start:
movax,data
movds,ax
leadx,infon;在屏幕上显示提示信息
movah,9;显示字符串
int21h
leadx,buf;从键盘输入年份字符串
movah,0Ah;0AH功能调用从键盘接受字符串到内存的输入缓存区
int21h
movcl,buf+1;把输入的字符的个数保存在cl中
leadi,buf+2;把从键盘输入字符的首地址存放到di中
pushax
a0:
moval,[di]
cmpal,0dh
jza1
cmpal,'9'
jga3
cmpal,'2'
jla3
incdi
a00:
moval,[di]
cmpal,0dh
jza1
cmpal,'9'
jga3
cmpal,'0'
jla3
incdi
jmpa00
a1:
popax
calldatacate;调用datacate子程序
callifyears;调用ifyears子程序
jca2;如果进位则跳转
subAX,AX;输出不是闰年,显示三角形
pushAX
movAH,0FH
int10h
movAH,0
movAL,2
int10h
movCX,1
movDX,0
MOVAH,2
int10H
movAL,30
movAH,0AH
int10H
movah,9
int21h
jmpexit
a2:
subAX,AX;输出是闰年显示笑脸
pushAX
movAH,0FH
int10h
movAH,0
movAL,2
int10h
movCX,1
movDX,0
MOVAH,2
int10H
movAL,2
movAH,0AH
int10H
movah,9
int21h
callexit
a3:
leadx,e
movah,9
int21h
exit:
movah,0
int16h
movah,4ch;返回操作系统
int21h
datacateprocnear;用于把表示年份的字符串转换为数值
pushcx;
deccx;让cx寄存器自减1
leasi,buf+2;把字符串的首地址保存在源地址寄存器SI中让si指向字符串的最低位
p1:
incsi
loopp1
popcx
movdh,30h
movbl,10
movax,1
p2:
pushax
subbyteptr[si],dh;ASCII码字符,减去30H后转换十六进制数
mulbyteptr[si];计算ax乘以字符数字
addw,ax;把计算结果累加,并保存在w中
popax;出栈操作,去除上一次操作后的倍数
mulbl;乘以bl,计算当前的倍数
decsi;修改源地址寄存器si的值,使得si指向下一个字符(即高位)
loopp2;循环直到所有字符处理完毕(
ret;子程序返回指令
datacateendp
ifyearsprocnear;此子程序用来判断年份是否为闰年
pushbx
pushcx
pushdx
movax,w;把转换后的年份的数值存入AX
movcx,ax
movdx,0;将dx清零
movbx,4;把4存放到寄存器bx中(除数)
divbx;除法指令
cmpdx,0;将dx的余数与0进行比较,看似否整除
jnzlab1;若不相等跳转
movax,cx;判断年份是否位400的整数倍
movbx,100;将100赋给bx寄存器,做div的源操作数
movdx,0
divbx
cmpdx,0;将dx中的余数与0比较,看似否整除
jnzlab2
movax,cx;判断年份是否位400的整数倍
movbx,400
movdx,0
divbx
cmpdx,0
jzlab2
lab1:
clc;清除进位标志,即非闰年
jmplab3
lab2:
stc;设置进位标志,即闰年
lab3:
popdx
popcx
popbx
ret;子程序返回指令
ifyearsendp
codeends
endstart