8085 program to count the number of ones in contents of register B
Problem: Write an assembly language program to count the number of ones in the contents of register B and store the result at memory location 3050.
- Convert the decimal number in Accumulator to its binary equivalent.
- Rotate the digits of the binary number right without carry.
- Apply a loop till the count is not zero to change the values of the D register and count.
- Copy the value of the D register to the accumulator and store the result.
|2000||MVI B 75||B ← 75|
|2002||MVI C 08||C ← 75|
|2004||MVI D 00||D ← 00|
|2006||MOV A, B||A ← B|
|2007||RRC||Rotate right without carry|
|2008||JNC 200C||Jump if Not Carry|
|200B||INR D||D ← D+1|
|200C||DCR C||C ← C-1|
|200D||JNZ 2007||Jump if Not Zero|
|2010||MOV A, D||A ← D|
|2011||STA 3050||A → 3050|
- MVI B 75 moves 75 decimal numbers into the B register
- MVI C 08 moves 08 decimal number into C register, which is taken as counter as the number is of 8 bites
- MVI D 00 moves 00 number into d register
- MOV A, B moves the contents of B register into A (accumulator) register
- RRC rotates the contents of A (which is 75 with binary equivalent 01110101) right
- JNC 200C jumps to 200C address and performs the instructions written there if the carry flag is not zero
- INR D increases the value of the D register by adding one to its contents
- DCR C decreases the value of the C register by subtracting one from its contents
- JNZ 2007 jumps to the 2007 address and performs the instructions written there if the zero flags are not zero
- MOV A, D moves the contents of the B register into the A register
- STA 3050 store the contents of A at 3050 memory location
- HLT stops execution
Approach : 2 [Using Rotate Instruction RLC] :
Here algorithm will be the same as above but here we are moving contents of accumulator bits to 1-bit left and then checking carry flag values and updating the count register accordingly.
If Carry Flag = 1 , then Count = Count + 1
Otherwise: Rotate Accumulator Left again without carrying and repeat the above procedure.
Both Different Instructions do the same task and concept of achieving end-goal is one and the same. Only Rotating Style is Different but these 2 methods can do the same task for us.
|2000||MVI B,75H||75H is the value that is to be tested for the Number of 1’s|
|2002||MVI C,08H||C is storing 8 because of the 8-bit data which we are using and we need to rotate the given number 8 times hence for loop [C]=08|
|2004||MVI D,00H||This is a counter variable that will increment when 1 will be encountered|
|2006||MOV A, B||Move 75H into Accumulator for rotating purposes because RLC will work only on Accumulator.|
|2007||RLC||Rotate Accumulator Left Without Carry|
|2008||JNC 200C||If Carry Flag = 0 then just decrement counter and again start Rotating Accumulator using RLC.|
|200B||INR D||If Carry Flag = 1 , then we have to increment Counter Register D =D + 1|
|200C||DCR C||Decrement value of C register because we have to rotate data 8 times because of 8 bits. So limit of rotation = 8|
|200D||JNZ 2007||While [C] =0 this looping structure will execute from location 2007 and keep rotating accumulator contents until [C]=0|
|2010||MOV A, D||Move Contents of register D which contains a total number of 1’s in given data into Accumulator.|
|2011||STA 3050||Store Accumulator Contents into memory location 3050H as asked in the question.|
|2014||HLT||Stop execution of the given Program.|