1汇编判断闰年实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.实验题目
编写一个判断闰年的汇编语言程序,判断某个年份是否是闰年,如果是,输出‚yes!‛;如果不是,则输出‚No!‛。

2.实验目的
1)学习汇编基本程序结构(顺序、分支、循环)编程;
2)学习int 21h的01h,09h,0ah号功能;
3)学习如何用堆栈方法解决实际问题。

3.实验步骤
1)根据题意,程序启动运行之后,用户在键盘上输入判断的年份,输出判断的结果。

所以,
程序主要结构应如下:
接收在键盘上输入的年份字符串,存储在缓冲区year;
将缓冲区中的年份转换成10进制数赋给变量yeard;
判断变量yeard是否满足闰年的条件;
输出判断的结果。

2)首先,定义数据段。

数据段包括输入判断闰年年份提示,判断是否结束程序的提示,输
入字符串的缓冲区(其中定义了允许输入的最大字节数,实际输入的个数,实际字符串存储的缓冲区大小),闰年和非闰年的判断提示,缓冲区的偏移量,十进制形式存储的变量yeard;
3)定义堆栈段,由于判断闰年时会改变yeard的数值,所以定义200个字节的堆栈空间供程
序使用;
4)接下来进入代码段的实现,从程序结构上看,用INT 21H的09号功能输出输入判断闰年
年份的提示,用INT 21H的10号功能输入年份字符串,将字符串存储在缓冲区year中;
5)定义最大输入的字符个数为5(包括回车),用循环again1将year转化为十进制数存入变
量yeard中;
a)设置最大循环次数为4,初始字符串偏移量i为2,年份变量yeard为0;
b)首先将ax寄存器置0,然后将year的首地址赋给si,再将si加上偏移量i用寄存器间接
寻址方式将si存储的字符赋给al;
c)将ax中存放的字符减去30h转化为十进制数值,把该数值加到年份变量yeard中,然
后bx清0,将实际输入的个数存入bl中,将偏移量i与bx+1作比较(判断是否读到
year的最后一个有效字符),是,跳出循环again1,否,继续下一步;
d)将ax中的数值乘以10再赋给yeard,然后i自增1,回到b。

6)判断yeard是否为闰年,是,输出‚yes!‛,否则输出‚No!‛;
a)将存有十进制形式的年份ax的数值压入栈中,然后与4进行整除运算,判断其余数是
否为0。

是,则进行下一步;否,跳到e;
b)将栈中的数值出栈赋给寄存器ax,再ax的数值压入栈中,然后与100进行整除运算,
判断其余数是否为0。

是,则进行下一步;否,跳到d;
c)将栈中的数值出栈赋给寄存器ax,然后与100进行整除运算,判断其余数是否为0。

是,
则进行下一步;否,跳到e;
d)输出提示‚yes!‛;跳到步骤7;
e)输出提示‚No!‛;
7)输出提示‚Continue?(n)‛,若想结束程序则按‘N’/’n’,否则按其他任意键。

源程序代码
data segment
output db'Input the year :','$'
judge db 13,10,'Continue?(n)',13,10,'$'
year db 5 ;允许输入的最大字节数
db?;实际输入的个数
db 5 dup(?) ,'$';实际字符串存储的缓冲区judge1 db'yes!','$'
judge2 db'no!','$'
i dw?;缓冲区的偏移量
yeard dw 0 ;10进制数形式的年份
ent db 13,10,'$'
data ends
stack segment
db 200 dup(0)
stack ends
code segment
assume cs:code,ss:stack,ds:data
start:
mov ax,data ;初始段寄存器
mov ds,ax
continue :
lea dx,output ;在屏幕上输出输入提示
mov ah,09h
int 21h
lea dx,year ;从键盘输入输入年份字符串
mov ah,0ah
int 21h
lea dx,ent ;换行
mov ah,09h
int 21h
mov cx,4 ;设置最大循环次数
mov i,2 ;取输入年份缓冲区字符串的偏移量mov yeard,0 ;年份置0
again1:
mov ax,0
lea si,year
add si,i
mov al,[si]
sub ax,30h ;将字符转化为10进制
add ax,yeard
mov bl,year[1] ;将实际输入的个数赋给bl寄存器add bx,1 ;计算出需要处理数据的次数
cmp i,bx
je over1
mov dx,0
mov bx,10
mul bx
mov yeard,ax
inc i
loop again1
over1:
push ax ;将ax压栈
mov dx,0
mov bx,4 ;将年份yeard与4整除
div bx
cmp dx,0
jne notleap
pop ax ;将ax出栈
push ax ;将ax压栈
mov dx,0
mov bx,100 ;将年份yeard与100整除
div bx
cmp dx,0
jne isleap
pop ax ;将ax出栈
mov dx,0
mov bx,400 ;将年份yeard与400整除
div bx
cmp dx,0
jne notleap
isleap : ;判断闰年
mov ah,09
lea dx,judge1
int 21h
jmp over2
notleap : ;判断非闰年
mov ah,09
lea dx,judge2
int 21h
over2:
mov ah,09 ;判断是否继续
lea dx,judge
int 21h
int 21h
cmp al,'n'
je outend
cmp al,'N'
je outend
jmp continue
outend:
mov ah,4ch
int 21h
code ends
end start
4.实验结果
5.心得体会
1)将复杂问题转化成若干个简单的问题,有助于问题的解决;
2)当程序出现语义错误时,多使用p指令检测程序,有利于定位程序发生错误的地方;
3)数据传送时,要注意传送的数据和目的操作数之间的大小关系,以防参与数据计算时掺
入其他不希望出现的数值;
4)常常将寄存器清0,可保证保存单个字节后,不影响后面数据的计算;
5)需要增加知识的获取量和加强有关方面的实践,提高排错能力。

相关文档
最新文档