INSTRUCCIONES DE CARGA

Las instrucciones de carga transfieren contenidos de memoria a registros, de registros a memoria y entre registros.

Se trata del grupo principal de instrucciones del microprocesador, y su necesidad queda justificada, ya que todas las operaciones aritméticas y lógicas se hacen sobre registros del microprocesador, o entre estos y posiciones de memoria y casi siempre será necesario almacenar los resultados sobre la memoria.

Por otra parte, gran número de instrucciones utilizan registros para direccionar posiciones de memoria, bien sea mediante direccionamiento absoluto o indexado.

El formato básico de estas instrucciones es:

LD DESTINO, ORIGEN

El código LD del inglés "LOAD" (carga), indica al microprocesador que debe cargar en el "DESTINO" el valor contenido en el "ORIGEN".

El "DESTINO" y el "ORIGEN", pueden ser tanto registros, como posiciones de memoria, utilizaremos "r" y "r'" para referirnos a los registros de 8 bits, afectados por la instrucción, y "dd" para referirnos a los de 16 bits (pares de registros).

Los valores de "r" y "r'" usados para el código de máquina en este grupo de instrucciones, son los siguientes:

r y r'
registro
111
A
000
B
001
C
010
D
011
E
100
H
101
L

Los valores de "dd" usados para el código de máquina en este grupo de instrucciones, son los siguientes:

dd
par de registros
00
BC
01
DE
10
HL
11
SP

Grupo de instrucciones de carga en registros
LD r,r'
OBJETO:
Carga el contenido del registro indicado por r' en el registro indicado por r.
CODIGO MAQUINA:
0 1 <--- r ---><--- r' --->
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
1
CICLOS DE RELOJ:
4

EJEMPLO:

LD A,B

El contenido de "A" no es significativo, ya que será destruido por la instrucción. Supongamos que el contenido de "B" es 43 en decimal, 2Bh en Hexa.

(B):
0 0 1 0 1 0 1 1
2Bh

Ejecutamos la instrucción: LD A,B que carga en el registro "A", el contenido del registro "B":

LD A,B:
0 1 1 1 1 0 0 0
78h

Después de la ejecución, el registro "A" contendrá el valor que contenía el registro "B", mientras que el contenido de este último no se habrá modificado.

Contenido de "A" después de la ejecución:

(A):
0 0 1 0 1 0 1 1
2Bh

Contenido de "B" después de la ejecución:

(B):
0 0 1 0 1 0 1 1
2Bh

Como vimos en un capítulo anterior, los registros cumplen, en código máquina, una función similar a la de las variables en Basic, de forma que esta instrucción sería similar a la instrucción: LET A=B del Basic.

LD r,n
OBJETO:
Carga en el registro indicado por "r" el valor numérico "n" de 8 bits y en el rango de 0 a 255.
CODIGO MAQUINA:
0 0 <--- r ---> 1 1 0
<-------- n -------->
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
7

EJEMPLO:

LD A,47

Esta instrucción carga el valor 47 decimal (2Fh Hexa) en el registro "A", el contenido anterior de este registro se pierde al ejecutarse la instrucción.

La mayoría de los ensambladores, permiten introducir los números, tanto en decimal como en Hexa. Concretamente, en el caso del GENS 3, esta instrucción se podría escribir también como:

LD A,#2F

El signo "#" delante del número, indica al ensamblador que se trata de un número hexadecimal.

Instrucción.

LD A,47:
0 0 1 1 1 1 1 0
0 0 1 0 1 1 1 1
3Eh
2Fh

Contenido de "A" después de la ejecución:

(A):
0 0 1 0 1 1 1 1
2Fh

El equivalente en Basic de esta instrucción sería: LET A=47

LD r,(HL)
OBJETO:
Carga en el registro indicado por "r", el contenido del octeto de memoria cuya dirección es el valor del par de registros HL.
CODIGO MAQUINA:
0 1 <--- r ---> 1 1 0
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
7

EJEMPLO:

LD B,(HL)

Esta instrucción carga en el registro "B", el contenido de la posición de memoria cuya dirección es el contenido del par de registros "HL". En este caso, estamos usando el modo de direccionamiento indirecto para especificar el "ORIGEN".

Supongamos que el registro "HL" contiene el valor 5F47h (24391), el registro "H" contendrá 5Fh (95) y el registro "L" contendrá 47h (71); observe que 95x256+71=24391.

La posición de memoria cuyo contenido vamos a cargar, será por tanto, la 5F47h. Supongamos que a su vez, esta posición de memoria contiene el número 55h (85). Veamos cómo se desarrollan los acontecimientos.

(H):
(L):
0 1 0 1 1 1 1 1
0 1 0 0 0 1 1 1
5Fh
47h

Contenido de la posición de memoria 5F47h:

(5F47h):
0 1 0 1 0 1 0 1
55h

Ejecutamos la instrucción:

LD B,(HL):
0 1 0 0 0 1 1 0
46h

Tras la instrucción, sólo se habrá modificado el contenido del registro "B".

Contenido del registro "B" después de la instrucción:

(B):
0 1 0 1 0 1 0 1
55h
LD r,(IX+d)
OBJETO:
Carga en el registro indicado por "r", el contenido de la posición de memoria que resulta de sumar: el valor del registro índice "IX" con un entero de desplazamiento "d", el cual puede adquirir los valores desde -128 a +127.
CODIGO MAQUINA:
1 1 0 1 1 1 0 1
0 1 <--- r ---> 1 1 0
<-------- d -------->
DDh
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD C,(IX+10)

En este caso, vamos a cargar el registro "C" con el contenido de la posición de memoria, cuya dirección es el resultado de sumar 10 al contenido del registro índice "IX".

Esta instrucción utiliza direccionamiento indexado para especificar el "ORIGEN"; obsérvese que el direccionamiento indexado es similar al indirecto, pero más sofisticado.

El contenido del registro "C" es irrelevante, ya que será destruido por la instrucción. Supongamos que el contenido de "IX" es 7743h (30531), por lo que accederemos a la posición de memoria 774Dh (30541). Supongamos también, que el contenido de esa posición de memoria es 41h (65).

Contenido de "IX":

(IX):
0 1 1 1 0 1 1 1
0 1 0 0 0 0 1 1
77h
43h

Contenido de la posición de memoria 774Dh:

(774Dh):
0 1 0 0 0 0 0 1
41h

Ejecutamos la instrucción:

LD C,(IX+10):
1 1 0 1 1 1 0 1
0 1 0 0 1 1 1 0
0 0 0 0 1 0 1 0
DDh
4Eh
0Ah

Contenido de "C" después de la ejecución:

(C):
0 1 0 0 0 0 0 1
41h

Observe que la posición de memoria leída es 7743h+10, es decir 7743h+Ah=774Dh. Tanto el contenido de esta posición de memoria, como el del registro "IX", no han sido alterados.

LD r,(IY+d)
OBJETO:
Carga en el registro indicado por "r", el contenido de la posición de memoria que resulta de sumar: el valor del registro índice "IY" con el entero de desplazamiento "d", el cual puede tomar los valores desde -128 a +127.
CODIGO MAQUINA:
1 1 1 1 1 1 0 1
0 1 <--- r ---> 1 1 0
<-------- d -------->
FDh
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD A,(IY-15)

De forma similar al ejemplo anterior, vamos a cargar el acumulador con el contenido de la posición de memoria direccionada por el índice "IY" menos 15.

Supongamos que el contenido de "IY" es 7743h (30531), direccionamos, por tanto la posición de memoria 7734h (30516), a la que a su vez, le suponemos un contenido de 42h (66).

(IY):
0 1 1 1 0 1 1 1
0 1 0 0 0 0 1 1
77h
43h

Contenido de la posición de memoria 7734h:

(7734h):
0 1 0 0 0 0 1 0
42h

Ejecutamos la instrucción:

LD A,(IY-15):
1 1 1 1 1 1 0 1
0 1 1 1 1 1 1 0
1 1 1 1 0 0 0 1
FDh
7Eh
F1h

Contenido de "A" después de la ejecución:

(A):
0 1 0 0 0 0 1 0
42h

Obsérvese que hemos representado -15 como F1h, que es precisamente el complemento a 2 de 0Fh, es decir, el negativo de 15.

En el Z-80, el primer byte del código de operación de todas las intrucciones que utilizan el registro "IX" es DDh, y el de todas las que utilizan el "IY" es FDh.

Grupo de instrucciones de carga en memoria
LD (HL),r
OBJETO:
Carga el contenido del registro indicado por "r", en el octeto de memoria direccionado por el valor del par de registros HL.
CODIGO MAQUINA:
0 1 1 1 0 <--- r --->
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
7

EJEMPLO:

LD (HL),B

Esta instrucción carga en la posición de memoria cuya dirección es el contenido de "HL", el contenido del registro "B". Los contenidos previos de "B" y "HL" no son alterados y sí el contenido de la posición de memoria correspondiente.

En este caso, se utiliza direccionamiento indirecto para especificar el "DESTINO".

Supongamos que "HL" contiene 4723h (18211), ésta será por tanto, la posición a la que accederemos. Suponemos asimismo, que el registro "B" tiene un con tenido de 75h (117). El contenido de la posición de memoria 4723h es irrelevante, ya que será destruido por la instrucción.

Contenido del par "HL":

(H):
(L):
0 1 0 0 0 1 1 1
0 0 1 0 0 0 1 1
47h
23h

Contenido de "B":

(B):
0 1 1 1 0 1 0 1
75h

Ejecutamos la instrucción:

LD (HL),B:
0 1 1 1 0 0 0 0
70h

Contenido de la posición 7423h después de la ejecución:

(4723h):
0 1 1 1 0 1 0 1
75h
LD (IX+d),r
OBJETO:
Carga el contenido del registro indicado por "r", en el octeto de la posición de memoria que resulta de sumar: el valor del registro índice "IX" con el entero de desplazamiento "d", el cual puede adquirir los valores desde -128 a +127.
CODIGO MAQUINA:
1 1 0 1 1 1 0 1
0 1 1 1 0 <--- r --->
<-------- d -------->
DDh
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD (IX+7),C

Supongamos que "IX" contiene 75B3h (30131), por lo que accederemos a la posición 75BAh (30138), cuyo contenido es irrelevante. Supongamos también que "C" contiene F0h (240).

Contenido del par "IX":

(IX):
0 1 1 1 0 1 0 1
1 0 1 1 0 0 1 1
75h
B3h

Contenido de "C":

(C):
1 1 1 1 0 0 0 0
F0h

Ejecutamos la instrucción:

LD (IX+7),C:
1 1 0 1 1 1 0 1
0 1 1 1 0 0 0 1
0 0 0 0 0 1 1 1
DDh
71h
07h

Contenido de la posición 75BAh después de la ejecución:

(75BAh):
1 1 1 1 0 0 0 0
F0h
LD (IY+d),r
OBJETO:
Carga el contenido del registro indicado por "r", en el octeto de la posición de memoria resultante de sumar: el valor del registro índice "IY" al entero de desplazamiento "d", el cual puede adquirir los valores desde -128 a +127.
CODIGO MAQUINA:
1 1 1 1 1 1 0 1
0 1 1 1 0 <--- r --->
<-------- d -------->
FDh
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD (IY+10),B

Supongamos que el índice "IY" contiene 5F40h (24384), por lo que accederemos a la posición 5F4Ah (24394). Supongamos también, que el registro "B" contiene FFh (255). El contenido de la posición 5F4Ah no es significativo, ya que será destruido por la instrucción.

Contenido del índice "IY":

(IY):
0 1 0 1 1 1 1 1
0 1 0 0 0 0 0 0
5Fh
40h

Contenido del registro "B":

(B):
1 1 1 1 1 1 1 1
FFh

Ejecutamos la instrucción:

LD (IY+10),B:
1 1 1 1 1 1 0 1
0 1 1 1 0 0 0 0
0 0 0 0 1 0 1 0
FDh
70h
0Ah

Contenido de la posición 5F4Ah después de la ejecución:

(5F4Ah):
1 1 1 1 1 1 1 1
FFh
LD (HL),n
OBJETO:
Carga el valor del número entero "n", (entre 0 y 255) en la posición de memoria cuya dirección es el contenido del par de registros "HL".
CODIGO MAQUINA:
0 0 1 1 0 1 1 0
<-------- n -------->
36h
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
3
CICLOS DE RELOJ:
10

EJEMPLO:

LD (HL),57

Este ejemplo se podría escribir también como: LD (HL),#39 ya que 39h = 57.

Suponemos que el par de registros "HL" contiene 6ACBh (27339), por tanto, esa será la dirección de memoria a la que accederemos. El contenido de esta posición de memoria no es significativo, ya que será destruido por la instrucción.

Contenido de "HL":

(H):
(L):
0 1 1 0 1 0 1 0
1 1 0 0 1 0 1 1
6Ah
CBh

Ejecutamos la instrucción:

LD (HL),57:
0 0 1 1 0 1 1 0
0 0 1 1 1 0 0 1
36h
39h

Contenido de la posición 6ACBh después de la ejecución:

(6ACBh):
0 0 1 1 1 0 0 1
39h
LD (IX+d),n
OBJETO:
Carga el valor del número entero "n", en el octeto de la posición de memoria que resulta de sumar: el contenido del registro índice "IX" al entero de desplazamiento "d", el cual puede adquirir valores desde -128 a +127.
CODIGO MAQUINA:
1 1 0 1 1 1 0 1
0 0 1 1 0 1 1 0
<-------- d -------->
<-------- n -------->
DDh
36h
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD (IX+3),7

Suponemos que "IX" contiene 73BCh (29628), por lo que accederemos a la posición 73BFh (29631), cuyo contenido es irrelevante.

Contenido de "IX":

(IX):
0 1 1 1 0 0 1 1
1 0 1 1 1 1 0 0
73h
BCh

Ejecutamos la instrucción:

LD (IX+3),7:
1 1 0 1 1 1 0 1
0 0 1 1 0 1 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 1 1
DDh
36h
03h
07h

Contenido de la posición 73BFh después de la ejecución:

(73BFh):
0 0 0 0 0 1 1 1
07h
LD (IY+d),n
OBJETO:
Carga el valor del número entero "n", en el octeto de la posición de memoria que resulta de sumar: el contenido del registro índice "IY" al entero de desplazamiento "d", el cual puede adquirir los valores desde -128 a +127.
CODIGO MAQUINA:
1 1 1 1 1 1 0 1
0 0 1 1 0 1 1 0
<-------- d -------->
<-------- n -------->
FDh
36h
 
 
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
5
CICLOS DE RELOJ:
19

EJEMPLO:

LD (IY+5),15

Le suponemos a "IY" un contenido de 5000h (20480), por lo que accederemos a la posición 5005h (20485). El contenido de esta posición es irrelevante.

Contenido de "IY":

(IY):
0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0
50h
00h

Ejecutamos la instrucción:

LD (IY+5),15:
1 1 1 1 1 1 0 1
0 0 1 1 0 1 1 0
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
FDh
36h
05h
0Fh

Contenido de la posición 5005h después de la ejecución:

(5005h):
0 0 0 0 1 1 1 1
0Fh
Grupo de instrucciones de carga en registro acumulador
LD A,(BC)
OBJETO:
Carga en el registro acumulador, el contenido de la posición de memoria direccionada por el par de registros "BC".
CODIGO MAQUINA:
0 0 0 0 1 0 1 0
0Ah
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
7

EJEMPLO:

LD A,(BC)

Supongamos que el par de registros "BC" contienen el número 76DFh (30431), esta es por tanto, la posición cuyo contenido cargaremos en el acumulador. Supongamos también, que el contenido de esta posición es AAh (170). El contenido del acumulador es irrelevante, ya que se pierde al ejecutar la instrucción.

Contenido del registro "BC":

(B):
(C):
0 1 1 1 0 1 1 0
1 1 0 1 1 1 1 1
76h
DFh

Contenido de la posición de memoria 76DFh:

(76DFh):
1 0 1 0 1 0 1 0
AAh

Ejecutamos la instrucción:

LD A,(BC):
0 0 0 0 1 0 1 0
0Ah

Contenido del acumulador después de la ejecución:

(A):
1 0 1 0 1 0 1 0
AAh
LD A,(DE)
OBJETO:
Carga en el registro acumulador, el contenido de la posición de memoria direccionada por el par de registros "DE".
CODIGO MAQUINA:
0 0 0 1 1 0 1 0
1Ah
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
7

EJEMPLO:

LD A,(DE)

Contenido del registro acumulador, no significativo.

Contenido del registro "DE":

(D):
(E):
0 1 0 0 1 1 1 1
1 1 1 1 1 1 1 1
4Fh
FFh

Contenido de la posición de memoria 4FFFh:

(4FFFh):
1 1 1 0 1 1 1 0
EEh

Ejecutamos la instrucción:

LD A,(DE):
0 0 0 1 1 0 1 0
1Ah

Contenido del acumulador después de la ejecución:

(A):
1 1 1 0 1 1 1 0
EEh
LD A,(nn)
OBJETO:
Carga en el registro acumulador, el contenido de la posición de memoria direccionada por el operando "nn".
CODIGO MAQUINA:
0 0 1 1 1 0 1 0
<-------- n -------->
<-------- n -------->
3Ah
LSB
MSB
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:
Ninguno.
CICLOS DE MEMORIA:
4
CICLOS DE RELOJ:
13

EJEMPLO:

CERO EQU #456A
LD A,(CERO)

La primera línea de este ejemplo define una etiqueta, esta operación no tiene código máquina y sirve simplemente, para indicarle al ensamblador, que allá donde le digamos la palabra "CERO", debe entender que queremos decir el número 456Ah.

Esta instrucción también se podría haber escrito sin etiqueta de la siguiente forma:

LD A,(#456A)

La utilidad de las etiquetas es que si vamos a acceder a la posición 456Ah muchas veces, seguramente nos resulte más fácil recordar la palabra "CERO" que el número 456Ah.

Contenido de la posición de memoria 456Ah:

(456Ah):
0 0 0 0 0 0 0 0
00h

Ejecutamos la instrucción:

LD A,(#456A):
0 0 1 1 1 0 1 0
0 1 1 0 1 0 1 0
0 1 0 0 0 1 0 1
3Ah
6Ah
45h

Observe cómo se codifica el operando: el octeto de orden inferior (6Ah) se almacena, en la instrucción, delante del octeto de orden superior (45h).

Contenido del acumulador después de la ejecución:

(A):
0 0 0 0 0 0 0 0
00h
LD A,I
OBJETO:
Carga en el acumulador, el contenido del registro "I" (vector de página de interrupción), y carga en el indicador "P/V" del registro "F", el estado del flip/flop de aceptación de interrupción "IFF2", que será "1" si la interrupción está habilitada y "0" si está inhabilitada. De esta forma, es posible comprobar de una sola instrucción, el estado del microprocesador en cuanto a las interrupciones.
CODIGO MAQUINA:
1 1 1 0 1 1 0 1
0 1 0 1 0 1 1 1
EDh
57h
INDICADORES DE CONDICIÓN A LOS QUE AFECTA:

S (signo): Pone a "1" si "I" es negativo, es decir, si su bit de más peso es "1".

Z (cero): Pone a "1" si "I" vale cero.

H (semiacarreo): Pone a "0".

P/V (Paridad/desbordamiento): Pone a "1" si las interrupciones están habilitadas y a "0" si están inhibidas.

N (suma/resta): Pone a "0".

C (acarreo): Permanece con su estado anterior.

CICLOS DE MEMORIA:
2
CICLOS DE RELOJ:
9

EJEMPLO:

LD A,I

Supongamos que el registro "I" contiene el valor 9Fh y que las interrupciones están habilitadas.

Contenido de "I":

(I):
1 0 0 1 1 1 1 1
9Fh

Ejecutamos la instrucción:

LD A,I:
1 1 1 0 1 1 0 1
0 1 0 1 0 1 1 1
EDh
57h

Contenido de "A" después de la instrucción:

(A):
1 0 0 1 1 1 1 1
9Fh

Estado de "F" después de la instrucción:

S
Z
H
P/V
N
C