# data[].attributes.body
Dentro del editor tenemos una pequeña guía de comandos en la parte inferior.

También podemos acceder a una ayuda más detallada pulsando F1 dentro del editor.

los atajos de teclado más comunes se muestran en la imagen

# 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.

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.

# data[].attributes.body
Una vez que estemos familiarizados con el nano

podemos pasar al traductor:

as -o intro1.o intro1.s

Observa que cuando se traduce, aparece una lista de errores, o bien, una indicación de que el programa se ha traducido correctamente. No se puede pasar a la

etapa de montaje hasta que no se han solucionado los errores de sintaxis.

gcc -o intro1 intro1.o

De la misma forma, el montador nos informa de si todo el proceso ha sido correcto.

Una vez que hemos terminado con éxito este proceso podemos pasar el programa

al gdb

gdb intro1

El gdb ofrece muchas posibilidades, entre estas esta:
(gdb) quit
(gdb) start
(gdb) disassemble
(gdb) info

(gdb) print

# 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

NOTA: tanto el comando as como el nombre del programa son sensibles a las mayúsculas.

# data[].attributes.body
ARM es una arquitectura RISC de 32 bits, salvo la versión del core ARMv8- A que es mixta 32/64 bits

# data[].attributes.body
El chip en concreto que lleva la Raspberry Pi es el BCM2835, se trata de un SoC que contiene además de la CPU otrosel

# data[].attributes.body
Registros

La arquitectura ARMv6 presenta un conjunto de 17 registros (16 principales más

uno de estado) de 32 bits cada uno.

Su función es el almacenamiento temporal de datos. Son los

13 registros que van R0 hasta R12.

# data[].attributes.body
Son los últimos 3 registros principales: R13, R14 y R15.

Como son de propósito especial, tienen nombres alternativos.

SP/R13. Stack Pointer ó Puntero de Pila. Sirve como puntero para almacenar variables locales y registros en llamadas a funciones.

LR/R14. Link Register ó Registro de Enlace. Almacena la dirección de retorno cuando una instrucción BL ó BLX ejecuta una llamada a una rutina.

PC/R15. Program Counter ó Contador de Programa. Es un registro que indica la posición donde está el procesador en su secuencia de instrucciones. Se incrementa de 4 en 4 cada vez que se ejecuta una instrucción, salvo que ésta provoque un salto.

# data[].attributes.body
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 thump (T) y el modo de operación de la CPU.

Existen hasta 8 modos de operación

Modo Usuario

sólo podemos acceder a las banderas condicionales,

que contienen información sobre el estado de la última operación realizada por la ALU.

# data[].attributes.body
Las directivas son expresiones que aparecen en el módulo fuente e indican al compilador que realice determinadas tareas en el proceso de compilación. Son fácilmente distinguibles de las instrucciones porque siempre comienzan con un punto

# data[].attributes.body
Directivas de asignación: Se utilizan para dar valores a las constantes o reservar posiciones de memoria para las variable

Directivas de control: .text y .data sirven para delimitar las distintas secciones de nuestro módulo. .align alineamiento es para alinear el siguiente dato, rellenando con ceros

Directivas de operando: Se aplican a los datos en tiempo de compilación. En general, incluyen las operaciones lógicas

# 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.

# data[].attributes.body
Los pasos habituales para hacer un programa (en cualquier lenguaje) son los siguientes: lo 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.

# 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

Sección de código: Se indica con la directiva .text , y sólo puede contener código o datos no modificables.

Datos: 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.

Símbolos: Se especifican con las directivas .macro y .equ respectivamente y permiten que el código sea más legible y menos repetitivo.