📄 实验一 闰年判断.asm
字号:
;判断闰年
;根据输入的具体年份(在1900-2100之间,要求对输入进行有效性检查)
;判断是否闰年,并给出相应的提示信息
load macro ;宏——依次读取字符串中的一个字符
mov cx,1
lodsb
endm
print macro mess ;宏——显示字符串
lea dx,mess
mov ah,9
int 21h
endm
data segment
yearasc label byte
maxlen db 5
actlen db ?
kb_data db 5 dup (?)
year dw 0
inmess db 'Please input a year:',0dh,0ah,'$'
errmess1 db 0dh,0ah,'INVALID INPUT!',0dH,0aH,'$'
errmess2 db 0dh,0ah,'INVALID YEAR INPUT(1900-2100)!',0dH,0aH,'$'
ymess db 0dh,0ah,'This is a leap year!','$'
nmess db 0dh,0ah,'This is a common year!','$'
factor dw 01h
data ends
code segment
main proc far
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
call input
call cascdec
call leap
mov ax,4c00h
int 21h
main endp
input proc near
print inmess
enter:
mov ah,0ah
lea dx,yearasc
int 21h
cld
mov cx,4
lea si,kb_data
check1: ;有效输入范围:1000-9999
lodsb
cmp al,'0'
jb err1
cmp al,'9'
ja err1
loop check1
;jmp check2
check2: ;有效输入范围:1900-2100
lea si,kb_data
cld
load
cmp al,'1'
je b1
cmp al,'2'
je b2
ja err2
ret
b1:
load
cmp al,'9'
jne err2
ret
b2:
load
cmp al,'1'
ja err2
jb exit
load
cmp al,'0'
ja err2
load
cmp al,'0'
ja err2
exit:
ret
err1:
mov dl,07h
lea dx,errmess1
mov ah,9
int 21h
jmp enter
err2:
lea dx,errmess2
mov ah,9
int 21h
jmp enter
input endp
cascdec proc near ;ASC码转十进制
std
lea si,kb_data+3
mov cx,4
again:
xor ax,ax
lodsb
and al,0fh ;AL寄存器的内容和0FH相与,使ASCII码的高4位清零,低4位保持不变
mul factor ;于是一个ASCII码数就转换成了BCD码
add year,ax
mov ax,factor
mov bx,10
mul bx
mov factor,ax
loop again
ret
cascdec endp
leap proc near
mov ax,year
and ax,0003h ;能否被4整除
jne no ;不能则输出NO
mov ax,year
mov cl,100
div cl ;除100
cmp ah,00h ;能否整除
jne yes ;不能,打印YES
xor dx,dx
mov ax,year
mov cx,400
div cx
cmp dx,0
je yes
no:
print nmess
jmp exit1
yes:
print ymess
exit1:
ret
leap endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -