用MASM32来DIY判断字符串1是否为字符串2的子串的函数演示代码(源码+exe)(应用lstrcpyn()和lstrcmp(),区分大小写)

简介: 用MASM32来DIY判断字符串1是否为字符串2的子串的函数演示代码(源码+exe)(应用lstrcpyn()和lstrcmp(),区分大小写)

Windows貌似没有提供判断字符串1是否为字符串2的子串的 API函数,我们可以DIY一个。

先应用ASM特有的repe cmpsb指令来实现,详见:

来实现。从串2头部开始用lstrcpyn()复制与串1相同长度的字符串,再用lstrcmp()来与串1进行比较,直到发现匹配或者串2剩余长度>串1长度。

 

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; 文 件 名:isSubStr.asm (控制台程序)

; 功    能: 判断字符串1是否为字符串2的字串(区分大小写)

; 开发环境:Win xp pro sp3 + MASM32 v11

; 作    者:PurpleEndurer, 2014-10-04,广西河池

; log

; --------------------------------------------------

; 2014-10-04 开始编写

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.586

.MODEL  

FLAT, STDCALL

OPTION  

CASEMAP: NONE

INCLUDE \masm32\

include\windows.inc

INCLUDE \masm32\

include\kernel32.inc

INCLUDELIB \masm32\

lib\kernel32.lib

INCLUDE \masm32\

include\ole32.inc

INCLUDELIB \masm32\

lib\ole32.lib

INCLUDE \masm32\

include\user32.inc

INCLUDELIB \masm32\

lib\user32.lib

INCLUDE \masm32\

include\msvcrt.inc

INCLUDELIB \masm32\

lib\msvcrt.lib

INCLUDE \masm32\macros\MACROS.ASM

INCLUDE \masm32\

include\masm32.inc

INCLUDELIB \masm32\

lib\masm32.lib

isSubStr2  

proto : dword, : dword

;ssssssssssssssssssssssss

;.const

;ssssssssssssssssssssssss

g_debug  

equ 0

;ssssssssssssssssssssssss

.DATA

;ssssssssssssssssssssssss

   g_szAppInfo  

db  "文 件 名:isSubstr.asm", 0dh ,0ah

             

db  "功  能:判断字符串1是否为字符串2的字串", 0dh ,0ah

         

db  "作  者:PurpleEndurer, 2014-10-04,广西河池", 0dh ,0ah

         

db  "开发环境:Win xp Pro sp3 + MASM32 v11", 0dh ,0ah, 0

   g_sz1  

db  "bc", 0

   g_sz2  

db  "abcde", 0

   g_sz3  

db  "ac", 0

   g_sz4  

db  "cDe",0

   g_sz5  

db  "Bcd",0

   g_sz6  

db  "abcdef123",0

 

   g_szFmt  

db  "%s %s %d", 0dh, 0ah, 0

   g_buf20  

db 20 dup(0)

;ssssssssssssssssssssssss

.CODE

;ssssssssssssssssssssssss

start:

 

invoke StdOut,  ADDR g_szAppInfo

 

invoke isSubStr2,  offset g_sz1,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz1,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

invoke isSubStr2,  offset g_sz2,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz2,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

invoke isSubStr2,  offset g_sz3,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz3,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

invoke isSubStr2,  offset g_sz4,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz4,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

invoke isSubStr2,  offset g_sz5,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz5,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

 

invoke isSubStr2,  offset g_sz6,  offset g_sz2

 

invoke wsprintf,  offset g_buf20,  offset g_szFmt,  offset g_sz6,  offset g_sz2,  eax

 

invoke StdOut,  offset g_buf20

 

invoke ExitProcess, 0

;======================================================

isSubStr2  

proc lpsz1: dword, lpsz2: dword

; 功能:判断字符串1是否为字符串2的字串(区分大小写)

; 入口:lpsz1:串1地址 lpsz2:串2地址

; 出口:eax=-1,不是子串

;       eax>=0,子串首次出现位置

;======================================================

 

local buf256[256]:  byte

 

local dwCopyBytes:  dword

 

mov  edi, lpsz2

 

;串2长度

 

invoke lstrlen,  edi

 

mov  ebx,  eax

 

 

mov  esi, lpsz1

 

;串1长度

 

invoke lstrlen,  esi

 

;串2长度 < 串1长度?

 

cmp  ebx,  eax  ;eax=length of lpsz1

 

;串2长度 < 串1长度,返回-1

 

;mov eax, -1

 

jl  @isSubStr2NoResult

 

mov  ecx,  eax

 

inc  eax

 

mov dwCopyBytes,  eax

@isSubStr2LoopCmp:

 

push  ecx     ;串1长度

 

push  ebx     ;串2长度

 

push  edi

 

invoke lstrcpyn,  addr buf256,  edi, dwCopyBytes

 

invoke lstrcmp,  addr buf256, lpsz1

 

test  eax,  eax

 

jz @isSubStr2YesResult  ;完全匹配

 

pop   edi    ;恢复串2本次比较的首址

 

inc   edi    ;使串2首址加1,指向下一个字符, 以便下次比较

 

pop   ebx    ;恢复串2长度

 

dec   ebx    ;串2长度减1

 

pop   ecx     ;串1长度

 

cmp   ebx,  ecx

 

jge  @isSubStr2LoopCmp  ;串2长度>=串1长度, 继续比较

@isSubStr2NoResult:

 

mov   eax, -1

 

jmp  @isSubStr2Ret    

@isSubStr2YesResult:

 

pop   eax    ;弹出先前压入的edi, 即本次比较时的串2的首址

 

pop   esi    ;弹出esi, 无用

 

pop   ecx    ;弹出串1长度, 无用

 

sub   eax, lpsz2   ;计算串1在串2中的位置

@isSubStr2Ret:

 

ret

isSubStr2  

endp

END start isSubStr1  

endp

END


相关文章
|
算法 关系型数据库 MySQL
TiDB保证数据一致性的策略与优势
【2月更文挑战第28天】TiDB作为一款分布式数据库,通过其独特的策略和优势,确保在分布式环境下数据的一致性。本章将详细探讨TiDB保证数据一致性的核心策略,包括其采用的分布式一致性协议、数据复制机制以及容错处理等方面,并阐述这些策略所带来的优势。通过理解TiDB的数据一致性保证机制,读者将能更深入地认识其作为分布式数据库的价值。
|
存储 机器学习/深度学习 算法
c语言基础知识帮助理解(函数递归详解)
c语言基础知识帮助理解(函数递归详解)
141 0
|
8月前
|
人工智能 算法 网络安全
基于PAI+专属网关+私网连接:构建全链路Deepseek云上私有化部署与模型调用架构
本文介绍了阿里云通过PAI+专属网关+私网连接方案,帮助企业实现DeepSeek-R1模型的私有化部署。方案解决了算力成本高、资源紧张、部署复杂和数据安全等问题,支持全链路零公网暴露及全球低延迟算力网络,最终实现技术可控、成本优化与安全可靠的AI部署路径,满足企业全球化业务需求。
|
12月前
|
编解码 人工智能 缓存
自学记录鸿蒙API 13:实现多目标识别Object Detection
多目标识别技术广泛应用于动物识别、智能相册分类和工业检测等领域。本文通过学习HarmonyOS的Object Detection API(API 13),详细介绍了如何实现一个多目标识别应用,涵盖从项目初始化、核心功能实现到用户界面设计的全过程。重点探讨了目标类别识别、边界框生成、高精度置信度等关键功能,并分享了性能优化与功能扩展的经验。最后,作者总结了学习心得,并展望了未来结合语音助手等创新应用的可能性。如果你对多目标识别感兴趣,不妨从基础功能开始,逐步实现自己的创意。
368 60
|
存储 监控 安全
数据访问权限
【6月更文挑战第24天】数据访问权限
505 5
|
算法 程序员
程序员必知:字符串压缩(三)之短字符串压缩
程序员必知:字符串压缩(三)之短字符串压缩
453 0
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
19298 31
|
监控 网络协议 API
利用zabbix api批量添加数百台监控主机
利用zabbix api批量添加监控主机 在公司规模很庞大的时候,每次都手动添加监控主机将会很麻烦,我们可以利用zabbix的api去批量添加监控主机 本次我们将实现用一台主机虚拟出100台主机,并通过api的方式自动添加监控主机
1039 0
利用zabbix api批量添加数百台监控主机
|
机器学习/深度学习 vr&ar 图形学
通义万相-虚拟模特是怎么实现的
通义万相-虚拟模特是怎么实现的
330 0
|
存储 Linux Android开发
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
2822 0