CUESTION B
En esta cuestión, debemos desarrollar un programa tanto en la arquitectura ARM como en la x86. Hemos escogido un programa sencillo, ya sea debido a algunos problemas a la hora de realizar el proyecto como a la dificultad que se nos ha presentado ante la programacion en ARM.
El programa es una simple calculadora del perímetro y superficie de un cuadrilátero, en el cual hemos incluido una rutina de selección múltiple, y varias llamadas al sistema.
En primer lugar el programa en ARM:
En la sección AREA, le damos atributos de CODE, y de lectura y escritura (READWRITE), de la misma forma que le damos un nombre al modulo en ensamblador.
Como vemos, antes de empezar con el código de programa, definimos etiquetas mediante la directiva EQU, que nos permite referenciar interrupciones o llamadas al sistema como para la escritura de un carácter (SWI_EscrCar) o su lectura (SWI_ReadC).
A partir de ahí, el código es simple, llamemos a la rutina ADR-SWI-MOV, como bloque1, el cual haremos 2 veces. ADR enviará la dirección de la cadena (en este caso, cad1) al regisro r0, impriéndola por pantalla gracias a la orden SWI &2(SWI SWI_write0, por medio de las etiquetas). Saltándonos la siguiente subrutina que simplemente imprime la cad3 y vuelve a pedir un valor, entramos de lleno en la subrutina de la selección múltiple (aunque en este caso se den solo dos 'casos').
La orden SWI &4, mandará una interrupción en la que leerá el registro r0, en el cual se ha guardado la opción del usuario y pasará a una orden de comparación entre dicho registro y unos valores. Segun el valor de la comparación (0 o 1) saltará a una subrutina de PERIMETRO o de SUPERFICIE.
Dentro de éstas, el método seguido es sencillo. En PERIMETRO multiplicamos por dos tanto los valores del ladoA(r1) y ladoB(r2), por medio de una operación de desplazamiento de bit a la izquierda [orden SHL(Shift Left)]. Luego una orden ADD efectuará la suma y la guardará en r3.
Por otro lado, la subrutina SUPERFICIE simplemente multiplica los lados (r1 y r2) guardando el resultado en r3.
Una vez explicado como funciona el programa en ARM, pasaremos al codigo en x86. Ya que es muy similar, me centraré en explicar sus diferencias con ensamblador ARM.
Como vemos, la simplicidad comparada con el código en ARM es enorme. No necesitamos definir ninguna etiqueta en la sección de datos puesto que recurriremos a una interrupción del sistema de forma directa como en ARM (recordemos SWI &2); rescatamos las funciones de la libreria de C con las que podremos imprimir por pantalla y a su vez pedir los valores al usuario.
Saltando el bloque de 'recogida de datos', llegamos a la subrutina de selección múltiple en el que, mediante la orden CMP, haremos una comparación del dato guardado en el registro de propósito general ECX (en el que hemos guardado la opción del usuario). Un salto condicional JE pasará a cualquiera de las dos subrutinas Superficie o Perímetro (Superficie en el caso de que la comparación de 1; Perímetro caso 0). Hemos añadido una subrutina Fin que simplemente llama a una interrupción del sistema con a ayuda de una funcion de la libreria de C y llama a la salida.
Es importante mencionar en las salidas de las subrutinas. En ARM, guardamos el contenido de r14, en el cual queda la dirección de la instrucción antes del salto a la subrutina, en el contador del programa, de modo que seguirá el programa por donde lo habíamos dejado, pasando a la subrutina de salida. En el caso del x86, aunque podríamos haber hecho algo parecido por medio de las instrucciones CALL y RET y pasando la subrutinas a un segundo plano con operaciones de los registros de la pila (segmento SS); hemos decidido simplificarlo y codificarlo linealmente mediante saltos condicionales (Obviamente esto es posible debido a la sencillez del programa).
Aunque no sea parte del proyecto, hemos añadido una sección en la que explicamos el uso de la pila, y el resto de registros de segmentos y en el que nos adentramos en el 80386 y 80387 con el uso de flotantes.

No hay comentarios:
Publicar un comentario