8085 program to find the set bit of accumulator
Last Updated :
13 May, 2019
Problem – All bits of an accumulator are 0 except a single bit which is 1. Write an assembly language program using 8085 to determine which bit of the accumulator is 1. The result should be a decimal number from 1 to 8 and is required to be stored in register C.
Examples –
Example 1 : Accumulator Content is 10H (Hex)
Accumulator Content -> 0 0 0 1 0 0 0 0
Result after execution -> Register C : 5
Example 2 : Accumulator content is 02H (Hex)
Accumulator Content -> 0 0 0 0 0 0 1 0
Result after execution -> Register C : 2
Solution –
The problem can be solved through multiple methods. Here, two approaches have been discussed:
- Without using Carry Flag
- Using Carry Flag
Method 1: Without using Carry Flag
Algorithm –
- Initialize a counter in the form of register C
- Load a register B with 01 to AND with accumulator and check for set bit
- AND the content of accumulator with register B
- If the result of AND operation is non-zero, then the final result is obtained
- If the result is zero, increment counter C
- Accumulator content is shifted right using RRC without affecting carry flag
- The search for next bit is carried out again
Program –
Starting Address of Program -> 3000H
MEMORY ADDRESS |
MNEMONICS |
COMMENT |
3000 |
LXI SP, 5000H |
Initialize Stack Pointer |
3003 |
MVI C, 01H |
C <- 01H |
3005 |
MVI B, 01H |
B <- 01H |
3007 |
ANA B |
AND A with B |
3008 |
JNZ 3010H |
Jump at Zero Flag reset (Z=1) to location 3010H |
300B |
INR C |
C <- C+1 |
300C |
RRC |
Rotate accumulator right without Carry |
300D |
JMP 3007H |
Unconditional jump to location 3007H |
3010 |
HLT |
Halt Execution |
Explanation –
- LXI SP, 5000H is used to initialize the stack pointer at a higher location such that it doesn’t coincide with the program counter
- MVI C, 01H stores the value of counter that will store the final result at end of execution
- MVI B, 01H stores 01H to register B
- ANA B Logical AND the contents of register B with right-most bit of accumulator to check for set bit
- JNZ 3010H jumps to Halt instruction if the AND operation results in non-zero value; it implies the bit is set and final result is obtained
- INR C increments the bit counter if AND operation results in zero value; implying search for set bit needs to be continued
- RRC is used to right shift the accumulator without affecting the carry flag
- JMP 3007H jumps unconditionally to check for next bit of accumulator
- HLT halts the execution of program flow
Method 2: Using Carry Flag
Algorithm –
- Initialize a counter in the form of register C
- Accumulator content is shifted right through carry flag
- The counter is incremented
- If the carry flag (the right-most bit of accumulator) is set, the final result is obtained
- If the carry flag is reset (CY=0), iteration is continued for the next bit
Program –
Starting Address of Program -> 3000H
MEMORY ADDRESS |
MNEMONICS |
COMMENT |
3000 |
LXI SP, 5000H |
Initialize Stack Pointer |
3003 |
MVI C, 00H |
C <- 00H |
3005 |
RAR |
Rotate accumulator right through Carry |
3006 |
INR C |
C <- C+1 |
3007 |
JNC 3005H |
Jump to location 3005H if CY=0 |
300A |
HLT |
Halt Execution |
Explanation –
- LXI SP, 5000H is used to initialize the stack pointer at a higher location such that it doesn’t coincide with the program counter
- MVI C, 00H stores the value of counter that will store the final result at end of execution
- RAR rotates the accumulator to right through Carry flag such that after the instruction Carry flag contains the right-most bit of accumulator
- INR C Increments the counter
- JNC 3005H jump to location 3005H if Carry flag is not set, that is the right-most bit of accumulator is 0. It doesn’t execute if the Carry flag is set
- HLT halts the execution of program flow
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...