Lnforme ARM2 BautistaAlvaro 201523902 EspitiaSantiago 201521090

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 26

LABORATORIO N°3 MICROPROCESADORES:

PROGRAMACIÓN Y DEPURACIÓN EN
PROCESADORES ARM
Alvaro Stiven Bautista Otalora
Santiago Espitia Torres
Facultad de Ingeniería
Programa de Ingeniería Electrónica extensión Tunja
Universidad Pedagógica y Tecnológica de Colombia
Tunja, Boyacá - Colombia
[email protected]
[email protected]

Resumen— En el presente informe se encontrará el desarrollo Se tiene un registro específico CPSR en el cual se
de la guía de laboratorio correspondiente a la programación de encuentran las banderas condicionales y bits de control en
lenguaje ensamblador en la plataforma ARM mediante el emulador donde estos últimos permiten habilitar interrupciones
y virtualizador QEMU. Aplicando las instrucciones,registros,uso normales (I), interrupciones rápidas (F), modo thumb (T) y
de memoria en aplicaciones reales y demás que permiten utilizar
mas fondo el proceso de compilación,depuración para sistemas
el modo de operación de la CPU. Para las banderas
basados en la arquitectura ARM AArch32. condicionales se puede encontrar las banderas N de
resultado negativo, Z de resultado cero o comparaciones
ciertas, C para acarreos de operaciones aritméticas y V para
indicar desbordamiento aritmético. Estas banderas
I. INTRODUCCIÓN condicionales se activan al poner una “s” después del
Se debe conocer que la arquitectura RISC de 32 bits de nemotécnico de la instrucción. [9]
ARM, anteriores a la arquitectura ARMv8-A es una
arquitectura licenciada por ARM Holdings pero con la II. OBJETIVO
particularidad de que esta no fabrican ni venden los chips.
En el manejo de la placa Raspberry Pi se encuentra que el Consolidar conocimientos en el lenguaje
chip específico que esta maneja es el BCM2835 el cual es ensamblador utilizado en la arquitectura ARM,
un SoC compuesto por CPU, un núcleo GPU, y un núcleo aprendiendo instrucciones y escritura de programas
DSP destinado al procesamiento y representación de señales mediante aplicaciones prácticas, como también la
analógicas. Se tiene la CPU ARM1176JZFS de la familia depuración de un sistema basado en la arquitectura
ARM11 y usa la arquitectura ARMv6k; en esta se presentan ARM Arch 32.
17 registros de 32 bits. III. MATERIALES

● Computador Personal.
● Virtualización en QEMU ARM versatilePB
(Raspberry Pi 1).

IV. DESARROLLO DE LA PRÁCTICA

● Parte 1: Adecuación de herramientas

1) Se adecuo el programa utilizado anteriormente


utilizando el sistema operativo Raspberry OS LITE
para utilizar únicamente la terminal tty para tener
menos sobrecarga en el procesador y RAM del
sistema operativo anfitrión por lo tanto se utiliza el
siguiente comando para correr el sistema

Una vez cargado el sistema operativo se inicializa en la


siguiente pantalla de QEMU

Se genera el siguiente código de ejemplo 1.s donde se


encuentra la sección de datos con la definición de las
variables, la sección de código con las instrucciones del
programa, la definición de punteros y demás para ejecutar la
aplicación definida.

● Compilación y depuración de un programa en


ARM
El ensamblado de un módulo fuente (ejemplo_l.s) se realiza
con el programa GNU Assembler, con el siguiente
comando: as -o ejemplo 1.o ejemplo 1.s, una vez se ejecuta
este comando se enlazan los objetos con el comando gcc -o
ejemplo_1 ejemplo_1.o y se utiliza el GNU Debugger con
2) Se modifica el siguiente archivo /etc/ld.so.preload el siguiente comando: gdb ejemplo_1, dichos comandos se
y se comenta la única línea existente para evitar ejecutan de la siguiente manera:
problemas de compilación.

Parte 2: Tutorial de Compilación, Ejecución y


Depuración
Se inicia GDB y se ejecuta el comando disassemble y
observamos las instrucciones han cambiado como se
muestra además de tener se observan los valores de los
registros.

Para realizar el código en lenguaje C se utiliza el editor de


texto plano nano con el nombre del archivo ejemplo _2.c,
para traducir este código a lenguaje ensamblador se usa el
comando gcc -Os -S -o ejemplo 2.s ejemplo 2.c. De esta
manera se genera el código ensamblador correspondiente el
cual no se encuentra optimizado.

se nota al que usar print se cambia el valor del registro R0 a


2, después se ejecuta el comando stepi dos veces vemos que
el PC ha avanzado dos posiciones

por último si se utiliza el comando continue, se puede


ejecutar el programa en su totalidad llegando hasta el final Para comprobar la optimización del código se utiliza el
comando gcc -03 -S -o ejemplo _2_ rapido.s ejemplo 2.c
el cual genera el siguiente código fuente una vez ejecutado:

● Compilación de un programa en C
Como se ve comentariado en el código se mueve el valor
255 al registro R0, luego un valor de -281 al registro R1,
enseguida un valor de 54116 al registro R4, a partir de ello
se mueve luego el valor FFB1 a los últimos 16 bits del
registro R4. Finalmente se genera el movimiento del
contenido del registro R5 al registro R4. por último se
genera la salida del programa mediante el comando lr.

Este código primero mueve el registro 4 el número 0, este


valor se carga al registro R1, luego se carga el valor de R5 al
R0, se suma 1 al registro R4 y se suma a sí mismo
cumpliendo el valor del iterador i y se imprime este valor
luego se compara con 5 si este valor se alcanza en el registro
R4 se salta a la etiqueta .L2 y se repite el ciclo.

Parte 3: Comprobación

● Instrucción de movimiento (MOV)


Esta instrucción permite mover datos constantes dentro de
los registros o mueve estos datos de un registro a otro.
En esta imagen se explica que el valor asignado al registro
es demasiado grande por lo tanto se cambia por el valor 9
Como se ve el uso del comando MOV permite un límite de
bits de 16 por tanto se implementa el comando MOVT, para
ello es necesario activar el modo thumb pero aunque se
intentó no se logra el funcionamiento de dicho modo por
tanto se implementa el comando MOV en cambio del
comando MOVT y el valor posterior se cambió por uno de
menos bits que entrara en el número de bits permitido por
MOV uno menor a 8 bits.

● Instrucciones de Desplazamiento y Rotación

Estas instrucciones de desplazamiento y rotación sirven para


cambiar la posición de los valores de los bits en un registro.

Desplazamiento lógico a la derecha (LSR)


Se ingresa a la etiqueta Stop
El número de desplazamiento corresponde a la división por
n
2 .
Este desplazamiento afecta el el registro CPSR en su último
dando un valor de 4

Se realiza 6 desplazamientos obteniéndose un valor de 8 en


el registro R4

Se evidencia el branch nuevamente a la etiqueta STOP.

● Desplazamiento aritmético a la derecha (ASR)

Es similar a la división con signo por 2n .

Se realizaron 6 desplazamientos obteniéndose un valor de 8


en el registro R2.
Como se evidencia se realiza un serie de desplazamientos
donde inicialmente se realizan 5 desplazamientos del valor
encontrado en R3 y el resultado se almacena en el registro
R4; luego tras haber guardado el valor 7 se realizan estos
desplazamientos en el valor del registro R3 y se almacena el
resultado en el registro R2; luego se le realizan 5
desplazamientos al valor que se encontraba en el registro R5
(177) y el resultado se almacenará en el registro R6.
Finalmente se realizan 5 desplazamientos del valor en el
registro R5 y se guardará en el registro R7.

Nuevamente vemos cómo se almacena el resultado de 5 en


el registro R7, producto de los 5 desplazamientos del valor
177 que se encuentra en el registro R5.

En la anterior figura se evidencia el almacenamiento inicial


de los valores respectivos en cada registro.

● Desplazamiento lógico a la izquierda (LSL)


Esta instrucción de cambio lógico de la izquierda ya sea con
signo o sin signo, es equivalente a multiplicar por 2n donde
En la anterior figura se observa de forma clara el resultado n es igual al número de desplazamientos
de los 5 desplazamientos realizados al valor 177 que se
encontraba en el registro R5, y luego vemos el resultado de
5 en el registro R6.

177/2=88\2=44\2=22/2=11\2=5
Por último se realiza la bifurcación a la etiqueta stop pero
antes se observa en el registro R6 el valor de los 10
desplazamientos del registro R4.

● Rotación a la derecha (ROR)

Esta instrucción hace que los los bits se eliminen de un


extremo del registro y se inserten en el otro extremo.

Se tienen los valores de R7=12,R0=-641,R2=195,R4=119.

Vemos que se mueve inicialmente el valor 9 en el registro


R0, el valor en hexadecimal C3 (195 en decimal) en el
registro R1, el valor en hexadecimal A2 (162 en decimal) en
el registro R3 y el valor en hexadecimal B1 (129 en
decimal) en el registro R4. Luego se realizan una serie de
rotaciones comenzando con una rotación de 24 posiciones
del valor almacenado en el registro R1 y los almacena en el
registro R2. Enseguida se realiza una rotación del número
almacenado en R0 (9) al registro R3 y almacenado en el
registro R7. Se hace luego una rotación de 10 posiciones al
valor almacenado en el registro R3 y se almacena en el
Se realizan 3 desplazamientos de r0 obteniéndose un valor Registro R4, teniendo en cuenta claro que el registro R3
que se observa en R1, al igual se observan 12 ahora tendría el resultado de la anterior rotación. Finalmente
desplazamientos al valor de 195 equivalente a 798720, al se hace una rotación de 10 posiciones al nuevo valor del
igual que los 10 desplazamientos de R4 que tiene un valor registro R3 y se almacena en el registro R5.
de 121856 guardados en el registro R5.
Vemos en la anterior imagen el almacenamiento de los
valores anteriormente mencionados en los correspondientes
registros.

Vemos finalmente los resultados en cada registro tras la


realización de las respectivas rotaciones.
sta instru
● Rotación a la derecha extendida (RRX)

Esta instrucción rota el número a la derecha una posición


reemplazando el bit 31 con el valor del flag de carry y el bit
0 se mueve al flag da carry.
Aquí se observa el cambio del registro CSPR activándose
Se observan los valores originales de los registros R3,R4 Y solo el flag de negativo
R6.
Instrucciones de Acceso a Memoria

● Transferencia de datos de registro único

Se muestra el valor r3 de 154 y el registro cpsr antes de


realizar el desplazamiento.

Se inicia por ingresar un valor de 2D en hexadecimal (45 en


decimal) en el registro R0, luego un valor de 40 en
hexadecimal (64 en decimal) en el registro R1. Se carga la
dirección de la variable dato en el registro R2; se realiza la
suma del valor encontrado en el registro R1 y el valor del
registro R0. Finalmente se almacena el valor que hay en el
registro R0 en la dirección cargada en R2.

se realiza el primer desplazamiento se observa el


desplazamiento vemos que el cpsr no cambia su valor en el
bit de carry ya que el bit 0 del registro 4 es 0.
Se evidencian los procesos anteriormente mencionados.

Se carga el valor de 284867 en R1,688737 en R2 y se carga


la dirección 0x21024 en R4.

Se mueve el valor 0 de r0, se multiplica r1*r2 y se guarda en


R3.
● LDR se utiliza en este caso para cargar cualquier
constante en los registros, la cual puede ser de 32
bits, esto se utiliza para constantes que están fuera
del alcance de MOV y MVN para ello se ejecuta el
siguiente codigo:
Se observa los 9 desplazamientos en R3 el cual disminuye
su valor a 5712723, por último este valor se carga a la
dirección 0x21024.

● En este ejemplo se utilizan datos tipo BYTE.

● Modos de direccionamiento de memoria


Existen diferentes modos de direccionamiento de memoria
como son pre indexar con escritura, pre indexar y post
indexar.
Se calcula el valor de offset igual a 0x21030 donde se carga
nuevamente en la dirección de memoria el valor de 697.

Se calcula el valor de offset igual a 0x21054 donde se carga


nuevamente en la dirección de memoria el valor de 697. al
hacer el desplazamiento de R3.
Primero se realizan las primera instrucciones que dan como Direccionamiento post-indexado
resultado el valor de los registros R0=1192,R1=1889,
R3=12,R4=141.
OFFSET

Se guarda en la dirección de offset 0x21028 el valor de 697. Se observa que la dirección de memoria cargada en R2
contiene al valor de R1 pero se observa que después el
contenido de R2 cambia al sumarle la constante 12 dando un
valor de 135216 después se le suma 24 para dar un valor de
135240 con esta instrucción el contenido de R2 cambia.

Direccionamiento pre-indexado
después al ejecutar la última instrucción se desactiva el flag
0 porque el número testeado es positivo.

2) Escriba un programa que permita verificar las


diferencias entre las diferentes instrucciones de
multiplicación (MUL, UMULL, SMULL,
SMUWB, SMUTT). Compruebe mediante GOB
que los resultados sean correctos. Use tres variables
.word: Ox12345678, Ox87654321 y Ox00012345.

El contenido de R1 se guarda en la dirección de memoria de


R2 más la constante 32 por ello está ubicado en la dirección
0x21044.

Parte 4: Ejercicios Prácticos

1) La instrucción TST hace la operación AND entre


un registro y una máscara, y sólo actúa sobre los
flags. Rellene las casillas en blanco, teniendo en
cuenta que el flag Z se pone a uno cuando el
resultado de la AND es cero, y se pone a cero en
caso contrario. Para simplificar indicamos sólo los
16 bits menos significativos del registro R0.

MULL

El cpsr inicialmente se activa la bandera de zero y carry,flag


N se mantiene en cero, después se observa que al utilizar la
instrucción TST se evidencia que el flag N se activa,
SMULLWB

Este corresponde a una multiplicación con signo donde la


letra b selecciona la parte baja del registro del segundo
Este tipo de instrucción solo realiza una multiplicación cuyo factor.
resultado solo contiene 32 bits correspondientes a los 32
bits inferiores del resultado SMULTT
UMULL

Este es similar al anterior pero es posible seleccionar si se


utiliza la parte baja o alta de ambos factores en este caso la
parte alta de ambos factores.
3) Escriba un bucle for que imprima los 50
Esta multiplicación se realiza entre operandos que no son primeros números pares naturales en orden
signados inverso (desde 100 hasta 2 en pasos de 2). Una
SMULL vez hecho esto, aplique desenrollamiento de
bucle de tal forma que el salto condicional se
ejecuta 10 veces, con 5 repeticiones cada vez.

En esta operación se tiene dos números enteros con signo


por lo cual su resultado es de tipo signed.
● Contraste con código C equivalente

Como se observa el resultado del código C es equivalente al


generado en assembly como se muestra a continuación:

4) Escriba en el ensamblador un código


equivalente al mostrado a continuación.
Primero haciendo uso de la instrucción ANDS y
un registro auxiliar, luego simplifique con la
instrucción TST. Compruebe los resultados
ensamblando el código C y contrastando los
valores producidos por su propio codigo en
ASM.

El codigo generado es el que se muestra a continuación: 5) Escriba un programa para realizar el ordenamiento
ascendente y descendente (seleccionando la función a
través de un valor cargado a registro) de 50 números
cargados en memoria RAM. El algoritmo de
ordenamiento puede ser simple, bubble sort, merge sort,
heapsort, o quicksort.

Teniendo en cuenta los requerimientos se plantea el


siguiente codigo:
Se debe crear un vector de tamaño 50 para poder tener los
datos en RAM una vez hecho esto se crea la función para
recorrer todos los elementos del vector para ordenarlos de
menor a mayor, esta función se llama en el main y se
mandan los parámetros para ordenar 50 números.

Se observa que se ejecuta el algoritmo de ordenamiento


bubble sort ascendente como se muestra a continuación:

Para entender de mejor manera se plantea el siguiente 6) Escriba en ensamblador un código equivalente al
código en C mostrado a continuación. Compruebe los resultados
ensamblando el código C y contrastando los valores
producidos por su propio código en ASM.

Este genera una salida correspondiente a los años donde


hubo olimpiadas, mundial de futbol o no hubo ninguno de
los dos.

7) Escriba un programa que implemente una


calculadora de tasa de cambio. Las divisas a usar son
Peso Colombiano y otra que usted seleccione. La
calculadora deberá permitir calcular la tasa de cambio
en ambos sentidos. Use la tasa de cambio
Se observa el codigo ensamblador generado donde se aplica correspondiente al día de la elaboración de este punto.
la sentencia switch dentro de un bucle en este caso for.

Además se comprobó utilizando el siguiente código en


lenguaje C
Como se observa se realiza el código fuente en lenguaje C
para la calculadora de tasa de cambio se escoge el dólar y el
peso colombiano a continuación se muestran dos
conversiones respectivamente.

Dólares a peso colombiano

Peso colombiano a dólares

8. Escriba un programa para buscar un elemento en un


árbol de búsqueda binario. Usted puede definir los
parámetros que sean más apropiados para su solución.

El código desarrollado es el siguiente:

Para verificar el codigo se realiza la siguiente prueba


mediate GDB

Pero se observa que el programa no responde o genera


alguna salida deberia mostrar el siguiente mensaje si fuerza
exitoso:
9) Escriba un programa que imprima n números de la
secuencia de fibonacci. El valor de n debe ser
determinado por el usuario.

Se multiplican las matrices cuadradas y se observa que el


resultado equivalente corresponde al obtenido en alguna
aplicación para calcular matrices en este caso derive 6.
10) Escriba un programa que permita multiplicar
matrices cuadradas 3*3. Las matrices pueden estar ● Parte 5: Aplicación
definidas en el código fuente. Puede usar una estructura
propia o basada en vectores. Escriba un programa en ensamblador ARM para
realizar alguno de los siguientes problemas planteados.
Provea un diagrama de flujo que permita la verificación
teórica. Seleccione uno de los siguientes ejemplos basado
en la suma reducida a 1 dígito del último dígito del
código estudiantil de los integrantes de esta práctica de
laboratorio. Integrante 1 (Codigo 201523902) Integrante
2 (Codigo 201521090). 2+0 = 2, 2+0= 1.

2. Calculadora de resistencias para un circuito temporizador


basado en NE555 en modo Monoestable. Las variables son
Rl, Cl, ancho del pulso. Si se ingresan las variables de los
componentes discretos (Rl y Cl), calcule el ancho del pulso.
Si se ingresa un valor de un componente discreto y el ancho
del pulso, calcule el valor del componente discreto restante.
El diagrama de flujo desarrollado de la aplicación es el que
se muestra a continuación:

Codigo Generado en assembly a partir del codigo C


Comprobación programa de aplicación

Elementos Pasivos(Condensador y Resistencia)


Se calcula el ancho de pulso teniendo en cuenta el valor del
condensador y la resistencia.

Para tener un mejor entendimiento del código se observa el


código en lenguaje de alto nivel:
V. CONSULTAS
a) Consulte los esquemas de almacenamiento
de datos “Big Endian” y “Little Endian”
(Endianess):

En el caso de cómo las máquinas realizan el


almacenamiento de datos y en especial cuando se trata de
datos de más de un byte (Endianess); para dichos casos se
tienen dos formas, la primera de ellas es la BIG ENDIAN
en la cual el orden está dado desde el byte de mayor
significancia hasta el de menor significancia (el byte menos
significativo tiene la dirección más alta); caso contrario al
que se encuentra en el LITTLE ENDIAN (el byte menos
significativo tiene la dirección más baja).[1]

Fig 21. Ejemplificación de Big Endian y Little Endian


(Fuente: [1]).
Elementos Pasivo y activo (Condensador y ancho de
pulso)
b) Consulte el proceso de compilación de
aplicaciones ARM usando el GNU Toolchain. Este
conjunto de herramientas comprende GNU
Assembler (as), GNU Compiler Collection (gcc) y
GNU Debbuger (gdb):

Primero la herramienta GNU Assembler se usa para


compilar linux y otros sistemas operativos como el sistema
operativo GNU, se accede a él mediante el comando as
desde el shell y hace parte del paquete GNU Binutils. Es por
defecto el back end de la siguiente herramienta: el GNU
Elementos Pasivo y activo (Resistencia y ancho de pulso) Compiler Collection la cual es un conjunto de compiladores
para varios lenguajes, destinados a aplicaciones como
también para sistemas operativos. Ahora bien el GNU
Debugger es el depurador estándar estándar del compilador
GNU. Este funciona para varios lenguajes de programación,
siendo portable para la depuración en varias plataformas Ahora si se busca un ejemplo podemos hacer uso del clásico
UNIX.[2] Hola mundo como se venía viendo:
Ahora bien, todas las anteriores son herramientas de
desarrollo de software de GNU Toolchain, que como se $ gcc hola.c
acaba de mencionar realiza un proceso en la compilación de
aplicaciones, este proceso se puede dar de la siguiente Con el código anterior se tendrá la salida el fichero
manera: ejecutable:
1. Preprocesado: Las directivas que inician con #,
como lo son #define, #include o #ifdef. $ a.out Hola mundo
2. Compilación: Se traduce el código fuente al código
objeto, para realizar llamadas externas sin resolver /* hola.c */
y teniendo direcciones de memoria relativas, #include main()
mediante código máquina (pasó de código fuente a {
código ensamblador). printf("Hola mundo\n"); return 0;
3. Enlazado: Se resuelve las llamadas pendientes y se }
asignan direcciones definitivas al ejecutable final
combinando los diferentes ficheros de código [3]
objeto (Traducción de código ensamblador a
código objeto). Para la generación de código depurable GNU Debugger
(gdb) se hace uso de la opción -g en la compilación y
c) Consulte la forma de uso básica de las enlazado de cualquier aplicación y mediante esto seguir con
herramientas más importantes mencionadas un nivel de información de depuración dada por tres niveles:
anteriormente, GNU Assembler (as), GNU Compiler
El primer nivel tiene la mínima cantidad de información de
Collection (gcc) y GNU Debugger (gdb). Exponga los depuración en el fichero de código objeto. Para este nivel no
argumentos básicos de cada programa, ejemplos de existe información que relacione el código ejecutable con el
uso y particularidades específicas referentes de su código fuente de modo que no se puede evaluar las variables
uso en el proceso de compilación en ARM. locales; sin embargo se tiene información para hacer
llamadas a funciones para evaluar el valor de las variables
Inicialmente para la herramienta GNU Assembler (as), globales.
conocemos que es el back-end por defecto de GCC, y
permite ensamblar el sistema operativo GNU y el kernel de En un segundo nivel está toda la información del nivel
linux y otro programas. La sintaxis de esta herramienta anterior, agregando otra que deja relacionar el código objeto
funciona en todas las arquitecturas compatibles incluyendo con el código fuente y también información de nombres y
directivas de ensamblador. [4] posiciones de variables locales.

Para el manejo de código de GNU Compiler Collection se Finalmente en el nivel tres se agrega a la información de los
puede ejemplificar mediante el clásico hola mundo de anteriores niveles, información sobre la definición de los
muchos lenguajes. Para este caso el comando gcc se macros del procesador.
implementa teniendo en cuenta si la opción tiene más de una
letra ya que en este caso se pone dos guiones, y para una Un ejemplo de carga de programas en depurador puede ser:
sola letra pues un solo guión; ejemplificandolo así:
$ gcc fibonacci.c -o fibonacci
$ gcc hola.c --ansi -c -o hola.o $ ./fibonacci 4
Bus error
En este comando las opciones de línea de comandos se
clasifica en las siguientes categorías: Aquí se genera un error y mediante esto se procede a una
depuración para determinar a detalle el error usando -g
● Específicas del lenguaje: Esta opción se usa sólo cargando lo con los comandos de la siguiente manera:
con determinados lenguajes de programación.
● Específicas de la plataforma: Como en el caso $ gcc fibonacci.c -g -o fibonacci
anterior en este solo se implementan en $ gdb fibonacci 4
determinadas plataformas (Intel como una de las (gdb)
plataformas a ejemplificar).
● Generales: Se usan en todos los lenguajes y Así se obtiene el prompt (gdb) y luego se podrá correr el
plataformas a diferencia de los dos casos programa escribiendo el comando run:
anteriores.
(gdb) run La directiva .equ permite usar símbolos, constantes, esto
Starting program: ./fibonacci para entender los símbolos como cadenas de caracteres que
Reading symbols for shared libraries . done son sustituidas donde aparezca por un valor determinado.
Indique un número como argumento Un ejemplo simple puede ser tomar el símbolo que en este
Program exited normally. caso seria UNO y darle el valor 0x01:

El ejemplo anterior recibe como argumento un número .equ UNO, 0x01


Fibonacci para calcular y con la depuración mostrada se ve
el error al no ingresar dicho argumento. [3] Con la directiva .space lo que se hace es reservar un espacio
de memoria de tamaño byte, esto específicamente para
d) Consulte y brinde ejemplos de las directivas variables de salida que no correspondan con las variables de
del código ensamblador de ARM. Hay directivas de entrada. Para implementar dicha directiva se usa la etiqueta
RES como se muestra en el siguiente ejemplo:
asignación
(.byte, .hword, .word, .ascii, .asciz, .zero, .equ RES: .space 4
y .space), directivas de control (.text y .data),y
directivas macro (sección macro). En el anterior comando se estaría reservando un espacio de
4 bytes o una palabra. Posteriormente la etiqueta RES
Comenzamos por definir que es una directiva en este servirá como referencia a dicho espacio.[5]
contexto; la cual es una orden al programa ensamblador,
estas permiten inicializar posiciones de memoria con un Ahora para las directivas de control se tiene inicialmente la
valor determinado dando símbolos que den un orden de directiva .text la cual tendría el código del programa, pues
entendimiento a los programas (dar un inicio y un final). Se después de ingresar . text, en la parte inferior se ubicará
deben tener además un programador en lenguaje cualquier código a realizar.
ensamblador que tenga un espacio en memoria para
variables usadas en el lenguaje ensamblador para usarlas en Para la directiva .data se tiene contenida en ella los datos
el trayecto del desarrollo como también tener valores de inicializados.
inicialización. [5]
Ahora bien comenzamos con las directivas de asignación; e) Consulte sobre el subconjunto de
entre ellas encontramos la .byte la cual permite inicializar un instrucciones THUMB de ARM. ¿En qué consiste el
byte con: subconjunto de instrucciones THUMB? ¿Cómo se
diferencian del set de instrucciones completo de
«.byte Value8» ARM? ¿Cómo es el manejo de registros y memoria
cuando el procesador está en modo THUMB? ¿En
en donde en el anterior código se tiene la inicialización de
qué versiones y microarquitecturas de ARM se
un byte con un contenido de Value 8. [6]
implementa THUMB?:
Ahora la directiva .hword nos permite inicializar medias
palabras y dobles palabras la sintaxis sería algo así: Las instrucciones THUMB son un subconjunto de un
conjunto de instrucciones lanzadas por ARM Ltda. con un
«.hword Value16» conjunto de reglas diferentes estas instrucciones son de 32 y
16 bits esto con el objetivo de mejorar la densidad de
Y para el caso ya no de medias palabras sino palabras en si código. En este subconjunto se presenta un ahorro de
se usa la directiva .word pues declaró valores enteros de 4 espacio gracias a que algunos operandos se hacen implícitos
bytes (una palabra). y también limitan el número de posibilidades comparado
con las instrucciones de ARM que se ejecutan en el estado
La directiva .ascii funciona para indicar que el dato de conjunto de instrucciones de ARM. En el modo THUMB
siguiente es de tipo cadena un ejemplo de ello es: solo las ramas son condicionales y muchos códigos de
operación tienen el acceso restringido a la mitad de los
mi_cadena: .ascii “El resultado es ” registros de propósito general de la CPU. Cuando el puerto
de memoria o el ancho del bus se encuentran restringidos a
Ahora bien se tiene la directiva .asciz que tiene similitud a la menos de 32 bits, es posible hacer uso de códigos de
anterior pero con un particularidad donde el lenguaje inserta operación THUMB más cortos debido a que estos permiten
un byte 0x00 al final de las cadenas, para que esto se note mayor rendimiento que el código de ARM de 32 bits,
como su terminación. debido a que se hace necesario que en el ancho de banda
restringido de la memoria se cargue menos código de
programa.
[7] “Estructura y Tecnología de Computadores; Practica 1
Representación de la información (Tipos de Datos)”; Universidad de
El procesador ARM7TDMI fue el primero en implementar Murcia - Departamento de Ingenieria y Tecnologia de Computadores.
un decodificador de instrucciones THUMB. A partir de lo Octubre de 2008.
anterior las familias de ARM9 y las posteriores incluyen el [8] Artículo: hmong.es “Arquitectura ARM”; Evans, Matt (27 de
decodificador de instrucciones THUMB Ahora bien para un diciembre de 2019). La última charla de Arquímedes de Bellota .:
rendimiento en aplicaciones de menor costo máximo las https://hmong.es/wiki/ARM_Thumb.
familias de procesadores de ARM como Cortex M0 y M1 [9] Guia: Laboratorio 3 - Microprocesadores “Programación y
Depuración en procesadores ARM”; Ph.D. Manuel Andrés Vélez.
implementan el conjunto de instrucciones THUMP de solo
16 bits. [8]

CONCLUSIONES

● Se comprobó el proceso de compilación, ejecución


y depuración por medio de QEMU y la raspberry el
cual nos brinda herramientas muy útiles para hacer
dicho proceso ya que es posible utilizar
herramientas como compiladores,depuradores y
demás que permiten desarrollar entre otras cosas
aplicaciones tanto en lenguaje de alto nivel como
también en bajo nivel.
● Al ejecutar código de alto nivel y luego hacer la
respectiva traducción se genera un archivo
equivalente en assembler pero este por lo general
está lleno de algunas variables extra, punteros y
demás que crean un código que si bien es funcional
puede que no sea el más óptimo.
● El modo THUMB no fue activado debido a su
complejidad de activación, además algunas
instrucciones como la instrucción MOV tienen un
tamaño a la hora de utilizarlos como literal para
moverlas a un registro. Por ello es mejor utilizar
algunas otras instrucciones como son LDR,STR y
para poder trabajar con numero o argumentos
grandes de tamaño de 32 bits en este caso.
BIBLIOGRAFÍA
[1] Artículo: sites.google.com “Arquitectura de Computadoras - Big
Endian vs Little Endian”:
https://sites.google.com/site/arquitectura1500/home/big-endian-vs-
little-endian
[2] Artículo: Centro de investigación de en informática para la ingeniería
(CII), Universidad Tecnológica Nacional - Facultad Regional
Córdoba. “Herramientas GNU para programación de uC de
arquitectura ARM” Guillermo Steiner; Gastón Araguás; Agustín
Henze.
[3] Artículo: GNU “Compilar y depurar aplicaciones con las
herramientas de programación de GNU”:
http://maraboli.cl/util/C/macprogramadores.org.GCC.pdf.
[4] Artículo: hmong.es wiki “Ensamblador GNU”:
https://hmong.es/wiki/GNU_Assembler
[5] R. Hermida; “Práctica 1: Descubriendo el entorno de trabajo”
Laboratorio de fundamentos de computadores; Universidad
complutense de Madrid.
[6] Sergio Barrachina Mir, Maribel Castillo Catalán, Germán Fabregat
Llueca, Juan Carlos Fernández Fernández, Germán León Navarro,
José Vicente Martí Avilés, Rafael Mayo Gual y Raúl Montoliu Colás;
“Prácticas de introducción a la arquitectura de computadores con
QtARMSim y Arduino” Capítulo 1:Primeros pasos con ARM y Qt
ARMSim; Página principal de lorca.act.uji.es.
http://lorca.act.uji.es/libro/practARM/CAP01_ebook.pdf (accedido el
20 de noviembre de 2022).

También podría gustarte