Intrucciones del micro 8051

Informática. Registros universales. Acumulador. Puntero de datos. Bytes. Bit

  • Enviado por: Mr. Moso
  • Idioma: castellano
  • País: México México
  • 11 páginas
publicidad

Rn: Representa uno de los ocho registros universales. El índice n puede tomar uno de los valores comprendidos entre 0 y 7.

Ri: Representa uno de los registros R0 o R1 para un direccionamiento indirecto en el que el registro es utilizado como puntero.

orig.byte: Operando origen de tamaño byte.

dest.byte: Operando destino de tamaño byte.

orig.bit: Operando origen de tamaño bit.

dest.bit: Operando destino de tamaño bit.

dirección 16: Dirección de 11 bits. La dirección se completa con los 5 bits más altos del contador de programa.

dir: Dirección de 8 bits.

#dato: Constante o dato de 8 bits con direccionamiento inmediato.

Directo: Representa una dirección directa de 8 b

ACALL dirección de 11 bits: Llamada Incondicional a subrutina.

En primer lugar, el PC es incrementado dos veces para obtener la dirección de retorno (la dirección de la instrucción que sigue a la instrucción "Acall"), esta dirección se guarda en la pila y después tiene lugar el salto.

La dirección de la subrutina se obtiene mediante la concatenación de los 5 bits más significativos del PC, los 3 bits más significativos del código objeto de la instrucción y los 8 bits del segundo byte de la instrucción. Por consiguiente, la subrutina debe estar situada en el mismo bloque de 2 Kbytes en el que se encuentra la dirección contenida en el PC.its.ç

Ejemplo Instrucción ACALL dirección de 11 bits

SP = 07H. La etiqueta SUBRUT representa la dirección 0345H.

Después de la ejecución de:

ACALL SUBRUT

situada en la dirección 0123H, SP vale 09H, las posiciones de RAM 08H y 09H tienen valores 25H y 01H respectivamente, y el PC toma el valor 0345H.

ADD A, <orig.byte>: Suma.

El operando se suma con el contenido del acumulador. El resultado se coloca en el acumulador. El indicadorde acarreo y el indicador de acarreo auxiliar se ponen a 1 si se produce un acarreo desde el bit 7 o el bit 3 respectivamente, y se ponen a 0 en ausencia del acarreo correspondiente.

Para la suma de dos enteros sin signo, el indicador de acarreo CY informa de un eventual desbordamiento.

El indicador de OV se pone a 1 durante una suma de dos enteros con signo si la suma de dos números positivos genera un resultado negativo, o si la suma de dos números negativos produce un resultado positivo.

Son posibles 4 modos de direccionamiento para el operando: Por registro, directo, indirecto por registro e inmediato.

Ejemplo Instrucción ADD A,<origen.byte>

El acumulador contiene 0C3H (11000011 B) y el registro R0 contiene 0AAH (10101010 B). La instrucción

ADD A,R0

coloca el valor 6DH (01101110 B) en A, pone AC a 0 y pone a 1 el indicador de acarreo CY así como el indicador de desbordamiento OV.

ADDC A, <Orig.Byte>: Suma con Acarreo.

Se suman el operando, el indicador de acarreo y el contenido del acumulador. El resultado se coloca en el acumulador. El indicador de acarreo y el indicador de acarreo auxiliar se ponen a 1 si se produce un acarreo desde el bit 7 o el bit 3, respectivamente, y se ponen a 0 en ausencia del acarreo correspondiente.

Para una suma de dos enteros sin signo, el indicador de acarreo CY informa de un eventual desbordamiento.

El indicador OV se pone a 1 durante una suma de dos enteros son signo si la suma de dos números positivos genera un resultado negativo, o si la suma de dos números negativos produce un resultado positivo.

Son posibles cuatro modos de direccionamiento para el operando:

Direccionamiento por RegistrosEl (o los) operando (s) de la operación están representados por nombres de registros. En realidad la operación actúa sobre los valores contenidos en estos registros.

Direccionamiento DirectoUno de los operandos de la instrucción es una dirección sobre cuyo contenido va a actuar la operación. La sintaxis del código fuente no emplea ningún signo particular.

Este modo de direccionamiento es el único medio de acceder a los registros con función especial. De forma general, el direccionamiento directo sólo afecta a los 128 bytes inferiores de la RAM interna y los SFR.

Direccionamiento Indirecto por RegistroEl direccionamiento indirecto por registro utiliza el contenido de los registros R0 o R1 como una dirección de 8 bits. Estos punteros permiten trabajar con los datos situados en los 256 primeros bytes de la RAM interna o con una página de 256 bytes de la memoria externa. En este último caso, la página es definida por el contenido del puerto P2. Este modo de direccionamiento no permite el acceso a los registros con función especial (SFR). En el código fuente se utiliza el signo @ para indicar al ensamblador la utilización de este modo de direccionamiento.

El mismo tipo de direccionamiento es posible con el registro de 16 bits DPTR; en este caso, el direccionamiento es aplicable a los 64 Kbytes de la memoria externa. Las instrucciones de salvaguarda en la pila y de recuperación desde la pila utilizan implícitamente este modo de direccionamiento por medio del puntero SP.

Direccionamiento Inmediato En lo referente al código maquina, este modo de direccionamiento se traduce en que el código de operación va seguido de un segundo byte que representa un dato. Debido a que este dato se encuentra en la memoria de programa, memoria que generalmente sólo es accesible en lectura, se trata por definición de una constante. En cuanto a la sintaxis en el código fuente, el direccionamiento inmediato utiliza el carácter #.

AJMP dir11: Salto incondicional.

AJMP efectúa un salto a la dirección obtenida mediante la concatenación de los 5 bits más significativos del PC (después de un doble incremento del mismo) a los 3 bits más significativos del código de la instrucción y a los 8 bits del segundo byte de la instrucción.

Ejemplo Instrucción AJMP dirección de 11 bit

La etiqueta SALT representa la dirección 0123H. La instrucción

AJMP SALTO

está situada en la dirección 0345H y pondrá el valor 0123H en el contador de programa.

ANL <dest.byte>, <orig.byte>: Y lógico.

ANL realiza la operación lógica Y entre la variable origen y la variable destino. Los indicadores no se modifican. Cuando el operando destino es el acumulador, el operando origen puede ser un registro, una dirección directa, una dirección indirecta por registro o un dato inmediato. Cuando el operando destino es una dirección directa, el origen debe ser bien un dato inmediato o bien el acumulador.

Ejemplo Instrucción ANL <destino.byte>,<origen.byte>

El acumulador contiene 0C3H (11000011 B) y el registro R0 contiene 0AAH (10101010 B). La instrucción

ANL A,R0

colocará el valor 82H (10000010 B) en el acumulador.

ANL C, <orig.bit>: Y lógico entre el bit y el indicador de acarreo.

Si el valor del bit origen es un 0 lógico, el indicador de acarreo C se pone a 0. Si el valor del bit es 1, el estado del indicador de acarreo no se modifica. El signo "/" delante del operando origen es interpretado por el ensamblador como complemento lógico. En tal caso, la operación realizada es un Y lógico entre el inverso del bit origen y el indicador de acarreo, pero el estado del bit origen no se modifica

Ejemplo Instrucción ANL C,<origen.bit>.En el ejemplo que sigue, el indicador de acarreo se pone a 1 si y sólo si P1.0 = 1, ACC.7 = 1 y OV = 0.

OV C,P1.0 ;cargar una E/S en el indicador C

NL C,ACC.7 ;Y lógico con el bit 7 del acumulador

NL C,OV ;Y lógico con el bit 7 del acumulador

CJNE <dest. byte>, <orig. byte>, rel: Comparación y salto si no son iguales.

CJNE efectúa una comparación entre los dos primeros operandos y provoca una ruptura de secuencia (salto) en caso de desigualdad. La dirección del salto se obtiene sumando el valor con signo, representado por el tercer operando, al valor del PC, previamente posicionado en la dirección de la siguiente instrucción. El indicador de acarreo se pone a 1 si el valor del operando destino es inferior al valor del operando origen. En los demás casos, el indicador de acarreo se pone a 0.

Ejemplo Instrucción CJNE <destino.byte>,<origen.byte>,relativo

El registro R7 vale 56H. La primera instrucción de la secuencia:

CJNE R7,#66H,DIF ;R7 = 66H ?

;secuencia si R7 = 66H

DIF: JC MENOR ;salto si R7 < 66H

;secuencia si R7 > 66H

pone a 1 el indicador de acarreo y provoca un salto a DIF. Comprobando el indicador de acarreo es posible determinar si el valor de R7 es inferior o superior a 66H.

CLR A: Puesta a cero del acumulador.

Todos los bits del acumulador se ponen a 0. No se modifica ningún indicador.

Ejemplo Instrucció

El acumulador A vale 5CH (01011100 B). La instrucción

CLR A

da al acumulador el valor 00H (00000000 B).n CLR A

CLR bit: Puesta a cero de un bit.

Se borra (se pone a 0) el bit especificado. No se modifica ningún indicador (salvo, en su caso, el acarreo). Esta instrucción puede actuar sobre el indicador de acarreo o sobre un bit direccionable directamente (en RAM interna).

Ejemplo InstruEl Buffer del puerto 1 vale 5DH (01011101 B). La instrucción

CLR P1.2

da al Buffer el valor 69H (01011001 B).cción CLR bit

CPL A: Complemento del acumulador.

Se invierten (complemento a 1) todos los bits del acumulador. Los bits a 1 se ponen a 0 y viceversa. No se modifica ningún indicador.

Ejemplo Instrucción CPL A

El acumulador A vale 5CH 01011100 B). Después de la instrucción

CPL A

el acumulador tendrá el valor A3H (10100011 B).

CPL bit: Complemento de un bit.

Se invierte el bit indicado. No se modifica ningún indicador (salvo, en su caso, el de acarreo). Esta instrucción puede actuar sobre el indicador de acarreo o sobre los bits direccionables directamente.

Ejemplo Instrucción CPL bit

El puerto 1 tiene el valor 5DH (01011101 B). La secuencia

CPL P1.1

CPL P1.2

da a este puerto el valor 5BH (01011011 B).

DA A: Ajuste decimal del acumulador.

La instrucción ajusta el valor de los 8 bits del acumulador que resulta de la suma de dos variables en formato BCD (instrucciones ADD o ADDC). Si los 4 bits bajos, b3 a b0, representan un valor superior a 9(de XXXX1010 a XXXX1111) o si el indicador AC está a 1, se añade el valor 6 a los 4 bits menos significativos para ajustarlos. Esta suma puede poner a 1 el indicador de acarreo si provoca un desbordamiento que se propagaría a lo largo de los 4 bits más significativos, pero en caso contrario no borra este indicador. A continuación, si el indicador de acarreo está a 1 o si los 4 bits más significativos tienen un valor superior a 9 (1010XXXX 1111XXXX), se suma 6 a estos bits. Un desbordamiento desde el octavo bit pone a 1 el indicador de acarreo. El indicador OV no es afectado por esta operación.

Ejemplo Instrucción DA A

El acumulador vale 65H (01010110 B), que representa un número de dos dígitos en formato BCD. El registro R3 contiene el valor 67H (01100111 B) en formato BCD y el indicador de acarreo está a 1. La secuencia

ADDC A,R3

DA A

deja el valor 0BEH (10111110 B) en el acumulador después de la suma, momento en que los indicadores de acarreo y de acarreo auxiliar AC están a 0. El ajuste decimal transforma este valor 0BEH en 24H y el indicador de acarreo se pone a 1 porque 56+67+1 = 124.

Una variable en formato BCD se puede incrementar o decrementar sumándole los valores 01 H ó 99 H, respectivamente. Por ejemplo: decremento de A = 30 H.

ADD A,#99H

DA A

da A = 29H porque 30+99 = 129.

DEC <byte>: Decremento del operando <byte>.

La variable indicada es decrementada en 1. Un valor original de 00H se convertirá en 0FFH debido al desbordamiento. No se modifica ningún indicador.

Ejemplo Instrucción DEC <byte>

El registro R0 contiene 7FH (01111111 B). Las posiciones de memoria 7EH y 7FH contienen, respectivamente, 00H y 40H. La secuencia

DEC @R0

DEC R0

DEC @R0

da el valor 7EH al registro R0 y los valores 0FFH y 3FH a las posiciones de memoria 7EH y 7FH.

DIV AB: División.

Realiza la división del entero sin signo del acumulador entre el entero sin signo que se encuentra en el registro V. El acumulador recibe la parte entera del cociente y el Registro B el resto de la división. El indicador de acarreo y el indicador OV se ponen a 0.

Excepción: Si B vale 00, los valores devueltos en A y en B no están definidos y el indicador OV se pone a 1.

Ejemplo Instrucción DIV AB

El acumulador contiene 251 (11111011 B) y B vale 18 (00010010 B). La instrucción

DIV AB

pone el valor 13 en el acumulador y el valor 17 en B porque 251 = (13x18) + 17.

DJNZ <byte>, rel: Decremento y salto si no es igual a 0.

La variable <byte> es decrementada en 1 y, si el resultado es diferente de 0, se ejecuta un salto relativo. Un valor original de 0 provoca un desbordamiento a 0FFH. No se modifica ningún indicador. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después del avance de éste.

Ejemplo Instrucción DJNZ <byte>,relativo

Las posiciones de memoria interna 40H, 50H y 60H contienen, respectivamente, los valores 01H, 70H y 15H. La secuencia

DJNZ 40H,ETI1

DJNZ 50H,ETI2

DJNZ 60H,ETI3

efectúa un salto a la etiqueta ETI2 con los valores 00H, 6FH y 15H para las tres posiciones de memoria citadas. El primer salto a la etiqueta ETI1 no se produce porque el resultado es igual a 0. Esta instrucción es un medio simple para realizar un bucle.

INC <byte>: incrementa la variable <byte>.

La variable especificada como operando es incrementada en uno. Un valor original de 0FFH se convertirá en 00H debido al desbordamiento. No se modifica ningún indicador.

Ejemplo Instrucción INC <byte>

El registro R0 contiene 7EH. Las posiciones de memoria interna 7EH y 7FH contienen, respectivamente, 0FFH y 40H. La secuencia

INC @R0

INC R0

INC @R0

da el valor 7FH al registro R0 y los valores 00H y 41H a las posiciones de memoria 7EH y 7FH.

INC DPTR: Incrementa el puntero de datos.

Incrementa en 1 el puntero de 16 bits formado por DPH y DPL. Esta instrucción no modifica los indicadores. Este es el único registro de 16 bits al que puede referirse esta instrucción.

Los registros DPH y DPL contienen 12H y 0EFH respectivamente. La secuencia

INC DPTR

INC DPTR

INC DPTR

cambia DPH y DPL a 13H y 01H.

JB bit, rel: Salto si el bit está a 1.

Si el bit indicado está a 1, se ejecuta un salto relativo. En caso contrario, se ejecuta la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. El bit que se comprueba no se modifica. Tampoco se modifica ningún indicador.

Ejemplo Instrucción JB bit,relativo

El dato presente e el puerto 1 es 11001010 B. El acumulador contiene el valor 56H (01010110 B). La secuencia

JB P1.2,ETI1

JB ACC.2,ETI2

produce una bifurcación a la dirección ETI2.

JBC bit, rel: Salto si el bit está a 1 y puesta a 0 del mismo.

Si el bit indicado está a 1, se ejecuta un salto a la dirección indicada. En caso contrario, se ejecuta la instrucción siguiente. Si el resultado de la comprobación es positivo, el bit es puesto a 0. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. No se modifica ningún indicador.

Ejemplo Instrucción JBC bit,relativo

El acumulador contiene el valor 56H (01010110 B). La secuencia

JBC ACC.3,ETI1

JBC ACC.3,ETI2

produce una bifurcación a la dirección ETI2 con el acumulador igual a 52H (01010010 B).

JC rel: Salto si el indicador de acarreo está a 1.

Si el indicador de acarreo está a 1, se ejecuta un salto a la dirección especificada. Si no, se ejecuta la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. No se modifica ningún indicador.

Ejemplo Instrucción JC relativo

El indicador de acarreo está a 0. La secuencia

JC ETI1

CPL C

JC ETI2

pondrá el indicador de acarreo a 1 y después realizará una bifurcación a la dirección ETI2.

JMP @A+DPTR: salto indirecto.

El valor de 8 bits sin signo contenido en el acumulador se suma al valor de 16 bits contenido en DPTR. El resultado es la dirección de la próxima instrucción que será ejecutada.

Ejemplo Instrucción JMP @A+DPTR

En el acumulador se pone un valor par comprendido entre 0 y 6. La secuencia siguiente realizará un salto en base a la tabla SALTO.

MOV DPTR,#SALTO

JMP @A+DPTR

SALTO: AJMP ETI0

AJMP ETI1

AJMP ETI2

AJMP ETI3

si el acumulador valía 4 al comienzo de la secuencia, se habrá ejecutado un salto a la dirección ETI2.

NB bit, rel: Salto si el bit no está a 1 (salto sí bit = 0).

Si el bit especificado está a 0, se ejecuta un salto relativo, si no se ejecuta la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. No se modifica ningún indicador.

Ejemplo Instrucción JNB bit,relativo

El dato presente en las entradas del puerto 1 es 11001010 B. El acumulador vale 56H (01010110 B). La secuencia

JNB P1.3,ETI1

JNB ACC.3,ETI2

provoca un salto a la dirección ETI2 porque el bit 3 del acumulador es un 0.

NC rel: Salto si el indicador de acarreo está a 0.

Si el indicador de acarreo está a 0, se ejecuta una bifurcación a la dirección especificada. En caso contrario, se ejecutará la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. Los indicadores no se modifican.

Ejemplo Instrucción JNC relativo

El indicador de acarreo está a 1. La secuencia siguiente

JNC ETI1

CPL C

JNC ETI2

pone a 0 el indicador de acarreo y provoca una bifurcación a la dirección ETI2.

JNZ rel: Salto si el acumulador es distinto de 0.

Si el acumulador contiene un valor distinto de 0, se ejecuta una bifurcación a la dirección especificada. En caso contrario, se ejecutaría la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. No se modifica ningún registro.

Ejemplo Instrucción JNZ relativo

El acumulador vale 00H. La secuencia

JNZ ETI1

INC A

JNZ ETI2

da al acumulador el valor 01H y provoca una bifurcación a la dirección ETI2.

JZ rel: Salto si el acumulador es igual a 0.

Si todos los bits del acumulador son 0, se realiza la bifurcación a la dirección especificada. En caso contrario, se ejecutaría la instrucción siguiente. La dirección de destino se calcula sumando el valor con signo "rel" al valor del PC después de incrementar éste. No se modifica ningún indicador.

Ejemplo Instrucción JZ relativo

El acumulador vale 01H. La secuencia

JZ ETI1

DEC A

JZ ETI2

da al acumulador el valor 0 y provoca una bifurcación a la dirección ETI2.

LCALL dir16: Llamada a una subrutina.

Provoca una bifurcación a la dirección expresada por los 16 bits de dir16. La instrucción suma el valor 3 al contenido del PC para obtener la dirección de la próxima de la subrutina. Esta dirección se guarda a continuación en la pila. Después, el puntero de pila es incrementado en dos. Posteriormente se realiza la bifurcación a la dirección de la subrutina. No se modifica ningún otro registro.

Ejemplo Instrucción LCALL dirección de 16 bits

El puntero de pila es igual a 07H. La etiqueta SUBRUT corresponde a la dirección 1234H. Después de la ejecución de la instrucción

LCALL SUBRUT

situada en la dirección 0123H, el puntero de pila vale 09H, el contenido de las posiciones de memoria 08H y 09H es 26H y 01H respectivamente, y el PC vale 1234H.

LJMP dir16: salto incondicional largo.

Esta instrucción realiza un salto incondicional a la dirección especificada por los 16 bits de dir16. El destino puede estar situado en cualquier punto de los 64 Kb de la memoria de programa. No se modifica ningún registro.

Ejemplo Instrucción LJMP dirección de 16 bits

La etiqueta DIRSALTO corresponde a la dirección 1234H. La instrucción

LJMP DIRSALTO

provoca una bifurcación a la dirección 1234H.

MOV <dest.byte>,<orig.byte>: Transferencia de un byte.

El operando origen se copia en el operando destino. El operando origen no se modifica. Tampoco se modifica ningún indicador. Es una de las instrucciones más flexibles. Son posibles 15 combinaciones de direccionamiento para origen de destino.

Ejemplo Instrucción MOV <destino.byte>,<origen.byte>

La posición de memoria interna 30H contiene el valor 40H. El valor de la posición de memoria interna 40H es 10H. El dato presente en el puerto P1 es 11001010 B (0CA H). La secuencia

MOV R0,#30H

MOV A,@R0

MOV R1,A

MOV B,@R1

MOV @R1,P1

MOV P2,P1

da el valor 30H al registro R0, el valor 40H al acumulador y al registro R1, el valor 10H al registro B, y el valor 0CAH a la posición de memoria 40H y al puerto P2.

MOV <dest.bit>,<orig.bit>: Transferencia de un bit.

El estado lógico del bit origen se copia en el bit destino. Uno de los dos bits operando debe ser el indicador de acarreo y el otro puede ser uno de los bits direccionables directamente. No se modifica ningún indicador salvo, en su caso, el de acarreo.

Ejemplo Instrucción MOV <origen.bit>,<destino.bit>

El indicador de acarreo está a 1. El dato presente en el puerto 3 es 11000101 B. El último dato escrito en la salida del puerto 1 es 00110101 B. La secuencia

MOV P1.3,C

MOV C,P3.3

MOV P1.2,C

pone a 0 el indicador de acarreo y cambia el puerto 1 a 00111001 B.

MOV DPTR, #dato16: Carga de una constante en el puntero de 16 bits.

El puntero de datos DPTR se carga con el valor de 16 bits que sigue. El segundo byte de la instrucción es la parte alta del dato y es colocado en DPH. Con respecto al tercer byte, la parte baja del dato, es colocado en DPL. No se modifica ningún indicador. Ésta es la única instrucción de carga de 16 bits del juego de instrucciones.

jemplo Instrucción MOV DPTR,#dato de 16 bits

La instrucción

MOV DPTR,#1234H

cargará el valor 1234H en DPTR con 12H en DPH y 23H en DPL.

MOVC A,A@+<reg-base>: Transfiere un byte desde la memoria de programa.

La instrucción MOVC carga el acumulador con un código o una constante situada en la memoria de programa. La dirección del byte leído es igual a la suma del valor de 8 bits original del acumulador y del contenido de 16 bits del registro base. El registro puede ser el contador de programa PC o el registro DPTR. Si el registro base es el PC, se incrementa primero para apuntar a la instrucción siguiente. No se modifica ningún indicador.

Ejemplo Instrucción MOVC A,@A+<registro-base>

Se coloca en A un valor entre 0 y3. La serie de instrucciones que sigue incrementa primero el acumulador en 1 para compensar el byte que ocupa la instrucción RET y devuelve en A uno de los 4 valores definidos por la directiva DB del ensamblador.

INC A

MOVC A,@A+PC

RET

B 66H

B 77H

B 88H

B 99H

Si esta subrutina se llama con el acumulador igual a 1, a la vuelta el acumulador valdrá 77H.

MOVX <dest.byte>,<orig.byte>: Transferencia externa.

La instrucción MOVX permite una transferencia entre el acumulador y la memoria externa. Existen dos tipos de instrucciones caracterizadas por un direccionamiento diferente de la memoria externa: direccionamiento indirecto de 8 bits o de 16 bits. En el primer tipo de direccionamiento, el contenido de R0 o de R1, del banco de registro activos, constituye la dirección de 8 bits que es multiplexada con el dato sobre el puerto 0. Si este espacio de direccionamiento de 8 bits fuera insuficiente, siempre es posible utilizar un segundo puerto cuyo estado seria controlado por una instrucción de salida hacia las patillas de este puerto. En el segundo tipo de direccionamiento, el puntero de datos DPTR contiene una dirección de 16 bits. El puerto P2 recibe el contenido de DPH mientras que el puerto P0 multiplexa los 8 bits menos significativos de la dirección (DPL) con el dato. Es preciso advertir que el contenido del registro P2 conserva el valor que tenia antes de emplear este tipo de direccionamiento y que el buffer de salida del puerto 2 es modificado por la parte alta de la dirección sólo durante el tiempo que dura la lectura o la escritura de la memoria externa.

Ejemplo Instrucción MOVX <destino.byte>,<origen.byte>

Se ha conectado una memoria externa de 256 Bytes al puerto P0. Direcciones y datos son multiplexados sobre este puerto. Se emplea uno de los bits del puerto P3 para habilitar el circuito de memoria. Los registros R0 y R1 contienen respectivamente los valores 12H y 34 H. La posición de memoria externa 34H contiene el valor 56H. La secuencia

MOVX A,@R1

MOVX @R0,A

copia el valor 56H sucesivamente en el acumulador y en la posición de memoria externa 12H.

MUL AB: Multiplicación.

MUL AB realiza una multiplicación sin signo de los enteros contenidos en el acumulador y el Registro B. La parte menos significativa del resultado de 16 bits es colocado en el acumulador, mientras que los 8 bits más significativos son colocados en el registro B. Si el producto da un resultado mayor que 255, se pone a 1 el indicador de desbordamiento OV. En caso contrario se pone a 0. El indicador de acarreo se pone a 0 en todos los casos.

Ejemplo Instrucción MUL AB

Inicialmente, el acumulador contiene el valor 80 (50H). El registro B contiene el valor 160 (0A0H). La instrucción

MUL AB

da el producto 12800 (3200H). Por tanto, B recibe el valor 32H y A el valor 0. El indicador OV se pone a 1.

NOP: No-operación.

La ejecución continúa en la próxima instrucción. Aparte del PC, no se modifica ningún registro ni indicador.

Ejemplo Instrucción NOP

La serie de instrucciones

CLR P2.7

NOP

NOP

NOP

NOP

SETB P2.7

permite producir un corto pulso negativo por la línea 7 del puerto P2. La serie CLR/SETB provoca un pulso negativo correspondiente a un ciclo máquina. Añadiendo instrucciones NOP se puede aumentar la duración de este pulso en pasos de un ciclo de máquina. Aquí, el pulso dura 5 ciclos de máquina.

ORL <dest.byte>,<orig.byte>: O lógico.

Se realiza un O lógico entre el byte origen y el byte destino. El resultado es colocado en el operando destino. No se modifica ningún indicador. Los dos operandos pueden presentarse en 6 combinaciones de modos de direccionamiento. Cuando el acumulador actúa como operando destino, el operando origen puede ser un registro, una dirección directa, un direccionamiento indirecto por registro o un dato inmediato; cuando el acumulador actúa como operando destino, el operando origen puede ser un registro, una dirección directa, un direccionamiento indirecto por registro o un dato inmediato; cuando el operando destino es una dirección directa, el operando origen puede ser el acumulador o un dato inmediato.

Ejemplo Instrucción ORL <destino.byte>,<origen.byte>

El acumulador contiene el valor 0C3H (11000011 B) y R0 contiene el valor 55H (01010101 B). Después de la ejecución de la instrucción

ORL A,R0

el acumulador recibirá el valor 0D7H (11010111 B).

ORL C, <orig.byte>: O lógico de bits.

Pone a 1 el indicador de acarreo si el bit origen está a 1. El indicador de acarreo es utilizado como "acumulador" por el procesador lógico. El signo "/" que eventualmente precede al bit operando indica que la operación O debe efectuarse con el inverso del estado de este bit. El bit origen no es modificado por esta operación.

Ejemplo Instrucción ORL C,<origen.bit>

Poner a 1 el indicador de acarreo C si P1.0 = 1, o si ACC.7 = 1, o si OV = 0.

MOV C,P1.0

;cargar el indicador de acarreo con P1.0

ORL C,ACC.7

;O lógico con ACC.7

ORL C,/OV

;O lógico con el complemento de OV

POP directo: Recuperación desde al pila.

Se lee el contenido de la RAM interna direcionado por el Puntero de Pila y después el puntero de pila es decrementado en 1. A continuación, el valor leído se copia a la dirección indicada por el operando de la instrucción. No se modifica ningún indicador.

Ejemplo Instrucción POP directo

El puntero de pila contiene el valor 32H, y las posiciones de memoria 30H, 31H y 32H contienen, respectivamente, los valores 20H, 23H y 01H. La secuencia siguiente

POP DPH

POP DPL

posiciona el puntero de pila sobre la dirección 20H. En este caso, hay que tener en cuenta que el puntero ha sido decrementado en 1 (2FH) antes de ser actualizado con el valor 20H.

PUSH directo: Guardar en la pila.

El puntero de pila se incrementa en 1. Luego, el contenido de la dirección indicada se copia en la RAM interna apuntada por SP. Esta instrucción no modifica ningún indicador.

Ejemplo Instrucción PUSH directo

El puntero SP contiene el valor 09H y el puntero de datos DPTR vale 0123H. La secuencia

PUSH DPL

PUSH DPH

desplaza el puntero SP al valor 0BH y coloca en memoria RAM los valores 23H y 01H en las direcciones 0AH y 0BH.

RET: Retorno de subrutina.

La instrucción RET recupera de la pila el valor del contador de programa PC y la ejecución continúa a partir de esta dirección recuperada. Esta operación no modifica ningún indicador.

Ejemplo Instrucción RET

El puntero de pila contiene el valor 0BH. Las posiciones 0AH y 0BH de RAM interna contienen, respectivamente, los valores 23H y 01H. La instrucción

RET

da el valor 09H al puntero de pila y la ejecución prosigue desde la dirección 0123H.

RETI: Retorno de interrupción.

La instrucción RETI recupera de la pila el valor del contador de programa PC, se restaura la lógica de interrupciones para aceptar interrupciones del mismo nivel de prioridad.

Ejemplo Instrucción RETI

El puntero de pila se decrementa en 2. Esta operación no modifica ningún indicador. La ejecución prosigue desde la dirección recuperada de la pila.

El puntero de pila contiene el valor 0BH. Las posiciones 0AH y 0BH de RAM interna contienen, respectivamente, los valores 23H y 01H. La instrucción

RETI

da el valor 09H al puntero de pila y la ejecución prosigue desde la dirección 0123H.

RL A: Rotación a la izquierda.

Los 8 bits del acumulador se desplazan una posición a la izquierda. El bit 7 se coloca en la posición menos significativa (bit 0). Esta operación no modifica ningún indicador.

Ejemplo Instrucción RL A

El acumulador contiene el valor 8BH (10001011 B). La instrucción

RL A

da al acumulador el valor 17H (00010111 B).

RR A: Rotación a la derecha.

Los 8 bits del acumulador se desplazan un lugar a la derecha. El bit 0 se coloca en la posición más significativa (bit 7). Esta operación no modifica ningún indicador.

Ejemplo Instrucción RR A

l acumulador contiene el valor 8BH (10001011 B). La instrucción

RR A

da al acumulador el valor 0C5H (11000101 B).

SETB bit: Puesta a 1 de un bit.

Las instrucciones SETB ponen a 1 el bit especificado por el operando.

Ejemplo Instrucción SETB bit

El indicador de acarreo está a 0. El puerto P1 vale 34H (00110100 B). La secuencia

SETB C

SETB P1.0

pone el indicador de acarreo a 1 y da al puerto P1 el valor 35H (00110101 B).

SJMP rel: Salto.

Esta instrucción realiza una bifurcación incondicional a la dirección indicada. La dirección de destino se calcula sumando el desplazamiento con signo, expresado en el segundo byte de la instrucción, al valor del PC después de incrementarlo dos veces. Por tanto, el espacio de salto está limitado a 128 byte más arriba y 127 más debajo de esta instrucción.

Ejemplo Instrucción SJMP relativo

La etiqueta DIRREL corresponde a la dirección 0123H. La instrucción

SJMP DIRREL

provoca una bifurcación a la dirección 0123H.

SUBB A, <orig.byte>: Resta con acarreo.

El operando origen y el indicador de acarreo se restan del contenido del acumulador. El resultado se coloca en el acumulador. El indicador de acarreo se pone a 1 si se produce un desbordamiento. Este mecanismo permite realizar una substracción en precisión múltiple en la que se resta el indicador de acarreo resultante de la operación precedente. El indicador AC se pone a 1 si se produce un acarreo del bit 3. El indicador OV se pone a 1 si se produce un acarreo del bit 6 pero no del bit 7 o viceversa. En una substracción de enteros con signo, el indicador de OV se pone a 1:

Si un valor negativo restado de un valor positivo produce un resultado negativo.

Si un valor positivo restado de un valor negativo produce un resultado positivo.

Ejemplo Instrucción SUBB a,<origen.byte>

El acumulador contiene 0C9H y R2 vale 54H con el indicador de acarreo a 1. La instrucción

SUBB A,R2

deja el valor 74H en el acumulador. El indicador de acarreo y AC se ponen a 0 y OV se pone a 1.

SWAP A: Permutación de los 4 bits altos del acumulador con los 4 bits bajos.

La instrucción "SWAP A" intercambia los 4 bits más significativos del acumulador con los 4 bits menos significativos. Esta instrucción reemplaza con ventaja a 4 instrucciones de rotación.

Ejemplo Instrucción SWAP A

El acumulador contiene el valor 0C5H (11000101 B). La instrucción

SWAP A

da al acumulador el valor 5CH (01011100 B).

XCH A: Intercambio de contenidos.

La instrucción XCH carga el acumulador con el contenido del operando origen y, al mismo tiempo, el valor original del acumulador se copia en el operando origen.

Ejemplo Instrucción XCH A,<byte>

R0 contiene el valor 20H. El acumulador contiene el valor 3FH. La posición 20H de RAM interna contiene el dato 75H. La instrucción

XCH A,@R0

carga el valor 3FH en la posición 20H de RAM interna y da al acumulador el valor 75 H

XCHD A,@Ri: Intercambio de 4 bits.

XCHD intercambia los 4 bits menos significativos (bit 3 a bit 0) del acumulador con los de la posición de RAM interna direccionada indirectamente por el registro R0 o R1. Los 4 bit s más significativos no son ni intercambiados ni modificados. Esta operación no modifica ningún indicador.

Ejemplo Instrucción XCHD A,@Ri

R0 contiene el valor 20H. El acumulador contiene el valor 36H. La posición 20H de RAM interna contiene el valor 75H. La instrucción

XCHD A,@R0

da el valor 76H a la posición 20H de RAM interna y deja el acumulador con un valor final de 35H.

XRL <dest.byte>,<orig.byte>: O lógico exclusivo.

Se realiza un O exclusivo entre el byte origen y el byte destino. El resultado es colocado en el operando destino. No se modifica ningún indicador. Los dos operandos pueden presentarse en 6 combinaciones de modos de direccionamiento. Cuando el acumulador actúa como operando destino, el operando origen puede ser un registro, una dirección directa, un direccionamiento indirecto por registro o un dato inmediato; cuando el operando origen puede ser el acumulador o un dato inmediato.

Ejemplo Instrucción XRL <destino.byte>,<origen.byte>

El acumulador contiene el valor 0C3H (11000011 B) y R0 contiene el valor 0AAH (10101010 B). Después de la ejecución de la instrucción

XRL A,R0

el acumulador recibirá el valor 69H (01101001 B).Cuando el operando destino es una dirección directa, esta instrucción permite invertir bits de la RAM interna o de los registros físicos. Los bits que se invierten son determinados por un byte de máscara que puede ser una constante en el programa o el resultado de un cálculo realizado sobre el acumulador. La instrucción

XRL P1,#00110001 B

invierte los bits 0, 4 y5 del puerto P1.