You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86汇编子程序实现字符串中子串出现次数统计的技术求助

x86汇编实现子串出现次数统计(封装为子程序)

以下是修改后的完整代码,实现了子串出现次数的统计并封装为子程序,同时支持重叠匹配的处理:

data segment
msg1    DB  "Enter string: $"
msg2    DB  0Ah, 0Dh, "Enter substring to find: $"
msg3    DB  0Ah, 0Dh, "Occurrence count: $"
msg4    DB  0Ah, 0Dh, "No such substring$"

str1ml  DB  200
str1l   DB  '$'
str1    DB  200 dup('$')

str2ml  DB  200
str2l   DB  '$'
str2    DB  200 dup('$')

count   DB  0   ; 存储子串出现次数
data ends

code segment
assume cs:code, ds:data
start:
    mov ax, data
    mov ds, ax
    mov es, ax
    xor ax, ax

    ; 输入主字符串
    lea dx, msg1    
    call strout
    lea dx, str1ml  
    call strin

    ; 输入子串
    lea dx, msg2    
    call strout
    lea dx, str2ml  
    call strin

    ; 计算主串中可匹配的起始位置数量
    xor cx, cx
    mov cl, str1l   
    sub cl, str2l
    inc cl
    ; 处理子串长度大于主串的情况
    jc no_match
    cld        
    lea di, str2    ; di指向子串
    lea si, str1    ; si指向主串
    call mainp

    ; 输出统计结果
    lea dx, msg3    
    call strout
    mov al, count
    call print_num
    jmp quit

no_match:
    lea dx, msg4
    call strout

quit:
    mov ah, 4ch     
    int 21h

;*****************Procedures***********************
; 输入字符串(DOS中断0Ah)
strin proc
    mov ah, 0Ah
    int 21h
    ret
strin endp

; 输出字符串(DOS中断09h)
strout proc
    mov ah, 09h
    int 21h
    ret
strout endp

; 主统计子程序
mainp proc
all_string:         
    push cx
    push di
    push si
    mov cl, str2l    ; 子串长度存入cl
    repe cmpsb       ; 逐字节比较主串和子串
    je match_found   ; 匹配成功跳转

match_not_found:
    pop si
    pop di
    pop cx
    inc si           ; 主串指针后移一位,继续下一个位置匹配
    loop all_string
    ret

match_found:
    inc count        ; 计数加1
    ; 处理重叠匹配:回退主串指针,允许重叠子串匹配(如"QQQ"中"QQ"出现2次)
    ; 若不需要重叠匹配,可删除以下两行
    mov al, str2l
    sub si, ax       ; si回退到匹配起始位置的下一个字符
    dec si
    ; 恢复寄存器并继续循环
    pop di
    pop cx
    jmp match_not_found
mainp endp

; 输出数字(支持0-99的十进制数)
print_num proc
    mov ah, 0
    mov bl, 10
    div bl          ; al=十位数字,ah=个位数字
    ; 输出十位(如果非0)
    mov dl, al
    add dl, '0'
    cmp dl, '0'
    je print_single_digit
    mov ah, 02h
    int 21h
print_single_digit:
    ; 输出个位
    mov dl, ah
    add dl, '0'
    mov ah, 02h
    int 21h
    ret
print_num endp
code ends
end start

关键改动说明

  1. 新增计数与结果输出:

    • 在data段添加count变量存储次数,msg3作为结果提示字符串。
    • 新增print_num子程序,将二进制计数转换为ASCII字符输出,支持0-99的数字打印。
  2. 修改匹配逻辑:

    • 匹配成功时不再直接退出,而是将count加1,调整主串指针后继续遍历。
    • 加入重叠匹配处理:若需要统计重叠的子串(如"QQQ"中的"QQ"),通过回退si指针实现;若不需要重叠匹配,可删除指针回退的代码。
    • 增加子串长度大于主串的判断,直接输出无匹配提示。
  3. 流程优化:

    • 主程序最后统一输出统计结果,替代原代码中找到匹配就退出的逻辑。
    • 子程序内部通过ret返回,避免硬跳转导致的流程混乱。

内容的提问来源于stack exchange,提问作者Veselchak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:15:26