【汇编例题】判断某一年是否为润年
data segment ;定义数据段
infon db 0dh,0ah,'Please input a year:
;提示信息
Y db 0dh,0ah,'This is a leap year!
;是闰年
N db 0dh,0ah,'This is not a leap year!
;不是闰年
w dw 0 ;存放非ascii码数据的 闰年
buf db 8 ;存放输入的闰年数据是ascii码
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax
;功能09H
;功能描述:输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,
;将无法判断磁盘已满
;入口参数:AH=09H
;DS:DX=待输出字符的地址
;说明:待显示的字符串以’$’作为其结束标志
;出口参数:无
lea dx,infon;取infon的偏移地址
mov ah,9
int 21h
;功能10
;功能描述:从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入
;(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,
;将无法判断文件是否已到文件尾
;入口参数:AH=0AH
;DS:DX=存放输入字符的起始地址
;接受输入字符串缓冲区的定义说明:
;1、第一个字节为缓冲区的最大容量,可认为是入口参数;
;2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
;3、从第三个字节开始存放实际输入的字符串;
;4、字符串以回车键结束,回车符是接受的最后一个字符;
;5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并
;发出响铃,直到输入“回车”键才结束输入。
lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h
mov cl, ;字符的个数
call datacate
call ifyears
jc a1
lea dx,n
mov ah,9
int 21h
jmp exit
a1: lea dx,y
mov ah,9
int 21h
exit: mov ah,4ch
int 21h
datacate proc near
push cx;
dec cx
lea si,buf+2
tt1: inc SI ;计算出最后一个年份字符的偏移
loop tt1
pop cx
mov dh,30h
mov bl,10
mov ax,1
l1: push ax
subbyte ptr,dh
mulbyte ptr
add w,ax
pop ax
mul bl
dec si
loop l1
ret
datacate endp
;能被4整除且又能不能被100整除 是闰年 能直接被400整除也是闰年
ifyears proc near
pushbx
pushcx
pushdx
mov ax,w
mov cx,ax
movdx,0
movbx,4
divbx
cmpdx,0
jnzlab1
mov ax,cx
movbx,100
divbx
cmp dx,0
jnzlab2
movax,cx
mov bx,400
divbx
cmpdx,0
jzlab2
lab1: clc
jmp lab3
lab2: stc
lab3: popdx
popcx
popbx
ret
ifyears endp
code ends
end start
页:
[1]