home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS - Coast to Coast
/
simteldosarchivecoasttocoast2.iso
/
asmutil
/
80x0393.zip
/
STRING.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-09-30
|
3KB
|
117 lines
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