; Guide to Assembly Language
        ; Section 9.6 Complete Program
        ; Copyright 2010, James T. Streib
        .model flat,c
        .stack 100h
scanf     PROTO arg2:Ptr Byte, inputlist:VARARG
printf    PROTO arg1:Ptr Byte, printlist:VARARG
msg1fmt   byte 0Ah,"%s",0
msg2fmt   byte 0Ah,"%s",0Ah,0Ah,0
in1fmt    byte "%s",0
msg1      byte "Enter the state to be found: ",0
msg2      byte "The state was found.",0
msg3      byte "The state was not found.",0
arrystr   byte "Illinois  ","Michigan  ","Iowa      ",
             "Missouri  ","Arkansas  ","Tennessee ",
             "Louisiana ","Arizona   ","Montana   ",
             "Ohio      "
n         sdword 10
string    byte 10 dup(?)
found     sdword ?
main      proc
        INVOKE printf, ADDR msg1fmt,ADDR msg1
        INVOKE scanf, ADDR in1fmt, ADDR string
        mov ecx,0                  ; initialize ecx to 0
        mov found,0                ; initialize found to 0
        lea edi,arrystr+0          ; load edi with address
        .while(ecx<n &&  found != -1)
        push ecx                   ; save ecx
        lea esi,string+0           ; load address of string
        cld                        ; clear direction flag
        mov ecx,lengthof string    ; load length of string
        repe cmpsb                 ; compare while equal
        dec esi                    ; decrement es1
        dec edi                    ; decrement edi
        mov al,[esi]               ; load al with [esi]
        mov ah,[edi]               ; load ah with [edi]
        .if (al==0)&&(ah==" ")     ; compare for 0 and space
        mov found,-1               ; if yes, found
        inc edi                    ; increment edi back
        add edi,ecx                ; adjust edi to next string
        pop ecx                    ; restore ecx
        inc ecx                    ; increment ecx
        .if (found ==-1)
        INVOKE printf, ADDR msg2fmt, ADDR msg2
        INVOKE printf, ADDR msg2fmt, ADDR msg3
main      endp