题目
从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示出这三类的计数结果。
思路
分支的极致运用,按照ASCII码由小到大进行比较,有点麻烦。详细解释见代码。
代码
datasg segment
ALPHABET db 'alaphabet:','$'
NUMBER db 'number:','$'
OTHER_ db 'other:','$'
CRLF db 13,10,'$'
datasg ends
;------------
codesg segment
assume cs:codesg,ds:datasg,es:datasg
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;-------------
begin:
mov bx,0 ;字母字符计数器
mov si,0 ;数字字符计数器
mov di,0 ;其他字符计数器
input:
mov ah,1 ;调用1号中断输入一个字符
int 21h ;存放于al中
cmp al,13 ;是回车吗?
je disp ;display
cmp al,30H ;小于数字0吗?
jae next1 ;大于数字0
OTHER: ;小于数字0的一定是其他字符
inc di
jmp short input
next1:
cmp al,39H ;大于数字9吗?
ja next2 ;不是数字
inc si ;不大于,是数字
jmp short input
next2:
cmp al,41H ;小于字母A吗
jae next3 ;大于字母A
jmp short OTHER ;小于字母A又不是数字
next3:
cmp al,5AH ;大于字母Z吗
ja next4 ;大于字母Z
inc bx ;是字母A-Z
jmp short input
next4:
cmp al,61H ;小于字母a吗
jae next5 ;大于字母a
jmp short OTHER ;大于字母Z小于字母a是其他字符
next5:
cmp al,7AH ;大于字母z吗
ja short OTHER ;大于字母z是其他字符
inc bx ;是字母a-z
jmp short input
disp:
lea dx,ALPHABET ;准备显示字母
call display
lea dx,NUMBER ;准备显示数字
mov bx,si ;si存放数字的值
call display
lea dx,OTHER_ ;准备显示其他字符
mov bx,di ;di存放其他字母的值
call display
ret
main endp ;主函数结束
;-----display子程序----
display proc near
mov ah,09H ;显示字符串
int 21h
call binihex ;把bx中的二进制数转换为16进制显示
lea dx,CRLF
mov ah,09h ;显示回车换行
int 21h
ret
display endp
;-----display子程序----
;-----bx中的数十六进制数显示子程序-----
binihex proc near
mov ch,4 ;4位16进制数
rotate:
mov cl,4
rol bx,cl ;循环左移,从高位到低位依次显示
mov dl,bl
and dl,0FH ;取出最低位
add dl,30H
cmp dl,3AH ;是A-F吗
jl print_it
add dl,07h
print_it:
mov ah,02h
int 21h
dec ch
jnz rotate
ret
binihex endp
;-----bx中的数十六进制数显示子程序-----
;-------------
codesg ends
end start