zoukankan      html  css  js  c++  java
  • 汇编语言系列Ⅲ 实现字符串操作

    软件:emu8086

    语言:汇编语言(Assembly)

    注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。

    7.字符串匹配设计

    7.1设计要求:

    要求掌握提示信息的设置及读取键入信息的方法。设计程序,从键盘输入两个字符串进行比较,如相同,则显示“MATCH”,否则显示“NO MATCH”。

    7.2设计思路:

    DOS功能调用输入两个字符串,通过CMPSB指令一个字节一个字节比较字符串,相同输出MATCH,不同输出NO MATCH。

    7.3程序清单:

    DATA    SEGMENT
            pkey   DB  0DH,0AH, 'please input str1 end by enter:','$'
            qkey   DB  0DH,0AH,'please input str2 end by enter:','$'
            skey   DB  0DH,0AH,'MATCH','$'
            tkey   DB  0DH,0AH,'NO MATCH','$' 
            BUFF1  DB  101,0,101 DUP(0)
            BUFF2  DB  101,0,101 DUP(0)`
    DATA    ENDS
    
    CODE    SEGMENT
            ASSUME  CS:CODE,DS:DATA 
            
    START:  MOV AX,DATA
            MOV DS,AX
            MOV ES,AX          ;数据段和堆栈段初始化
                  
            LEA DX,pkey             
            MOV AH,9
            INT 21H               ;DOS功能调用,输出字符串
            LEA DX,BUFF1
            MOV AH,0AH
            INT 21H               ;输入第一个字符串到BUFF1缓冲区
            
            LEA DX,qkey
            MOV AH,9
            INT 21H
            LEA DX,BUFF2
            MOV AH,0AH
            INT 21H               ;输入第二个字符串到BUFF2缓冲区
       
            LEA SI,BUFF1          ;将第一个字符串给SI
            LEA DI,BUFF2          ;将第二个字符串给DI
            MOV CX,53            ;给计数器值
            CLD                  ;清方向标准DF
            REPZ CMPSB        ;一个字节一个字节比较字符串,SI和DI递增
            JZ MATCH             ;全部字节都相等输出MATCH
            LEA DX,tkey
            MOV AH,9
            INT 21H               ;不等输出NO MATCH
            JMP START 
            
    MATCH:  LEA DX,skey
            MOV AH,9
            INT 21H               ;DOS功能调用,输出MATCH
            JMP START
    
    CODE    ENDS
            END     START 

    7.4程序运行结果及分析:

    主要是学会CMPSB指令的使用,清零DF标志使DI,SI递增,然后实现一个字节一个字节的比较。

    图7 字符串匹配设计结果

    8.字符串输入及显示设计

    8.1设计要求:

    要求掌握字符和数据的显示方法。设计程序,接收键盘键入字符串,包括字符和数字,并在终端显示。设计要求:有键入和结束提示信息,如在键入字符串之前提示:INPUT STRING,THE END FLAG IS $。要求统计键入字符串中数字(0-9)的个数和字符的个数,分行显示。

    8.2设计思路:

    判断在0~9范围内DI累加,判断在a~z和A~Z范围内SI累加,然后将SI和DI即字母个数和数字个数分别转十进制输出。

    8.3程序清单:

    DATA    SEGMENT
            pkey  DB  0dh,0ah,"input string,the end flag is $" 
            skey  DB  0dh,0ah,'abc length is:','$'
            tkey  DB  0dh,0ah,'num length is:','$' 
    DATA    ENDS
    
    CODE    SEGMENT
            ASSUME  CS:CODE,DS:DATA
            
    START:  MOV AX,DATA
            MOV DS,AX
            MOV ES,AX                 ;数据段堆栈段初始化
            LEA DX,pkey
            MOV AH,9
            INT 21H                   ;DOS功能调用,输出字符串
            MOV DX,'$'
            MOV AH,2
            INT 21H                   ;DOS功能调用,输出$
            MOV DX,3AH
            MOV AH,2
            INT 21H                   ;DOS功能调用,输出:
            MOV DX,0DH
            MOV AH,2
            INT 21H                   ;DOS功能调用,归位
            MOV DX,0AH
            MOV AH,2
            INT 21H                   ;DOS功能调用,换行
            
            MOV SI,0
            MOV DI,0              ;清零,SI存放字母个数,DI存放数字个数
            
    INPUT:  MOV AH,1 
            INT 21H
            CMP AL,'$'
            JZ  INEND
            CMP AL,'z'
            JA  INPUT                   
            CMP AL,'a'
            JAE ABC1                   ;输入为a~f,SI加1
            CMP AL,'Z'
            JA  INPUT
            CMP AL,'A'                        
            JAE ABC1                   ;输入为A~F,SI也加1
            CMP AL,'9'
            JA  INPUT
            CMP AL,'0'
            JAE NUM1                   ;输入为0~9,DI加1
            JMP INPUT  
            
    ABC1:  INC SI
           JMP INPUT    
            
    NUM1:  INC DI
            JMP INPUT 
                    
    INEND:  MOV BX,0
            MOV CX,10        
            MOV AX,SI               ;将字母个数给AX(十六进制转十进制)  
            
    LP1:    MOV DX,0
            DIV CX       ;AX表示的32位数除以10,商放在AX,余数放在DX
            PUSH DX                   ;将余数压入栈
            INC BX
            CMP AX,0                  ;商不为0就继续除10
            JNZ LP1
            LEA DX,skey
            MOV AH,9
            INT 21H                    ;DOS功能调用,输出字符串
    
    LLP1:   POP DX                     ;DX中数据依次出栈并显示
            ADD DX,30H
            MOV AH,2
            INT 21H                    ;DOS功能调用,输出字母个数
            DEC BX
            JNZ LLP1
            MOV BX,0 
            MOV AX,DI              ;将数字个数给AX(十六进制转十进制)
            
    LP2:  
            MOV DX,0                 
            DIV CX       ;AX表示的32位数除以10,商放在AX,余数放在DX
            PUSH DX                 ;将余数压入栈
            INC BX
            CMP AX,0
            JNZ LP2                 ;商不为0就继续除10
            LEA DX,tkey
            MOV AH,9
            INT 21H                  ;DOS功能调用,输出字符串
            
    LLP2:   POP DX                   ;DX中数据依次出栈并显示
            ADD DX,30H
            MOV AH,2
            INT 21H                  ;DOS功能调用,输出数字个数
            DEC BX
            JNZ LLP2  
            JMP START
            
    CODE    ENDS
            END     START

    8.4程序运行结果及分析:

    当输入字母或数字个数大于10之后统计输出比较麻烦,这里使用了除以10循环并存入堆栈再依次输出的方法实现输出。

    图8 字符串输入及显示设计结果

  • 相关阅读:
    linux试题
    linux常用脚本
    nagios
    lvs/nginx/haproxy 负载均衡优缺点分析讲解
    一次SSLPeerUnverifiedException,SSLHandshakeException问题的分析
    [转]【安卓笔记】AsyncTask源码剖析
    linux下查看进程占用端口和端口占用进程命令
    which framework or library is best to use WebRTC
    [转]svn diff 替代工具
    [转]使用Subversion进行版本控制
  • 原文地址:https://www.cnblogs.com/BoBoRing/p/10240891.html
Copyright © 2011-2022 走看看