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

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:
    ; 检测结束,继续你的主流程

代码说明

  1. 边界处理:先排除空字符串、目标过短的极端情况,避免无效遍历。
  2. 滑动窗口遍历:通过eax记录当前起始偏移量,每次取palabraAux+eax作为起始地址,与palabra2做全长度匹配。
  3. 复用已有逻辑:直接调用你已实现的compare_words(替换为你实际的函数名),减少重复代码。
  4. 结果分支:匹配成功跳转到substring_found,失败遍历结束后进入substring_not_found,你可以在这两个分支中添加符合自身程序需求的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:42:20