实验内容:
在数据段定义缓冲区,从键盘接收两串字符到两个缓冲区,比较两个字符串,将不一致的字符显示在屏幕上。再从键盘输入一位字符到BX,查找第一串字符串中有几个相同的字符,并将次数显示在屏幕上。
具体代码
data segment ;定义一个数据段
buff db 16,?,16 dup(?),13,10,'$' ;在缓冲区定义一个buff字符串
bufff db 16,?, 16 dup(?),13,10,'$' ;在缓冲区定义一个bufff字符串
data ends ;数据段结束
code segment ;定义一个代码段
assume cs:code,ds:data,es:data ;分配段寄存器
start: ;start标号
mov ax,data ;将data的段地址赋值给ax
mov ds,ax ;将ax中的data的段地址赋值给ds
mov es,ax ;将ax中的data的段地址赋值给es
lea dx,buff ;赋偏移地址,将从键盘上输入的字符串存到buff缓冲区中,再将缓冲区中的内容保存到dx寄存器中
mov ah,0ah ;执行输入指令
int 21;
mov dl,13 ;执行回车换行指令
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
lea dx,bufff ;赋偏移地址,将从键盘上输入的字符串存到bufff缓冲区中,再将缓冲区中的内容保存到dx寄存器中
mov ah,0ah ;执行输入指令
int 21h
mov dl,13 ;执行回车换行指令
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
mov cl,buff+1 ;设置串长
lea si,buff+2 ;赋偏移地址,目标串位于当前附加段中 es寻址 di做指针
lea di,bufff+2 ; 源串位于当前数据段中,ds寻址 si做指针
mov ch,0 ;将ch清零
cld ;设置方向
repe cmpsb ;执行串比较指令,在每次比较过程中,一旦发现不相等,ZF=0,则终止重复执行
jz yes ;如果两个串相等则跳过下面的步骤
dec di ;di退格
mov dl,byte ptr es:[di] ;将源串中不相等的那个字符保存到dl中
mov ah,2 ;将那个不相等的字符显示出来
int 21h
mov dl,13 ;回车换行
mov ah,2
int 21h
mov dl,10
int 21h
jmp yes ;第一部分功能结束,接下来执行第二部分
mov ah,4ch
int 21h
yes:
mov ah,1 ;从键盘中接受一个字符,并保存到ah中
int 21h ;1号即输入命令
mov bl,al ;将al寄存器中的值保存到bl寄存器中
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
mov cl,0 ;将cl清零
lea di,buff+2 ;赋源串的偏移地址
mov cl,buff+1 ;串长
mov ch,0 ;清空ch
cld ;设置DF方向
mov al,bl ;bl的值回送al参与比较
xor dx,dx ;dx清零作计数器
t1:
repne scasb ;不相等则重复
jnz ans ;相等则执行下面的指令
inc dx ;dx递增
jmp t1 ;跳转t1
ans:
;准备输出dx中的值,将dx中的值转化成十进制数
add dx,30h
cmp dx,39h
jle exit ;大于则执行下面的指令
;加39H后ASCII码大于39H说明16进制数大于9,转化成十进制数时需要额外输出十位1
push dx ;保存dx寄存器的值
mov dl,31h ;先输出十位1
mov ah,2
int 21h
pop dx ;dx寄存器值回来
sub dx,10 ;dx中的值减10,然后输出个位
exit:
mov al,dl
mov al,2
int 21h
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start