【汇编语言】算术及位串处理(采用cmpsb和scasb语句)

实验内容:

    在数据段定义缓冲区,从键盘接收两串字符到两个缓冲区,比较两个字符串,将不一致的字符显示在屏幕上。再从键盘输入一位字符到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值