; Searching a substring from a Main string
[org 0x0100]
jmp start
mstr: db 'aaab', 0
sstr: db 'aab', 0
sub_len: dw ; Used to contain length of sub string
start: dw ; Place to resume search
stop: dw ; Last place to begin search
; subroutine to calculate the length of a string
; takes the segment and offset of a string as parameters
strlen: push bp
mov bp,sp
push es
push cx
push di
les di, [bp+4] ; point es:di to string
mov cx, 0xffff ; load maximum number in cx
xor al, al ; load a zero in al
repne scasb ; find zero in the string
mov ax, 0xffff ; load maximum number in ax
sub ax, cx ; find change in cx
dec ax ; exclude null from length
pop di
pop cx
pop es
pop bp
ret 4
; subroutine to compare two strings
; takes segment and offset pairs of two strings to compare
; returns 1 in ax if they match and 0 other wise
strcmp: push bp
mov bp,sp
push cx
push si
push di
push es
push ds
lds si, [bp+4] ; point ds:si to first sstr
les di, [bp+8] ; point es:di to second mstr
push es ; push segment of mstr
push di ; push offset of mstr
call strlen ; calculate string length
mov bx, ax ; save length in bx
push ds ; push segment of sstr
push si ; push offset of sstr
call strlen ; calculate string length
; Now length of sstr is in ax register
; See if mstr/sstr are null or sstr longer than mstr
or bx,bx ; mstr null?
JE exitfalse
cmp ax,0 ; sstr null?
JE exitfalse
cmp ax, bx ; sstr>mstr?
JE exitfalse
mov sub_len, ax ; Move length of sstr in sub_len
; see if the sstr is substring of mstr
LEA SI, sstr ; SI points to sstr
LEA DI, mstr ; DI points to mstr
Cld ; Left to right processing
; Compute STOP
mov stop, DI ; stop has mstr address
add stop, bx
mov cx,sub_len
sub stop,cx ; subtract substring length
; Initialize start
mov start, DI
REPEAT:
; compare characters
mov cx, sub_len
mov DI, start ; reset DI
LEA SI, sstr ; reset SI
Repe cmpsb ; compare characters
JE exitsimple
; substring not found yet
INC start
; see if the start<=stop
mov ax, start
cmp ax, stop
JNLE exitfalse
JMP REPEAT
mov ax,1
JMP exitsimple
exitfalse: mov ax, 0 ; store 0 to mark unequal
exitsimple: pop ds
pop es
pop di
pop si
pop cx
pop bp
ret 8
start: push ds ; push segment of first string
mov ax, mstr
push ax ; push offset of first string
push ds ; push segment of second string
mov ax, sstr
push ax ; push offset of second string
call strcmp ; call strcmp subroutine
mov ax, 0x4c00 ; terminate program
int 0x21
[org 0x0100]
jmp start
mstr: db 'aaab', 0
sstr: db 'aab', 0
sub_len: dw ; Used to contain length of sub string
start: dw ; Place to resume search
stop: dw ; Last place to begin search
; subroutine to calculate the length of a string
; takes the segment and offset of a string as parameters
strlen: push bp
mov bp,sp
push es
push cx
push di
les di, [bp+4] ; point es:di to string
mov cx, 0xffff ; load maximum number in cx
xor al, al ; load a zero in al
repne scasb ; find zero in the string
mov ax, 0xffff ; load maximum number in ax
sub ax, cx ; find change in cx
dec ax ; exclude null from length
pop di
pop cx
pop es
pop bp
ret 4
; subroutine to compare two strings
; takes segment and offset pairs of two strings to compare
; returns 1 in ax if they match and 0 other wise
strcmp: push bp
mov bp,sp
push cx
push si
push di
push es
push ds
lds si, [bp+4] ; point ds:si to first sstr
les di, [bp+8] ; point es:di to second mstr
push es ; push segment of mstr
push di ; push offset of mstr
call strlen ; calculate string length
mov bx, ax ; save length in bx
push ds ; push segment of sstr
push si ; push offset of sstr
call strlen ; calculate string length
; Now length of sstr is in ax register
; See if mstr/sstr are null or sstr longer than mstr
or bx,bx ; mstr null?
JE exitfalse
cmp ax,0 ; sstr null?
JE exitfalse
cmp ax, bx ; sstr>mstr?
JE exitfalse
mov sub_len, ax ; Move length of sstr in sub_len
; see if the sstr is substring of mstr
LEA SI, sstr ; SI points to sstr
LEA DI, mstr ; DI points to mstr
Cld ; Left to right processing
; Compute STOP
mov stop, DI ; stop has mstr address
add stop, bx
mov cx,sub_len
sub stop,cx ; subtract substring length
; Initialize start
mov start, DI
REPEAT:
; compare characters
mov cx, sub_len
mov DI, start ; reset DI
LEA SI, sstr ; reset SI
Repe cmpsb ; compare characters
JE exitsimple
; substring not found yet
INC start
; see if the start<=stop
mov ax, start
cmp ax, stop
JNLE exitfalse
JMP REPEAT
mov ax,1
JMP exitsimple
exitfalse: mov ax, 0 ; store 0 to mark unequal
exitsimple: pop ds
pop es
pop di
pop si
pop cx
pop bp
ret 8
start: push ds ; push segment of first string
mov ax, mstr
push ax ; push offset of first string
push ds ; push segment of second string
mov ax, sstr
push ax ; push offset of second string
call strcmp ; call strcmp subroutine
mov ax, 0x4c00 ; terminate program
int 0x21
_________________
0 comments:
Post a Comment