Anda di halaman 1dari 48

Arquitectura de Computadoras

Semana 06: Instrucciones y


saltos

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

Temario:

– Memoria de programa en el ATmega2560


– Instrucciones aritméticas
– Instrucciones lógicas
– Instrucciones para manipulación de bits
– Instrucciones de salto incondicional
– El registro de estado
– Instrucciones de test
– Instrucciones de salto condicional
– Llamado a sub-rutinas

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.1.- Mapeo de la memoria FLASH

¿Cómo funciona la memoria de


programa del ATmega2560?

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.1.- Mapeo de la memoria FLASH

● El microcontrolador ATmega2560 pertenece a la familia de microcontroladores AVR, del


fabricante Atmel (actualmente parte de Microchip). Algunos miembros de la familia AVR
cuentan con solo unos cuantos kilobytes de FLASH incorporada.

● Lo más importante es recordar que ningún miembro de la familia AVR puede acceder a
más de 4M palabras de opcode, porque el contador de programa (PC) en el AVR puede
tener un ancho de 22 bits como máximo (desde 0x000000 hasta 0x3FFFFF)

● La primera ubicación en la memoria FLASH siempre es 0x000000; sin embargo, la última


ubicación puede ser diferente, dependiendo del tamaño de la FLASH en el chip. Entre los
miembros de la familia AVR, el ATmega2560 cuenta con una memoria FLASH de 256
Kbytes. Esta memoria se encuentra organizada en 128K x 2 bytes (128 x 16 bits) y tiene
direcciones desde 0x000000 hasta 0x1FFFF.

● Cuando el microcontrolador es encendido (o cuando recibe una señal de RESET), éste


inicia la ejecución del programa a partir de la dirección 0x000000 de la memoria de
programa (FLASH). En otras palabras, al encender (o reinicar) el microcontrolador, el
contador de programa (PC) toma el valor 0.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.1.- Mapeo de la memoria FLASH

128Kx2Bytes

1FFFF

Mega2560

Ejemplos de rango de direcciones en la memoria de programa (FLASH) de los AVR.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.1.- Mapeo de la memoria FLASH

(FLASH)

Ancho de la memoria de programa (FLASH) para los microcontroladores AVR.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.2.- Almacenamiento de instrucciones en la FLASH

● Como se sabe, la memoria FLASH es un tipo de memoria de solo lectura (ROM), y por
este motivo hace falta un procedimiento especial para escribir en ella. Las formas más
común de almacenar el programa en la FLASH es mediante un programador o con un
programa bootloader (un programa que “carga” otros programas al microcontrolador).

● Luego que el programa ha sido almacenado en la FLASH de un microcontrolador como el


ATmega2560, los opcodes y operandos son colocados en las ubicaciones de la memoria
FLASH, comenzando por 0x000000.

● Las instrucciones completas (opcode + operandos) son almacenadas en lenguaje máquina


(formato binario) en la memoria FLASH. Por ejemplo, la instrucción “LDI R16, 0x25” es
traducida al código máquina “0xE205”. En este caso, 0xE representa el opcode (LDI) y
0x205 representa a los operandos.

● De forma similar, la instrucción “ADD R16, R17” es traducida al código máquina “0F01”.
Las imágenes en las siguientes diapositivas brindan mayores detalles.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.2.- Almacenamiento de instrucciones en la FLASH

Formato y ejemplos de la instrucción LDI.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.2.- Almacenamiento de instrucciones en la FLASH

Formato y ejemplos de la instrucción ADD.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.3.- Tamaño de las instrucciones en los microcontroladores AVR

● Las instrucciones en los AVR pueden ser de 2 bytes (16 bits) o 4 bytes (32 bits). Casi todas
las instrucciones en los AVR son de 2 bytes. Las excepciones son LDS, STS, JMP y
algunas otras.

● Dado que el bus de datos correspondiente a la memoria de programa tiene un ancho de 16


bits, no es posible extraer una instrucción de 4 bytes en un solo paso. Por esta razón, las
instrucciones de 4 bytes toman más tiempo que las demás en ejecutarse.

● En las siguientes diapositivas se muestra el formato de algunas instrucciones de 2 bytes y


4 bytes, con la finalidad de identificar sus ventajas y desventajas.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.3.- Tamaño de las instrucciones en los microcontroladores AVR

Formato de las instrucciones LDS y STS.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- MEMORIA DE PROGRAMA DEL ATMEGA2560

1.3.- Tamaño de las instrucciones en los microcontroladores AVR

Formato de las instrucciones IN y OUT.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.1.- Instrucciones aritméticas

Anteriormente se vieron algunas instrucciones aritméticas, entre las que se encuentran:

ADD (Suma entre dos registros)


SUB (Resta entre dos registros)
INC (Incrementar el contenido de un registro)
DEC (Decrementa el contenido de un registro)

El microcontrolador ATmega2560 cuenta con muchas otras instrucciones aritméticas. Sin


embargo, por cuestiones de practicidad solo se revisarán las más importantes para los
propósitos de nuestro curso. Las instrucciones aritméticas que se revisarán a continuación
son:

SUBI (Resta entre el contenido de un registro y un inmediato)


MUL (Multiplica dos números enteros sin signo)

Es importante recalcar que el microcontrolador ATmega2560 cuenta con instrucciones para


multiplicar, pero no cuenta con ninguna instrucción para dividir. Por esta razón, si se desea
llevar a cabo una división en lenguaje Assembly, es necesario escribir una rutina que
implemente un algoritmo de división.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.2.- La instrucción SUBI (Substract Immediate from Register)

En términos simples, la instrucción SUBI sustrae un valor de 8 bits del valor almacenado en
un registro de propósito general. Esta instrucción tiene el siguiente formato:

SUBI Rd, K ; Resta K del contenido de Rd y almacena 
; el resultado en Rd

K es un valor de 8 bits que puede encontrarse entre 0 y 255 en decimal, ó entre 0x00 y 0xFF
en hexadecimal, y Rd está entre R16 y R31 .

Ejemplo: El siguiente código almacena el valor 29 en el registro R21 y luego sustrae 18 del
mismo registro.

LDI    R21, 29 ; carga R21 con 29 (R21 = 29)
SUBI   R21, 18 ; R21 = R21 – 18 = 29 – 18 = 11

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.3.- La instrucción MUL (Multiply unsigned)

La instrucción MUL tiene el siguiente formato:

MUL Rd, Rr ; multiplica Rr y Rd y almacena el resultado en
; R1(MSB) y R0(LSB)

La instrucción MUL le dice a la CPU que multiplique el valor de Rr con el valor de Rd.

Dado que el valor contenido en ambos registros es de 8 bits, se espera que el resultado
tenga un máximo de 16 bits (2 bytes). Por esta razón, el byte más significativo (MSB) y el
byte menos significativo (LSB) se almacenan por separado, en los registros R1 y R0,
respectivamente

Para multiplicar dos números, por ejemplo 0x25 y 0x34, uno puede hacer lo siguiente:

LDI R16, 0x25 ; carga 0x25 dentro de R16
LDI R17, 0x34 ; carga 0x34 dentro de R17
MUL R16, R17  ; multiplica los valores de R16 y R17

Debe quedar claro que la instrucción MUL sólo se emplea para multiplicar números enteros
sin signo (naturales). Si se desea trabajar con números enteros con signo, entonces se deben
emplear otras instrucciones, tales como MULS y MULSU.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.4.- Instrucciones lógicas

Anteriormente se vieron algunas instrucciones lógicas, entre las que se encuentran:

COM (Complemento a 1 del contenido de un registro)


NEG (Complemento a 2 del contenido de un registro)

Por otro lado, el microcontrolador ATmega2560 cuenta con diferente instrucciones para llevar
a cabo operaciones booleanas (lógicas) . Las instrucciones que revisaremos a continuación
son:

AND (Operación AND, bit a bit, entre los valores almacenados en dos registros)
ANDI (Operación AND entre un valor almacenado en un registro y un inmediato)
OR (Operación OR, bit a bit, entre los valores almacenados en dos registros)
ORI (Operación AND entre un valor almacenado en un registro y un inmediato)
EOR (Operación XOR, bit a bit, entre los valores almacenados en dos registros)
SER (Forzar a ‘1’ todos los bits en un registro)
CLR (Forzar a ‘0’ todos los bits en un registro)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.5.- La instrucción AND (Logical AND)

La instrucción AND tiene el siguiente formato:

AND Rd, Rr ; Rd = Rd AND Rr

La instrucción AND le dice a la CPU que lleve a cabo la operación lógica AND sobre los dos
operandos (bit a bit), y que almacene el resultado en Rd.

Por ejemplo, para hacer un AND sobre los números 0xF0 y 0x0F, uno puede hacer lo
siguiente:

LDI R16, 0xF0 ; carga 0xF0 dentro de R16
LDI R17, 0x0F ; carga 0x0F dentro de R17
AND R16, R17  ; R16 = R16 AND R17 = 0xF0 AND 0x0F = 0x00

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.6.- La instrucción ANDI (Logical AND with Immediate)

En términos simples, la instrucción ANDI lleva a cabo un AND lógico entre un valor
almacenado en un registro y un valor constante. Esta instrucción tiene el siguiente formato:

ANDI Rd, K ; AND sobre K y el valor almacenado en Rd 
; almacena el resultado en Rd

K es un valor de 8 bits que puede encontrarse entre 0 y 255 en decimal, ó entre 0x00 y 0xFF
en hexadecimal, y Rd está entre R16 y R31 .

Ejemplo: El siguiente código almacena el valor 0xAA en el registro R21 y luego aplica un
AND lógico entre el número 0xCC y el contenido del registro.

LDI    R21, 0xAA ; carga R21 con 0xAA (R21 = 0xAA)
ANDI   R21, 0xCC ; R21 = R21 AND 0xCC = 0xAA AND 0xCC = 0x88 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.7.- La instrucción OR (Logical OR)

La instrucción OR tiene el siguiente formato:

OR Rd, Rr ; Rd = Rd OR Rr

La instrucción OR le dice a la CPU que lleve a cabo la operación lógica OR sobre los dos
operandos (bit a bit), y que almacene el resultado en Rd.

Por ejemplo, para hacer un OR sobre los números 0xF0 y 0x0F, uno puede hacer lo siguiente:

LDI R16, 0xF0 ; carga 0xF0 dentro de R16
LDI R17, 0x0F ; carga 0x0F dentro de R17
OR R16, R17  ; R16 = R16 OR R17 = 0xF0 OR 0x0F = 0xFF

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.8.- La instrucción ORI (Logical OR with Immediate)

En términos simples, la instrucción ORI lleva a cabo un OR lógico entre un valor almacenado
en un registro y un valor constante. Esta instrucción tiene el siguiente formato:

ORI Rd, K ; OR sobre K y el valor almacenado en Rd 
; almacena el resultado en Rd

K es un valor de 8 bits que puede encontrarse entre 0 y 255 en decimal, ó entre 0x00 y 0xFF
en hexadecimal, y Rd está entre R16 y R31 .

Ejemplo: El siguiente código almacena el valor 0xAA en el registro R21 y luego aplica un OR
lógico entre el número 0xCC y el contenido del registro.

LDI    R21, 0xAA ; carga R21 con 0xAA (R21 = 0xAA)
ORI   R21, 0xCC ; R21 = R21 OR 0xCC = 0xAA OR 0xCC = 0xEE 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.9.- La instrucción EOR (Logical Exclusive OR)

La instrucción EOR tiene el siguiente formato:

EOR Rd, Rr ; Rd = Rd XOR Rr

La instrucción EOR le dice a la CPU que lleve a cabo la operación lógica XOR sobre los dos
operandos (bit a bit), y que almacene el resultado en Rd.

Por ejemplo, para hacer un XOR sobre los números 0xAA y 0xCC, uno puede hacer lo
siguiente:

LDI R16, 0xAA ; carga 0xAA dentro de R16
LDI R17, 0xCC ; carga 0xCC dentro de R17
EOR R16, R17  ; R16 = 0xAA XOR 0xCC = 0xF0 XOR 0x0F = 0x66

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.10.- Las instrucciones SER y CLR (Set Register, Clear Register)

La instrucción SER tiene el siguiente formato:

SER Rd ; Rd = 0xFF

La instrucción SER fuerza todos los bits del registro Rd a ‘1’. La acción de forzar un bit a ‘1’,
en Inglés, se conoce como “set” (setear).

La instrucción CLR tiene el siguiente formato:

CLR Rd ; Rd = 0x00

La instrucción CLR fuerza todos los bits del registro Rd a ‘0’. La acción de forzar un bit a ‘0’,
en Inglés, se conoce como “clear” (limpiar).

Por ejemplo, para cargar valores a los registros R16 y R17, y luego “setear” todos los bits de
R16 y “limpiar” todos los bits de R17, se puede hacer los siguiente:

LDI R16, 0xAA ; carga 0xAA dentro de R16
LDI R17, 0xCC ; carga 0xCC dentro de R17
SER R16    ; R16 = 0xFF
CLR R17  ; R17 = 0x00 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.11.- Instrucciones para manipulación de bits

El microcontrolador ATmega2560 cuenta con diversas instrucciones para la manipulación de


bits, tanto en registros de propósito general (GPRs) como en registros de función específica
(SFRs) y en el registro de estado (del cual se hablará más adelante).

Las instrucciones para manipulación de bits pueden llevar a cabo diferentes operaciones,
tales como desplazamiento lógico, desplazamiento aritmético, rotación, forzar un bit
específico a 1, forzar un bit específico a 0, entre otras.

Por practicidad, solo se revisarán las instrucciones más relevantes para los objetivos del
curso:

LSL (Desplazamiento lógico hacia la izquierda)


LSR (Desplazamiento lógico hacia la derecha)
ASR (Desplazamiento aritmético hacia la derecha)
SBI (Setear un bit en un SFR)
CBI (Limpiar un bit en un SFR)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.12.- La instrucción LSL (Logical Shift Left)

La instrucción LSL es usada para desplazar (desplazamiento lógico) un bit hacia la izquierda
el valor almacenado en un GPR. La instrucción LSL tiene el siguiente formato

LSL Rd ; Desplazamiento lógico hacia la izquierda

Por ejemplo, el siguiente código almacena el valor 0x26 en el registro R20 y luego aplica 03
desplazamientos consecutivos hacia la izquierda:

LDI R20, 0x26 ; R20 = 0010 0110 (38)
LSL R20  ; R20 = 0100 1100 (76)
LSL R20  ; R20 = 1001 1000 (152)
LSL R20  ; R20 = 0011 0000 (48)

Se debe tener claro que, esta instrucción lleva a cabo un desplazamiento y no una rotación.
La diferencia fundamental es que para una rotación debe tomarse en cuenta un bit de
acarreo, mientras que para un desplazamiento este bit no es relevante.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.13.- La instrucción LSR (Logical Shift Right)

La instrucción LSR es usada para desplazar (desplazamiento lógico) un bit hacia la derecha
el valor almacenado en un GPR. La instrucción LSR tiene el siguiente formato

LSR Rd ; Desplazamiento lógico hacia la derecha

Por ejemplo, el siguiente código almacena el valor 0x26 en el registro R20 y luego aplica 03
desplazamientos consecutivos hacia la derecha:

LDI R20, 0x26 ; R20 = 0010 0110 (38)
LSR R20  ; R20 = 0001 0011 (19)
LSR R20  ; R20 = 0000 1001 (9)
LSR R20  ; R20 = 0000 0100 (4)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.14.- La instrucción ASR (Arithmetic Shift Right)

La instrucción ASR es usada para desplazar (desplazamiento aritmético) un bit hacia la


derecha el valor almacenado en un GPR. La instrucción ASR tiene el siguiente formato

ASR Rd ; Desplazamiento aritmético hacia la derecha

El desplazamiento aritmético hacia la derecha es útil cuando se desea dividir un número


negativo entre una potencia de 2 de manera esiciente.

Por ejemplo, el siguiente código almacena el valor 0x8C (-116 en complemento a 2) en el


registro R20 y luego aplica 03 desplazamientos aritméticos consecutivos hacia la derecha:

LDI R20, 0x8C ; R20 = 1000 1100 (­116)
LSR R20  ; R20 = 1100 0110 (­58)
LSR R20  ; R20 = 1110 0011 (­29)
LSR R20  ; R20 = 1111 0001 (­15)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.15.- La instrucción SBI (Set Bit in I/O register)

La instrucción SBI es usada para forzar a ‘1’ un bit en particular de un registro de función
específica (SFR). La instrucción SBI tiene el siguiente formato:

SBI A, n ; Forzar el bit n de A a 1
; 0 < A < 63 

Esta instrucción es útil cuando se tienen diferentes señales conectadas a un puerto del
microcontrolador, y solo se desea modificar una señal en particular.

Por ejemplo, el siguiente código configura el PUERTO F como salida, almacena el valor
0x8C en un GPR, muestra el valor del GPR en PORTF y fuerza el bit 5 de PORTF a ‘1’ :

LDI R20, 0xFF ; Cofigurar todos los pines del
OUT DDRF, R20 ; PUERTO F como salida
LDI R20, 0x8C  ; R20 = 1000 1100 (0x8C) 
OUT PORTF, R20 ; PORTF = 1000 1100 (0x8C)
SBI PORTF, 5 ; PORTF = 1010 1100 (0xAC) 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.16.- La instrucción CBI (Clear Bit in I/O register)

La instrucción CBI es usada para forzar a ‘0’ un bit en particular de un registro de función
específica (SFR). La instrucción CBI tiene el siguiente formato:

CBI A, n ; Forzar el bit n de A a 0
; 0 < A < 63 

Esta instrucción es útil cuando se tienen diferentes señales conectadas a un puerto del
microcontrolador, y solo se desea modificar una señal en particular.

Por ejemplo, el siguiente código configura el PUERTO F como salida, almacena el valor
0x8C en un GPR, muestra el valor del GPR en PORTF y fuerza el bit 3 de PORTF a ‘1’ :

LDI R20, 0xFF ; Cofigurar todos los pines del
OUT DDRF, R20 ; PUERTO F como salida
LDI R20, 0x8C  ; R20 = 1000 1100 (0x8C) 
OUT PORTF, R20 ; PORTF = 1000 1100 (0x8C)
CBI PORTF, 3 ; PORTF = 1000 0100 (0x84) 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.16.- La instrucción CBI (Clear Bit in I/O register)

Ejercicio 01:
Conectar 08 LEDs al PUERTO F y otros 08 LEDs al PUERTO K del microcontrolador. Luego,
escribir un programa que lleve a cabo lo siguiente: Crear dos etiquetas para valores
constantes VALOR1 y VALOR2, cargar una de las constantes a R16 y la otra a constante a
R17, llevar a cabo la multiplicación (sin signo) de ambos valores y, finalmente, mostrar el
resultado de la multiplicación en los LEDs del PUERTO F (LSB) y del PUERTO K (MSB).

Ejercicio 02:
Conectar 08 LEDs al PUERTO F del microcontrolador. Luego, escribir un programa que lleve
a cabo lo siguiente: Crear una etiqueta para un valor constante NUMERO, cargar esta
constante al registro R18, calcular el valor del número representado en código Gray de 8 bits,
cargar el resultado del cálculo en el registro R12, mostrar el resultado en los LEDs del
PUERTO F.

Ejercicio 03:
Conectar 08 LEDs al PUERTO F del microcontrolador. Luego, escribir un programa que lleve
a cabo lo siguiente: Definir una etiqueta VALOR_INICIAL = 0xAA, cargar el valor inicial al
registro R19, mostrar el valor inicial en los LEDs del PUERTO F. Después, empleando las
instrucciones SBI y CBI, modificar el programa para encender los LEDs en las posiciones 0, 4
y apagar los LEDs en las posiciones 1, 3 y 7 (todo esto sin alterar el estado de los demás
LEDs). Una vez que el programa funcione, intente cumplir la misma tarea mediante el uso de
las instrucciones AND/ANDI y OR/ORI.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.17.- Instrucciones de salto incondicional

El microcontrolador ATmega2560 cuenta 03 instrucciones principales de salto incondicional:

JMP (Salto directo)


RJMP (Salto relativo)
IJMP (Salto indirecto)

Para los objetivos del curso no es necesario el manejo de todas estas instrucciones, por lo
que solamente se tratará el uso de la instrucción JMP.

Por otro lado, existen 02 instrucciones “especiales” que también permiten realizar saltos
incondicionales: CALL (Llamar) y RET (Volver). Estas instrucciones serán tratadas con
detalle cuando veamos la parte de llamada a sub-rutinas y el uso de la pila (stack).

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.18.- La instrucción JMP (Direct Jump)

La instrucción JMP es usada para llevar a cabo un salto incondicional hacia CUALQUIER
UBICACIÓN en la memoria de programa. Esta instrucción tiene el siguiente formato :

JMP k ; Realiza un salto condicional a la
; instrucción en la ubicación k 

Para emplear esta instrucción es necesario el uso del campo “etiqueta” de la instrucción hacia
la que se desea realizar el salto.

Esta instrucción resulta útil cuando se desea implementar bucles infinitos.

Por ejemplo, el siguiente código configura el PUERTO F como salida, lee el PUERTO K y
muestra su valor en el PUERTO F. La lectura y escritura de los puertos se realiza de manera
permanente:

LDI R20, 0xFF ; Cofigurar todos los pines del
OUT DDRF, R20 ; PUERTO F como salida
BUCLE: LDS R3, PINK ; Leer PINK y guardar en R3
OUT PORTF, R3 ; Mostrar el valor de R3 en PORTF
JMP BUCLE ; Repetir indefinidamente
 

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- INSTRUCCIONES DEL ATMEGA2560

2.18.- La instrucción JMP (Direct Jump)

Ejercicio 04:
Conectar 08 LEDs al PUERTO F y conectar 08 pulsadores (con resistencias pull-down) al
PUERTO K del microcontrolador. Luego, escribir un programa que lleve a cabo lo siguiente:
Leer el valor del PINK, calcular el complemento a dos del valor leído, mostrar el resultado en
los LEDs del PUERTO F. Repetir la lectura del puerto permanentemente.

NOTA: Si no cuenta con resistencias pull-down, una alternativa es activar las resistencias
pull-up internas del MCU e invertir el valor leído de PINK antes del procesamiento.

Ejercicio 05:
Conectar 08 LEDs al PUERTO F y conectar 08 pulsadores (con resistencias pull-down) al
PUERTO K del microcontrolador. Luego, escribir un programa que lleve a cabo lo siguiente:
leer el valor en PINK, forzar a ‘1’ los bits en las posiciones 0 y 7 en el valor leído, mostrar el
valor (con los bits modificados) en los LEDs del PUERTO F. Repertir la lectura del puerto
permanentemente.

Ejercicio 06:
Conectar 08 LEDs al PUERTO F y conectar 08 pulsadores (con resistencias pull-down) al
PUERTO K del microcontrolador. Luego, escribir un programa que lleve a cabo lo siguiente:
leer el valor en PINK, invertir los bits en las posiciones 0, 5 y 7 en el valor leído, y mostrar el
valor (con los bits modificados) en los LEDs del PUERTO F. Repetir la lectura del puerto
permanentemente.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.1.- Diagrama de flujo (Flowchart)

Inicio o final Decisión

Proceso Entrada o salida


de datos

Proceso pre-definido Conector

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.1.- Diagrama de flujo (Flowchart)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.1.- Diagrama de flujo (Flowchart)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.2.- SREG (Status Register)

El registro de estado (SREG), también llamado registro de banderas, es un registro de 8 bits.


Los bits C, Z, N, V, S y H son llamados banderas condicionales, lo cual significa que todos
ellos indican algunas condiciones (eventos) resultantes luego que una instrucción se ha
ejecutado.

Cada una de las banderas condicionales puede ser usada para llevar a cabo un salto
condicional, como se verá más adelante.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.2.- SREG (Status Register)

Bandera acarreo (C)


Esta bandera se activa cuando se lleva un bit de acarreo (carry) en una suma o una resta.
También se usa para detectar desbordamiento de números enteros sin signo.

Bandera cero (Z)


Eta bandera refleja el resultado de una operación aritmética o lógica. Si el resultado es cero,
entonces Z = 1. Por lo tanto, Z = 0 si el resultado es diferente de cero.

Bandera negativo (N)


La representación de números enteros con signo utiliza el nit más significativo (bit 7) como bit
de signo. La bandera N refleja el resultado de una operación aritmética. Si el bit 7 del
resultado es cero, entonces N = 0 (el resultado es positivo); si el bit 7 del resultado es 1,
entonces N = 1 (el resultado es negativo).

Bandera desbordamiento (V)


Esta bandera indica un desbordamiento al llevar a cabo una operación aritmética entre
números enteros con signo.

Bandera signo (S)


Esta bandera es el resultado de un XOR entre las banderas N y V. Es decir: S = N XOR V

Bandera medio acarreo (H)


Empleado para trabajar con formato BCD (binary coded decimal).

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.2.- SREG (Status Register)

Algunas instrucciones afectan los 06 bits bandera (por ejemplo ADD). Sin embargo, otras
funciones no afectan ninguno de los bits bandera (las instrucciones de carga como LDI y LDS
están en esta categoría). Otras instrucciones afectan solo algunos de los bits bandera (las
instrucciones lógicas están en esta categoría).

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.2.- SREG (Status Register)

Por ejemplo, se tiene el siguiente segmento de código en Assembly:

LDI R20, 4 ; R20 = 4


DEC R20 ; R20 = R20 ­ 1
DEC R20 ; R20 = R20 ­ 1
DEC R20 ; R20 = R20 ­ 1
DEC R20 ; R20 = R20 ­ 1

La instrucción DEC en el código afecta el bit bandera Z del registro de estado:

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.3.- Instrucciones de comparación

En algunas ocasiones deseamos evaluar si un número es positivo, negativo, mayor que otro
número, etc. Para estos casos resulta más práctico emplear las instrucciones de
comparación, las cuales fueron diseñadas especialmente diseñadas para este propósito.

Las instrucciones de comparación afectan los bits bandera, pero sin modificar el contenido de
ningún registro de propósito general (a diferencia de las instrucciones aritméticas y lógicas).

Las instrucciones de comparación más importantes, con sus respectivos formatos, son las
siguientes:

CP (Compara dos registros)

CP Rd, Rr ; Opera internamente Rd ­ Rr

CPI (Compara un registro con un inmediato)

CPI Rd, k ; Opera internamente Rd – k


;  R16 < Rd < R31   y 0 < k < 0xFF

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.4.- Instrucciones de salto codicional

Las instrucciones de salto condicional son aquellas que llevan a cabo un salto si y solo si una
bandera determinada tiene un valor determinado. Si esta condición no se cumple, entonces el
salto no es llevado a cabo y el programa ejecuta la siguiente instrucción.

Cada instrucción de salto evalúa una bandera en particular, tal y como se muestra en la
siguiente tabla:

Salta si es menor
Salta si es mayor o igual
Salta si es igual
Salta si no es igual
Salta si es negativo
Salta si es positivo
Salta si hubo desbordamiento
Salta si no hubo desbordamiento

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.4.- Instrucciones de salto codicional

Ejemplo:

Escribir un programa que limpie el registro R20, luego que sume 3 a R20 diez veces y que
muestre el resultado final en el PUERTO F. Utilice la bandera Z y la instrucción BRNE.

.INCLUDE “m2560def.inc”
.ORG 0x00

LDI R31, 0xFF ; Configura todos los pines del


OUT DDRF, R31 ; PUERTO F como salida
LDI R16, 10 ; R16 = 10, será el contador
LDI R20, 0 ; R20 = 0
LDI R21, 3 ; R21 = 3
REPETIR: ADD R20, R21 ; Sumar 3 a R20
DEC R16 ; Decrementar R16 (contador)
BRNE REPETIR ; Repetir hasta que el contador sea 0
OUT PORTF, R20 ; Mostrar el resultado en el PUERTO F
AQUI: JMP AQUI ; Permanecer aqui

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.4.- Instrucciones de salto codicional


INICIO

R16 = 10

R20 = 0

R20 = R20 + 3

R16 = R16 - 1

F
¿R16 ≠ 0?

Mostrar
V
resultado

FIN

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.5.- Instrucciones de salto pequeño (SKIP)

Las instrucciones de salto vistas anteriormente nos permiten realizar un salto hacia cualquier
parte del código, por ese motivo necesitan una ubicación (etiqueta) como operando. En
contraste, las instrucciones de salto pequeño (skip) solamente pueden saltar una instrucción.
Por ejemplo: si nos encontramos en la instrucción 35 y la condición de salto se cumple,
entonces el procesador pasará a ajecutar la instrucción 37, saltándose la instrucción 36. Si la
condición de salto no se cumple, entonces todas las instrucciones son ejecutadas de manera
regular.

Estas instrucciones se caracterizan por traer “incorporado” el test y por no requerir de una
etiqueta de ubicación para realizar el salto (ya que la ubicación de destino está implícita).

El ATmega2560 cuenta con 04 instrucciones de salto pequeño(skip):

SBRC (Salta si el bit en el GPR es ‘0’)


SBRS (Salta si el bit en el GPR es ‘1’)
SBIC (Salta si el bit en el SFR es ‘0’)
SBIS (Salta si el bit en el SFR es ‘1’)

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.6.- La instrucciones SBRC y SBRS

La instrucciones SBRC y SBRS son usadas para saltarse una instrucción si, en un registro
de propósito general (GPR), un bit en particular es ‘0’ o es ‘1’, respectivamente. Estas
instrucciones tienen el siguiente formato:

SBRC Rd, n ; Salta una instrucción si el bit n
; de Rd es 0 

SBRS Rd, n ; Salta una instrucción si el bit n
; de Rd es 1

Por ejemplo, el siguiente código configura el pin 7 PUERTO B como salida, y fuerza dicho pin
a ‘1’ solo si el pin 3 del PUERTO K se encuentra en ‘0’ :

LDI  R20, 0x80 ; Cofigurar el pin 7 del


OUT  DDRB, R20 ; PUERTO B como salida
BUCLE: LDS  R20, PINK  ; R20 = PINK 
SBRS R20, 3   ; Salta si RB3 es 1 
JMP ALTO ; Salta a ALTO 
BAJO: CBI PORTB, 7 ; Fuerza PB7 a cero
JMP BUCLE ; Repite el bucle
ALTO: SBI PORTB, 7 ; Fuerza PB7 a 1
JMP  BUCLE ; Repite el bucle

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.7.- La instrucciones SBIC y SBIS

La instrucciones SBRC y SBRS son usadas para saltarse una instrucción si, en un registro
de función específica (SFR), un bit en particular es ‘0’ o es ‘1’, respectivamente. Estas
instrucciones tienen el siguiente formato:

SBIC A, n ; Salta una instrucción si el bit n
; de A es 0,   0 < A < 63                 

SBIS A, n ; Salta una instrucción si el bit n
; de A es 1,   0 < A < 63

Por ejemplo, el siguiente código configura el pin 7 PUERTO B como salida, y fuerza dicho pin
a ‘1’ solo si el pin 3 del PUERTO F se encuentra en ‘0’ :

LDI  R20, 0x80 ; Cofigurar el pin 7 del


OUT  DDRB, R20 ; PUERTO B como salida
BUCLE: SBIS PINF, 3   ; Salta si RF3 es 1 
JMP ALTO ; Salta a ALTO 
BAJO: CBI PORTB, 7 ; Fuerza PB7 a cero
JMP BUCLE ; Repite el bucle
ALTO: SBI PORTB, 7 ; Fuerza PB7 a 1
JMP  BUCLE ; Repite el bucle

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.8.- La instrucciones SBIC y SBIS

Ejercicio 07:
Conectar 08 LEDs al PUERTO F del microcontrolador. Luego, escribir un programa que lleve
a cabo lo siguiente: Crear una etiqueta N que defina un valor constante que valga entre 1 y
22, implementar un código que calcule la suma de los N primeros números naturales
mediante un bucle, y que muestre el resultado en los LEDs del PUERTO F.

Ejercicio 08:
Conectar 08 LEDs al PUERTO F del microcontrolador y 08 pulsadores (con resistencias pull-
down). Luego, escribir un programa que lleve a cabo lo siguiente: Leer el valor de entrada del
PUERTO K, interpretar ese valor como un número entero con signo de 8 bits, calcular y
mostrar el valor absoluto de este valor en los LEDs del PUERTO F.

Ejercicio 09:
Conectar 02 pulsadores a cualquiera de los puertos del microcontrolador. Luego, escribir un
programa que lleve a cabo lo siguiente: configurar el pin 7 del PUERTO B (PB7) como salida,
activar las resistencias pull-up internas correspondientes a los pines donde están los botones,
y hacer que el LED conectado a PB7 responda a las entradas de acuerdo a una lógica de
“control bimanual”. Una vez que el programa funcione correctamente, modificarlo para que
funcione con una lógica de “luz de escalera”.

NOTA: Si no está familiarizado con los términos “control bimanual” y “luz de escalera”,
preguntar al profesor.

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- FLUJO DE CONTROL EN ASSEMBLY

3.8.- La instrucciones SBIC y SBIS

(a) Control bimanual (b) Iluminación de escalera

Semana 06 – Instrucciones y saltos Miguel A. Torres Lázaro

Anda mungkin juga menyukai