用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


相关文章
|
存储 编译器 C++
关于“VS2022无法打开头文件<graphics.h>” 以及编译时 “没有与参数列表匹配的重载函数实例”俩个问题的解决思路
关于“VS2022无法打开头文件<graphics.h>” 以及编译时 “没有与参数列表匹配的重载函数实例”俩个问题的解决思路
2672 0
【原创】演示判断一个字符串是否为另一字符串的子串的函数的汇编源程序
【原创】演示判断一个字符串是否为另一字符串的子串的函数的汇编源程序
如何根据文件夹中文件,生成对应名字的图片,名称一样的路径,这里用到了变量,将集合定义在外面,字符串拼接,正则表达式截取.jpg文件
如何根据文件夹中文件,生成对应名字的图片,名称一样的路径,这里用到了变量,将集合定义在外面,字符串拼接,正则表达式截取.jpg文件
|
5月前
|
JavaScript
js 判断字符串是否包含中文,判断字符串是否全是中文,判断字符是否为中文
js 判断字符串是否包含中文,判断字符串是否全是中文,判断字符是否为中文
259 0
|
7月前
如何去掉字符串中文括号及其内部的内容三种方式
如何去掉字符串中文括号及其内部的内容三种方式
255 0
|
7月前
|
存储 人工智能 资源调度
【windows批处理batch】.bat文件 字符串处理相关操作(字符串定义、分割、拼接、替换、切片、查找)
【windows批处理batch】.bat文件 字符串处理相关操作(字符串定义、分割、拼接、替换、切片、查找)
【STM32】【vscode编译】 不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来(\“&\“),以将其作为字符串的一部分传递
【STM32】【vscode编译】 不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来(\“&\“),以将其作为字符串的一部分传递
445 0
|
Python
vscode编译 不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来(\“&\“),以将其作为字符串的一部分传递
vscode编译 不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来(\“&\“),以将其作为字符串的一部分传递
568 0
|
存储 算法 JavaScript
请用JS实现一个判断字符串括号是否匹配的方法!
前言 这是一道考察基础数据结构与算法的题目,如果没有学过数据结构,可能刚开始还有点摸不着头脑,但是如果你学过数据结构,那么看到这道题我相信你就有很清晰的思路。今天我们就来剖析剖析这道题。
606 0
请用JS实现一个判断字符串括号是否匹配的方法!
|
SQL Java 数据库连接
实战小技巧:字符串占位替换-JDK版
接下来我们看一下在我们的日常工作生涯中,经常涉及到的几种占位替换方式
809 0