Está en la página 1de 4

Miguel Sagaseta de Ilúrdoz Sánchez

Cuestiones teóricas

1. La Raspberry Pi 4, cuenta con un procesador de 64 bits, mientras que la SoC 4 es de 32 bits.

2. Toolchain nos permite compilar un programa fase por fase y no directamente como hace GCC.
Cada una de las herramientas del toolchain comprende las distintas fases de este proceso. Estas
son:
a) Traducción de C a ensamblador
b) As: Herramienta de ensamblaje; especificamos la arquitectura y generamos, si queremos, la
tabla de símbolos.
c) Ld: Herramienta de enlazado; nuevamente, indicamos, mediante -melf_i386 que trabajamos
en una arquitectura de 32 bits.

3. Lista de herramientas de desarrollo:


[22] [I386]AS i386: syntax, mnemonics, register
[23] [GNU] GNU Software Development
[24] [GAS] GNU ASsembler
[25] [GDB] debugger GDB
[26] [GCC] Compilador GCC
[27] [CPP] Preprocessor cpp
[28] [BiU] herramientas GNU binutils:as,ld,objdump,. . .
[29] [VIM] Vim
[30] [EMACS] Emacs

4. Libro: Programming from the ground-up:


He consultado el libro en este enlace:
http://mirrors.up.pt/pub/nongnu/pgubook/ProgrammingGroundUp-0-8.pdf

a) GNU/Linux es un sistema operativo modelado tras UNIX. La parte GNU viene del proyecto
GNU (http://www.gnu.org/) el cual incluye la mayoría de los programas que usaremos, como la
herramienta GCC. Linux es el nombre del Kernel, el kernel es el núcleo del sistema
operativo, el cual “sigue la pista” al resto de procesos del sistema.

b) GNU es un sistema operativo de software libre. Este se fundamenta en paquetes de GNU,


que incluye programas creados específicamente para el proyecto GNU. Como hemos visto en
la pregunta anterior, GCC entre otros.

c) GCC (GNU compiler collection) es un compilador optimizado producido por el proyecto


GNU, este acepta una gran variedad de lenguajes de programación. Por lo general, GCC es el
compilador estándar para la mayoría de los proyectos de GNU y de Linux.

d) El Kernel, como hemos especificado en la primera pregunta, es un programa informático en


el núcleo del sistema operativo del ordenador. Es una porción del sistema operativo que
siempre reside en memoria. Facilita y permite también la interacción entre los distintos
componentes físicos del ordenador y las aplicaciones.

e) Tanto los datos como las instrucciones, cuando ejecutamos un programa, se “guardan” en
los registros del procesador. Por una parte, el registro de instrucciones (PC y IR) se encarga
de saber que instrucción se ejecuta y cuál será la próxima, mientras que el registro de acceso
a la memoria guarda la información de los datos o variables a las que accedamos. A la hora
de comunicar nuestro programa con las instrucciones o los datos, empleamos el Bus de datos
Miguel Sagaseta de Ilúrdoz Sánchez

e instrucciones que, como su nombre indica, se emplea para el traslado de ambas cosas,
impidiendo en el proceso la simultaneidad a la hora de su acceso.

f) El registro PC (program counter) contiene la dirección de la siguiente instrucción. Es decir,


guarda el lugar donde se leerá en memoria la siguiente instrucción.

g) Si bien existen más de dos tipos de registros en las CPU, los dos más importantes son los
registros de datos y los de memoria. El primero guarda valores de números enteros. Para
valores no enteros, se emplea el registro de coma flotante. El segundo, el registro de
memoria, se una exclusivamente para almacenar direcciones de memoria de forma que estas
sean accesibles más tarde.

h) Word Size hace referencia al número de bits procesados por la CPU de un ordenador al
mismo tiempo. Los ordenadores modernos tienen un Word Size de 64 bits.

i) Un puntero es una variable cuyo valor es una dirección de memoria. Esta variable es capaz
de acceder a dicha dirección y extraer el valor almacenado en ella.

j) Inmediato, Directo, Indirecto, De registro.

Cuestiones prácticas

1. Opción 1:
a) as --32 --gstabs -o sum1toN.o sum1toN.s
b) ld -melf_i386 -o sum1toN sum1toN.o
Opción 2:
c) gcc -m32 -nostartfiles -g -o sum1toN sum1toN.s

Opción 3:
a) gcc -m32 -o sum1toN sum1toN.c

2. linker → ld -melf_i386 -o sum1toN sum1toN.o

3. int n;

4. add %edx, %ecx

5. print n

6. Pasos:
a) gcc -m32 -g -o sum1toN sum1toN.s
b) gdb
c) set trace-commands on
d) set logging file sum1toN_gdb_asm.txt
e) set logging on
Miguel Sagaseta de Ilúrdoz Sánchez

f) break main
g) run
h) Continuar la ejecución hasta que las variables “existan” dentro del contexto actual
i) x &n
j) x bucle
k) info registers ecx

7. Para cambiar el tamaño de alguna variable, podemos usar los comandos Short, char, int o long. En
nuestro caso, al interesarnos un tamaño de 2 bytes = 16 bits, usamos el Short. Nota; según entiendo,
un entero en ensamblador o en C, también tiene tamaño de 2 bytes, así que creo que no haría falta
hacer ninguna modificación en realidad. Por otro lado, al querer cambiar los valores de los
sumandos de la suma, cambiaremos los tamaños de los registros edx y ecx. Otra opción, si funciona,
sería cambiar directamente el tamaño de la suma resultante en su propia línea; sabemos que los
diferentes tamaños a la hora de, por ejemplo, imprimir datos, son b,h,w,g para 1,2,4 y 8 bytes
respectivamente. Es decir, la nueva instrucción podría ser: add h %edx %ecx

8. Como hemos explicado en el apartado anterior, al realizar este cambio, añadimos wide a la
instrucción de adición, haciendo que la habitual suma de 16 bits pase a ser de 32. Por otro lado,
prescindimos de parte del nombre de los registros de la CPU (de edx pasa a dx, por ejemplo) ya que
ya no estamos extrayendo el valor de dicho registro, sino solo la “mitad derecha” del mismo. En
caso del registro destino, que pasa de ecx a ec, la situación es justo la inversa, usando solo la “mitad
izquierda” del registro para guardar el que será el valor de la suma.

9. Una vez entremos en el debugger, podemos simplemente dejar que el programa siga todo su curso
sin interrupciones si usamos el comando run una segunda vez (el primero habrá sido para empezar a
debuggear) o con el comando continue, el cual avanzará el programa hasta encontrar un punto de
ruptura o terminarlo. Otra opción es usar el comando RET las veces que sea necesario hasta salir del
bucle, o, en último lugar, la función until.

10. A la hora de usar el compilador GDB, debemos recordar que, en ocasiones, es post de una mayor
eficiencia en la ejecución, el propio depurador puede generar sentencias para si mismo. En el caso el
until, cuyo mayor uso reside en los bucles, puede ocurrir que el compilador genere código de testeo
para el cierre del ciclo DESPUÉS de que este haya terminado (aún sabiendo que en C este código se
escribe antes). Es decir, que según compilemos con un lenguaje u otro, el compilador, de nuevo en
aras de la eficiencia, puede realizar comprobaciones en momentos distintos del bucle, generando
este tipo de incoherencias.

Información consultada en: https://sourceware.org/gdb/download/onlinedocs/gdb/Continuing-and-


Stepping.html
Miguel Sagaseta de Ilúrdoz Sánchez

11. Cambio el tamaño de bits que acepta la operación add, de esta manera los datos no se almacenan
correctamente:

También podría gustarte