data segment
X DW ?
f db 0 ;读取输入数字的标志符,0-正常数字,1-E or e, 2-非数字
mo1 db 'January',0dh,0ah, '$' ;定义1-12月的字符串
mo2 db 'February', 0dh, 0ah, '$'
mo3 db 'March', 0dh, 0ah, '$'
mo4 db 'April', 0dh,0ah,'$'
mo5 db 'May',0dh,0ah,'$'
mo6 db 'June',0dh,0ah,'$'
mo7 db 'July',0dh,0ah,'$'
mo8 db 'August',0dh,0ah,'$'
mo9 db 'September',0dh,0ah,'$'
mo10 db 'October',0dh,0ah,'$'
mo11 db 'November',0dh,0ah,'$'
mo12 db 'December',0dh,0ah,'$'
me db 'Input error.',0dh,0ah,'$' ;输入错误的字符串提示
data ends
code segment
assume cs:code, ds:data
start:
MOV AX, data
mov ds, ax
lea si, X ; si指向存储输入数字的变量
call readint ; 读取输入数字
f1:
cmp f, 1 ;'E' or 'e', exit program
jnz f2
jmp exit
f2:
cmp f, 2 ;输入是不是合法数字
jnz m1
f3:
lea dx,me ;不是,则输出错误信息
jmp showmsg
m1:
cmp X,1
jb f3 ;输入数字<1月,则输出错误信息
ja m2 ;x>1,判断x==2?
lea dx,mo1 ;x==1
jmp showmsg ;输出1月英文
m2:
cmp X, 2 ;判断2月?下同
ja m3
lea dx,mo2
jmp showmsg
m3:
cmp X,3
ja m4
lea dx,mo3
jmp showmsg
m4:
cmp X,4
ja m5
lea dx,mo4
jmp showmsg
m5:
cmp X,5
ja m6
lea dx,mo5
jmp showmsg
m6:
cmp X,6
ja m7
lea dx,mo6
jmp showmsg
m7:
cmp X,7
ja m8
lea dx,mo7
jmp showmsg
m8:
cmp X,8
ja m9
lea dx,mo8
jmp showmsg
m9:
cmp x, 9
ja m10
lea dx,mo9
jmp showmsg
m10:
cmp x, 10
ja m11
lea dx,mo10
jmp showmsg
m11:
cmp x,11
ja m12
lea dx,mo11
jmp showmsg
m12:
cmp x,12 ;12月?
ja f0 ;>12,则输出错误信息
lea dx, mo12 ;12月的提示信息
jmp showmsg
f0:
lea dx,me
showmsg:
mov ah,9
int 21h
exit:
mov ah,4ch ;exit to OS
int 21h
;read a integer less than 65535
;return it in [si]
readint proc near
mov bx,10
read:
mov ah,1 ;读取一个字符
int 21h ; 21h中断1号子功能
cmp al,'E' ;判断=='E'?
jz r0
cmp al,'e' ; =='e' ?
jz r0
cmp al,0dh ;回车键,表示输入结束
jz e2
cmp al,'0'
jb e1 ; < '0',输入有误
cmp al,'9' ; >'9',输入有误
ja e1
and al,0Fh ; ;ascII码转成实际数值
mov ah,0
xchg ax,[si] ; ax与[si]互换
mul bx ; ax * 10
xchg [si],ax ; [si]与ax互换
add [si],ax ; [si] + ax, 即实现输入2位以上10进制数
jmp read
r0:
mov f, 1 ;f=1,则表示输入'E'或'e'字符
jmp e2
e1:
mov f, 2 ;f=2,表示输入错误字符
e2:
ret
readint endp
code ends
end start
温馨提示:答案为网友推荐,仅供参考