;**********************************************
TITLE 汇编实现的 memcpy memset strstr
;**********************************************


;**********************************************
;程序运行平台说明
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;**********************************************


;**********************************************
;文件包含
INCLUDE Irvine32.inc
;**********************************************


;**********************************************
;数据段定义
.DATA
valstr byte "This is Source Byte",0dh,0ah,0
valDes byte ($-valstr) dup(0)
strstr byte "we have found it",0dh,0ah,0
;**********************************************


;**********************************************
;代码段定义
.CODE
main proc
;开始使用memcpy
mov esi,offset valstr
mov edi,offset valDes
mov ecx,sizeof valstr
cld
rep movsb
;输出valDes查看结果
mov edx,offset valDes
call WriteString
;开始使用strstr寻找特定的字符
mov al,'B'
mov edi,offset valDes
mov ecx,sizeof valDes
repne scasb;repne 当在不相等的情况下继续循环
;开始输出看看是否是结果
mov edx,offset valDes
mov ebx,sizeof valDes
add edx,ebx
sub edx,ecx
dec edx
call WriteString
;开始使用memset将valDes清空
mov edi,offset valDes
mov al,0
mov ecx,sizeof valDes
rep stosb
;输出查看结果
mov edx,offset valDes
call WriteString
exit
main endp
end main
;**********************************************




PS:解读使用strstr时,也就是scasb,

如果要查询的字符在edi指向的内存数据当中的话,那么ecx的值就是其索引所在,但是与高级语言不同的是,ecx的索引的含义是从字符串末尾开始作为起始0开始计数的

也就是说如果内存中的数据是

str=ABCDEFG   起始地址放在edi当中的话,ecx中放的是7,查找F,那么最终ecx中放的索引值就是2,此时如果我们想要输出查找字符所在的的后续字符串的话,就需要

str+sizeof(str)-ecx,将该结果放在edx当中,然后输出,才是最终结果...