Programa 8085 para copiar un bloque de origen a un bloque de destino con direcciones de memoria superpuestas

La tarea es copiar los datos de algún bloque de origen a algún bloque de destino dado que el bloque de destino tiene una dirección de memoria superpuesta con el bloque de origen. Los datos no se pueden mover simplemente del bloque de origen al bloque de destino porque el bloque de destino tiene una dirección de memoria superpuesta, podría provocar la anulación de los datos y los datos originales se pueden perder sin copiarlos en su posición de destino.

Before copying data, the state of the source block and destination block

Antes de copiar datos, el estado del bloque de origen y el bloque de destino

After copying the state of the destination block and source block is shown

Después de copiar el estado del bloque de destino y el bloque de origen se muestra

Solución:

El objetivo detrás de la solución es copiar los datos del bloque de origen a alguna otra ubicación temporal y luego copiar los datos desde allí al bloque de destino. Por lo tanto, al hacer esto, los problemas de superposición se pueden manejar fácilmente. Como ubicación temporal, se puede usar un puntero de pila. Primero, los datos del bloque de origen se insertan en la pila, luego todos los datos se extraen de la pila y se guardan en el bloque de memoria de destino.

Algoritmo:

  1. Cargue el par HL con la ubicación del bloque fuente e inicialice el puntero de la pila.
  2.  Mueva la longitud del bloque fuente en el registro C y guarde su copia en el registro B para su uso posterior.
  3. Incremente el par HL para apuntar al primer elemento del bloque de origen.
  4. [GUARDAR] Empuje el elemento del bloque fuente apuntado por el par HL en la parte superior de la pila.
  5. Decrementar registro C
  6. Repita [GUARDAR] hasta que el registro C sea distinto de cero. En otras palabras, esto empujará todos los elementos del bloque de origen en la pila uno por uno.
  7. Restaure la longitud del bloque fuente del registro B al registro C.
  8. Cargue el par HL con la dirección del bloque de destino.
  9. [COPY] extrae el elemento de la pila en el par de registros DE.
  10. Mueva el registro E a la dirección de destino señalada por el par HL. En otras palabras, copie el elemento al bloque de destino.
  11. Registro de decrementos C.
  12. Incremente el par HL para apuntar a la siguiente dirección en el bloque de destino
  13. Repita [COPY] hasta que el registro C sea distinto de cero. En otras palabras, mueva todos los elementos del bloque de origen al bloque de destino.
  14. Detener el programa.

Programa de montaje 8085

// 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

Explicación:

INSTRUCCIONES EXPLICACIÓN DE INSTRUCCIONES
# EMPIEZA 0000H El programa comienza en la dirección 0000H
LXI H, C000H Cargue el par HL con la dirección del bloque de origen
LXI SP, B000H Inicializar puntero de pila
MOV B,M guardar la longitud del bloque fuente en el registro B
MOV C,M guardar la longitud del bloque fuente en el registro C
INXH Incremente el par HL para apuntar al primer elemento del bloque de origen

AHORRAR:  

MVI D,00H

Empuje todos los elementos del bloque fuente a la pila

Mover 00H a D, para borrar el registro D

MOVER E,M Mover el contenido apuntado por el par HL al registro E
EMPUJAR D Inserte el contenido del par de registros DE en la pila
DCR C Decrementar registro C
INXH Incrementar par HL
AHORRAR JNZ Saltar a GUARDAR si el indicador cero no está configurado
MOV C,B Restaurar la longitud del bloque fuente en el registro C desde el registro B
MOV D,M Guardar la dirección de destino en el par de registros DE
INXH Incrementar par HL
MOVER E, M Mover el contenido apuntado por el par HL al registro E
MOV A, E Para realizar una copia estable (es decir, no cambiar el orden de los elementos, realice una copia desde una ubicación hacia atrás. Por lo tanto, simplemente agregue la longitud del bloque y copie los elementos uno por uno y siga disminuyendo después de copiar cada elemento.
AÑADIR C Agregue el contenido de C al acumulador
DCR A Disminución del contenido del acumulador
MUEVE UN Mover el contenido del acumulador al registro E
XCHG intercambiar el contenido del par HL con el par de registros DE
COPIA:
POP D
Copie los elementos de la pila a la ubicación de destino uno por uno Coloque un elemento a la vez en el par de registros DE y guárdelo en la ubicación de destino que apunta actualmente el par HL
 
MOV M,E Mover elemento del par de registros DE a la ubicación de destino
DCR C Decrementa el contador.
 DCXH Actualice el par HL a la siguiente ubicación libre en el bloque de destino para copiar otro elemento (si queda alguno)
COPIA JNZ Saltar a COPIAR si el indicador cero no está establecido.
HLT Detener el programa.

Publicación traducida automáticamente

Artículo escrito por ayaankhan98 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *