home *** CD-ROM | disk | FTP | other *** search
- comment #
-
- STRING.ASM
- Finding strings in memory
-
- Author: Dave Walker
- placed in public domain
-
- The actual search is quite easy, due to the magical "rep cmpsb"
- instruction. The biggest problem is normalizing the addresses.
- If you are starting with an arbitrary address, just do this:
-
- While (offset >= 10h)
- offset = offset-10h
- segment = segment+1
- #
-
- IDEAL
- MODEL TINY
-
- CODESEG
- ORG 100h
-
- start: mov dx,OFFSET askmsg ;Ask user for string
- mov ah,9
- int 21h
-
- mov dx,OFFSET inbuf ;Get input
- mov ah,0ah
- int 21h
-
- xor ax,ax ;Init target to 0:0
- mov es,ax
- mov di,ax
- cld
-
- mainloop: mov ch,0 ;Init length
- mov cl,[inbuf+1]
- mov si,OFFSET string ;Init source
-
- push es ;Perform search
- push di
- rep cmpsb
- pop di
- pop es
- jz foundit
-
- bump: inc di ;Next mem location
- cmp di,16 ;Past paragraph boundary?
- jb mainloop
- sub di,16 ;If so, adjust DI and ES
-
- push es ;INC ES (grrr...)
- pop ax
- inc ax
- push ax
- pop es
-
- cmp ax,0a000h ;Did we pass 640k?
- jb mainloop
-
- mov ax,4c00h ;Bye-bye
- int 21h
-
- foundit: mov ax,es ;Convert segment to ASCII
- mov dx,OFFSET foundaddr
- call binhex
- mov ax,di ;Convert offset to ASCII
- mov dx,OFFSET foundaddr+5
- call binhex
- mov dx,OFFSET foundmsg ;Tell user where we found
- mov ah,9 ; the string
- int 21h
- jmp bump
-
- PROC binhex ;Convert AX to ASCII and
- push ax ; store result at [DS:DX].
- push bx ; All regs (including
- push cx ; DX) are preserved.
- push dx
- mov bx,dx
- mov dl,ah
- mov cl,4
- shr dl,cl
- call bh10
- mov dl,ah
- and dl,15
- call bh10
- mov dl,al
- shr dl,cl
- call bh10
- mov dl,al
- and dl,15
- call bh10
- pop dx
- pop cx
- pop bx
- pop ax
- ret
-
- bh10: cmp dl,10
- jb bh11
- add dl,7
- bh11: add dl,'0'
- mov [bx],dl
- inc bx
- ret
- ENDP
-
- askmsg db 'Enter search string : $'
- foundmsg db 13,10,'String found at '
- foundaddr db 'ssss:oooo','$'
- inbuf db 253,?
- string db 253 dup (?)
-
- END start
-