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

目录
  • 7.字符串匹配设计
    • 7.1设计要求:
    • 7.2设计思路:
    • 7.3程序清单:
    • 7.4程序运行结果及分析:
  • 8.字符串输入及显示设计
    • 8.1设计要求:
    • 8.2设计思路:
    • 8.3程序清单:
    • 8.4程序运行结果及分析:

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

到此这篇关于汇编语言系列之汇编实现字符串操作的文章就介绍到这了,更多相关汇编字符串操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 汇编语言实现在指定字符串中搜索字符'A'的方法

    我也不知道我以前怎么会写这种东西的,留个纪念- ;用串操作指令设计程序,实现在指定字符串中搜索字符'A', ;若该字条串中有字符'A', ;则将第一个'A'字符在该字符串中的位置记录在BX寄存器中, ;若不包含,则使BX=0FFFFH. ;在程序开始查找指定字符前要求在屏幕上输出提示信息: ;The program is running!查找结束后输出信息:the program is over! DATAS SEGMENT STRING DB 'CDAFX246hk' NO DW 10 FAL

  • 使用汇编实现字符串的大小写转换

    使用汇编编程,可以直接访问内存中的数据,对数据进行相关操作,现在需要通过汇编指令and,or对字符串数据进行大小写转换.如下例,将BaSiC转换成大写,将iNforMaTiOn转换成小写. 例子: assume cs:codesg,ds:datasg datasg segment db 'BaSiC' db 'iNforMaTiOn' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov cx,5 mov bx,0 s1: m

  • 汇编语言功能字符串大小写转换实现实例详解

    目录 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 问题2:将data段中每个单词的头一个字母改成大写字母 问题3:将data段中每个单词改为大写字母 问题4:将data段中每个单词的前4个字母改为大写字母 问题5:设计一个子程序,将一个全是字母的字符串转化成大写 问题6:设计一个子程序,将一个全是字母,以0结尾的字符串,转化成大写 复杂一点的对结构化数据的版本 问题1:将data段中的第一个字符串转换成大写,第二个字符串转换成小写 分析: 如何转换成大小写 如果利用A

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

    目录 7.字符串匹配设计 7.1设计要求: 7.2设计思路: 7.3程序清单: 7.4程序运行结果及分析: 8.字符串输入及显示设计 8.1设计要求: 8.2设计思路: 8.3程序清单: 8.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 7.字符串匹配设计 7.1设计要求: 要求掌握提示信息的设置及读取键入信息的方法.设计程序,从键盘输入两个字符串进行比较,如相

  • 汇编语言系列之汇编实现简单数学运算

    目录 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 5.2设计思路: 5.3程序清单: 5.4程序运行结果及分析: 6.计算N! 6.1设计要求: 6.2设计思路: 6.3程序清单: 6.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 设计程序,实现数学公式S=1+

  • 汇编语言系列之汇编实现各种码制的转换(思路详解)

    目录 1.十六进制转换为二进制数设计 1.1设计要求: 1.2设计思路: 1.4程序运行结果及分析: 2.十六进制转换为十进制数设计 2.1设计要求: 2.2设计思路: 2.3程序清单: 2.4程序运行结果及分析: 3.十六进制转换为ASCII码 3.1设计要求: 3.2设计思路: 3.3程序清单: 3.4程序运行结果及分析: 4.英文字母大小写转换设计 4.1设计要求: 4.2设计思路: 4.3程序清单: 4.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注

  • 汇编语言:x86汇编指令大全及其注意事项

    目录 Part 1:instruction Part 2 2.1 (逻辑)运算.移位等常用指令 2.1 (逻辑)运算.移位等常用指令 2.2 循环移位指令 2.3 数据串操作指令 2.4 逻辑运算指令 2.5 基于大小关系的跳转指令 2.6 基于单标志位的转移指令 Part 1:instruction 积少成多,持续更新.(这将会是一个极其漫长的过程) 表格中各条指令的顺序根据笔者所认为的重要或常用程度进行排序,仅供参考. Part 2 本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以

  • C语言字符串操作总结大全(超详细)

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1

  • shell基础学习中的字符串操作、for循环语句示例

    复制代码 代码如下: #!/bin/bashmy_name="jxq" echo $my_nameecho ${my_name} # ------------------------------------# 字符串操作# ------------------------------------ # 单引号字符串的限制,双引号没有这些限制:# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的# 单引号字串中不能出现单引号(对单引号使用转义符后也不行)name="w

  • PHP开发中常用的字符串操作函数

    1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行定义,这样做是比较有好处的. 2,替换字符串 在PHP这门语言中,提供了一个名字叫做substr_replace()的函数,该函数的作用可以快速的完成扫描和编辑文本内容较多的字符串替换功能.他的语法格式: mixed substr_replace(mixed $string,string $repl

  • php字符串操作针对负值的判断分析

    本文实例分析了php字符串操作针对负值的判断方法.分享给大家供大家参考,具体如下: $a = '-1'; $b = (int)$a; $c = is_numeric($a); if ($a) { echo 1; //echo 1 } else { echo 2; } var_dump($b); // int(-1) var_dump($c); // true 运行结果输出如下: 1 int -1 boolean true 总结: 字符串 '-1'的逻辑值是true; 更多关于PHP相关内容感兴趣

  • 基于PHP中自带的字符串操作函数合集

    1.查找字符位置函数: strpos($str,search,[int])://查找search在$str中的第一次位置从int开始: strrpos($str,search,[int])://查找search在$str中的最后一次出现的位置从int开始 2.提取子字符函数(双字节) submit($str,int start[,int length])://从$str中strat位置开始提取[length长度的字符串]. strstr($str1,$str2)://从$str1(第一个的位置)

  • JS基于正则截取替换特定字符之间字符串操作示例

    本文实例讲述了JS基于正则截取替换特定字符之间字符串操作.分享给大家供大家参考,具体如下: 示例1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"&

随机推荐