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


Reply With Quote