汇编实验2-2 查找匹配字符串笔记

一、数据段

[1.字符串结尾:13,10,''](#1.字符串结尾:13,10,'')

2.设置格式控制字符串(这样就不用再写clrf函数了)

3.设置存关键字和句子的地址标签,以关键字为例

二、代码段

1.输入字符串

2.字符串比较

[2.1 每次的比较长度,KLEN->CL](#2.1 每次的比较长度,KLEN->CL)

[2.2 设置目标串起始位置](#2.2 设置目标串起始位置)

[2.3 比较](#2.3 比较)

[2.4 偏移地址++,并与目标串长度比较,判断是否出界](#2.4 偏移地址++,并与目标串长度比较,判断是否出界)

[3. 二进制转16进制](#3. 二进制转16进制)

三、完整代码及注释


一、数据段

1.字符串结尾:13,10,'$'

2.设置格式控制字符串(这样就不用再写clrf函数了)

bash 复制代码
    FORMAT  DB  13,10,'$'   ;格式

3.设置存关键字和句子的地址标签,以关键字为例

  • max1------最大长度限制
  • KLEN------字符串的实际长度
  • keywd------输入的内容
cpp 复制代码
    KEYWORD Label byte      ;存关键字
        max1    DB  10
        KLEN    DB  ?
        keywd   DB  10  dup(?)

二、代码段

1.输入字符串

  • 将关键字缓冲区的地址加载到 DX 寄存器
  • 将中断 21H 的功能号设置为 0AH(缓冲输入)
  • 调用中断 21H来执行缓冲输入操作
cpp 复制代码
        LEA DX, KEYWORD  ;输入keyword
        MOV AH, 0AH      
        INT 21H

2.字符串比较

2.1 每次的比较长度,KLEN->CL

bash 复制代码
        MOV CL, KLEN   ;cl存keyword的长度

2.2 设置目标串起始位置

bash 复制代码
        LEA BX, sentc   ;BX存sentence的基址
        ADD BL, AL      ;al是偏移地址
        MOV DI, BX      ;DI通常用来存目标字符串的地址

2.3 比较

  • REPE CMPSB ------ 以字节为单位进行比较

  • ZF = 0------匹配

    cs 复制代码
            REPE CMPSB   ;以字节为单位进行比较,直到cx=0或不相等退出
            JZ MATCH     ;CMP是两数相减进行比较,jz=0表示相等

    2.4 偏移地址++,并与目标串长度比较,判断是否出界

    bash 复制代码
            INC  AL
            CMP  AL, SLEN
            JAE  NOT_MATCH
  1. 二进制转16进制
cpp 复制代码
BTOH PROC FAR
        MOV CH, 4    ; 16/4, 处理四次
    ROTATE:
        MOV CL, 4    ; 一次处理四位
        ROL BX, CL   ; 循环左移四位,从最高四位开始处理(移到最低四位)
        MOV AL, BL   ; 取低8位
        AND AL, 0fh  ; 取低4位
        ADD AL, 30h  ; 转为数字字符
        CMP AL, 3AH  ; 9后面的数
        JB print
        ADD AL, 7h   ; 转为字母
    print:
        MOV DL, AL
        MOV AH, 02
        INT 21H

        DEC CH 
        JNZ ROTATE 
        RET 
BTOH endp

三、完整代码及注释

cs 复制代码
DATAS SEGMENT
    STRING1 DB 'Enter keyword:$'
    STRING2 DB 'Enter sentence:$'
    STRING3 DB 'Match at location:$'
    STRING4 DB 'H of the sentence.',13,10,'$'   ;句号结尾,换行回车 
    STRING5 DB 'No match.',13,10,'$'
    
    FORMAT  DB  13,10,'$'   ;格式

    KEYWORD Label byte      ;存关键字
        max1    DB  10
        KLEN    DB  ?
        keywd   DB  10  dup(?)

    SENTENCE Label byte     ;存句子
        max2    DB  50
        SLEN    DB  ?
        sentc   DB  50 dup(?)

DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS

main PROC far
    START:
        PUSH  DS
        XOR   AX, AX
        PUSH  AX
        MOV   AX, DATAS
        MOV   DS, AX
        MOV   ES, AX

        LEA DX, STRING1
        MOV AH, 09
        INT 21H

        LEA DX, KEYWORD  ;输入keyword
        MOV AH, 0AH      
        INT 21H

        LEA DX, FORMAT  ;格式控制
        MOV AH, 09
        INT 21H

    INPUTSENTC:
        LEA DX, STRING2
        MOV AH, 09
        INT 21H

        LEA DX, SENTENCE   ;输入sentence
        MOV AH, 0AH
        INT 21h

        LEA DX, FORMAT  ;格式控制
        MOV AH, 09
        INT 21H

        MOV AX, 0       ;清空AX
        
    LOOP_CMP:
        MOV CL, KLEN   ;cl存keyword的长度
        LEA SI, keywd  ;SI通常用来存源字符串的地址
        LEA BX, sentc  ;BX存sentence的基址
        ADD BL, AL      ;al是偏移地址
        MOV DI, BX      ;DI通常用来存目标字符串的地址

        REPE CMPSB   ;以字节为单位进行比较,直到cx=0或不相等退出
        JZ MATCH     ;CMP是两数相减进行比较,jz=0表示相等

        INC AL          ;偏移量++
        CMP AL, SLEN    ;判断是否到sentence末尾
        JAE NOT_MATCH   ;NOT MATCH
        JMP LOOP_CMP    ;继续比较

    MATCH:
        MOV BX, 0   ;为什么给bx,不直接用ax?1)
        MOV BL, AL  ;BL中存偏移量
        ADD BX, 1   ;从下标为1开始

        LEA DX, STRING3  
        MOV AH, 09  ;1) AX用处比较多
        INT 21H 

        CALL BTOH   ;二进制转十六进制子程序

        LEA DX, STRING4
        MOV AH, 09
        INT 21H

        JMP INPUTSENTC  ;

BTOH PROC FAR
        MOV CH, 4    ; 16/4, 处理四次
    ROTATE:
        MOV CL, 4    ; 一次处理四位
        ROL BX, CL   ; 循环左移四位,从最高四位开始处理(移到最低四位)
        MOV AL, BL   ; 取低8位
        AND AL, 0fh  ; 取低4位
        ADD AL, 30h  ; 转为数字字符
        CMP AL, 3AH  ; 9后面的数
        JB print
        ADD AL, 7h   ; 转为字母
    print:
        MOV DL, AL
        MOV AH, 02
        INT 21H

        DEC CH 
        JNZ ROTATE 
        RET 
BTOH endp

NOT_MATCH:
        LEA DX, STRING5
        MOV AH, 09
        INT 21H

        JMP INPUTSENTC

EXIT:
        RET
main endp
CODES ENDS
END START
相关推荐
Crossoads1 天前
【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式
android·开发语言·javascript·汇编·人工智能·数据挖掘·c#
—Miss. Z—2 天前
C语言中用指针输入字符串
c语言·字符串·指针
Crossoads2 天前
【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读
android·汇编·人工智能·redis·单片机·深度学习·机器学习
zhuqiyua3 天前
深入解析Kernel32.dll与Msvcrt.dll
汇编·microsoft·windbg·二进制·dll
Crossoads4 天前
【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问
android·linux·运维·服务器·汇编·机器学习·数据挖掘
Crossoads4 天前
【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用
android·java·开发语言·javascript·汇编·数据挖掘·c#
Coding~5 天前
逆向攻防世界CTF系列38-xxxorrr
c语言·汇编·安全
Crossoads5 天前
【汇编语言】数据处理的两个基本问题 —— 汇编语言中的数据奥秘:数据位置与寻址方式总结
android·汇编·人工智能·redis·单片机·深度学习·机器学习
Crossoads6 天前
【汇编语言】更灵活的定位内存地址的方法(一)—— 字符操作:and与or指令、ASCII码及大小写转换
android·linux·运维·服务器·汇编·机器学习·数据挖掘
不会写算法的小沈6 天前
函数栈帧的创建与销毁
c语言·汇编·数据结构