![]() |
#2
ONEPROBLEM2008-08-28 21:45
|

TITLE str_find.asm
;程序描述:查找子字符串
;创建日期:2008\8\25
INCLUDE Irvine32.inc ;这是我看的书的作者的头文件,用到了他的一个函数:writedec,其要显示的数保存在EAX在中
str_find proto, ;
source:ptr byte, ;the begining position to remove ;
target:ptr byte ;the number to remove
.data
t byte "123ABC342432",0
s byte "ABC",0
.code
main proc
invoke str_find,addr s,addr t
call writedec ;显示保存在EAX中的位置
call crlf
ret
main endp
str_find proc ,
source:ptr byte,
target:ptr byte
;查找源字符串是否在目标字符串中
;结果:若存在则设置零标志,eax返回源字符串中第一个字符在目标字符串中的位置
;否则清除零标志
mov edi,target
mov edx,[edi] ;判断target是否为空
cmp edx,0
jz failed ;若为空则跳转
mov eax,0 ;保存位置位eax
begin:
mov esi,source
mov edx,[esi]
cmp edx,[edi] ;比较[esi]与[edi]
jnz L1 ;不相等,则跳转到L1
L2: ;否则比较它们的下一个字符
inc edi
mov edx,[edi]
cmp edx,0 ;判断目标字符串是否移到了末尾
jz failed
inc eax ;每一次edi递增时,eax也递增
inc esi
mov edx,[esi]
cmp edx,0 ;若源字符串移到了末尾,标志着已找到了
jz successful;成功退出即可
cmp [edi],edx
je L2
L1:
inc edi ;转入比较目标字符串的下一个字符
mov edx,[edi]
cmp edx,0
jz failed
inc eax
jmp begin
failed:
mov dx,1
or dx,1 ;这是为了清楚零标志
successful:
ret
str_find endp
end main
;程序描述:查找子字符串
;创建日期:2008\8\25
INCLUDE Irvine32.inc ;这是我看的书的作者的头文件,用到了他的一个函数:writedec,其要显示的数保存在EAX在中
str_find proto, ;
source:ptr byte, ;the begining position to remove ;
target:ptr byte ;the number to remove
.data
t byte "123ABC342432",0
s byte "ABC",0
.code
main proc
invoke str_find,addr s,addr t
call writedec ;显示保存在EAX中的位置
call crlf
ret
main endp
str_find proc ,
source:ptr byte,
target:ptr byte
;查找源字符串是否在目标字符串中
;结果:若存在则设置零标志,eax返回源字符串中第一个字符在目标字符串中的位置
;否则清除零标志
mov edi,target
mov edx,[edi] ;判断target是否为空
cmp edx,0
jz failed ;若为空则跳转
mov eax,0 ;保存位置位eax
begin:
mov esi,source
mov edx,[esi]
cmp edx,[edi] ;比较[esi]与[edi]
jnz L1 ;不相等,则跳转到L1
L2: ;否则比较它们的下一个字符
inc edi
mov edx,[edi]
cmp edx,0 ;判断目标字符串是否移到了末尾
jz failed
inc eax ;每一次edi递增时,eax也递增
inc esi
mov edx,[esi]
cmp edx,0 ;若源字符串移到了末尾,标志着已找到了
jz successful;成功退出即可
cmp [edi],edx
je L2
L1:
inc edi ;转入比较目标字符串的下一个字符
mov edx,[edi]
cmp edx,0
jz failed
inc eax
jmp begin
failed:
mov dx,1
or dx,1 ;这是为了清楚零标志
successful:
ret
str_find endp
end main