注册 登录
编程论坛 汇编论坛

求高手来个win32汇编字符串替换函数

爱末流 发布于 2012-11-27 17:48, 769 次点击
求高手来个win32汇编字符串替换函数

网上复制的也可以,我在网上找了下没有找到类似函数

或者来个思路也可以。

伪函数调用 ;invoke ReplaceStr  ("abc123a123","123","aaa")    如:把abc123a123 存在的所有 123 替换成 aaa

在此谢谢了。
5 回复
#2
wp2319572012-11-27 20:37
为啥非要用汇编做呢
#3
wp2319572012-11-27 20:49
网上找到的
不过是16位汇编的
程序代码:
1、 编写一个把字符串中的所有小写字符转换成大写字符的子程序Strupr,要求字符串的首地址和结束符为其入口参数。
解:
.MODEL SMALL, C
.DATA
buffDB   "This is a example.", 0
.CODE
StruprPROC   USES AX BX, String:PTR BYTE, Tail:BYTE
MOVBX, String
.REPEAT
MOVAL, [BX]
.IF AL>=’a’ && AL<=’z’
SUBAL, 20H
MOV[BX], AL
.ENDIF
INCBX
.UNTIL AL==Tail
RET
StruprENDP
.STARTUP
INVOKE Strupr, ADDR buff, 0
.EXIT 0
END

2、编写一个从字符串中拷贝子串的子程序Strncpy,它有四个参数str1、str2、idx和num,其具体功能为把字符串str2中从第idx个(从0开始记数)字符开始、num个字符传送给str1,字符串str1和str2都是以ASCII码0为结束符。
解:
.MODELSMALL, C
.DATA
str1DB "12345ABCDEF", 0
str2DB 20 DUP(’A’)
.CODE
StrlenPROC  USES AX BX, String:PTR BYTE
……;参见例10.1
StrlenENDP
StrncpyPROC  USES AX CX DI SI DS ES, str1:FAR PTR BYTE, str2:FAR PTR BYTE, idx:WORD, num:WORD
LESDI, str1
LDSSI, str2;取两个字符串的首地址
INVOKEStrlen, SI;计算源字符串的长度,在CX中
MOVAX, idx
.IF AX >= CX;若字符起点就超过源串的长度
MOVBYTE PTR ES:[DI], 0;拷贝的字符串为“空”
JMPover
.ENDIF
ADDSI, AX;定源串中字符的起点SI
MOVCX, num
CLD
.REPEAT
LODSB
STOSB
.UNTILCXZ AL==0
.IF AL!=0;设置目标串的结束符
MOVBYTE PTR[DI], 0
.ENDIF
over:RET
StrncpyENDP
.STARTUP
INVOKEStrncpy, ADDR str2, ADDR str1, 3, 5
.EXIT0
END
#4
爱末流2012-11-27 23:30
回复 3楼 wp231957
不是这个,这个不是字符串的替换
#5
爱末流2012-11-27 23:30
回复 3楼 wp231957
不过还是感谢下,我已经自己写出来了
#6
爱末流2012-11-27 23:35
写得不好。

szTestStr1      byte    "AB123ABCABBABAB",0
szTest1         byte    "AB",0
szTest2         byte    "YY",0

调用: invoke ReplaceStr,addr szTestStr1,addr szTest1,addr szTest2

ReplaceStr  proc  _lpSource,_lpBuffer1,_lpBuffer2   
            LOCAL  @dwLength,@dwCount   
            mov    @dwCount,0
            invoke lstrlen,_lpBuffer1
            push   eax
            invoke lstrlen,_lpBuffer2
            mov    @dwLength,eax
            pop    ebx
            .if    eax != ebx
                   mov eax,FALSE
                   ret              
            .endif
            invoke lstrlen,_lpSource
            mov    ecx, eax
            mov    esi,_lpSource
            mov    edi,_lpBuffer1
            mov    ebx,_lpBuffer2           
            .while ecx         
                   push   ecx   
                   invoke lstrlen,_lpBuffer2
                   mov    @dwLength,eax                 
                   .while @dwLength   ;2
                          mov dl,byte ptr [esi]
                          .if dl != byte ptr [edi]
                              .break
                          .else                        
                              inc @dwCount
                              inc esi  
                              inc edi  
                          .endif            
                          dec @dwLength                                                                 
                   .endw      
                          invoke lstrlen,_lpBuffer2
                   .if    @dwCount != eax
                          inc esi
                          mov edi,_lpBuffer1   
                          mov @dwCount,0  
                   .else
                          push esi
                          sub esi,@dwCount  
                          mov edi,esi
                          mov esi,_lpBuffer2
                          mov ecx,@dwCount
                          cld
                          rep movsb
                          pop esi
                          mov edi,_lpBuffer1
                          mov @dwCount,0
                   .endif                                 
             pop ecx
             dec ecx                        
            .endw
            
             ret     
ReplaceStr  endp
1