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
buf db 8
db ?
db 8 dup(?)
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
lea dx,infon ;在屏幕上显示提示信息
mov ah,9
int 21h
lea dx,buf ;从键盘输入年份字符串
mov ah,10
int 21h
mov cl, [buf+1]?cl=实际输入的字符数(不包括回车)
lea di,buf+2 ;将年份的地址传给寄存器
call datacate
call ifyears
jc a1 ;如果判断是闰年就显示Y,不是闰年就显示N
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
;lea si,cx[di]
pop cx ;把字符指向最后一个数字
mov dh,30h ;转换成ASCII码,需要减30h
mov bl,10 ;10进制
mov ax,1
l1: push ax
sub byte ptr [si],dh?把输入的年份字符减30H
mul byte ptr [si] ;
add w,ax ;程序把换算成的年份数放在W处
pop ax
mul bl ;ax进位
dec si
loop l1
ret
datacate endp
ifyears proc near ;判断W处的年分数是否为闰年
push bx
push cx
push dx
mov ax,w ;将年份弄到cx寄存器
mov cx,ax
mov dx,0
mov bx,4
div bx
cmp dx,0 ;DX中放余数
jnz lab1 ;不被4整除
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz lab2 ;被4整除但不被100整除
mov ax,cx
mov bx,400 ;被400整除
div bx
cmp dx,0
jz lab2
lab1: clc ;设置CF标志位为0
jmp lab3
lab2: stc ;设置CF标志位为1
lab3: pop dx
pop cx
pop bx
ret
ifyears endp
code ends
end start