|
| Home / Docencia / I. Telecom. / Fundamentos de los Ordenadores II |
|
|
|
|
|
Fundamentos de los Ordenadores IICurso 2010-2011Práctica 3 |
|
|
|
En un teatro hay 3 tipos de asientos: de anfiteatro, de butacas y de "gallinero". Te han encargado que hagas el presupuesto para cambiar la tapicería de todos los asientos, así que has enviado a tu ayudante para que contara los asientos de cada tipo. Tu ayudante se confundió al introducir los números, de tal forma que en el número de asientos de butacas ha puesto el número de asientos de anfiteatro, en el de asientos de anfiteatro, el de asientos de "gallinero" y en el de asientos de "gallinero", el de asientos de butacas. El plazo para entregar el presupuesto termina mañana, así que debes subsanar su error antes de calcularlo, pero no te acuerdas de más instrucciones que de push y pop, y tampoco tienes un manual a mano. Escribe el programa asientos.s que:
|
|
|
En este ejercicio se trabajará con instrucciones de salto. En el primer apartado se utilizarán instrucciones de salto incondicional (JMP), mientras que en el segundo se utilizarán instrucciones de salto condicional. Apartado 1: instrucción JMP La instrucción JMP dir_destino carga el valor dir_destino en el contador de programa (registro IP), de tal forma que la siguiente instrucción que se ejecute será la ubicada en la posición de memoria indicada, dentro del segmento de código. Normalmente, destino es una etiqueta, asociada a la instrucción a la cual se pretende saltar.
Apartado 2: instrucciones de salto condicional Hay una gran variedad de instrucciones de salto condicional. Estas instrucciones se basan en flags del registro de estado para decidir si se realiza el salto a la dirección especificada o, por el contrario, continúa la ejecución en la instrucción siguiente. En este apartado realizaremos el cálculo del presupuesto de tapizar los asientos de butaca del ejercicio anterior, realizando sumas sucesivas de 8 bits (sin signo) que iremos acumulando en una posición de memoria (de 8 bits) llamada resultado (que debes declarar en el segmento de datos, de tipo int, y con un valor inicial de 0). Cuando realizamos una operación aritmética el flag Z (zero) se modifica, activándose cuando el resultado es cero, para advertir de ello al programador.
Apartado 3: cambio de coste
Apartado 4: desbordamiento
|
|
|
Cuando se escribe código encapsulado en subrutinas se deben seguir las siguientes pautas que se comprobarán durante la corrección:
Apartado 1: identificación del tipo de carácterEstas subrutinas se codificarán en el fichero compara.s. Todas han de ser globales. La cabecera del fichero compara.s contendrá las siguientes declaraciones (y sólo estas): .data .text .global isMin,min2may,comparaCarac Escriba una subrutina llamada isMin que, recibiendo un carácter a través de la pila, devuelva, también por la pila:
Cuando se llame a esta subrutina el programa llamante debe reservar espacio en la pila para el resultado, insertar en la pila el carácter a identificar y llamar a la subrutina con la instrucción call. Apartado 2: subrutina para convertir minúsculas en mayúsculasEscriba una subrutina llamada min2may que, recibiendo como parámetro de entrada un carácter (cualquiera), a través del registro bl, devuelva, en el byte más bajo del acumulador (al), el carácter en mayúsculas, si procede, o el mismo carácter (si no era alfabético) Esta subrutina debe utlizar la subrutina anterior.
Apartado 3: comparación de caracteresSe debe codificar en el fichero llamado compara.s, una subrutina global (para que pueda ser llamada desde fuera) llamada comparaCarac que compare dos caracteres almacenados en %al y %ah. El resultado lo devuelve en %ecx. El valor devuelto en %ecx será:
Para probar el correcto funcionamiento, se recomienda hacer un programa de pruebas aparte, en un fichero llamado prueba.s(es en este fichero donde estará el main). Para compilarlo: gcc -o programa prueba.s compara.s |
|
|
Se debe codificar en el fichero llamado compara.s, una
subrutina
llamada comparaCadena que compare dos cadenas (considerando
mayúsculas igual a minúsuculas)
La cabecera del fichero compara.s tendrá las siguientes declaraciones (y sólo estas): .data .text .global isMin,min2may,comparaCarac,comparaCadena |
|
Apartado 1: Potencia de números enterosEscribe el programa potencia.s que halle el resultado de calcular la potencia de un número entero. Para ello, programe la rutina iterativa potencia, en el fichero subPotencia.s, que recibe como parámetros dos números enteros x y n (base y exponente, respectivamente) y devuelve como resultado x^n. Utiliza la siguiente definición de datos: bases: .int 4, 3, 5, 1, 0
exps: .int 0, 5, 2, 20, 4
longitud: .int 5 # Número de datos a procesar
de modo que el programa presente por pantalla:
unix$ potencia
4 ^ 0 = 1
3 ^ 5 = 243
5 ^ 2 = 25
1 ^ 20 = 1
0 ^ 4 = 0
unix$
Importante:
Apartado 2: Impresión de una matriz por pantallaSe dispone de un programa ensamblador que manipula una matriz de números enteros cuyas dimensiones están almacenadas en las etiquetas filas y columnas: filas: .int 3 columnas: .int 5 Los datos de la matriz están almacenados a partir de la posición de memoria matriz como una secuencia de enteros que representa la matriz almacenada fila tras fila. Por ejemplo, la matriz de tres filas y cinco columnas cuyos elementos son los números obtenidos al tomar los índices de fila y columna se almacena: matriz: .int -11, 12, 13, 14, 15, 21, -22, 23, -24, 25, 31, 32, -33, -34, 35 Se pide:
-11 12 13 14 15 21 -22 23 -24 25 31 32 -33 -34 35 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 El programa debe funcionar para cualquier tamaño de matriz. Se recomienda probar el programa utilizando los datos de la matriz dada y alterando el valor de las filas y columnas (siempre que su producto no sobrepase 15) y comprobar que por pantalla se imprime de forma correcta. |
|
|