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
关键改动说明
新增计数与结果输出:
- 在
data段添加count变量存储次数,msg3作为结果提示字符串。 - 新增
print_num子程序,将二进制计数转换为ASCII字符输出,支持0-99的数字打印。
- 在
修改匹配逻辑:
- 匹配成功时不再直接退出,而是将
count加1,调整主串指针后继续遍历。 - 加入重叠匹配处理:若需要统计重叠的子串(如
"QQQ"中的"QQ"),通过回退si指针实现;若不需要重叠匹配,可删除指针回退的代码。 - 增加子串长度大于主串的判断,直接输出无匹配提示。
- 匹配成功时不再直接退出,而是将
流程优化:
- 主程序最后统一输出统计结果,替代原代码中找到匹配就退出的逻辑。
- 子程序内部通过
ret返回,避免硬跳转导致的流程混乱。
内容的提问来源于stack exchange,提问作者Veselchak
相关产品推荐
相关产品推荐

