I am trying to write a subprocedure that will count the number of buts set in a 16bit number, then send that number (bits set) back to the main procedure in AX. The main should display display the number of 1s and determine if the number is even or odd.

I am trying to count the 1s by shifting left and incrementing on carry. This doesn't seem to be working...

Code:
;===================================================
;                   MAIN.ASM
;===================================================================
         EXTERN  GETDEC:FAR
         EXTERN  NEWLINE:FAR
         EXTERN  PUTSTRNG:FAR
         EXTERN  PUTDEC:FAR
         EXTERN  PUTBIN:FAR
         EXTERN  PARITY:FAR
;===================================================================
        .MODEL  LARGE
        .STACK  512
;===================================================================
; D A T A   S E G M E N T   D E F I N I T I O N
        .DATA
NUMBER	   	DW  ?
PROMPT		DB 'Enter a number: '
BINDISPLAY   	DB 'Number in binary: '
ONESDISPLAY   	DB 'Number of 1s: '
ODDDISPLAY   	DB 'The number of 1s is odd. '
EVENDISPLAY	DB 'The number of 1s is even. '  
;===================================================================
; C O D E   S E G M E N T   D E F I N I T I O N
        .CODE
        ASSUME  DS:DGROUP
;===================================================================

MAIN    PROC
        MOV     AX, DGROUP           ;SET DS-REGISTER TO POINT TO
        MOV     DS, AX               ;DATA SEGMENT
        MOV     ES, AX               ;AND ES ALSO

BEGINNING:
        CALL    NEWLINE
        MOV     DI, OFFSET PROMPT
        MOV     CX, SIZEOF PROMPT
        CALL    PUTSTRNG
        CALL    GETDEC
        CALL    NEWLINE
        MOV     DI, OFFSET BINDISPLAY
        MOV     CX, SIZEOF BINDISPLAY
        CALL    PUTSTRNG 
	CALL 	PUTBIN
        PUSH    AX
        CALL    PARITY 
	CALL 	NEWLINE


        CALL    NEWLINE
        MOV     DI, OFFSET ONESDISPLAY
        MOV     CX, SIZEOF ONESDISPLAY
        CALL    PUTSTRNG
        CALL    PUTDEC
                
        MOV     BX, 2
        DIV     BX
        CMP     DX, 0
        JNE     ODDS

        MOV     DI, OFFSET EVENDISPLAY
        MOV     CX, SIZEOF EVENDISPLAY
        CALL    PUTSTRNG
        JMP     EXIT_PROGRAM
ODDS:    
        MOV     DI, OFFSET ODDDISPLAY
        MOV     CX, SIZEOF ODDDISPLAY
        CALL    PUTSTRNG       
EXIT_PROGRAM:
        MOV     AX, 4C00H
        INT     21H
MAIN    ENDP
        END MAIN

Code:
;===================================================================
;                PARITY.ASM
;===================================================================
         .MODEL  LARGE     
;===================================================================
; D A T A   S E G M E N T   D E F I N I T I O N
        .DATA 
ONES_COUNT     DW      0                           
;===================================================================
; C O D E   S E G M E N T   D E F I N I T I O N
        .CODE   
        ASSUME  DS:DGROUP
;===================================================================

PARITY  PROC    FAR PUBLIC USES DX DS
	POP	AX
NUM_LOOP:
	CMP	AX, 0
	JE	EXIT_PROGRAM
	SHL	AX, 1
	JC	INCREMENT
	JMP	NUM_LOOP
INCREMENT:
	INC	ONES_COUNT
	JMP	NUM_LOOP
EXIT_PROGRAM:
	MOV	AX, ONES_COUNT	
	PUSH	AX
	RET
PARITY  ENDP
        END PARITY