Assembly Language Programming in 8085
PROGRAMS
Steps to write a program:-
- Type the starting memory address using keyboard, in this 8085kit address belongs to C000 to FFFF. We can use any memory address between them. Ex: A C000 here A stands for assemble the program.
- After that counting type the to the end.
- Whenever label is given type their corresponding memory address where we want to jump our program.
- When complete program is typed then enter key is pressed two times to execute the program.
Steps to execute a program:-
- Type G< starting address>, then press enter key, after that space key.
- Type R, then press enter key. Which given the content of registers.
- When memory address is given in program following step are performed.
B. After that step 1 is performed.
C. Type D<memory address>, then press enter key. Here memory address is the address where answer is stored which is already mention program.
Program No. 1
· Write a program for addition of two binary numbers stored in any two register.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 06 | MVI B,06H | //initialize register B// | ||
C001 | 06 | ||||
C002 | 16 | MVI D,02H | //initialize register D// | ||
C003 | 02 | ||||
C004 | 78 | MOV A,B | //Copy the content of register B in Accumulator// | ||
C005 | 82 | ADD D | //Add the content of register D with the content of Accumulator// | ||
C006 | CF | RST 1 | //terminate program execution// |
· Input:- B=06 & D=02
· Output:-
A=08, B=06, C=00, D=02, E=04, F=00, I=0F, H=08, L=00, M=0850, S=FFEB, P=C007
Program No. 2
· Write a program for subtraction of two binary numbers stored in any two register.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 06 | MVI B,06H | //initialize register B// | ||
C001 | 06 | ||||
C002 | 16 | MVI D,02H | //initialize register D// | ||
C003 | 02 | ||||
C004 | 78 | MOV A,B | //Copy the content of register B in Accumulator// | ||
C005 | 92 | SUB D | //Subtract the content of register D with the content of Accumulator// | ||
C006 | CF | RST 1 | //terminate program execution// |
· Input:- B=06 & D=02
· Output:-
A=04, B=06, C=00, D=02, E=00, F=10, I=0F, H=08, L=00, M=D800, S=FFEB, P=C007
Program No. 3
Write a program for a group of data is residing at C050 H memory location to transfer in reverse order at memory location starting from D050 H.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 21 | LXI H,C050 H | //initialize HL pair register// | ||
C001 | 50 | ||||
C002 | C0 | ||||
C003 | 01 | LXI B,D054 H | //initialize HL pair register// | ||
C004 | 54 | ||||
C005 | D0 | ||||
C006 | 16 | MVI D,05 H | //Load 05 in D register// | ||
C007 | 05 | ||||
LOOP | C008 | 7E | MOV A,M | //Copy the content of HL pair in Accumulator// | |
C009 | 02 | STAX B | //save in register pair BC// | ||
C00A | 23 | INX H | //increment in HL pair// | ||
C00B | 0B | DCX B | //Decrement in BC pair// | ||
C00C | 15 | DCR D | //Decrement in D// | ||
C00D | C2 | JNZ LOOP (C008) | //Jump to the loop// | ||
C00E | 08 | ||||
C00F | C0 | ||||
C010 | CF | RST 1 | //terminate program execution// |
· Input:- E_C050 [C050-1,51-2,52-3,53-4,54-5]
· Output:-D_D054 [D054-5,53-4,52-3,51-2,50-1]
A=01 BD0 C=53 D05 E=00 F=SS I=0F H=C0 L=51 M=05 S=FFFB P=C010
Program No. 4
Write a program to sort given 10 numbers from memory location C050 H in the ascending order.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 06 | MVI B,09 H | //Initialize counter// | ||
C001 | 09 | ||||
START | C002 | 21 | LXI H,C050 H | //Initialize memory pointer// | |
C003 | 50 | ||||
C004 | C0 | ||||
C005 | 0E | MVI C,09 H | //initialize counter// | ||
C006 | 09 | ||||
BACK | C007 | 7E | MOV A,M | //get the number// | |
C008 | 23 | INX H | //increment memory pointer// | ||
C009 | BE | CMP M | //compare number with next number// | ||
C00A | DA | JC SKIP (C015) | //if less, don’t interchange// | ||
C00B | 15 | ||||
C00C | C0 | ||||
C00D | CA | JZ SKIP (C015) | //if equal, don’t interchange// | ||
C00E | 15 | ||||
C00F | C0 | ||||
C010 | 56 | MOV D,M | //move the content of memory into D// | ||
C011 | 77 | MOV M,A | //move the content of Accumulator into memory// | ||
C012 | 2B | DCX H | //decrement in HL pair// | ||
C013 | 72 | MOV M,D | //move the content of D into memory// | ||
C014 | 23 | INX H | //increment in HL pair// | ||
SKIP | C015 | 0D | DCR C | //Decrement in C// | |
C016 | C2 | JNZ BACK (C007) | //If not zero, repeat// | ||
C017 | 07 | ||||
C018 | C0 | ||||
C019 | 05 | DCR B | //Decrement in B// | ||
C01A | C2 | JNZ START (C002) | //If not zero, repeat// | ||
C01B | 02 | ||||
C01C | C0 | ||||
C01D | CF | RST1 | //terminate program execution// |
· Input:- E_C050 [C050-9,51-8,52-7,53-6,54-5,55-4,56-3,57-2,58-1,59-0]
· Output:- D_C050 [C050-0,51-1,52-2,53-3,54-4,55-5,56-6,57-7,58-8,59-9]
A=08 B=00 C=00 D=00 E=00 F=55 I=0F H=C059 M=C059 S=FFEB P=C01E
Program No. 5
Write a program to multiply the 8-bit unsigned number in memory location C050 H by the 8-bit unsigned number in memory location C051 H. Store the 8 least significant bits of the result in memory location C300H and the 8 most significant bits in memory location C301 H.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | LXI H, C050 H | // initialize the memory pointer// | |||
C001 | |||||
C002 | |||||
C003 | MOV E,M | // get multiplicand// | |||
C004 | MVI D,00 H | // initialize register D by 00// | |||
C005 | |||||
C006 | INX H | //increment memory pointer// | |||
C007 | MOV A,M | // get multiplier// | |||
C008 | LXI H,0000 | // product=0// | |||
C009 | |||||
C00A | |||||
C00B | MVI B,08 H | //initialize counter with count 8// | |||
C00C | |||||
MULT: | C00D | DAD H | // add the content of register pair HL with accumulator// | ||
C00E | RAL | // rotate accumulator left with carry// | |||
C00F | JNC SKIP | //jump if no carry// | |||
C010 | |||||
C011 | |||||
C012 | DAD D | // add the content of register pair DE with accumulator// | |||
SKIP | C013 | DCR B | //decrement in register B// | ||
C014 | JNZ MULT | //jump on no zero// | |||
C015 | |||||
C016 | |||||
C017 | SHLD C300 | // store the result// | |||
C018 | |||||
C019 | |||||
C01A | RST 1 | //terminate program execution// |
· Input:-
· Output:-
Program No. 6
Write a program to convert a 2-digit BCD number stored at memory address C200 H into its binary equivalent number & store the result in a memory location C300 H.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 3A | LDA C200 H | //get BCD number// | ||
C001 | 00 | ||||
C002 | C2 | ||||
C003 | 47 | MOV B,A | //save it// | ||
C004 | E6 | ANI OF H | //mask most significant four bits// | ||
C005 | 0F | ||||
C006 | 4F | MOV C,A | //save unpacked BCD in C register// | ||
C007 | 78 | MOV A,B | //get BCD again// | ||
C008 | E6 | ANI FO H | //mask least significant four bit// | ||
C009 | F0 | ||||
C00A | 0F | RRC | //convert most significant four bits into unpacked BCD2// | ||
C00B | 0F | RRC | -“”- | ||
C00C | 0F | RRC | -“”- | ||
C00D | 0F | RRC | -“”- | ||
C00E | 47 | MOV B,A | //save unpacked BCD2 in B register// | ||
C00F | AF | XRA A | //clear accumulator (sum=0)// | ||
C010 | 16 | MVI D,0A H | //set D as a multiplier of 10// | ||
C011 | 0A | ||||
SUM | C012 | 82 | ADD D | //add 10 unit (B)=0// | |
C013 | 05 | DCR E | //decrement BCD2 by one// | ||
C014 | C2 | JNZ SUM | //is multiplication complete? If not, go back and add again// | ||
C015 | 12 | ||||
C016 | C0 | ||||
C017 | 84 | ADD C | //add BCD1// | ||
C018 | 32 | STA C300 H | // store the result// | ||
C019 | 00 | ||||
C01A | C3 | ||||
C01B | CF | RST 1 | //terminate program execution// |
· Input:- E_C050-13
· Output:- D_C050 [C050-0D, 02, 03.....]
A=0F B=00 C=05 D=0A E=00 F=04 I=0F H=C0 L=59 M=C059 S=FFEB P=C01C
Program -07
Write a main Program and a conversion subroutine to convert the binary number stored at D000H into its equivalent BCD number. Store the result from memory location D100H.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | LXI SP,C7FF H | //Initialize stack pointer// | |||
C001 | |||||
C002 | |||||
C003 | LDA D000 H | //get the binary number in accumulator// | |||
C004 | |||||
C005 | |||||
C006 | CALL Subroutine (C00A) | //call subroutine// | |||
C007 | |||||
C008 | |||||
C009 | RST 1 | //terminate program execution// | |||
Subroutine to convert binary number into its equivalent BCD number. | |||||
C00A | PUSH B | //save BC register pair content// | |||
C00B | PUSH D | //save DE register pair content// | |||
C00C | MVI B, 64 | //load divisor decimal 100 in B register// | |||
C00D | |||||
C00E | MVI C,0A | //load divisor decimal 10 in C register// | |||
C00F | |||||
C010 | MVI D,00 | //initialize digit 1// | |||
C011 | |||||
C012 | MVI E,00 | //initialize digit 2// | |||
C013 | |||||
STEP1 | C014 | CMP B | //check if number <decimal 100// | ||
C015 | JC STEP2 (C01D) | //if yes go to step 2// | |||
C016 | |||||
C017 | |||||
C018 | SUB B | //subtract decimal 100// | |||
C019 | INR E | //increment register E by 1// | |||
C01A | JMP STEP1 (C014) | // go to step 1// | |||
C01B | |||||
C01C | |||||
STEP2 | C01D | CMP C | //check if number < decimal 10// | ||
C01E | JC STEP3 (C026) | //if yes go to step 3// | |||
C01F | |||||
C020 | |||||
C021 | SUB C | //subtract decimal 10// | |||
C022 | INR D | //increment register by 1// | |||
C023 | JMP STEP2 (C01D) | //go to step 2// | |||
C024 | |||||
C025 | |||||
STEP3 | C026 | STA D100 H | //store digit 0// | ||
C027 | |||||
C028 | |||||
C029 | MOV A,M | //get digit 1// | |||
C02A | STA D101 H | //store digit 1// | |||
C02B | |||||
C02C | |||||
C02D | MOV A,E | //get digit 2// | |||
C02E | STA D102 H | //store digit 2// | |||
C02F | |||||
C030 | |||||
C031 | POP D | //restore DE register pair// | |||
C032 | POP B | //restore BC register pair// | |||
C033 | RST 1 | //terminate program execution// |
· Input:-
· Output:-
Program No. -08
Write a program to convert the ASCII number in memory to equivalent decimal.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | LXI H,C050H | //point to data// | |||
C001 | |||||
C002 | |||||
C003 | MOV A,M | //get operand// | |||
C004 | SUI 30H | //convert to decimal// | |||
C005 | |||||
C006 | CPI 0AH | //check whether it is valid decimal number// | |||
C007 | |||||
C008 | JC LOOP (C00D) | //yes, store result// | |||
C009 | |||||
C00A | |||||
C00B | MVI A,FFH | //no, make result=FF H// | |||
C00C | |||||
LOOP: | C00D | INX H | //increment in register pair HL// | ||
C00E | MOV M,A | //move content of accumulator into memory// | |||
C00F | RST 1 | //terminate program execution// |
· Input:-
· Output:-
Program No. 9
Two ten bytes are residing at location starting from C050 & D050 respectively. Write a program to add them up & store the result starting from C090.
Program:-
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 21 | LXI H,C050 H | //initialize memory pointer one// | ||
C001 | 50 | ||||
C002 | C0 | ||||
C003 | 01 | LXI B,D050 H | //initialize memory pointer two// | ||
C004 | 50 | ||||
C005 | D0 | ||||
C006 | 11 | LXI D,C090 H | //initialize result pointer// | ||
C007 | 90 | ||||
C008 | C0 | ||||
BACK: | C009 | 0A | LDAX B | //get the number from array two// | |
C00A | 86 | ADD M | //add it eight number in array one// | ||
C00B | 12 | STAX D | //store the addition in array three// | ||
C00C | 23 | INX H | //increment pointer one// | ||
C00D | 03 | INX B | //increment pointer two// | ||
C00E | 13 | INX D | //increment result pointer// | ||
C00F | 7D | MOV A,L | //move the content of L in accumulator// | ||
C010 | FE | CPI 0AH | //check pointer one for last number// | ||
C011 | 0A | ||||
C012 | C2 | JNZ BACK (C009) | //if not repeat step four// | ||
C013 | 09 | ||||
C014 | C0 | ||||
C015 | CF | RST 1 | //terminate program execution// |
· Input:- E_C050 [C050-1,51-2,52-3,53-4,54-5,55-6,56-7,57-8,58-9,59-A]
· Output:- D_D050 [D050-A,51-9,52-8,53-7,54-6,55-5,56-4,57-3,58-2,59-1]
A=0A B=D C=0A D=C E=4A F=54 I=0F H=C1 L=0A M=C10A S=FFEB P=C016
Program No. 10
Write a program for a block of 16 signed binary numbers is residing at location starting from C050 add them up & store the result in D050.
Program:
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | 21 | LXI H,C050 H | //initialize the pointer// | ||
C001 | 50 | ||||
C002 | C0 | ||||
C003 | 01 | LXI B,D050 H | //initialize second pointer// | ||
C004 | 50 | ||||
C005 | D0 | ||||
C006 | 16 | MVI D,10 H | //Initialize the counter// | ||
CO07 | 10 | ||||
C008 | 7E | MOV A,M | //loading the number in accumulator// | ||
LOOP | C009 | 23 | INX H | //incrementing the pointer// | |
C00A | 86 | ADD M | //adding the binary number to the last number// | ||
C00B | 15 | DCR D | //decrementing the counter// | ||
C00C | C2 | JNZ LOOP (C009) | //if not zero jump to loop// | ||
C00D | 09 | ||||
C00E | C0 | ||||
C00F | 02 | STAX B | //saving the addition to a new memory location// | ||
C010 | CF | RST 1 | //terminate program execution// |
· Input:- E C050- 1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10
· Output:-
A=89 B=D0 C=50 D=00 E=00 F=54 I=0F H=C0 L=60 M=C060 S=FFEB P=C011
Program No. 11
Write a program to calculate the sum of series of number. The length of the series is in memory location C050 & the series begins from memory location C090.
Program:
Label | Address | Hex Code | Nemonics | Comment’s | Remarks |
C000 | LDA C050 H | //load accumulator with number// | |||
C001 | 50 | ||||
C002 | C0 | ||||
C003 | MOV C,A | //initialize counter// | |||
C004 | LXI H,C050 H | //Initialize pointer// | |||
C005 | 50 | ||||
C006 | C0 | ||||
C007 | SUB A | //sum low=0// | |||
C008 | MOV B,A | //sum high=0// | |||
BACK: | C009 | ADD M | //sum=sum + data// | ||
C00A | JNC SKIP (C00E) | //jump on no carry// | |||
C00B | |||||
C00C | |||||
C00D | INR B | //increment in B// | |||
SKIP | C00E | INX H | //increment pointer // | ||
C00F | DCR C | //decrement counter// | |||
C010 | JNZ BACK (C009) | //check if counter zero repeat// | |||
C011 | |||||
C012 | |||||
C013 | STA C300 H | //store lower byte// | |||
C014 | 00 | ||||
C015 | C3 | ||||
‘ | C016 | MOV A,B | //move counting of register B into accumulator// | ||
C017 | STA D050 H | //store higher byte// | |||
C018 | |||||
C019 | |||||
C01A | RST 1 | //terminate program execution// |
· Input:-
· Output:-
REFERENCES
- R. S. Gaonkar, Microprocessor Architecture, Programming, and Applications with the 8085, Fifth Edition, Penram International Publishing (India) Private Limited.
- S Ghoshal, Microprocessor Based System Design, Macmillan India Limited, 1996
- M. Mano, Digital Logic and Computer Design, Prentice – Hall India
- B. Ram - Fundamentals of Microprocessor and Microcontrollers
- “Microprocessors: Principles and Applications” by A Pal
- “Microprocessors and Microcontrollers : Architecture, Programming and Interfacing Using 8085, 8086 and 8051” by Soumitra Kumar Mandal
- “Introduction to Microprocessors and Microcontrollers” by Crisp John Crisp
- “Microprocessors And Microcontrollers” by A Nagoor Kani
- “Microprocessors And Microcontrollers : Architecture, Programming and System Design 8085, 8086, 8051, 8096” by KRISHNA KANT
- “8 - Bit Microprocessor” by Vibhute
Comments
Post a Comment