⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compare.asm

📁 使用纯汇编语言实现的字符串模式匹配源代码。
💻 ASM
字号:
DATAS SEGMENT
buffer1     label byte
buffer1maxlen db 51
buffer1len  db ?
buffer1fld  db 51 dup(?)
buffer2     label byte
buffer2maxlen db 51
buffer2len  db ?
buffer2fld  db 51 dup(?)   
cstring1 db 0ah, 0dh, 'Please Input the String:$'
cstring2 db 0ah, 0dh, 'Input the substring:$'
cstring3 db 0ah, 0dh, 'Match At '
cstring3_s db 0,0,'$'
cstring4 db 0ah, 0dh, 'No match!$'
    ;此处输入数据段代码  
DATAS ENDS
 
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
 mov AX, DATAS
 mov ds, AX
 mov DX, OFFSET cstring1
 mov ah,09h
 int 21h
  
 mov ax, seg buffer1
 mov eS, ax
 mov dx, offset buffer1  ;将主串放入buffer1
 mov ah, 0ah
 int 21h
 
 mov DX, OFFSET cstring2
 mov ah, 09h
 int 21h
  
 mov ax, seg buffer2
 mov ds, ax
 mov dx, offset buffer2  ;将子串放入buffer2
 mov ah, 0ah
 int 21h
 
 lea di, buffer1fld
 lea si, buffer2fld
 
 mov ch,0h
 
 mov cl, [buffer1len]
 mov al, [buffer2len]
 sub cl, al
 inc cl
 inc cl
 CLD
s: 
    mov al, ds:[si]  ;查找第一个字符匹配
 REPNE SCAS byte ptr ES:[DI]
 jcxz dismatch
 
 push cx ;存游标位置 
 
 mov cl, [buffer2len]
 inc si
 repe cmpsb byte ptr DS:[SI], byte ptr ES:[DI] ;匹配剩下位置,不对则退出,恢复现场
 jcxz match
 
 mov al, [buffer2len]  ;Context Switch
 sub al, cl
 mov cl , al
 sub si, cx
 dec si
 sub di, cx   ;恢复原现场
 pop cx
 jmp short s
  
match: ;计算并输出匹配位置
 mov ax, di
 sub ax, offset buffer1fld
 mov bl, [buffer2len]
 sub al, bl
 
 mov cl, 4
 mov ah, al  
 shr al, cl  ;al存低四位
 mov bl, ah  ;bl存高四位
 and bl, 00001111B  ; mask off
 
 ;转换为ASCII码
    add al,30H
    cmp al,39H
    js next1
    add al,07H

next1:
 add bl, 30h
 cmp bl, 39H
 js next2
 add bl,07H

next2:
 mov [cstring3_s], al
 mov 1[cstring3_s], bl
 mov DX, OFFSET cstring3
 mov ah, 09h
 int 21h
 jmp short over

dismatch:   ;  不匹配:-(
 mov DX, OFFSET cstring4
 mov ah, 09h
 int 21h


 over:   ; 退出
    MOV AH,4CH
    INT 21H
 
CODES ENDS
    END START

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -