The complete set of instructions supported by a microprocessor is called its Instruction Set. Intel’s 8085 has 246 instructions. A binary value denotes each instruction of the 8085. These 8-bit binary values are called Op-Codes or Instruction Bytes.
The opcode is the first part of an instruction that specifies the operation that is to be performed. Whereas, the operand is the second (or third) part of the instruction on which the operation is performed. You’ll understand this more clearly as we progress through the instruction set.
The 246 instructions of the 8085 are classified into various categories. We’ll take a look at all these categories in this 8085 course. In this post, we’ll start with the data transfer instructions.
Contents
Data Transfer Instructions
These instructions are used to move data between the registers, or between memory and the registers. These instructions perform a simple task – to copy data from a source to a destination. While copying the contents stored in the source are not altered. They are also referred to as copy instructions.
Let’s start with a summary of all the instructions that are used to copy data from one place to another inside the 8085 microprocessor.
In this table, R -> register; M -> Memory (HL register pair); data -> direct data; rp -> any of the three register pairs; A -> Accumulator; SP-> Stack pointer
Operation | Instruction | Description |
Register to register
|
MOV R1,R2 | [R1] <- [R2] |
XCHG | [HL] <-> [DE] | |
Register to memory
|
MOV M,R | [[HL]] <- [R] |
STA address | [address] <- [A] | |
SHLD address |
[address] <- [L]
[address+1] <- [H]
|
|
STAX rp | [[rp]] <- [A] | |
Memory to register
|
MOV R,M | [R] <- [[HL]] |
LDA address | [A] <- [[address]] | |
LHLD address |
[L] <- [[address]]
[H] <- [[address+1]]
|
|
LDAX rp | [A] <- [[rp]] | |
Data to register
|
MVI R,data | [R] <- data |
LXI rp,data16 |
[rp] <- 16-bit data
8 MSBs in upper register 8 LSBs in lower register |
|
Data to memory | MVI M,data | [[HL]] <- data |
Stack operations
|
PUSH rp |
[[SP]-1] <- [rupper]
[[SP]-2] <- [rlower]
[SP] <- [SP]-2
|
PUSH PSW |
[[SP]-1] <- [A]
[[SP]-2] <- [PSW]
[SP] <- [SP]-2
|
|
POP rp |
[rlower] <- [[SP]]
[rupper] <- [[SP]+1]
[SP] <- [SP]+2
|
|
POP PSW | [PSW] <- [[SP]] [A] <- [[SP]+1] [SP] <- [SP]+2 | |
XTHL | [L] <-> [[SP]] [H] <-> [[SP]+1] | |
SPHL | [SP] <- [HL] | |
I/O data transfer
|
IN port address |
[A] <- [value at port]
|
OUT port address |
[A] -> [value at port]
|
Now, we’ll see these data transfer instructions in detail, one at a time.
MOV
The Opcode |
The Operands |
Description |
MOV |
R1, R2 | Copy between two registers |
R, M | Copy from register to the location pointed by the HL pair (M) [[HL]] <- [R] | |
M, R | Copy from the location pointed by the HL pair (M) to register |
The MOV instruction copies the contents of the source register/location pointed by the HL pair (M) into the destination register/memory location pointed by the HL pair (M). The contents of the source are not altered.
Size of instruction
1 byte
Addressing mode
MOV R1, R2 – Register; MOV M, R – Direct; MOV R, M – Register Indirect
Flags affected
None
Example
- MOV B, C
- MOV B, M
- MOV M, C
MVI
The Opcode | The Operands | Description |
MVI |
R, Data |
Move immediate 8-bit into a register [R] <- Data |
M, Data |
Move immediate 8-bit data into the memory location pointed by the HL pair (M) [[HL]] <- Data |
Here, an 8-bit immediate data is stored in the destination register or a memory location, which is pointed by the HL register pair.
Size of instruction
2 bytes
Addressing mode
Immediate
Flags affected
None
Example
- MVI A, 57H
- MVI M, 57H
LXI
The Opcode | The Operand | Description |
LXI |
rp, Data |
Load the register pair with an immediate value
[rp] <- 16-bit data
8 MSBs in the upper register 8 LSBs in the lower register |
This instruction loads a 16-bit immediate data in the memory location pointed by the HL pair (M).
Size of instruction
3 bytes
Addressing mode
Immediate
Flags affected
None
Example
- LXI H, 2034 H //here 20H is stored in register H, and 34H is stored in register L.
LDA
The Opcode |
The Operand |
Description |
LDA |
16-bit address |
Load Accumulator with contents stored at an address [A] <- [[address]] |
The contents from the address (addresses in 8085 are 16-bit) are copied to the accumulator register. The contents of the source location remain unaltered.
Size of instruction
3 bytes
Addressing mode
Direct
Flags affected
None
Example
- LDA 2034H //Contents stored at memory location 2034H are copied into the accumulator.
LDAX
The Opcode |
The Operand |
Description |
LDAX |
Either B/D Register Pair |
Load accumulator with data at the memory location pointed by the contents of the register pair. [A] <- [[rp]] |
The contents of the mentioned register pair point to a memory location. LDAX instruction copies the contents of that particular memory location into the accumulator register. Neither the contents of the register pair nor that of the memory location is altered.
Size of instruction
3 bytes
Addressing mode
Register Indirect
Flags affected
None
Example
- LDAX B
- LDAX D
LHLD
The Opcode |
The Operand |
Description |
LHLD |
16-bit address |
Load the H-L registers with contents location at memory locations given by the address value [L] <- [[address]] [H] <- [[address+1]] |
The LHLD instruction copies the contents of a specified memory location pointed out by a 16-bit address into register L. The contents of the next memory location are copied into register H.
Size of instruction
3 bytes
Addressing mode
LHLD Memory
Flags affected
None
Example
- LHLD 2100H
STA
The Opcode |
The Operand |
Description |
STA |
16-bit address value |
Store from the accumulator into a memory location [address] <- [A] |
The contents of the accumulator register are copied into a memory location, which is specified by the operand.
Size of instruction
3 bytes
Addressing mode
Direct
Flags affected
None
Example
- STA 1000H
STAX
The Opcode |
The Operand |
Description |
STAX |
Register pair |
Store contents of the accumulator into other register pair [[RP]] <- [A] |
The contents of the accumulator register are copied into the memory specified by the register pair in the operand.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- STAX B
- STAX D
SHLD
The Opcode |
The Operand |
Description |
SHLD |
16-bit address |
Stores from the H-L registers into the specified location [address] <- [L] [address+1] <- [H] |
The first 8-bit contents of the register L is stored into the memory location specified by the 16-bit address. The next 8-bit contents of the register H are stored into the subsequent memory location.
Size of instruction
3 bytes
Addressing mode
Direct
Flags affected
None
Example
- SHLD 1200H
XCHG
The Opcode |
The Operand |
Description |
XCHG |
None |
Exchange H-L with D-E [HL] <-> [DE] |
The contents of register pair H-L are exchanged with the contents of the register-pair D-E. The information stored in register H is exchanged with that of D; similarly, that in register L is exchanged with the contents of the register E.
Size of instruction
1 byte
Addressing mode
Implicit
Flags affected
None
Example
- XCHG
Stack Control Instructions
PUSH
The Opcode |
The Operand |
Description |
PUSH |
R |
Pushes onto stack [[SP]-1] <- [rupper]
[[SP]-2] <- [rlower]
[SP] <- [SP]-2
|
The PUSH command pushes the contents of the register onto the stack in 8085, which saves it as a temporary copy. You can read more about stacks and stack pointers in 8085 here.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- PUSH H
- PUSH B
PUSH PSW
The Opcode |
The Operand |
Description |
PUSH |
PSW |
Pushes PSW onto the stack [[SP]-1] <- [A] [[SP]-2] <- [PSW] [SP] <- [SP]-2 |
The PUSH PSW command pushes the contents of the PSW (Program status word or flag register) onto the stack in 8085, which saves it as a temporary copy.
The stack pointer is first decremented by one, and the contents of the accumulator are copied to that particular location. The stack pointer is again decremented by one, and the contents of the flag register (PSW) are copied to that location.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- PUSH PSW
POP
The Opcode |
The Operand |
Description |
POP |
R |
Pops from the stack [rlower] <- [[SP]] [rupper] <- [[SP]+1] [SP] <- [SP]+2 |
The POP command pops the contents stored onto the stack (where it might have been saved as a temporary copy) to a register.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- POP H
- POP B
POP PSW
The Opcode |
The Operand |
Description |
POP |
PSW |
Pops PSW from the stack [PSW] <- [[SP]] [A] <- [[SP]+1] [SP] <- [SP]+2 |
The data at the memory location pointed by the stack pointer are copied to the flag register. The stack pointer is incremented by one, and the contents of that location are copied to the accumulator. The stack pointer is again incremented by one.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- POP PSW
XTHL
The Opcode |
The Operand |
Description |
XTHL |
– |
Exchange the contents at the top of the stack with HL pair [L] <-> [[SP]] [H] <-> [[SP]+1] |
Contents of L register are exchanged with top of the stack. The stack pointer is incremented, and the contents of the next location of the stack are exchanged with H register. The contents of the stack pointer register are not altered.
Size of instruction
1 byte
Addressing mode
Indirect
Flags affected
None
Example
- XTHL
SPHL
The Opcode |
The Operand |
Description |
SPHL |
– |
Move contents of HL pair to SP register [SP] <- [HL] |
Contents of L register are exchanged with top of the stack. The stack pointer is incremented, and the contents of the next location of the stack are exchanged with H register. The contents of the stack pointer register are not altered.
Size of instruction
1 byte
Addressing mode
Register
Flags affected
None
Example
- SPHL
I/O Data Transfer Instructions
IN
The Opcode |
The Operand |
Description |
IN |
8-bit port address |
Input contents at port shifted to the accumulator
[A] <- [value at port] |
The current 8-bit contents available at the PORT# mentioned will be shifted to the Accumulator register.
Let us consider the PORT having 8 DIP switches connected. Let the states of these switches be ON-OFF-OFF-ON-ON-OFF-OFF-ON. Thus, after the execution of the IN PORT# command, the accumulator register’s contents will be updated to 1001 1001.
Size of instruction
2 bytes
Addressing mode
Direct
Flags affected
None
Example
- IN 15
OUT
The Opcode |
The Operand |
Description |
OUT |
8-bit port address |
Contents of the accumulator shifted to port [A] -> [value at port] |
The 8-bit value stored in the accumulator register gets copied on to the PORT#.
Let us consider the initial contents of the Accumulator register to be 0011 0011. An LED system consisting of 8 LEDs is connected with the 8-bit port. Thus, after the execution of the instruction OUT PORT#, the LEDs will have the ON-OFF states as displayed below.
Size of instruction
2 bytes
Addressing mode
Direct
Flags affected
None
Example
- OUT 35
Simulation using the Sim8085 Emulator
The example codes in this 8085 course have been executed in an online development environment called Sim8085. It is a simple environment that is really user-friendly for beginners. You can write codes for the Intel 8085 microprocessor, debug the assembly code, and then simulate the 8085 microprocessor. Check it out here.
Let us walk through the simulator and see how to use it and run our programs.
When you open the Sim8085 page, you will see the above image. Let us go through each of the functionalities of this page and begin with our programming!
- CODE EDITOR (1) – You can enter your ALP code here.
- PROGRAMMING BUTTONS(2) – Let us go through each of these buttons in detail.
A. Compile Button
This button is used for compiling and loading the compiled opcodes into the memory. The compiled output is then displayed in the editor.
B. Run Button
Once you have compiled your 8085 code, run the program by pressing this button.
C. Step Button
Want to know how the contents of the registers changes in each step? Click this button for the step-by-step analysis of the code.
D. Stop Button
You can stop the execution of the program by clicking this button.
E. Reset Button
Reset all the registers, memory locations’ contents, and flags by pressing this button.
- REGISTER VIEW AND EDITING(3) – Here, you can see the value of the registers, or also edit them. (SP and PC cannot be edited.)
- FLAGS VIEW AND EDITING(4) – You can see the contents of the Flags here. You can also set/unset them manually, as per your convenience.
- MEMORY LOCATION VIEW AND EDITING(5) -The memory location view displays the total 65536 (0xFFFF) memory cells which are available in 8085. You can also edit them by double-clicking on them.
- MEMORY VIEW STARTING ADDRESS(6) – Since there are so many locations to be viewed, this dropdown helps to set the range of values to see the memory view.
- RANGE CONTROL FOR THE MEMORY ADDRESS(7) – You can slide this to get a finer control on viewing the memory locations.
- ADDRESS FINDER(8) – Tired searching for one particular address? Enter it here and jump directly to the mentioned location!
Assembly Language Programming Using Data Transfer Instructions
We shall now see an Assembly Language Programme using these instructions and see how these instructions are put to use.
Consider the given problem statement. Let us write a program to move a block of 16-bit data stored from DF10H to DF1FH to a target location from DF70H to DF7FH
LXI H, DF10H LXI D, DF70H MVI B, 10H LOOP:MOV A, M STAX D INX H INX D DCR B JNZ LOOP HLT
Let us go through the step by step analysis of our program.
-
LXI H, DF10H
We first load the memory address DF10H into the register pair H-L.
-
LXI D, DF70H
We then load the memory address DF70H into the register pair D-E.
-
MVI B, 10H
Since we need to move 16 bits of data, we need to set a counter for 16 counts. Thus, we assign 10H (hex for 16) counts for register B.
-
LOOP : MOV A, M
We shall now move the first bit of data from the memory location DF10H to the accumulator register.
-
STAX D
The data copied to the accumulator is now copied to the register pair D-E, which in turn moves to the memory location DF70H.
-
INX H
Now that we have copied the value from the first memory location, we increment the pointer to the next location.
-
INX D
We do not want to overwrite on the same memory location, do we? So we increment the destination address by one value too.
-
DCR B
As we have finished moving one bit, we decrease the counter by one value.
-
JNZ LOOP
Until register B is not zero, we jump back to the label LOOP and repeat the steps until everything has been copied.
-
HLT
After completing the program, we put an end / halt the program by using the HLT instruction.
We can now see that our 16-bit data has been moved to the memory locations from DF70H to DF7FH.