STCSEG  SEGMENT PARA    STACK
        DW      64
STCSEG  ENDS

DATSEG  SEGMENT PARA    'data'

        STRUCT_INPUT_STRING     LABEL   BYTE
        MAX_LEN         DB      200
        ACT_LEN         DB      ?
        STRING_INPUT    DB      200 DUP(' ')

        NUMBER_OF_TWO_WORDS     DB      0
        NUMBER_OF_THREE_WORDS   DB      0
        NUMBER_OF_FOUR_WORDS    DB      0

        MSG_2_WORDS     DB      'Number of Two Words is   :','$'
        MSG_3_WORDS     DB      'Number of Three Words is :','$'
        MSG_4_WORDS     DB      'Number of Four Words is  :','$'

DATSEG  ENDS

CODSEG  SEGMENT PARA    'code'

        MAIN    PROC

                ;set the segment to register

                ASSUME  SS:STCSEG,DS:DATSEG,CS:CODSEG
                MOV     AX,DATSEG
                MOV     DS,AX
                ;------------------------------------------------------
                ;clear screen

                MOV     AX,0600H
                MOV     BH,07
                MOV     CX,0000
                MOV     DX,189FH
                INT     10H
                ;------------------------------------------------------
                ;set curser in the top of screen

                MOV     AH,02H
                MOV     BH,00
                MOV     DX,0100H
                INT     10H
                ;------------------------------------------------------
                ;read a input string

                MOV     AH,0AH
                LEA     DX,STRUCT_INPUT_STRING
                INT     21H


                ;------------------------------------------------------
                ;calculate the words

                MOV     CL,ACT_LEN
                MOV     SI,0
                MOV     AX,0

        BEGIN_OF_LOOP:

                CMP     STRING_INPUT[SI],' '
                JZ      EQUAL_WITH_BLANK

                INC     AX
                JMP     AFTER_CHECK_BLANK

        EQUAL_WITH_BLANK:

                CMP     AX,2
                JNE     NOT_LEN_IS_TWO
                ADD     NUMBER_OF_TWO_WORDS,1
                JMP     END_OF_CHECK

           NOT_LEN_IS_TWO:
                CMP     AX,3
                JNE     NOT_LEN_IS_THREE
                ADD     NUMBER_OF_THREE_WORDS,1
                JMP     END_OF_CHECK

           NOT_LEN_IS_THREE:
                CMP     AX,4
                JNE     END_OF_CHECK
                ADD     NUMBER_OF_FOUR_WORDS,1

           END_OF_CHECK:
                MOV     AX,0

        AFTER_CHECK_BLANK:
                
                INC     SI
                LOOP    BEGIN_OF_LOOP

                CMP     AX,2
                JNE     NOT_LEN_IS_TWO1
                ADD     NUMBER_OF_TWO_WORDS,1
                JMP     END_OF_CHECK1

           NOT_LEN_IS_TWO1:
                CMP     AX,3
                JNE     NOT_LEN_IS_THREE1
                ADD     NUMBER_OF_THREE_WORDS,1
                JMP     END_OF_CHECK1

           NOT_LEN_IS_THREE1:
                CMP     AX,4
                JNE     END_OF_CHECK1
                ADD     NUMBER_OF_FOUR_WORDS,1

           END_OF_CHECK1:

                ;------------------------------------------------------
                ;print number of words

                ;print number of two words

                ;set curser
                MOV     AH,02H
                MOV     BH,00
                MOV     DX,0300H
                INT     10H

                ;display message
                MOV     AH,09H
                LEA     DX,MSG_2_WORDS
                INT     21H

                ;divide to 10
                MOV     AH,0H
                MOV     AL,NUMBER_OF_TWO_WORDS
                MOV     CL,10
                DIV     CL
                MOV     BX,AX
                ADD     BX,3030H

                ;print result of divide
                MOV     AH,02H
                MOV     DL,BL
                INT     21H

                MOV     AH,02H
                MOV     DL,BH
                INT     21H

                ;set curser
                MOV     AH,02H
                MOV     BH,00
                MOV     DX,0400H
                INT     10H

                ;display message
                MOV     AH,09H
                LEA     DX,MSG_3_WORDS
                INT     21H

                ;divide to 10
                MOV     AH,0H
                MOV     AL,NUMBER_OF_THREE_WORDS
                MOV     CL,10
                DIV     CL
                MOV     BX,AX
                ADD     BX,3030H

                ;print result of divide
                MOV     AH,02H
                MOV     DL,BL
                INT     21H

                MOV     AH,02H
                MOV     DL,BH
                INT     21H

                ;set curser
                MOV     AH,02H
                MOV     BH,00
                MOV     DX,0500H
                INT     10H

                ;display message
                MOV     AH,09H
                LEA     DX,MSG_4_WORDS
                INT     21H

                ;divide to 10
                MOV     AH,0H
                MOV     AL,NUMBER_OF_FOUR_WORDS
                MOV     CL,10
                DIV     CL
                MOV     BX,AX
                ADD     BX,3030H

                ;print result of divide
                MOV     AH,02H
                MOV     DL,BL
                INT     21H

                MOV     AH,02H
                MOV     DL,BH
                INT     21H

                ;end of program
                MOV     AX,4C00H
                INT     21H

        MAIN    ENDP

CODSEG  ENDS
        END     MAIN
