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.
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:
- Cargue el par HL con la ubicación del bloque fuente e inicialice el puntero de la pila.
- Mueva la longitud del bloque fuente en el registro C y guarde su copia en el registro B para su uso posterior.
- Incremente el par HL para apuntar al primer elemento del bloque de origen.
- [GUARDAR] Empuje el elemento del bloque fuente apuntado por el par HL en la parte superior de la pila.
- Decrementar registro C
- 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.
- Restaure la longitud del bloque fuente del registro B al registro C.
- Cargue el par HL con la dirección del bloque de destino.
- [COPY] extrae el elemento de la pila en el par de registros DE.
- 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.
- Registro de decrementos C.
- Incremente el par HL para apuntar a la siguiente dirección en el bloque de destino
- 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.
- 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