Está en la página 1de 29

Set de instrucciones

El set o conjunto de instrucciones de la familia MCS-51 se puede dividir segn las siguientes especialidades o dedicacin de las instrucciones segn su operacin. TIPOS DE OPERACIONES OPERACIONES ARITMTICAS OPERACIONES LGICAS TRANSFERENCIA DE DATOS SALTO O CONTROL DEL PROGRAMA MANIPULACIN A BIT O LGEBRA BOOLEANA No. MNEMNICOS 5 10 7 13 11

Las instrucciones aritmticas, lgicas, de transferencia y de salto son comunes a la mayora de microprocesadores. Los microcontroladores tienen un rea especial de aplicacin que es el rea de control de procesos, en este campo las operaciones estn orientadas muy a menudo a BIT. Los microcontroladores leen, procesan, escriben e intercambian informacin con los sistemas exteriores en formato BIT a BIT o palabra a palabra. Un procesador booleano con un set de instrucciones booleanas muy completo se encarga de realizar este tipo de operaciones, que esta orientada a BIT. Esta particularidad, as como su inmunidad al ruido elctrico, lo hacen valioso en el mundo de control de procesos industriales.

Conjunto de instrucciones de la familia MCS-51


A continuacin se presenta una tabla en la cual se describen todos los conjuntos de instrucciones que conforman a la familia de MCS-51, as como sus periodos de oscilacin, los bytes que ocupa cada instruccin y una breve descripcin de cada una de las instrucciones. Instrucciones que afectan a los <<flags>>: FLAR OV AC X X X X X X X X

Instruccin
ADD ADDC SUBB MUL DIV DA RRC RLC SETB C CLR C CPL C ANL C, bit ANL C./bit ORL C, bit ORL C,/bit MOV C, bit CJNE

C
X X X 0 0 X X X 1 0 X X X X X X X

Notas sobre el significado de los operandos de las instrucciones que se describen a continuacin: Rn..................Registros R0-R7 del banco de registros seleccionado. Direct........... Direccin del dato de 8 bits de la memoria interna. Puede ser un dato de la RAM interna (0- 127 para el 8051 o 0-255 para el 8052) o un registro del SFR (por ejemplo, Puerto de E/S, registro de control, registro de estado (128-255). @Ri ........... Se refiere a los registros R0 y Rl, que permiten el direccionamiento indirecto para acceder a los datos de 8 bits de la RAM interna (80-FFH) solapada con el SFR para el 8052 y (00-7FH) para el 8052/8051.

# data .............Operando constante de 8 bits

#datal6 ........ Operando constante de 16 bits. Addr 16 ....... Direccin destino de 16 bits. Utilizada por las instrucciones de salto LCALL y LJMP para permitir el salto dentro del espacio de 64Kbytes de la memoria de programas. Addr 11........ Direccin destino de 11 bits. Utilizada por las instrucciones de salto ACALL y AJMP para permitir el salto dentro de la pagina de 2Kbytes de la memoria de programas a partir del primer byte de la siguiente instruccin. rel ................ Salto relativo en formato de 8 bits en complemento a 2. Utilizado por la instruccin SJMP y todos los saltos condicionales. El rango del salto (8 bits) esta comprendido entre -128 a +127 bytes a partir del primer byte de la siguiente instruccin. BIT............. Direccionamiento directo BIT a BIT dentro del rea de la memoria RAM interna y de los registros SFR que permiten el direccionamiento por BIT. rrr................. En la columna de codificacin indica el registro implicado en la instruccin (Rn), segn la siguiente tabla: r r r registro

0 0 0 R0 0 1 1 R1 0 1 0 R2 ================== 1 1 1 R7 i.................. En la columna de codificacin indica el registro implicado en la instruccin de direccionamiento indirecto (@Ri), segn se muestra en la siguiente tabla: i 0 1 registro @R0 @R1

Listado de instrucciones del microcontrolador


MNEMNICO DESCRIPCIN BYTE PERIODOS DE OSCILACIN

INSTRUCCINES ARITMTICAS ADD ADD ADD A,Rn A,direct A, @Ri Suma registro a Acumulador Suma un byte directo a Acumulador Suma indirectamente un registro de RAM a Acumulador Suma dato inmediato a Acumulador Suma registro a Acumulador con carry Suma un byte directo a Acumulador con carry Suma indirectamente un registro de RAM a Acumulador con carry DESCRIPCIN Suma dato inmediato a Acumulador con carry Substrae Registro de ACC con prstamo Substrae un byte directo de ACC con prstamo Substrae indirectamente un registro de RAM de ACC con prstamo Substrae un dato inmediato de ACC con prstamo Incrementa Acumulador Incrementa Registro Incrementa directamente un byte Incrementa indirecto un byte en RAM Decrementa Acumulador Decrementa Registro Decrementa directamente un byte Decrementa indirecto un byte en RAM Incrementa Data Pointer Multiplica A y B Divide A y B Ajuste decimal del Acumulador 1 2 1 2 1 2 1 BYTE 2 1 2 1 2 1 1 2 1 1 1 2 1 1 1 1 1 12 12 12 12 12 12 12 PERIODOS DE OSCILACIN 12 12 12 12 12 12 12 12 12 12 12 12 12 24 48 48 12

ADD A, #data ADDC A,Rn ADDC A,direct ADDC A, @Ri MNEMNICO ADDC A, #data SUBB SUBB SUBB SUBB INC INC INC INC DEC DEC DEC DEC INC MUL DIV DA A,Rn A,direct A, @Ri A, #data A Rn direct @Ri A Rn direct @Ri DPTR AB AB A

INSTRUCCINES LGICAS

ANL ANL ANL

A,Rn A,direct A, @Ri

ANL A, #data ANL direct,A ANL direct, #data ORL A,Rn ORL A,direct ORL A, @Ri ORL A, #data ORL direct,A ORL direct, #data XRL A,Rn XRL A,direct XRL XRL XRL A, @Ri A, #data direct,A

XRL direct, #data CLR CPL RL RLC RR RRC SWAP A A A A A A A

AND Registro a Acumulador AND Byte directo a Acumulador AND indirecto un byte en RAM a Acumulador AND Dato inmediato a Acumulador AND Acumulador a un byte directo AND dato inmediato a byte directo OR Registro a Acumulador OR Byte directo a Acumulador OR indirecto un byte en RAM a Acumulador OR Dato inmediato a Acumulador OR Acumulador a un byte directo OR dato inmediato a byte directo OR-Exclusiva Registro a Acumulador OR-Exclusiva Byte directo a Acumulador OR-Exclusiva indirecto un byte en RAM a Acumulad. OR-Exclusiva Dato inmediato a Acumulador OR-Exclusiva Acumulador a un byte directo OR-Exclusiva dato inmediato a byte directo Limpia Acumulador Complementa Acumulador Rota Acumulador a la izquierda Rota Acumulador a la izquierda a travs del carry Rota Acumulador a la derecha Rota Acumulador a la derecha a travs del carry Intercambio de nibbles dentro del ACC INSTRUCCINES DE TRANSFERENCIA DE DATOS

1 2 1 2 2 3 1 2 1 2 2 3 1 2 1 2 2 3 1 1 1 1 1 1 1

12 12 12 12 12 24 12 12 12 12 12 24 12 12 12 12 12 24 12 12 12 12 12 12 12

MOV MOV MOV

A,Rn A,direct A, @Ri

MNEMNICO MOV MOV Rn,A Rn,direct

Mueve registro a Acumulador Mueve byte directo a Acumulador Mueve indirecto un byte en RAM a Acumulador DESCRIPCIN Mueve Acumulador a registro Mueve byte directo a registro

1 2 1 BYTE 1 2

12 12 12 PERIODOS DE OSCILACIN 12 24

MOV Rn, #data MOV direct,A MOV direct,Rn MOV direct,direc MOV direct, @Ri MOV direc,#data MOV @Ri,A MOV @Ri,direct MOV @Ri,#data MOV DPTR, #data16 MOVC A, @A+DPTR MOVC A, @A+PC MOVX A@Ri

Mueve dato inmediato a registro Mueve Acumulador a byte directo Mueve registro a byte directo Mueve byte directo a byte directo Mueve indirecto Byte en RAM a byte directo Mueve dato inmediato a byte directo Mueve Acumulador a byte indirectamente en RAM Mueve byte directo a byte indirectamente en RAM Mueve dato inmediato a byte indirectamente en RAM Carga el Data Pointer con una constante de 16 bits Mueve Cdigo relativo byte a DPTR a Acumulador Mueve Cdigo relativo byte a PC a Acumulador Mueve de RAM externa (direccin de 8 bits) a Acumulador Mueve de RAM externa (direccin de 16 bits) a Acumulador Mueve Acumulador a RAM externa (direccin de 8 bits) Mueve Acumulador a RAM externa (direccin de 16 bits) Empuja byte directo al stack Suelta byte directo del stack Intercambia registro con Acumulador Intercambia byte directo con Acumulador Intercambia indirecto RAM con ACC Intercambia dgito de bajo orden indirecto RAM con Acumulador

2 2 2 3 2 3 1 2 2 3 1 1 1

12 12 24 24 24 24 12 24 12 24 24 24 24

MOVX A@DPTR MOVX A, @Ri,A MOVX @DPTR,A PUSH direct POP direct XCH A,Rn XCH A,direct XCH XCHD A, @Ri A, @Ri

1 1 1 2 2 1 2 1 1

24 24 24 24 24 12 12 12 12

MANIPULACIN DE VARIABLES BOOLEANAS Nota. La palabra carry se refiere al BIT de acarreo del SFR PSW.7 CLR CLR SETB SETB C BIT C BIT Limpia el carry (PSW.7) Limpia BIT directo Pone un uno en el carry Pone un uno en el BIT directo 1 2 1 2 12 12 12 12

CPL CPL ANL ANL ORL ORL MOV MOV JC JNC JB JNB JBC

C BIT C,bit C,/BIT C,bit C,/BIT C,bit bit,C rel rel rel rel bit,rel

Complementa el carry Complementa BIT directo AND BIT directo y el carry AND complemento de BIT directo y carry OR bit directo y carry OR complemento de BIT directo y carry Mueve BIT directo al carry Mueve carry a bit directo Salta si el carry es uno Salta si el carry no es uno Salta si el BIT directo es uno Salta si el BIT directo no es uno Salta si el BIT directo es uno y limpia el BIT

1 2 2 2 2 2 2 2 2 2 2 2 3

12 12 24 24 24 24 12 24 24 24 24 24 24

RAMIFICANDO EL PROGRAMA MNEMNICO LCALL addr16 RET RETI AJMP addr11 LJMP addr16 SJMP rel JMP @A+DPTR JZ rel JNZ rel CJNE A,direct,rel CJNE #data,rel A, DESCRIPCIN Larga llamada a subrutina Retorno de subrutina Retorno de interrupcin Salto absoluto Salto largo Salto corto (direccin relativa) Salto relativo indirecto a el DPTR Salta si el Acumulador es cero Salta si el Acumulador no es cero Compara byte directo con ACC y salta si no es igual Compara dato inmediato con ACC y salta si no es igual Compara dato inmediato con registro y salta si no es igual Compara dato inmediato con byte indirecto y salta si no es igual Decrementa registro y salta si no es cero Decrementa byte directo y salta si no es cero No operacin BYTE 3 1 1 2 3 2 1 2 2 3 3 PERIODOS DE OSCILACIN 24 24 24 24 24 24 24 24 24 24 24

CJNE Rn, #data,rel CJNE @Ri, #data,rel DJNZ Rn,rel DJNZ NOP direct,rel

3 3 2 3 1

24 24 24 24 12

Conjunto de instrucciones del C AT89C52

Descripcin de las instrucciones


ACALL.- (Llamada) Llama incondicionalmente a una subrutina localizada en la direccin indicada. Durante esta instruccin se realizan los siguientes eventos: El contenido del PC se incrementa dos veces y apunta la direccin de la siguiente instruccin; el stack Pointer se incrementa una vez, introduciendo el byte bajo del PC; incrementa nuevamente el SP para introducir el byte alto del PC; por ltimo, el PC es cargado con el contenido de la DIRECCIN DESTINO. La ejecucin de las instrucciones de la subrutina comienza en esta direccin, hasta que encuentre la instruccin RET, la cual restablece el PC que haba sido almacenado en el SP, continuando nuevamente con el programa inicial. ACALL (PC) (SP) ((SP)) (SP) ((SP)) Ejemplo: ACALL MOV

(PC) + 2 (SP) +1 (PC 7-0) (SP) + 1 (PC15-8)

TIME A,R1

Esta instruccin solicita la ejecucin de la subrutina llamada TIME, para lo cual los requisitos son: 1) Que exista la etiqueta que indica el principio de la subrutina, y 2) Una instruccin que nos indique el final de la subrutina y por lo tanto el regreso a la ejecucin normal del programa (instruccin RET). As pues, al encontrarse con el ACALL el micro acudir a ejecutar la siguiente subrutina: TIME MOV DJNZ RET R1,#0FFH R1,$

Despus de haber ejecutado las dos instrucciones que componen la subrutina TIME, y al encontrarse con la instruccin RET, el micro regresa a ejecutar el programa en donde se qued, lo cual quiere decir que ejecutar la instruccin MOV A,R1 y las siguientes hasta encontrar otra desviacin. ADD.- (Suma) Esta instruccin suma el contenido del acumulador de acuerdo al modo de direccionamiento y deja el resultado en el acumulador, afectando las banderas de carry y carry auxiliar, as como la de sobreflujo. Sus modos de direccionamiento son el directo, indirecto, inmediato y de registro indirecto

ADD A, R0 A, directo ADD A, @Ri ADD A, #dato Ejemplos: MOV A,#05H MOV R0,#05H ADD A,R0

(A) (A) + (Rn) ADD (A) (A) + (directo) (A) (A) + ((Ri)) (A) (A) + #dato

Despus de la instruccin ADD el contenido del acumulador ser 0AH, esto es, el resultado de la suma del contenido, el registro R0 ms el contenido del acumulador. MOV 20H,#05H MOV A,#05H ADD A,20H Despus de la ltima instruccin, el contenido del acumulador ser de 0AH, esto es, el resultado de sumar el contenido del acumulador ms el contendido de la direccin 20H. MOV 3BH,#05H MOV R1,#3BH MOV A,#05H ADD A,@R1 Despus de la ltima instruccin el contenido del acumulador ser 0AH, esto es, el resultado de sumar el contenido de la direccin 3BH ms el contenido del acumulador. MOV A,#05H ADD A,#05H Despus de la ltima instruccin, el contenido del acumulador ser el resultado de la suma directa del contenido del acumulador y el nmero 05H, esto es, 0AH.

ADDC.- (Suma + carry) Esta instruccin es similar a la anterior, con la diferencia de que en la suma se incluye el valor del carry, y de la misma manera puede direccionarse de los cuatro modos anteriores: ADDC A, R0 (A) ADDC A, directo (A) (A) + (C) + (Rn) (A) + (C) + (directo)

ADDC A, @Ri ADDC A, #dato

(A) (A)

(A) + (C) + ((Ri)) (A) + (C) + #dato

AJMP.- (Salto absoluto) Esta instruccin transfiere la ejecucin del programa incondicionalmente hacia donde el dato lo indique, utilizando nicamente 5 bits para la codificacin de la instruccin y los otros 3 que sobran del BIT para la pgina a saltar, ya que el salto mximo por esta instruccin es dentro de una pgina de 2K. A10, A9, A8,0 0001 AJMP addr11 Ejemplo: MOV A,#0FH MOV R1,#0AH AJMP FULL DIV A,#03H FULL ADD A,R1 END Al encontrarse con la instruccin AJMP salta incondicionalmente a ejecutar la instruccin precedida por la etiqueta FULL (la suma del acumulador y el registro 1), sin ejecutar la instruccin que, en orden sucesivo, sera la siguiente (divisin del acumulador entre el valor #03H).. ANL.- (And lgico) Esta es la instruccin lgica AND entre las variables indicadas, no afecta ninguna bandera y puede usar direccionamiento directo, indirecto, de registro o inmediato: ANL A, Rn (A) ANL A, directo (A) ANL A, @Ri (A) (A) ANL A, #dato ANL directo, A (directo) ANL directo, #dato(directo) Ejemplos: MOV A,#06H MOV R1,#04H ANL A,R1 Al final de este segmento de programa, el contenido del acumulador ser = 02H, que es el resultado de la operacin AND entre el acumulador y el registro R1. MOV A,#06H (A) ^ (Rn) (A) ^ (directo) (A) ^ ((Ri)) (A) ^ #dato (directo) ^ (A) (directo) ^ #dato A7,A6,A5,A4,A3,A2,A1,A0 (PC) (PC) + 2

MOV 020H,#04H ANL A,020H Despus de la ltima instruccin el contenido del acumulador ser 04H, que es el resultado de la operacin AND entre el acumulador y el contenido de la direccin 020H. MOV A,#06H MOV 03BH,#04H MOV R1,#03BH ANL A,@R1 Despus de haber ejecutado esta ltima instruccin el contenido del acumulador ser 04H, que es el resultado de la operacin AND entre el acumulador y el valor contenido en la direccin de memoria 03BH. ANL C.- (And lgico con carry) La misma instruccin que la anterior pero slo con el carry del acumulador, si en el ensamblaje se pone un / entonces el operando se negar slo para la operacin sin ser afectado realmente, es decir slo en la operacin lgica se ver negado; el resultado de esta operacin aparecer en el mismo BIT de carry despus de realizada la operacin: ANL C,bit ANL C,/bit (C) (C) ^ (bit) (C) (C) ^ (-bit)

Ejemplos: SETB F0 ;Flag del usuario SETB PSW.7 ;PSW.7 = direccin del carry del acumulador ANL C,F0 ANL C,/F0 Despus de la primera instruccin ANL el estado del carry ser 1, pero despus de la segunda ser 0. CJNE.- (Comparacin) Esta instruccin se encarga de hacer comparaciones con un byte completo y transfiere el control en caso de no ser igual a la referencia dada. Esta instruccin trabaja con cuatro combinaciones de direccionamiento, el acumulador puede ser comparado con cualquier byte directamente o con cualquier dato inmediatamente y cualquier direccin de RAM indirectamente o un registro puede ser comparado con una constante inmediata:

CJNE A, directo, relativa CJNE A, #dato, relativa CJNE Rn, #dato, relativa

(A) <> (directo) (A) <> #dato (A) <> #dato

CJNE @Ri, #dato, relativa (PC) (PC) + 3 (PC) (PC) + desplazamiento relativo Ejemplos:

((Ri)) <> #dato falso verdadero

Cualquiera de los siguientes fragmentos de programa mandar a ejecutar la instruccin precedida por la etiqueta FIN, sin ejecutar la instruccin de suma. MOV A,#05H MOV 03BH,#04H CJNE A,03BH,FIN ADD A,03BH MOV A,03BH END MOV A,#05H CJNE A,#04H,FIN ADD A,#04H MOV A,#04H END MOV R1,#05H CJNE R1,#04H,FIN ADD A,R1 MOV A,R1 END MOV R1,#03BH MOV 03BH,#05H MOV A,#04H CJNE A,@R1,FIN El siguiente fragmento de programa ejecutar las dos ltimas instrucciones del programa, y es aplicable a cualquiera de los cuatro tipos de direccionamiento: MOV A,#05H CJNE A,#05H,FIN ADD A,R1 MOV A,R1 END

FIN

FIN

FIN

FIN

Colocar aqu las consideraciones de si es mayor o menor cuando no es igual en cuanto al carry CLR A.- (borra A) Esta instruccin se encarga de limpiar el acumulador y poner ceros a todos sus bits, ejemplo: CLR A (A) 0

CLR bit.- (Borra el BIT) Limpia el BIT al igual que la instruccin anterior pero con la particularidad de actuar individualmente en las zonas de memoria direccionables BIT a BIT. CLR C CLR bit (C) (bit) 0 0

CPL A.- (Complementa A) Cada BIT del acumulador esta lgicamente complementado (complemento a unos). Los bits que previamente contienen un 1 son cambiados a 0 y viceversa. Las banderas no son afectadas: CPL A (A) (-A)

Ejemplo: MOV A,#06H CPL A END Al finalizar la ejecucin de este fragmento de programa el contenido del acumulador ser 0F9H, que es el complemento de 06H. CPL BIT.- (Complementa el BIT) Al igual que la anterior complementa pero nicamente el BIT indicado, slo acta en la zona direccionable por BIT, ejemplo:

CPL C CPL bit

(C) (bit)

(-C) (-bit)

DA.- (Ajusta decimal) Se encarga de hacer ajustes de hexadecimal a BCD mediante sumas de 00H, 06H, 60H, o 66H de acuerdo al caso; es decir, divide el byte en 2 nibbles y si alguno es mayor de 9 (1010-1111) le agrega 6 para obtener el nmero de unidades en este dgito hexadecimal, ejemplo: DA A si [ (A3-A0) > 9 ] V [ (AC) =1 ] A3-A0) (A3-A0) + 6

Y si [ (A7-A4) (A7-A4) + 6 ] DEC.- (Drecrementa) Decremento, esta instruccin puede utilizar cuatro tipos de direccionamiento, el de acumulador, registro, directo o registro indirecto, ejemplo:

DEC A (A) DEC Rn (Rn) DEC directo (directo) DEC @Ri ((Ri))

(A) - 1 (Rn) - 1 (directo) - 1 ((Ri)) - 1

DIV AB.- (Divisin) Divide los bytes interpretndolos como enteros sin signo, siendo el dividendo el A y el divisor B, dejando el cociente en A y el residuo en B, la bandera de sobreflujo se limpia mediante esta instruccin, esta operacin esta restringida a B:

DIV AB Ejemplo: MOV A,#010H MOV B,#03H DIV AB END El contenido del acumulador y del registro auxiliar B, despus de este fragmento de programa es: A=5 y B=1

DJNZ.-(Decremento y comparacin) Decrementa el byte indicado y brinca, en caso de que ste no sea igual a cero, a la instruccin precedida por la etiqueta indicada en la instruccin. No afecta ninguna bandera, la ramificacin puede especificarse por un registro o por direccionamiento de byte directo: DJNZ Rn, relativa DJNZ directo, relativa Directo si es verdadero (PC) (Rn) (PC) (PC) (PC) + 2 (Rn) - 1 (PC) + 2 directo - 1 (PC) + relativa

En los siguientes ejemplos se omitir la ejecucin de la instruccin que complementa el acumulador y en cambio se transferir el valor de R1 al acumulador:

FIN

MOV R1,#03H DJNZ R1,FIN CPL A MOV A,R1 END MOV 03BH,#03H MOV R1,#02H DJNZ 03BH,FIN CPL A MOV A,R1 END

FIN

INC.- (Incremento) Encargada de incrementar el valor del byte, no afecta banderas, direcciona mediante forma de registro directo o registro indirecto: INC A INC Rn INC directo INC @Ri (A) (Rn) (directo) ((Ri)) (A) + 1 (Rn) + 1 (directo) + 1 ((Ri)) + 1

INC DPTR.- (Incrementa el DPTR) Funcin similar a la anterior pero para uso exclusivo del puntero de datos (Data PoinTeR): INC DPTR (DPTR) (DPTR) + 1

JB.- (Salto) Si el BIT indicado es 1 salta a la direccin indicada sumndola al PC: JB BIT, relativa (PC) (PC) + 3 (PC) (PC) + relativa FALSO VERDADERO

En el siguiente ejemplo se omite la instruccin que incrementa el acumulador y brinca a la etiqueta FIN en la cual le transfiere un valor numrico, cabe sealar que si en lugar de la instruccin SETB F0 se colocara una instruccin CLR F0, se ejecutaran ambas instrucciones antes de llegar al final del programa: SETB JB INC MOV END F0 F0,FIN A A,#02H

FIN

JC.- (Salto) Saltar si el carry est en 1, de otro modo contina su curso normal:

JC relativa

(PC) (PC) + 2 (PC) (PC) + relativa

FALSO VERDADERO

En el siguiente ejemplo la ejecucin del programa brinca a la etiqueta FIN, al encontrar que el carry est en 1, eludiendo as la instruccin que transfiere el nmero #03H al acumulador; y quedando un valor de #0FH en ste, al final del programa: MOV ADD JC MOV ADD END A,#0FFH A,#01H FIN A,#03H A,#0FH

FIN

JMP @A + DPTR.- (Salto incondicional) Suma los ocho bits no asignados contenidos en el acumulador con los 16 bits del apuntador de datos y carga la suma resultante al contador del programa. Esta ser la nueva direccin para las siguientes bsquedas de las instrucciones: JMP @A + DPTR (PC) (A) + (DPTR) Ejemplo: DIRECCIN 010H DIRECCIN 012H DIRECCIN 014H MOV DPTR,#20H MOV A,#05H JMP @A+DPTR . . . MOV A,#0FFH END

DIRECCIN 025H

JNB.- (Salto) Si el bit indicado es cero, salta a la direccin suma del byte indicando ms el PC, de otra manera, sigue su curso normal: JNB bit, relativa (PC) (PC) + 3 (PC) (PC) + relativa FALSO VERDADERO

En el siguiente ejemplo se ejecutarn las dos ltimas instrucciones antes de llegar al final debido a que el resultado de la operacin JNB resulta falso, es importante tomar en cuenta que al utilizar CLR F0 en lugar de SETB F0 se llevar a cabo el brinco a FIN omitiendo la instruccin que incrementa el acumulador.

FIN

SETB JNB INC MOV END

F0 F0,FIN A A,#02H

JNC.- (Salto) Si el bit de carry es un cero, salta a la direccin formada por la suma algebraica del PC incrementado y del byte de desplazamiento relativo; de otra manera procede con la siguiente instruccin. La bandera de carry no es modificada (ver ejemplo de JC). JNC relativa (PC) (PC) + 2 (PC) (PC) + relativa FALSO VERDADERO

JNZ relativa.(Salto) Si cualquier bit del acumulador es un 1, salta a la direccin formada por la suma algebraica del PC incrementado y del byte de desplazamiento relativo, REL; de otra manera procede con la siguiente instruccin. La bandera de carry no es modificada. JNZ relativa (PC) (PC) + 2 (PC) (PC) + relativa FALSO VERDADERO

En el siguiente ejemplo al ejecutar la segunda instruccin brincar a la instruccin precedida por la etiqueta FIN omitiendo la suma de A y #02H. MOV A,#04H JNZ FIN ADD A,#02H NOP END

FIN

JZ relativa.- (Salto) Salta si el acumulador tiene todos sus bits en cero, el acumulador no se modifica y las banderas no son afectadas. JZ relativa (PC) (PC) + 2 (PC) (PC) + relativa FALSO VERDADERO

En el siguiente ejemplo se forzara un salto a la etiqueta FIN: MOV A,#0H JZ FIN MOV R0#04H

FIN

NOP END

LCALL addr16.- (Llamada) Llama a una subrutina mediante el uso de 2 bytes. La instruccin suma 3 al PC para que apunte a la direccin de la siguiente instruccin, luego incrementa el SP introduciendo el byte bajo del PC e incrementa nuevamente el SP para introducir el byte alto del PC. El PC se carga con el segundo y tercer byte de la instruccin LCALL. La ejecucin de las instrucciones de la subrutina comienza en esta direccin, hasta encontrar la instruccin RET, la cual restablece el PC que haba sido almacenado en el SP, continuando nuevamente con el programa inicial. Las banderas no son afectadas. LCALL addr (15-8) addr (7-0) (PC) (PC) + 3 (SP) (SP) + 1 ((SP)) (PC 7-0) (SP) (SP) + 1 ((SP)) (PC 15-8) (PC) (addr 15-0)

Ejemplo: En este ejemplo se supone que la subrutina TIME se encuentra en localidades altas de memoria, con esto se justifica el uso de la instruccin LCALL, se observa que el procedimiento es exactamente el mismo que con las instrucciones ACALL Y SCALL. As al encontrarse con la instruccin LCALL ejecutar la subrutina TIME y regresar al flujo normal para dar por terminado el programa (END). LCALL TIME END TIME MOV R1,#0FFH DJNZ R1,$ RET

LJMP addr16.- (Salto) Ramificacin incondicional del programa mediante dos bytes. El PC se carga con los dos ltimos bytes de la instruccin y salta para continuar con la ejecucin del programa a partir de esa direccin. Las banderas no son afectadas. LJMP addr (15-8) addr (7-0) Ejemplo: (PC) addr (15-0)

Al igual que la instruccin anterior, es importante tener en cuenta que si el salto se realiza a localidades de memoria altas, es necesario el empleo de esta instruccin, por lo dems, el uso de sta es el mismo que con las instrucciones SJMP y AJMP. LJMP FIN MOV R1,#09H FIN NOP END MOV.- (Mover) Esta instruccin permite la modificacin de un registro o direccin mediante los modos de direccionamiento usados pudiendo ser inmediato, directo, indirecto, de registro ndice y de registro. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 MOV A, #dato (A) MOV A, Rn (A) MOV A,directo (A) MOV A,@Ri (A) MOV Rn,A (Rn) MOV Rn,directo (Rn) MOV Rn, #dato (Rn) MOV directo,A (directo) MOV directo,Rn (directo) MOV directo,directo(directo) MOV directo, @Ri (directo) MOV directo, #dato (directo) MOV @Ri,A ((Ri)) MOV @Ri,directo ((Ri)) MOV @Ri, #dato ((Ri)) #dato (Rn) (directo) ((Ri)) (A) directo #dato (A) (Rn) (directo) ((Ri)) #dato (A) directo #dato

Nota. Destino, origen. Quiere decir Byte origen, donde inicialmente tomar el valor a mover y Byte destino la direccin donde lo colocar. Es importante comprender los siguientes conceptos: @Ri significa que Ri contiene la direccin de donde se encuentra el dato con el cual se est trabajando. #dato el nmero que se escriba en el espacio que dice dato ser directamente el valor con el que se quiere trabajar. directo ste ser una direccin de memoria. Es importante no perder de vista que el operando de la derecha es el origen de la transferencia de informacin, y a su vez, el operando de la izquierda es el destino de esta informacin, as, el siguiente segmento de programa tiene el objetivo de mostrar todas las combinaciones de direccionamiento que se pueden utilizar con la instruccin

MOV, en el espacio designado a comentarios (esto es despus del smbolo ;) de cada instruccin se explicar el efecto de la misma (DIRECCIN DE MEMORIA=DATO): MOV A,#06CH ;transfiere al acc un 6CH. A=#06CH MOV R1,#03BH ;transfiere a R1 un 03BH. R1=#03BH MOV 0FCH,R1 ;transfiere el contenido de R1 a la direccin de ;memoria 0FCH. 0FCH=#03BH MOV A,R1 ;transfiere al acc el contenido de R1. A=#03BH MOV 03BH,#0AFH ;transfiere un 0AFH a la direccin de memoria 03BH. ;3BH=#0AFH MOV 0FCH,#0B5H ;transfiere un 0B5H a la direccin de memoria 0FCH. ;FCH=#0B5H MOV A,03BH ;transfiere al acc el dato contenido en la direccin de ;memoria 03BH o sea A=#0AFH MOV A,@R1 ;R1 contiene la direccin de donde se encuentra el ;dato que ser transferido al acc A=#0AFH MOV 03BH,0FCH ;transfiere el contenido de la direccin de memoria ;FCH, a la tambin direccin de memoria 3BH. ;3BH=#0B5H MOV 0FCH,@R1 ;R1 contiene la direccin en la cual se encuentra el ;dato que ser transferido a la direccin de memoria ;FCH;FCH=#0B5H MOV R1,A ;transfiere a R1 el contenido del acc R1=#0AFH MOV R1,03BH ;transfiere a R1 el contenido de la direccin de ;memoria 03BH. R1=#0B5H MOV 0FCH,A ;transfiere el dato contenido en el acc a la direccin ;de memoria FCH. FCH=#0AFH MOV R1,#03BH ;transfiere un 3BH a R1. R1=#03BH MOV @R1,A ;transfiere el contenido del acc a la direccin 03BH ;03BH=#0AFH MOV @R1,0FCH ;transfiere el contenido de la direccin de memoria ;0FCH a la tambin direccin de memoria 03BH. ;03BH=#0B5H MOV @R1,#021H ;transfiere un 21H a la direccin de memoria 03BH ;03BH=#021H MOVC.- (Mover) Esta instruccin se utiliza para la lectura de tablas contenidas en la memoria de programa (move constant) y cabe sealar que estas tablas slo pueden ser ledas ms no modificadas: MOVC A,@A+DPTR MOVC A,@A+DPTR Ejemplo: Al finalizar el siguiente fragmento de programa el acumulador contendr el nmero 5, obtenido de una tabla que comienza en la direccin 05BH: MOV DPTR,#05BH (A) (A) ((A+DPTR)) ((A+DPTR))

MOV A,#04H MOVC A,@A+DPTR END DIRECCIN 05BH DB DB DB DB DIRECCIN 05BH+04H DB 01H 02H 03H 04H 05H

MOV C,bit MOV bit,C.- (Mover bit) En forma anloga a la instruccin anterior pero operando con el carry del acumulador y cualquier otro bit. MOV C,bit MOV bit,C (C) (bit) (bit) (C)

En el siguiente ejemplo se transferir el bit 0 del puerto 1 al carry del acumulador: MOV C,P1.0 END MOV DPTR,dato16.- (Mover) Carga al DPTR con el dato de dos bytes, ejemplo: MOV DPTR,dato(15-8),dato(7-0) (DPTR) dato(15-0)

MOVX destino,origen.- (Mover a/de RAM Externa) Esta instruccin permite la carga de un byte desde o hacia la memoria RAM externa, esta instruccin se divide en dos tipos: la accesada por los registros ndice (Ri) y la accesada por el puntero de datos (DPTR). En el primer tipo puede accesar slo hasta 256 localidades generalmente usada para entradas/salidas y el segundo caso para accesar a 64 Kb de memoria RAM externa, ejemplo: MOVX A, @Ri MOVX A, @DPTR MOVX @Ri,A MOVX @DPTR,A (A) (A) ((Ri)) ((DPTR)) ((Ri)) ((DPTR)) (A) (A)

NOP.- (No operacin) Esta instruccin no principalmente para hacer retardos, ejemplo: NOP (PC) (PC) + 1

realiza ninguna

funcin, utilizada

Ejemplo: En el siguiente fragmento de programa, despus de transferir un dato al acumulador, se llegar al final del programa sin realizar ninguna otra operacin, pero s, logrando un retraso: MOV A,#09H NOP NOP NOP NOP END MUL AB.- (Multiplicacin) Multiplica los bytes enteros sin signo, dejando el byte ms significativo de la respuesta en B y el byte menos significativo en A, ejemplo: MUL AB(A) 7-0 (B) 15-8 (A) * (B)

En el siguiente ejemplo se ejecutar la multiplicacin de 50D * 50D dando como resultado C409H (2500D en decimal) y quedando el resultado organizado de la siguiente manera:

MOV A,#050D MOV B,#050D MUL AB END ORL destino,origen.- (Or lgica) Realiza la operacin lgica OR entre los dos bytes dejando el resultado en el byte destino. ORL A,Rn (A) ORL A,directo(A) ORL A, @Ri (A) ORL A, #dato(A) ORL directo.A (directo) ORL directo, #dato (directo) Ejemplo: (A) o (Rn) (A) o (directo) (A) o ((Ri)) (A) o #dato (directo) o (A) (directo) o #dato

El resultado de las siguientes operaciones ser igual a #067H, quedando ste en el acumulador. Tomar en cuenta que son fragmentos de programas diferentes, es decir que no existe relacin entre ellos. MOV A,#042H MOV R1,#025H ORL A,R1 END MOV A,#042H MOV 03BH,#025H ;SIENDO 03BH UNA DIRECCIN DE ORL A,03BH ;MEMORIA END MOV MOV MOV ORL END A,#042H R1#03BH 03BH,#025H A,@R1

MOV A,#042H ORL A,#025H END MOV A,#042H MOV 03BH,#025H ORL 03BH,A END MOV 03BH,#042H ORL 03BH,#025H END ORL C,bitdestino.- (Or lgica) Operacin lgica OR realizada con el bit de prueba y el del carry, ejemplo: ORL C,bit ORL C,/bit (C) (C) (C) o (bit) (C) o (-bit)

POP directo.- (Sacar) Operacin de byte de la pila (stack). El contenido de la localidad de la RAM interna direccionada por el SP es ledo, y posteriormente el SP es decrementado por 1. El valor ledo es transferido al byte indicado por el direccionamiento directo. Las banderas no son afectadas:

POP directo (directo) (SP) Ejemplo: (ver instruccin PUSH).

((SP)) (SP) - 1

PUSH directo.- (Guardar) Operacin contraria a la anterior, pone un byte a la pila (stack): PUSH directo(SP) ((SP)) Ejemplo: El siguiente fragmento de programa aplica las dos ltimas instrucciones. Primero se mover el SP a la direccin 028H, despus se cargar en la direccin 010H el dato #045H se guarda en la pila, quedando ste en la direccin 029H e inmediatamente despus, se recupera de la pila para transferirlo a la direccin 011H. MOV SP,#028H MOV 010H,#045H PUSH 010H POP 011H END RET.- (Regreso) Instruccin encargada de regresar el control de una subrutina llamada previamente: RET (PC15-8) (SP) (PC7-0) (SP) Ejemplo: ((SP)) (SP) - 1 ((SP)) (SP) -1 (SP) + 1 (directo)

(ver instrucciones de llamado de subrutina: ACALL)

RETI.-(Regreso de interrupcin) Instruccin similar a la anterior pero con la diferencia de que este regreso es de una subrutina de una peticin de interrupcin. RETI (PC15-8) (SP) (PC7-0) (SP) Ejemplo: ((SP)) (SP) - 1 ((SP)) (SP) 1

RL A.- (Rotacin) Los ocho bits en el acumulador son trasladados un bit a la izquierda. El bit 7 es rotado a la posicin del bit 0. Las banderas no son afectadas. RL A (An + 1) (A0) Ejemplo: En este ejemplo se transfiere al acumulador un valor de 082H y al finalizar el programa, el acumulador contiene un valor de 05H. MOV A,080H RL A END ;A= 1000 0010 ;A= 0000 0101 (An) (A7) n=0-6

RLC A.- (Rotacin) Los ocho bits en el acumulador y la bandera de carry son rotados un bit a la izquierda. El bit 7 se mueve a la bandera de carry; el valor original de la bandera de carry se mueve a la posicin del bit 0. Las otras banderas no son afectadas. RLC A(An + 1) (A0) (C) (An) (C) (A7) n=0-6

Ejemplo: Esta instruccin incluye el carry del acumulador siendo bsicamente igual que la anterior. C MOV A,#082H SETB C RLC A END ;A= 0 1000 0010 ;A= 1 1000 0010 ;A= 1 0000 0101

RR A.- (Rotacin) Los ocho bits en el acumulador son rotados un bit a la derecha. El bit 0 es rotado a la posicin del bit 7. Las banderas no son afectadas. RR A (An) (A7) Ejemplo: (An + 1) (A0) n=0-6

En este ejemplo se transfiere el nmero 05H al acumulador y al finalizar el programa se tiene el nmero 082H. MOV A,#05H RR A ;A=0000 0101 ;A=1000 0010

RRC A.- (Rotacin) Los ocho bits en el acumulador y la bandera de carry son rotados un bit a la derecha. El bit 0 se mueve a la bandera de carry; el valor original de la bandera de carry se mueve a la posicin del bit 7. Las otras banderas no son afectadas. RRC A(An) (A7) (C) Ejemplo: MOV A,#081H RRC A END ;A=0 1000 0001 ;A=1 0100 0000 (An + 1) (C) (A0) n=0-6

SETB bit.- (Coloca el bit) Coloca el bit indicado en uno. SETB puede operar sobre la bandera de carry cualquier bit direccionable directamente. Las otras banderas no son afectadas, ejemplo: SETB C(C) (bit) Ejemplo: Supngase que el estado en el que se encuentra el carry es 0. MOV A,#00H SETB C END ;A= 0 0000 0000 ;A= 1 0000 0000 1 1

SJMP relativa.- (Salto) El programa de control salta incondicionalmente a la direccin indicada. El destino del salto es calculado por la suma del desplazamiento REL, ms el contenido del Contador de Programa. El rango de destinaciones permitido es de 128 bytes hacia atrs y 127 bytes hacia adelante. Esta instruccin utiliza 11bits para la direccin destino. SJMP relativa (PC) (PC) + 2 (PC) (PC) + relativa

Ejemplo: (ver instruccin LJMP).

FIN

MOV A,#09H SJMP FIN NOP END

SUBB A,destino.- (Resta) Resta con prstamo del carry, resta 2 bytes signados y afecta al carry y a la bandera de sobreflujo, ejemplo: SUBB A,Rn (A) SUBB A,directo SUBB A, @Ri SUBB A,#dato (A) - (C) - (Rn) (A) - (C) - (directo) (A) - (C) - ((Ri)) (A) - (C) - #dato

(A) (A) (A)

SWAP A.- (Intercambio) Intercambia los nibbles del acumulador. La operacin puede tambin ser vista como una instruccin de rotacin de 4 bits sin carry, las banderas no son afectadas. Ejemplo: SWAP A Ejemplo: MOV A,#063H SWAP A END ;A= 0110 0011 ;A= 0011 0110 (A3-0) (A7-4)

XCH A, byte.- (Intercambio) Carga el acumulador con el contenido de la variable indicada, al mismo tiempo que escribe el contenido original del acumulador a la variable indicada. El operando fuente/destino puede usar direccionamiento por registro, directo registro indirecto. XCH A,Rn (A) XCH A,directo(A) XCH A, @Ri (A) Ejemplo: MOV MOV XCH MOV XCH MOV XCH END (Rn) (directo) ((Ri))

A,#045H ;A=#045H R1,#09H ;R1=#09H A,R1 ;A=#09H y R1=#045H 03BH,#067H ;03BH=#067H A,03BH ;A=#067H y 03BH=#09H 045H,#0FCH ;045H=#0FCH A,@R1 ;A=0FCH y 045H=#067H

XCHD A, @Ri.- (Intercambio) Intercambia nicamente el nivel menos significativo entre el acumulador y el contenido de la direccin indicada en Ri, las banderas no son afectadas. XCHD A, @Ri Ejemplo: MOV R1,#03BH MOV 03BH,#63H MOV A,#81H XCHD A,@R1 END ;R1=#03BH ;03BH=#063H ;A=#081H ;A=#083H y 03BH=#061H (A3-0) ((Ri3-0))

XRL destino,origen.- (Or exclusiva) XRL ejecuta la operacin lgica OR-Exclusiva entre las variables indicadas, guardando el resultado en el destino. Las banderas no son afectadas. Los dos operandos permiten 6 combinaciones de modos de direccionamiento. Cuando el destino es el Acumulador, la fuente puede usar direccionamiento directo, por registro, por registro indirecto, e inmediato; cuando el destino es una direccin directa, la fuente puede ser el acumulador un dato inmediato. Ejemplo: XRL A,Rn (A) XRL A,directo (A) XRL A, @Ri (A) XRL A,#dato (A) XRL directo,A XRL directo,#dato (directo) (directo) (A) XOR (Rn) (A) XOR (directo) (A) XOR ((Ri)) (A) XOR #dato (directo) XOR (A) (directo XOR #dato

También podría gustarte