一、题目要求
从键盘上输入一串字符到输入缓冲区,找出其中的大写字母和小写字母,并分别统
计它们的个数,结果放到变量 num1 和 num2 中,要求在屏幕输出显示所有字母及变
量 num1 和 num2 的值。
二、注意
这个问题本身不是很难,但是需要具体了解DOS 0Ah的功能调用。0Ah功能会将输入的字符串放入缓冲区,并以回车(0Dh)结尾,这里还有一个小坑,当时写的时候困扰了很久,就是缓冲区的第二个参数是一个字节型变量,如果要赋值到寄存器中,需要注意类型一致,但不要轻易尝试把字节型扩展成字型,容易引起意想不到的错误。另外一个要注意的就是,要掌握好循环的结束情况,不要轻易在某个子分支内使用loop指令。
三、具体代码
代码如下(示例):
;test3-2.asm
.model small
.stack
.data
str_input db 'please input a string:','$'
str_letters db 'all letters:','$'
str_num1 db 'num1 is:','$'
str_num2 db 'num2 is:','$'
num1 db 0;保存大写字母的个数
num2 db 0;保存小写字母的个数
cha_line db 0ah,'$';换行
;缓冲区
BUF db 30
db 0
db 30 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 cha_line;换行
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,'a' ;与字符和Z比较
jb lower
inc num2 ;如果大于等于a,则是小写字母,num2++
int 21h;输出该字母
lower:
cmp dl,'A';与字符和A比较
jb error;如果比A小,则不是字母
cmp dl,'Z';与字符和z比较
ja error;如果比Z大,则不是大写字母
inc num1;否则,就是大写字母,num1++
int 21h;输出该字母
error:
inc si
loop again
;循环结束
mov dx,offset cha_line ;换行
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 cha_line;换行
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