8085 Program to Copy a Source Block to Destination Block with Overlapping Memory Address
The task is to copy the data from some source block to some destination block given that the destination block has an overlapping memory address with the source block. Data cannot just simply be moved from source block to destination block because the destination block is having an overlapping memory address, it could lead to overriding of data and original data can be lost without copying to its destination position.
The objective behind the solution is to copy the data from the source block to some other temporary location and then copy the data from there to the destination block. Therefore, by doing this overlapping problems can be handled easily. As a temporary location, a stack pointer can be used. First, the data from the source block is pushed onto the stack then all the data is popped out of the stack and saved to the destination memory block.
- Load HL pair with the source block location and initialize stack pointer.
- Move the length of the Source block in register C and save its copy in register B for further use.
- Increment HL pair to point to the first element of the source block.
- [SAVE] Push element of source block pointed by HL pair on top of the stack.
- Decrement register C
- Repeat [SAVE] until register C is non-zero. In, other words this will push all elements of the source block on the stack one by one.
- Restore the length of the source block from register B to register C.
- Load HL pair with destination block address.
- [COPY] pop the element from the stack into the DE register pair.
- Move register E into destination address pointed by HL pair. In other words, copy the element to the destination block.
- Decrement register C.
- Increment HL pair to point to next address in destination block
- Repeat [COPY] until register C is non-zero. In other words, move all elements from the source block to the destination block.
- Stop the program.
8085 Assembly Program
// Program begins at address 0000H # BEGIN 0000H // Load HL pair with source block address LXI H,C000H // Initialize stack pointer LXI SP,B000H // save the length of source block in register B and C MOV B,M MOV C,M // Increment HL pair to point to first element of source block INX H // Push all elements from source block onto stack SAVE: MVI D,00H MOV E,M PUSH D DCR C INX H JNZ SAVE // Restore the length of source block in register C from register B MOV C,B // Save destination address in DE register pair MOV D,M INX H MOV E,M // To perform stable copy (that is to do not change the order of // elements, perform copy from backward location. So, just add // the length of block and copy element one by one and keep // decrementing after copying each element. MOV A,E ADD C DCR A MOV E,A // exchange the content of HL pair with DE register pair XCHG // Copy elements from stack to destination location one by one // Pop one element at a time in DE register pair and save it // into the destination location which is currently pointed // by the HL pair COPY: POP D // Move element from DE register pair to destination location MOV M,E // decrement the counter DCR C // update HL pair to next free location in destination block // to copy another element (if any remaining) DCX H JNZ COPY // Stop the program HLT
|INSTRUCTIONS||EXPLANATION OF INSTRUCTIONS|
|# BEGIN 0000H||The program begins at address 0000H|
|LXI H, C000H||Load HL pair with the source block address|
|LXI SP, B000H||Initialize stack pointer|
|MOV B,M||save the length of the source block in register B|
|MOV C,M||save the length of the source block in register C|
|INX H||Increment HL pair to point to the first element of the source block|
Push all elements from the source block onto the stack
Move 00H to D, to clear register D
|MOV E,M||Move content pointed by HL pair into register E|
|PUSH D||Push content of DE register pair onto the stack|
|DCR C||Decrement register C|
|INX H||Increment HL pair|
|JNZ SAVE||Jump to SAVE if the zero flag is not set|
|MOV C,B||Restore the length of the source block in register C from register B|
|MOV D,M||Save destination address in DE register pair|
|INX H||Increment HL pair|
|MOV E, M||Move content pointed by HL pair into register E|
|MOV A, E||To perform stable copy (that is to do not change the order of elements, perform copy from backward location. So, just add the length of the block and copy elements one by one and keep decrementing after copying each element.|
|ADD C||Add the content of C to the accumulator|
|DCR A||Decrement content of accumulator|
|MOV E, A||Move content of accumulator to register E|
|XCHG||exchange the content of HL pair with DE register pair|
|Copy elements from stack to destination location one by one Pop one element at a time in DE register pair and save it into the destination location which is currently pointed by the HL pair
|MOV M,E||Move element from DE register pair to the destination location|
|DCR C||Decrement the counter.|
|DCX H||Update HL pair to the next free location in the destination block to copy another element (if any remaining)|
|JNZ COPY||Jump to COPY if the zero flag is not set.|
|HLT||Stop the program.|