Q. Write a program for comparing two strings?
Let's write a program for comparing two strings. Determine the following piece of code that has been written in C to compare two strings. Let's presume that 'str1' and 'str2' are two strings which are initialised by some values and 'ind' is index for these character strings:
for (ind = 0; ( (ind <9) and (str1[ind] = = str2[ind]) ), ind + +)
Intermediate code in assembly language produced by a non-optimising compiler for the above piece may appear like:
MOV IND, 00; ind: = 0
L3: CMP IND, 08; Ind < 9
JG L1 ; not so; skip
LEA AX, STR1; offset of str1 in AX register
MOV BX, IND; it uses a register for indexing into
; The array
LEA CX, STR2; str2 in CX
MOV DL, BYTE PTR CX [BX]
CMP DL, BYTE PTR AX [BX]; str1 [Ind] = str2 [Ind]
JNE L1 ; no, skip
MOV IND, BX
ADD IND, 01
L2: JMP L3 ; loop back
L1:
What we find in above code: a large code which could have been improved further if 8086 string instructions would have been used.
; Program: Matching two strings of similar length stored in memory locations.
; REGISTERS: Uses CS, DS, ES, AX, DX, CX, SI, DI
DATA SEGMENT
PASSWORD DB 'FAILSAFE' ; source string
DESTSTR DB 'FEELSAFE' ; destination string
MESSAGE DB 'String are equal $'
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, ES: DATA
MOV AX, DATA
MOV DS, AX ; Initialise data segment register
MOV ES, AX ; Initialise extra segment register
; As destination string is considered to be in extra segment. Please note that ES is also
; initialised to the same segment as of DS.
LEA SI, PASSWORD; Load source pointer
LEA DI, DESTSTR; Load destination pointer
MOV CX, 08 ; Load counter with string length
CLD ; Clear direction flag so that comparison is
; done in forward direction.
EPE CMPSB; Compare the two string byte by byte
JNE NOTEQUAL; If not equal, jump to NOTEQUAL
MOV AH, 09; else display message
MOV DX, OFFSET MESSAGE;
INT 21h; display the message
NOTEQUAL: MOV AX, 4C00h; interrupt function to halt
INT 21h
CODE ENDS
END