【实验题目】字符统计
【实验内容】从键盘上输入一个字符串,然后统计英文字母、数字字符和其他字符的个数并输出
【实验目的】
1、 掌握输入字符串的DOS功能调用
2、 掌握分支程序设计方法
3、 掌握二进制到十进制的转换的汇编语言实现方法
【汇编代码+自己的理解:】
data segment
prompt db ‘Please enter a string, including any char.’,13,10,’ $ ’
string db 25,?,25 dup(?)
string1 db 13,10,‘Number of other char:’,’ $ ’
string2 db 13,10,‘Number of english char:’,’ $ ’
string3 db 13,10,‘Number of digital char:’,’ $ ’
address dw string1
dw string2
dw string3 ;string address table
a db 0 ;other char
b db 0 ;english char
c db 0 ;digital char
data ends
code segment
main proc far
assume cs:code,ds:data
start: push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax ;初始化定义
lea dx,prompt
mov ah,9
int 21h ;提示字符串输出
mov ah,0ah
lea dx,string
int 21h ;提示进行字符串输入,存入string缓冲区
mov si,2 ;string字符串的首地址string[si],si在程序的整个过程中为偏移值
mov cl,string+1 ;cl为字符串的长度,mov一定要注意左右都是8位的
xor ch,ch ;cx为字符串的长度
begin:
cmp string[si],‘z’
ja others ;高于122为其他字符
cmp string[si],‘a’
jnb words ;97-122之间为小写字母
cmp string[si],‘Z’
ja others ;91-96之间其他字符
cmp string[si],‘A’
jnb words ;65-90之间大写字母
cmp string[si],‘9’
ja others ;58-64为其他字符
cmp string[si],‘0’
jnb number ;48-57为数字
jmp others ;其余均为其他字符
others:
inc a ;a = a+1
jmp next
words:
inc b ;b = b+1
jmp next
number:
inc c ;c = c+1
jmp next
next:
inc si ;进行下一次循环,si=si+1
loop begin ;直到cx=0,否则下一次循环开始
lea si,a ;将数据a 的段偏移地址给si
lea bx,address ;将address的首地址,也就是string1的段偏移地址给bx,为了在下面输出字符串
mov di,3 ;di控制循环参数
continue:
mov dx,[bx] ;利用循环输出三个字符串
mov ah,9
int 21h
mov al,[si]
cbw ;假设循环第一次,因为a的位宽是一个字节,因此先将a赋值给al,之后对ax进行符号扩展指令。符号扩展指令主要用于数据类型不同时用符号扩展指令可以使得数据类型相同,扩展前后真值不变
mov cl,10
div cl ;16进制除法,将商放在al,余数放在ah。例如0002/10,商为0,余数为2
add ax,3030h ;ax+3030h,目的是为了输出对应字符的ASCII码值
push ax
mov dl,al ;屏幕显示al对应ASCII码字符,先显示al,为商
mov ah,2
int 21h
pop ax
mov dl,ah ;屏幕显示ah对应ASCII码字符,显示ah,为余数
mov ah,2
int 21h
inc si ;si=si+1,输出下一个数字
add bx,2 ;bx=bx+2,输出下一个字符串
dec di ;di=di-1
jnz continue ;di不为0,继续循环。总共需要输出3次
ret
main endp
code ends
end start