键盘输入数字、大写字母、小写字母的混合串(以回车结束,100个以内),将其中的小写字母转换为大写字母后显示到CRT上
(扩展:并统计其中其中数字、大写字母、小写字母的的个数,显示出来)
data segment
new db "please input a string:",0dh,0ah,'$'
num db 0dh,0ah,"the number of num is:$"
cap db 0dh,0ah,"the number of cap is:$"
lower db 0dh,0ah,"the number of lower is:$"
sum_num db 0
sum_cap db 0
sum_lower db 0
buf db 100
db ?
db 100 dup(0)
crlf db 0aH,0dH,"$";回车换行
data ends
code segment
assume cs:code,ds:data,es:data
start:
mov ax,data
mov ds,ax
mov dx,offset new
mov ah,9
int 21h
mov dx,offset buf ;输入一串字符串
mov ah,10
int 21h
lea dx, crlf
mov ah, 09h
int 21h
mov bx,offset buf+2;bx存放字符第一个编译地址
mov cl,buf+1;循环次数为字符长度
l: mov al,[bx];将bx偏移地址存储的值送到al
cmp al,61h;61h-7ah
jb c
cmp al,7ah
ja c
sub al,20h;减20得到大写字母
mov dl,al
mov ah,2
int 21h
inc sum_lower;小写字母个数加1
jmp tram
c:
cmp al,41h;41h-5ah
jb n
cmp al,5ah
ja n
inc sum_cap;大写字母个数加1
jmp tram
n:
inc sum_num;数字个数加1
tram:
inc bx
dec cl
jnz l;不等于0跳转回l
;输出统计个数
mov dx, offset num
mov ah, 9
int 21h
mov al,sum_num
call B_TO_D ;
mov dx, offset cap
mov ah, 9
int 21h
mov al,sum_cap
call B_TO_D
mov dx, offset lower
mov ah, 9
int 21h
mov al,sum_lower
call B_TO_D
jmp exit
;位二进制转十进制子程序
B_TO_D PROC NEAR;AL中要转换的二进制数
AND AH,0 ;ah存放余数,初始化为0
MOV BL,100
DIV BL ;ax/100得到百位数,存放al中
MOV CL,AH ;余数暂存于cl中
ADD AL,30H ;输出百位数
MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,CL
MOV BL,10
AND AH,0
DIV BL ;ax/10得到十位数
ADD AL,30H ;输出十位数
MOV DL,AL
MOV CL,AH
MOV AH,02H
INT 21H
MOV AL,CL ;输出个位数
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
RET
B_TO_D ENDP
exit:
mov ah, 4ch
int 21h
code ends
end start