8086 program to Count the number of 1’s in a register




ØØ       Explanation :
·           We have a word that is stored in AX register.
·           Initialize the counter 1 = 16.
·           Initialize counter 2 = 0 to count the number of 1’s.
·           We will rotate the number in AX alongwith carry by 1 bit to the right. If there is a carry we will increment counter 2. Decrement counter 1. This process with continue till all the bits are checked. The counter 2 will indicate the number of 1’s present in the word. The result of counter 2 is stored in BL. Display the result.
 eg. :        AX = 5267
0101
0010
0110
0111
                                                            no  of 1’s = 8
ØØ       Algorithm :
Step I         : Initialize the data memory.
Step II       :  Load the number in AX register.
Step III      : Initialize count in BL = 00
                               Initialize counter 1 = 16.
Step IV      :  Rotate contents of register so that  LSB will go in carry.
Step V        :  Check if carry = 1. If not goto step VII.
Step VI      :  Increment count in BL.
Step VII    :  Decrement counter 1.
Step VIII   :  Check if counter 1 = 0. If not go to step IV.
Step IX      :  Display result in BL.
Step X       :  Stop.
ØØ       Flowchart : Refer flowchart 7.

ØØ       Program :
.model small
.data
a dw 5267H
.code
            mov    ax, @data        ; Initialize data section
            mov    ds, ax
            mov    ax, a               ; Load number1 in ax
            mov    cx, 16              ; load count in cx register
back:     rcr      ax, 1          ; rotate by 1 bit to the right
            jnc      l1                    ; if bit is 0 goto next bit
            inc      bl                   ; if bit=1 increment count
l1:         dec     cx                  ; decrement counter
            jnz      back               ;
            mov    ch, 04h           ; Count of digits to be displayed
            mov    cl, 04h            ; Count to roll by 4 bits
l2:        rol      bx, cl              ; roll bl so that msb comes to lsb
            mov    dl, bl               ; load dl with data to be displayed
            and     dl, 0fH            ; get only lsb
            cmp    dl, 09             ; check if digit is 0-9 or letter A-F
            jbe      l4
            add     dl, 07              ; if letter add 37H
                                           ; else only add 30H
l4:        add     dl, 30H
            mov    ah, 02             ; Function 2 under
                                           ; INT 21H                                                       
                                           ; (Display character)
            int      21H
            dec     ch                     ; Decrement Count
            jnz      l2
            mov    ah, 4cH              ; Terminate Program
            int      21H
       end
ØØ       Result :
C:\programs>tasm count1.asm
Turbo Assembler  Version 3.0  Copyright (c) 1988, 1991 Borland International
Assembling file:   count1.asm
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  438k
C:\programs>tlink count1
Turbo Link  Version 3.0 Copyright (c) 1987, 1990 Borland International
Warning: No stack
C:\programs>count1
0008
C:\programs>