NASM汇编子串检测示例请求——简易SQL开发需求
NASM汇编:检测子字符串palabra2是否存在于palabraAux中
核心逻辑
通过滑动窗口遍历目标字符串palabraAux的每个起始位置,从该位置开始与待检测单词palabra2逐字节匹配。若某一位置开始的连续字节完全匹配palabra2,则判定存在;遍历完所有可能位置仍无匹配则判定不存在。以下代码适配你提到的跳转到siguiente_palabraDeseado的检测流程。
示例代码
假设你的程序中寄存器约定如下(可根据自身需求调整):
ESI:存储palabra2的起始地址ECX:存储palabra2的字节长度(需提前计算好,不含终止符)EDI:存储palabraAux的起始地址EDX:存储palabraAux的字节长度(不含终止符)
siguiente_palabraDeseado: ; 边界情况处理:若palabra2为空,直接判定存在 test ecx, ecx jz substring_found ; 若palabraAux比palabra2短,直接判定不存在 cmp edx, ecx jb substring_not_found ; 计算可遍历的最大起始位置:palabraAux长度 - palabra2长度 mov ebx, edx sub ebx, ecx inc ebx ; 包含最后一个可能的起始位置 ; 初始化遍历计数器 mov eax, 0 match_loop: ; 保存当前遍历位置的起始地址:palabraAux + eax mov ebp, edi add ebp, eax ; 调用你已实现的单词相等比较逻辑(或直接实现以下比较) ; 此处假设你的相等比较逻辑是:以ESI(palabra2)、ECX(长度)和EBP(当前片段)为参数, ; 匹配成功则置ZF=1,失败则ZF=0 push eax ; 保存遍历计数器,避免被比较逻辑破坏 call compare_words ; 替换为你已有的相等比较函数名 pop eax ; 若匹配成功,跳转到存在分支 jz substring_found ; 遍历计数器+1,检查是否到达最大位置 inc eax cmp eax, ebx jb match_loop ; 遍历完所有位置仍无匹配 substring_not_found: ; 此处添加不存在的处理逻辑(比如置标志位、返回错误码等) ; 例如:mov al, 0 表示不存在 jmp end_substring_check substring_found: ; 此处添加存在的处理逻辑(比如置标志位、记录位置等) ; 例如:mov al, 1 表示存在,eax中还保存了匹配的起始偏移量 jmp end_substring_check end_substring_check: ; 检测结束,继续你的主流程
代码说明
- 边界处理:先排除空字符串、目标过短的极端情况,避免无效遍历。
- 滑动窗口遍历:通过
eax记录当前起始偏移量,每次取palabraAux+eax作为起始地址,与palabra2做全长度匹配。 - 复用已有逻辑:直接调用你已实现的
compare_words(替换为你实际的函数名),减少重复代码。 - 结果分支:匹配成功跳转到
substring_found,失败遍历结束后进入substring_not_found,你可以在这两个分支中添加符合自身程序需求的处理逻辑。
内容的提问来源于stack exchange,提问作者7FULL
相关产品推荐
相关产品推荐

