Problem – Write an assembly language program for determining if a given number is prime or not using 8085 microprocessor.
If the number is prime, store 01H at the memory location which stores the result, else 00H.
Examples:
Input : 03H Output : 01H The number 3 only has two divisors, 1 and 3. Hence, it is prime. Input : 09H Output : 00H The number 9 has three divisors, 1, 3 and 9. Hence, it is composite.
A prime number is the one which has only two divisors, 1 and the number itself.
A composite number, on the other hand, has 3 or more divisors.
Algorithm:
- Take n as input
- Run a loop from i = n to 1. For each iteration, check if i divides n completely or not. If it does, then i is n’s divisor
- Keep a count of the total number of divisors of n
- If the count of divisors is 2, then the number is prime, else composite
How to find out if i is a divisor or not?
Keep subtracting i from the dividend till the dividend either becomes 0 or less than 0. Now, check the value of dividend. If it’s 0, then i is a divisor, otherwise it’s not.
Steps:
- Load the data from the memory location (2029H, arbitrary choice) into the accumulator
- Initialize register C with 00H. This stores the number of divisors of n
- Move the value in the accumulator in E. This will act as an iterator for the loop from n to 1.
- Move the value in the accumulator in B. B permanently stores n because the value in the accumulator will change
- Move the value in E to D and perform division with the accumulator as the dividend and D as the divisor.
- Division: Keep subtracting D from A till the value in A either becomes 0 or less than 0. After this, check the value in the accumulator. If it’s equal to 0, then increment the count of divisors by incrementing the value in C by one
- Restore the value of the accumulator by moving the value in B to A and continue with the loop till E becomes 0
- Now, move the number of divisors from C to A and check if it’s equal to 2 or not. If it is, then store 01H to 202AH (arbitrary), else store 00H.
202AH contains the result.
ADDRESS | LABEL | MNEMONIC |
---|---|---|
2000H | LDA 2029H | |
2001H | ||
2002H | ||
2003H | MVI C, 00H | |
2004H | ||
2005H | MOV E, A | |
2006H | MOV B, A | |
2007H | LOOP1 | MOV D, E |
2008H | LOOP2 | CMP D |
2009H | JC DIVIDENDLESSTHAN0 | |
200AH | ||
200BH | ||
200CH | SUB D | |
200DH | JNZ LOOP2 | |
200EH | ||
200FH | ||
2010H | DIVIDENDLESSTHAN0 | CPI 00H |
2011H | ||
2012H | JNZ NOTADIVISOR | |
2013H | ||
2014H | ||
2015H | INR C | |
2016H | NOTADIVISOR | MOV A, B |
2017H | DCR E | |
2018H | JNZ LOOP1 | |
2019H | ||
201AH | ||
201BH | MOV A, C | |
201CH | MVI C, 00H | |
201DH | ||
201EH | CPI 02H | |
201FH | ||
2020H | JNZ COMPOSITE | |
2021H | ||
2022H | ||
2023H | INR C | |
2024H | COMPOSITE | MOV A, C |
2025H | STA 202AH | |
2026H | ||
2027H | ||
2028H | HLT |
Store the value of n in 2029H. If 202AH contains 01H, then n is prime, else composite.