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