码迷,mamicode.com
首页 > 编程语言 > 详细

汇编语言系列Ⅲ 实现字符串操作

时间:2019-01-08 21:12:19      阅读:491      评论:0      收藏:0      [点我收藏+]

标签:大于   实现   缓冲区   判断   思路   调用   span   进制   inf   

软件: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 字符串输入及显示设计结果

 

汇编语言系列Ⅲ 实现字符串操作

标签:大于   实现   缓冲区   判断   思路   调用   span   进制   inf   

原文地址:https://www.cnblogs.com/BoBoRing/p/10240891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!