汇编判断闰年课程设计报告.docx
《汇编判断闰年课程设计报告.docx》由会员分享,可在线阅读,更多相关《汇编判断闰年课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
汇编判断闰年课程设计报告
闰年判别程序设计
一、设计目的
通过完成闰年判别程序设计掌握字符输入及特殊符号显示方面的编程、调试过程。
二、设计要求
1、程序要求
(1)由键盘输入任意年份,限制范围:
2000-9999;
(2)若程序判别输入年份为闰年,显示☆,否则显示△;
2、设计内容
(1)根据要求确定解决问题的编程方法;
(2)画出程序框图、设计源程序;
(3)在计算机上汇编、链接所设计的程序;
(4)按照要求调试程序,记录程序运行结果;
(5)写出设计总结报告。
三、总体设计思路
判断某年是否为闰年具体算法为如果该年份的数值正整数若能被400整除,或者不能被100整除,却能被4整除,则该数值代表的年份为闰年。
判断结果的显示符号可用ASCII值来实现。
(1)程序框图
(2)程序源代码
a.各个模块
主模块:
显示提示输入年份以及输入的内容和最后输出的判断
子模块:
①判断输入:
该模块是对输入的年份的范围的判断,若是错误则显示错误Error,正确则进行下面的操作。
②将数字字符串转换成数字,以便进行下面的程序操作。
③判断闰年:
判断输入的年份是否为闰年,若是则输出笑脸,若不是则输出三角形,然后退出。
b.程序代码
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中
push ax
a0:
moval,[di]
cmpal,0dh
jz a1
cmpal,'9'
jga3
cmpal,'2'
jl a3
inc di
a00:
moval,[di]
cmpal,0dh
jz a1
cmpal,'9'
jga3
cmpal,'0'
jl a3
inc di
jmp a00
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:
mov ah,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
sub byteptr[si],dh;ASCII码字符,减去30H后转换十六进制数
mul byteptr[si] ;计算ax乘以字符数字
addw,ax ;把计算结果累加,并保存在w中
popax ;出栈操作,去除上一次操作后的倍数
mulbl ;乘以bl,计算当前的倍数
decsi ;修改源地址寄存器si的值,使得si指向下一个字符(即高位)
loopp2 ;循环直到所有字符处理完毕(
ret ;子程序返回指令
datacateendp
ifyearsprocnear ;此子程序用来判断年份是否为闰年
push bx
push cx
push dx
mov ax,w ;把转换后的年份的数值存入AX
mov cx,ax
mov dx,0 ;将dx清零
mov bx,4 ;把4存放到寄存器bx中(除数)
div bx ;除法指令
cmp dx,0 ;将dx中的余数与0进行比较,看似否整除
jnz lab1 ;若不相等跳转
mov ax,cx ;判断年份是否位400的整数倍
mov bx,100;将100赋给bx寄存器,做div的源操作数
mov dx,0
div bx
cmp dx,0 ;将dx中的余数与0进行比较,看似否整除
jnz lab2
mov ax,cx ;判断年份是否位400的整数倍
mov bx,400
mov dx,0
div bx
cmp dx,0
jz lab2
lab1:
clc ;清除进位标志,即非闰年
jmplab3
lab2:
stc ;设置进位标志,即闰年
lab3:
pop dx
pop cx
pop bx
ret ;子程序返回指令
ifyearsendp
codeends
endstart
(3)程序调试结果
a.操作系统界面
b.当输出年份时显示结果
当输入为闰年时显示笑脸并返回操作界面:
当输入不是闰年时输出三角形并返回界面: