【汇编语言】算术及位串处理(采用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

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值