data segment ;定义数据段
infon db 0dh,0ah,'Please input a year: $' ;定义数据段 infon 准备用来显示的一个字符串段
Y db 0dh,0ah,'This is a leap year! $' ; Y 来显示判断之后的信息,闰年显示这个
N db 0dh,0ah,'This is not a leap year! $' ; N 不是闰年显示这个
w dw 0 ;dword段 初始为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 ;执行 data移动到ax
mov ds,ax ;ax 移动到ds 这是声明的执行段
lea dx,infon ;在屏幕上显示提示信息 ;这一行的意思是 把infon的首地址给dx
mov ah,9 ;执行第21号中断 显示
int 21h
lea dx,buf ;从键盘输入年份字符串 ;buf的首地址给dx
mov ah,10 ;等待输入的中断
int 21h
mov cl, [buf+1] ;buf的下一个移动到cl
lea di,buf+2 ;di设为buf+2的首地址
call datacate ;调用datacate
call ifyears ;调用ifyears
jc a1 ;有进位的话 跳转到a1
lea dx,n ;n的首地址给dx
mov ah,9 ;显示
int 21h
jmp exit ;无条件跳转到exit
a1: lea dx,y ;把y的首地址给dx
mov ah,9 ;显示
int 21h
exit: mov ah,4ch ;将控制权交给当前系统,即退出,这也是个中断
int 21h
datacate proc near ;datacate过程
push cx ;cx入栈
dec cx ;cx累加
lea si,buf+2 ;将buf+2的首地址给si
tt1: inc si ;si减一
loop tt1 ;循环tt1
;lea si,cx[di] ;这句被注释了
pop cx ;cx弹栈
mov dh,30h ;把30h传递给DH
mov bl,10 ;把10传递给BL
mov ax,1 ;把1传递给ax
l1: push ax ;ax入栈
sub byte ptr [si],dh ;[si]指向的数据-dh
mul byte ptr [si] ;作用:当操作数为8位时,AX=AL*src;
add w,ax ;w+ax
pop ax ;ax弹栈
mul bl ;bl+al→ax
dec si ;si+1
loop l1 ;循环l1
ret
datacate endp
ifyears proc near ;ifyears过程
push bx ;bx,cx,dx,入栈
push cx
push dx
mov ax,w ;w→ax
mov cx,ax ;ax→cx
mov dx,0 ;0→dx
mov bx,4 ;4→bx
div bx ;ax/bx
cmp dx,0 ;比较dx和0
jnz lab1 ;不相等 跳到lab1
mov ax,cx ;cx→ax 100→bx
mov bx,100
div bx ;ax/bx
cmp dx,0 ;比较dx和0
jnz lab2 ;不等 跳到lab2
mov ax,cx ;cx→ax cx→400
mov bx,400
div bx ;ax/bx
cmp dx,0 ;比较dx和0
jz lab2 ;相等 跳到lab2
lab1: clc ;cf置零
jmp lab3 ;跳到lab3
lab2: stc ;cf置1
lab3: pop dx ;dx,cx,bx弹栈
pop cx
pop bx
ret
ifyears endp
code ends
end start