# data[].attributes.headline
1.1.1 Características generales de la arquitectura ARM

# data[].attributes.subject
1.1.1 Características generales de la arquitectura ARM

# data[].attributes.body
ARM es una arquitectura RISC (Reduced Instruction Set Computer=Ordenador con Conjunto Reducido de Instrucciones) de 32 bits, salvo la versión del core ARMv8- A que es mixta 32/64 bits (bus de 32 bits con registros de 64 bits). Se trata de una arquitectura licenciable, quiere decir que la empresa desarrolladora ARM Holdings diseña la arquitectura, pero son otras compañías las que fabrican y venden los chips, llevándose ARM Holdings un pequeño porcentaje por la licencia.
-  El chip que lleva la Raspberry Pi es el BCM2835
-  La CPU en cuestión es la ARM1176JZF-S
-  chip de la familia ARM11 que usa la arquitectura ARMv6k.

# data[].attributes.headline
1.1.1 Características generales de la arquitectura ARM

# data[].attributes.subject
1.1.1 Características generales de la arquitectura ARM

# data[].attributes.body
Registros Generales. Su función es el almacenamiento temporal de datos. Son los 13 registros que van R0 hasta R12.

Registros Especiales. Son los últimos 3 registros principales: R13, R14 y R15. Como son de propósito especial, tienen nombres alternativos

Registro CPSR. Almacena las banderas condicionales y los bits de control. Los bits de control definen la habilitación de interrupciones normales (I)
interrupciones rápidas (F)
modo Thumb 1 (T) y el modo de operación de la CPU.

Existen 4 banderas y son las siguientes:
N. Se activa cuando el resultado es negativo.
Z. Se activa cuando el resultado es cero o una comparación es cierta.
C. Indica acarreo en las operaciones aritméticas.
V. Desbordamiento aritmético.

# data[].attributes.body
El ensamblador es un lenguaje de bajo nivel que permite un control directo de la CPU y todos los elementos asociados. Cada línea de un programa ensamblador consta de una instrucción del procesador y la posición que ocupan los datos de esa instrucción.

características
la flexibilidad
la posibilidad de acceso directo a nivel de registro.

desventajas
los programas contienen un número elevado de líneas y la corrección y depuración de éstos se hace difícil.

# data[].attributes.body
Los pasos habituales para hacer un programa son los siguientes:

primero es escribir el programa en el lenguaje fuente mediante un editor de programas.

El resultado es un fichero en un lenguaje que puede entender el usuario, pero no la máquina.

Para traducirlo a lenguaje máquina hay que utilizar un programa traductor.

Éste genera un fichero con la traducción de dicho programa, pero todavía no es un programa ejecutable.

Un fichero ejecutable contiene el programa traducido más una serie de códigos que debe tener todo programa que vaya a ser ejecutado en una máquina determinada.

Entre estos códigos comunes se encuentran las librerías del lenguaje.

El encargado de unir el código del programa con el código de estas librerías es un programa llamado montador (linker) que genera el programa ejecutable

# data[].attributes.body
Recuerda que en laboratorio las raspberries no tienen monitor ni teclado, la única conexión con el mundo real es el puerto Ethernet. En el apéndice C se explica otro mecanismo para conectar. Así que antes de nada averigua cuál es la dirección IP de la Raspberry Pi dentro de la red local. Por defecto el usuario es pi y la contraseña raspberry.
Suponiendo que la dirección IP asignada es 192.168.1.42, utilizaremos ssh: ssh pi@192 .168.1.42
Y luego introduce la contraseña.
Ya conectado a la Raspberry Pi desde un PC a través de ssh.

Todos los alumnos se conectarán con el mismo nombre de usuario, por lo que hay que dejar limpio el directorio de trabajo antes de terminar la sesión. También es buena idea conectarte por ssh a la Raspberry que tengas en casa como acabamos de explicar, así te ahorras el tener que disponer de teclado y monitor extra.
Desde Windows puedes bajarte putty.exe en http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html (no requiere instalación) y crear un acceso directo en el escritorio con el siguiente destino, cambiando ruta y 192.168.1.42 por lo que corresponda

# data[].attributes.body
Admiten muchas posibilidades, debido a que es una operación en la cual el resultado tiene el doble de bits que cada operando. En la siguiente tabla vemos las 5 instrucciones de multiplicación que existen.
La instrucción mul realiza una multiplicación truncada, es decir, nos quedamos con los 32 bits inferiores del resultado. Como el signo del resultado es el bit más significativo el cual no obtenemos, esta multiplicación es válida tanto para operandos naturales (sin signo) como para enteros (con signo)

# data[].attributes.body
Recordemos que cuando se representa cualquier dato en memoria, éste tiene un valor explícito (el que tiene como dato guardado en binario) y un valor implícito (el que tiene interpretado como un tipo de dato determinado o como una instrucción).
En este apartado queremos que veais la diferencia entre el valor explícito y el valor implícito interpretado como un natural y como un entero.

# data[].attributes.body
Los desplazamientos lógicos desplazan los bit del registro fuente introduciendo ceros (uno o más de uno).
El último bit que sale del registro fuente se almacena en el flag C . El desplazamiento aritmético hace lo mismo, pero manteniendo el signo .
Las instrucciones de rotación también desplazan, pero el bit que sale del valor se realimenta. No existe ninguna instrucción para rotar hacia la izquierda ROL, ya que puede simularse con la de rotación a la derecha ROR que sí existe.

En estas instrucciones el bit desplazado fuera es el mismo que el que entra, además de dejar una copia en el flag C
Las instrucciones de rotación con el carry funcionan de manera similar, pero el bit que entra es el que había en el flag C y el que sale va a parar al flag C cbed A. Villena, R. Asenjo, F. Corbera. DAC-UMA. 26 1.2. Enunciados de la práctica .

Estas instrucciones sólo rotan un bit, al contrario que las anteriores que podían rotar/desplazar varios.
La rotación con carry a la derecha es RRX, no existe la contrapartida RLX porque se puede sintetizar con otra instrucción ya existente adcs.

Con adcs podemos sumar un registro consigo mismo, que es lo mismo que multiplicar por 2 o desplazar 1 bit hacia la izquierda. Si a esto le añadimos el bit de carry como entrada y actualizamos los flags a la salida, tendremos exactamente el mismo comportamiento que tendría la instrucción RLX

# data[].attributes.body
La traducción o ensamblado de un módulo fuente (nombreprograma.s) se realiza con el programa Gnu Assembler
con el siguiente comando:
as -o nombreprograma.o nombreprograma.s
El comando debe ir en minúsculas y el nombre como queramos, pero recomendamos minúsculas también. Las opción -o nombreprograma.o puede ir después de nombreprograma.s.
El as genera un fichero nombreprograma.o. Para montar (linkar) hay que hacer:
gcc -o nombreprograma nombreprograma.o
Nuevamente, tanto gcc como el nombre del programa deben estar en minúsculas. Este comando es muy parecido al anterior, podemos poner si queremos -o nombreprograma detrás de nombreprograma.o.
Una vez hecho ésto, ya tenemos un fichero ejecutable (nombreprograma) que podemos ejecutar o depurar con el gdb

# data[].attributes.headline
1.1.4. Configuración del entorno para realizar las prácticas en casa

# data[].attributes.subject
1.1.4. Configuración del entorno para realizar las prácticas en casa

# data[].attributes.body
Las instrucciones vienen detalladas en esta dirección: http://elinux.org/RPi_Easy_SD_Card_Setup

De forma alternativa podemos ejecutar la imagen anterior en un emulador de Raspberry Pi, y seguir gran parte de las prácticas con la comodidad de tu PC. Para ello partimos del archivo de imagen obtenido en el apartado 2 de la lista anterior, y seguimos los pasos según [5]. Los pasos son válidos para Windows y Linux,

# data[].attributes.headline
1.1.5. Aspecto de un programa en ensamblador

# data[].attributes.subject
1.1.5. Aspecto de un programa en ensamblador

# data[].attributes.body
Sección de datos. Viene identificada por la directiva .data. En esta zona se definen todas las variables que utiliza el programa con el objeto de reservar memoria para contener los valores asignados. Hay que tener especial cuidado para que los datos estén alineados en palabras de 4 bytes, sobre todo después de las cadenas. Alinear significa rellenar con ceros el final de un dato para que el siguiente dato comience en una dirección múltiplo de 4 (con los dos bits menos significativos a cero). Los datos son modificables.

Sección de código. Se indica con la directiva .text, y sólo puede contener código o datos no modificables. Como todas las instrucciones son de 32 bits no hay que tener especial cuidado en que estén alineadas. Si tratamos de escribir en esta zona el ensamblador nos mostrará un mensaje de error.

Datos Los datos se pueden representar de distintas maneras. Para representar números tenemos 4 bases. La más habitual es en su forma decimal, la cual no lleva ningún delimitador especial. Luego tenemos otra muy útil que es la representación hexadecimal, que indicaremos con el prefijo 0x. Otra interesante es la binaria, que emplea el prefijo 0b antes del número en binario. La cuarta y última base es la octal, que usaremos en raras ocasiones y se especifica con el prefijo 0

Símbolos Como las etiquetas se pueden ubicar tanto en la sección de datos como en la de código, la versatilidad que nos dan las mismas es enorme. En la zona de datos, las etiquetas pueden representar variables, constantes y cadenas. En la zona de código podemos usar etiquetas de salto, funciones y punteros a zona de datos.