一、题目要求
从键盘上输入一串字符到输入缓冲区,找出其中的大写字母和小写字母,并分别统 计它们的个数,结果放到变量 num1 和 num2 中,要求在屏幕输出显示所有字母及变 量 num1 和 num2 的值。
二、算法思想
保存字符串的功能需要调用DOS的0Ah号功能,实现字符串的获取。注意,0Ah号功能的出口参数为缓冲区buffer,关于缓冲区buffer的形式定义在第三部分的代码中,其中第一个字节缓冲区字节大小,第二个字节为在调用结束时被功能调用填进输入的字符个数,第3个字节开始存放输入字符的ASCII码,遇到回车字符结束。注意,三个参数均为字节。用cl保存缓冲区第二个字节的数值,即字符串长度,随后进行遍历比较,小写字母存入num2,大写字母存入num1,将num1、num2的值与30h与操作后输出即可
三、主要代码
;3-2.asm
.model small
.stack
.data
str_input db 'input your string:','$'
str_letters db 'all letters:','$'
str_num1 db 'num1 is:','$'
str_num2 db 'num2 is:','$'
num1 db 0;保存大写字母的个数
num2 db 0;保存小写字母的个数
ENT db 0ah,'$';换行
;缓冲区
BUF db 255
db 0
db 255 dup(?)
.code
.startup
mov dx,offset str_input
mov ah,09h
int 21h
mov dx,offset buf;输入字符串到缓冲区
mov ah,0ah
int 21h
mov dx,offset ent;换行
mov ah,09h
int 21h
mov dx,offset str_letters
mov ah,09h
int 21h
mov cl,[buf+1];cx=字符数
mov si,offset buf
add si,2;si指向字符开始的地址
mov ah,02h;调用02h号功能实现单个字符输出
;循环开始
again:
mov dl,[si]
cmp dl,'A';与字符和A比较
jb error;如果比A小,则不是字母
cmp dl,'Z';与字符和Z比较
ja abovez
inc num1;如果比A大,比Z小,则是大写字母,num1++
int 21h;输出该字母
abovez:
cmp dl,'a';与字符和a比较
jb error;如果比a小,则不是字母
cmp dl,'z';与字符和z比较
ja error;如果比z大,则不是字母
inc num2;否则,就是小写字母,num2++
int 21h;输出该字母
error:
inc si
loop again
;循环结束
mov dx,offset ent;换行
mov ah,09h
int 21h
mov dx,offset str_num1
mov ah,09h
int 21h
mov dl,num1
or dl,30h;与30h或,将数值转换成ASCII码
mov ah,02h
int 21h
mov dx,offset ent;换行
mov ah,09h
int 21h
mov dx,offset str_num2
mov ah,09h
int 21h
mov dl,num2
or dl,30h
mov ah,02h
int 21h
.exit
end