Instructivo Para Uso SimulProc

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas SimuProc 1.4.2.0 INDICE 1.

Views 160 Downloads 4 File size 281KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

  • Author / Uploaded
  • Chuu
Citation preview

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

SimuProc 1.4.2.0 INDICE 1. PARTE TEORICA..................................................................................................................2 1.1 Introducción........................................................................................................................................................................2 1.2 Programar usando SIMUPROC.......................................................................................................................................2 1.3 Componentes del SIMUPROC..........................................................................................................................................2 1.3.1 Memoria......................................................................................................................................................................2 1.3.2 Registros......................................................................................................................................................................3 1.3.2.1 Registros generales.............................................................................................................................................3 1.3.2.2 Registros Apuntadores.......................................................................................................................................3 1.3.2.3 Registros de Pila..................................................................................................................................................3 1.3.2.4 Registros de Control (Flags)..............................................................................................................................4 1.4 Características del Simulador...........................................................................................................................................4 1.4.1 Puertos Virtuales........................................................................................................................................................5 1.4.2 La Pila..........................................................................................................................................................................5 1.4.3 Características generales...........................................................................................................................................5

2. PARTE PRÁCTICA................................................................................................................7 2.2 Vista de la pantalla principal del Simuproc.....................................................................................................................7 2.3 Conversión de números enteros entre bases. ..................................................................................................................7 2.4 Instrucciones del simulador...............................................................................................................................................8 2.5.4 Generación de sonido...............................................................................................................................................10

3. PREGUNTAS MAS FRECUENTES....................................................................................11

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 1 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

1. PARTE TEORICA 1.1 Introducción SimuProc es un Simulador de un “Procesador Hipotético” con el cual tiene por objetivo el aprendizaje de las nociones básicas para empezar a programar en lenguaje ensamblador, en el cual puede observar todo el proceso interno de ejecución del programa a través de cada ciclo del procesador. El simulador incluye: •

Un Editor con resaltador de sintaxis para escribir programas más fácilmente.



Un conversor de bases (para hacer pasajes de una base origen a otra base destino, soportando todas las bases desde base2 a base36).



Conversión de números de punto flotante de decimal a IEEE 754 y viceversa

1.2 Programar usando SIMUPROC El simulador solo reconoce lenguaje ensamblador (assembler1); por lo tanto para ejecutar programas en el simulador, se deben escribirlos primero en este lenguaje. Luego de tener el programa ya en lenguaje ensamblador se carga en el simulador. Para ello existen tres alternativas:

1. Se puede cargar desde un archivo 2. Usando el Editor interno 3. Ingresando las instrucciones manualmente. La utilización del programa es muy sencilla, sólo debe crear el programa en ensamblador e insertarlo al SimuProc mediante un archivo de texto (o manualmente). Luego él mismo se encarga de almacenar ese proyecto en un archivo .SMP para futuras necesidades sin tener que volver a escribir el programa nuevamente. Se pueden ingresar instrucciones manualmente desde la ventana principal, pero la manera mas fácil es hacerlo desde el editor. Se accede a los Editores presionando el botón Editor en la barra de herramientas. En el panel derecho (Editor 2) puede escribir el programa, las instrucciones serán resaltadas; puede presionar el botón derecho del Mouse en este editor para acceder a más opciones.

1.3 Componentes del SIMUPROC 1.3.1 Memoria La Memoria es el dispositivo que almacena toda la información del programa que se ejecuta, tanto datos como instrucciones. Esta en realidad no es parte del procesador, sino que es un dispositivo a parte al que el procesador accede para ir leyendo las instrucciones y datos del programa. 1

El assembler es un lenguaje de programación de bajo nivel.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 2 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

La capacidad de la memoria Simulada es de 4096 posiciones de 16 bits cada una: desde 0 hasta 4095 en decimal (en hexadecimal: desde 000 hasta FFF). Esta memoria es suficiente para ejecutar gran variedad de simples y complejos programas. El simulador trabaja con constantes y variables en binario y direcciones (posiciones de memoria) en Hexadecimal.

1.3.2 Registros Este Procesador consta de 3 registros de propósito general, AX, BX y CX cada uno con 16 bits de capacidad, registros apuntadores, registros de pila y registros de control.

1.3.2.1 Registros generales Los registros generales del procesador se usan para almacenar información de uso rápido, ya que se accede a ellos a una velocidad mucho más alta que la memoria. En ellos se pueden almacenar direcciones de memoria a las que se va a acceder a lo largo de la ejecución del programa, o variables que se deseen utilizar.

1.3.2.2 Registros Apuntadores • PC ó IP: Program Counter o Instruction Pointer. Contiene la dirección de memoria de la próxima instrucción a ejecutar y es incrementado en cada nueva instrucción. • MAR: Memory Address Register (Registro de Dirección de Memoria). Es el registro en el que se almacena la dirección de memoria a la que se quiere acceder. • MDR: Memory Data Register o Memory Buffer Register. Es un registro intermedio en el que se almacenan los datos que se escriben o leen de memoria. En el caso de una lectura, se pone en el MAR la dirección y se activa la señal de leer, obteniendo en el MDR el dato buscado. En el caso de una escritura, se pone en el MAR la dirección y en el MDR el dato a escribir en memoria, después se activa la señal de escribir, de esta forma almacenamos en memoria el dato. • IR: Instruction Register. En este registro se introduce la instrucción a ejecutar, después de haberla leído de memoria accediendo a ella mediante la dirección señalada en el PC; El contenido de este registro se puede dividir en código de operación (el código que señala la operación que se realizará) y operandos. Puede haber 2 operandos o sólo uno. Acá es donde se decodifica e interpreta la instrucción; así: se descompone la instrucción leída de forma que se pueda saber cual es la operación que se desea realizar y cuales son los operandos, en su caso, o el desplazamiento en caso de que se trate de una instrucción de bifurcación.

1.3.2.3 Registros de Pila BP: Base Pointer (Puntero de base de la pila.) El valor de por defecto es F80. Este puede cambiarse desde un programa, asignándole otra dirección de memoria con la instrucción MOV. •

Mientras se ejecuta el programa se puede visualizar en una barra de porcentaje el uso de la pila.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 3 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

SP: Stack Pointer (Puntero de la pila). Indica la próxima dirección de la pila que esta disponible, es decir, apunta a la cima de la pila. Este valor se cambia automáticamente cuando se usan las instrucciones PUSH ó POP. •

1.3.2.4 Registros de Control (Flags) Estos registros se usan para poder controlar el comportamiento de un programa; se activan después de cada operación según sea el resultado de la instrucción ejecutada. •

Zero flag: se vuelve 1 si el resultado de la ultima operación = 0.



Negative ó Sign flag: Se vuelve 1 si el resultado de la ultima operación es igual a un numero negativo.



Carry flag: se activa cuando la operación realizada ha producido un acarreo.



Overflow flag: se activa cuando la operación produjo desbordamiento (overflow), es decir, el resultado ocupaba más de los 16 bits que caben en un registro.

Estos flags se usan principalmente en instrucciones de bifurcación (por ejemplo, si queremos que, en caso de que el resultado de la última operación fuera cero, el programa se salte varias de las instrucciones siguientes, comprobamos el flag cero y si está activo el programa salta, esto se consigue con la instrucción JEQ).

1.4 Características del Simulador •

Editor Interno: Es una herramienta usada para escribir los programas mas fácilmente. Permite: deshacer, rehacer, desplazar o tabular el código seleccionado.



Modificador de Memoria: Se utiliza para inicializar las variables y/o constantes del programa en ciertas posiciones de memoria cuando lo escribe. También puede modificar posiciones de memoria en cualquier momento, ya sea antes ó durante la ejecución de un programa.



Conversor de Bases: Dispone un conversor de bases para realizar conversiones de una base a cualquier otra, soporta desde base2 a base36. También permite la conversión entre números de punto flotante y IEEE 754.



Estadísticas: El simulador constantemente le estará mostrando las estadísticas del programa en ejecución, como por ejemplo: el número de instrucciones ejecutadas, que clase de instrucciones y la velocidad de la simulación.



Vigilante de Memoria: Dispone de un vigilante de memoria con el cual se pueden observar algunas variables en las posiciones de memoria. Posee un historial que muestra los últimos 5 valores de las posiciones vigiladas.



Dispositivos Virtuales: Cada computadora utiliza periféricos para conectarse con el mundo exterior. SimuProc también dispone unos dispositivos de E/S simulados. Estos están conectados a unos puertos virtuales los cuales pueden ser accedidos con las instrucciones In y Out dependiendo del tipo de dispositivo.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 4 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

1.4.1 Puertos Virtuales Puerto 1: Teclado y Pantalla. El teclado es usado únicamente para solicitarle al usuario que ingrese un numero de 32 bits. Por pantalla podrán visualizarse resultados. •

Puerto 8 : Reloj Lee los segundos del sistema, retorna un número en binario (entre 0 y 59) al registro especificado. Permite generar números aleatorios. •

Puerto 9: Switches Este dispositivo, consiste de 16 switches en fila enumerados de 0 a 15. Cualquier switch puede ser encendido resultando un “1” lógico correspondiente al bit del switch. •

Puerto 13: PC-Speaker Genera sonidos a través del altavoz de tu PC. Para generar un sonido necesita dar la frecuencia y la duración en milisegundos. La frecuencia debe ser entre 7Hz y 32767Hz. La frecuencia es leída del registro especificado en la instrucción, y la duración es leída del registro BX. •

1.4.2 La Pila La pila de este simulador es simplemente un conjunto de datos que se almacenan en una zona de memoria, del tipo LIFO (Last In- First Out = Ultimo en entrar - Primero en salir). La Pila es un buffer usualmente implementado como un bloque de n bytes o words consecutivos. En este simulador cada posición de memoria es de 16 bits. Usos para la pila: La pila se utiliza para pasar variables entre funciones y para almacenar variables locales. El programador es el responsable de reservar el espacio apropiado para la pila. Un problema con las pilas es que el programador las puede hacer muy pequeñas y puede que ocurra un stack overflow o desbordamiento de pila si se esta intentando usar la instrucción PUSH para enviar algo cuando ya la pila esta llena; o stack underflow si se usa la instrucción POP para leer la pila estando la misma vacía. Por cada PUSH debe de haber luego un POP. Cuando un programa o función termina su ejecución la pila debe quedar como estaba antes de que este se ejecutara, sino hay errores en este.

1.4.3 Características generales La velocidad de Simulación puede ser cambiada en cualquier momento y se puede apagar la animación para una ejecución más rápida. Puede observarse el acceso en memoria de las instrucciones y/o variables a medida que se ejecuta la simulación. Al ejecutarse el Simulador este chequea que Windows este usando fuentes pequeñas y que la resolución sea como mínimo de 800x600, en otro caso sacara un dialogo para cambiarla si el usuario desea. Hay dos Barras de Porcentaje que muestran el porcentaje de uso de la memoria simulada y porcentaje de uso del espacio reservado para la pila en ese momento. A los Registros de control (flags) se les puede dar doble clic para hacer un cambio forzado de estos en caso de sea necesario depurar un programa. También si hace clic con el botón derecho del mouse saldrá un menú para seleccionar que flag se desea activar ó desactivar.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 5 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

Para cargar programas en el simulador se pueden tipear las instrucciones manualmente por la interfaz del programa o puede abrir varios tipos de archivos: •

.SMP que son los creados por este mismo cuando se salvan



.TXT



.ASM (que son compatibles con la versión anterior de este simulador)

Recuerde que también se puede usar el editor Interno.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 6 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

2. PARTE PRÁCTICA 2.2 Vista de la pantalla principal del Simuproc A continuación se muestra la pantalla principal del simulador en donde se han hecho aclaraciones básicas sobre el contenido de la misma. Haciendo referencia a lo comentado en la parte teórica de esta guía:

Muestra el contenido del: PC: Contador de Programa. MAR: Registro de Direcciones de Memoria (Memory Address Register). MBR ó MDR: Registro Buffer de Memoria. (Memory Data Register o Memory Buffer Register). IR: Registro Índice. (Instruction Register).

Cero Negativo Carry Overflow

Permite seleccionar la instrucción. En este espacio vacío aparecen en rojo los mensajes de errores que se presentan en tiempo de ejecución

Área de Memoria. Haciendo doble clic se accede a esta pantalla de codificación.

Permite hacer el seguimiento paso a paso visualizando el contenido de los registros. Además comenta en esta barra que está haciendo la CPU en cada instante (para ello debe ingresarse un programa y hacer clic en el botón “Ejecutar”). La velocidad de la animación para el seguimiento del programa debe ser variada por el usuario de modo que pueda leer sin inconveniente los comentarios y visualizar los cambios de los contenidos de los registros.

Muestra el mnemónico ó no, haciendo clic es posible activar o desactivar esta opción

2.3 Conversión de números enteros entre bases. Vienen predefinidas las bases: • Decimal • Octal • Binario Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 7 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas



Hexadecimal

Se pueden elegir dos bases para ver cual sería la conversión al elegir la base aparecen los símbolos que posee dicha base

2.4 Instrucciones del simulador A continuación se muestran ordenadas alfabéticamente las instrucciones que incluye el simulador (el número antepuesto indica el orden en que aparecen ubicadas en el programa): 20 - ADD [mem]: Sumar: AX = AX + el contenido de la dirección de memoria 60 - ADDF [mem]: Suma números de 32 bits: En BX y AX queda el resultado de la suma de estos más el contenido de [mem] y mem+1 11 - AND [dest,orig]: Y lógico, hace un Y lógico entre todos los bits de los dos operandos escribiendo el resultado en el destino. Los parámetros pueden ser direcciones de memoria o Registros. 04 - CLA: Hace AX = 0 25 - CLC: Limpia el Carry Flag. C = 0 27 - CMC: Complementa (invierte) el Carry Flag. Si C = 1 vuelve C = 0 y viceversa. 32 - CMP [mem]: Compara AX con [mem], si AX es mayor, Z=0 N=0, si es igual Z=1 N=0, si es menor Z=0 N=1 09 - DEC [dest]: Decremento en 1 el destino especificado (Si el destino queda = 0, se vuelve Z = 1) 23 - DIV [mem]: Dividir: AX = AX / el contenido de la dirección de memoria, BX=AX % el contenido de la dir de memoria (BX = modulo o residuo). 63 - DIVF [mem]: Division: BX y AX = BX y AX / [mem]y mem+1, en CX queda el residuo de la division en entero de 16 bits 41 - EAP: Escribe en Pantalla el contenido del registro AX 65 - FTOI: Conversión de Real a Entero: Convierte un número Real(32bits) a su equivalente en entero BX y AX en un entero (16bits), el Resultado queda en AX. Los registros de control cambian de acuerdo al numero convertido: "Z" si el numero es cero, "N" si el numero es negativo, "O" si el numero real es mayor de 65535 99 – HLT: Terminar Programa (todo programa lleva esta instrucción para indicarle al simulador que el programa ha terminado su ejecución) 80 - IN [registro,Puerto]: Lleva al Registro el valor retornado por el puerto especificado 08 - INC [dest]: Incrementa en 1 el destino especificado, el parámetro puede ser una dirección de memoria o un registro.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 8 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

64 – ITOF: Conversión de Entero a Real: Convierte un número entero (16bits) almacenado en AX al mismo número pero representado en Real IEEE754(32bits), el Resultado de la conversión queda en BX (bits mas significativos) y AX. Los registros de control cambian de acuerdo al numero convertido: "Z" si el número es cero, "N" si el numero es negativo. 35 - JC [mem]: Saltar si el Carry Flag esta activado. Si C = 1, PC = contenido de memoria 31 - JEQ [mem]: Saltar si son iguales Si Z = 1, PC = contenido de la memoria. 34 - JMA [mem]: Saltar si es Mayor. Si Z = 0 y N = 0, PC = contenido de memoria. 33 - JME [mem]: Saltar si es Menor. Si N = 1, PC = contenido de la memoria 30 - JMP [mem]: Salto incondicional. PC = dirección de memoria donde esta la siguiente instrucción a ejecutar" 36 - JNC [mem]: Saltar si el Carry Flag no esta activado. Si C = 0, PC = contenido de memoria 39 - JNE [mem]: Saltar si no son iguales. Si Z = 0, PC = contenido de memoria 38 - JNO [mem]: Saltar si el Overflow Flag no esta activado. Si O = 0, PC = contenido de memoria 37 - JO [mem]: Saltar si el Overflow Flag esta Activado 01 - LDA [mem]: Cargue en AX el contenido de la dirección de Memoria especificada. (hay casos donde es mejor usar MOV si se desea pasar datos sin tener que pasarlos por AX) 50 - LDB [mem]: La instrucción carga en AX el contenido de memoria almacenado en [mem] + BX 55 - LDF [mem]: Carga en BX y AX un numero de 32 bits (IEEE) que esta almacenado en la dir [mem] y mem+1. En BX quedan los digitos mas Significativos 40 – LDT: Lee un valor del Teclado y lo lleva al registro AX 29 - LOOP [mem]: Decrementa CX y salta a la Pos de memoria si CX no es cero. 10 - MOV [dest,orig]: Copia el valor almacenado en el origen al destino. El destino y/o origen pueden ser registros o direcciones de memoria o combinación de estos. 42 – MSG: Muestra un mensaje en pantalla 22 - MUL [mem]: Multiplicar: AX = AX * el contenido de la dirección de memoria. (Si el número resultante supera su longitud en binario de 16 bits, este resultado se parte almacenando los bits más significativos en el Registro BX.) 62 - MULF [mem]: Multiplicación: BX y AX = BX y AX * [mem]y mem+1 90 – NOP: Esta operación no hace nada. 12 - NOT [destino]: NO lógico, invierte los bits del operando formando el complemento del primero. 13 - OR [dest,orig]: O inclusive lógico, todo bit activo en cualquiera de los operándoos será activado en el destino 81 - OUT puerto,registro: Escribe en el puerto especificado, el valor del registro 07 - POP [registro]: Trae de la Pila el último valor llevado por PUSH (indicado por el registro SP) y lo almacena en el registro especificado. 06 - PUSH [registro]: Envía el valor del registro especificado a la pila 15 - ROL [dest,veces]: Rota los bits a la izquierda las veces especificadas(en decimal), los bits que salen por la izquierda re-entran por la Derecha. En el Carry Flag queda el último bit rotado. 16 - ROR [dest,veces]: Rota los bits a la derecha las veces especificadas(en decimal), los Bits que salen por la derecha reentran por la izquierda. El Carry Flag guarda el último bit rotado. 17 - SHL [dest,veces]: Desplaza los bits a la izquierda el numero de veces especificado(en decimal), agregando ceros a la derecha, el Carry Flag guarda ultimo bit desplazado. 18 - SHR [dest,veces]: Desplaza los bits a la Derecha el numero de veces especificado(en decimal), agregando ceros a la izquierda, el Carry Flag guarda ultimo bit desplazado. 02 - STA [mem]: Guarde el contenido de AX en la dirección de Memoria especificada 51 - STB [mem]: guarda el contenido de AX en la dirección [mem] + BX 26 – STC: Pone el Carry Flag. C = 1 Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 9 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

56 - STF [mem]: Guarda en [mem] y mem+1 el contenido de BX y AX 21 - SUB [mem]: Restar: AX = AX - el contenido de la dirección de memoria 61 - SUBF [mem]: Resta el numero de 32 bits: BX y AX = BX y AX - [mem] y mem+1 03 - XAB: Intercambia los valores de los registros AX y BX (Esta instrucción no necesita parámetros.) 14 - XOR [dest,orig]:O exclusivo, realiza un O exclusivo entre los operándos y almacena el resultado en destino.

2.4 Como escribir en el editor y enviar las instrucciones a memoria:

1º Paso: Se puede escribir el programa en el editor de texto.

3º Paso: Al hacer click en enviar a memoria se cargan las instrucciones en el área de memoria de la pantalla principal del simulador.

2º Paso: Se ve el programa cargado en cada posición de memoria (igual que como se vería en la pantalla principal salvando los carteles a mostrar por pantalla) 2.5.4 Generación de sonido Para generar un Sonido se necesita dar la frecuencia y la duración en milisegundos.

- La frecuencia debe ser entre 7Hz y 32767Hz (frecuencias menores son tomadas por defecto dentro del umbral mínimo) y es leída del registro especificado en la instrucción. - La duración es leída del registro BX. Ejemplo: Supongamos que AX = 101000101000 y BX = 111110100 OUT 13,AX Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 10 de 11

UNIVERSIDAD NACIONAL DE LA MATANZA Departamento de Ingeniería e Investigaciones Tecnológicas

Produce un sonido de 2600Hz durante 500 ms

Instrucciones cargadas en las direcciones:

Dirección 000: Carga en AX el contenido de la posición de memoria: 00E. Dirección 001: Copia el valor almacenado en el origen al destino: El contenido de AX, en BX (es decir BX se carga con el contenido de AX que en la instrucción anterior se le cargo el contenido de la posición 00E. De esta manera BX=111110100). Dirección 002: Carga en AX el contenido de la dirección de memoria: 00F (es decir que AX=101000101000). Dirección 003: Se genera, por el speaker (parlante interno) de la computadora, el sonido con la frecuencia establecida en AX (la duración del sonido se toma por defecto del registro BX). “Cuanto mayor es la frecuencia más agudo es el sonido, por lo que cuanto menor es la frecuencia más grave es el sonido” Dirección 004: Fin de programa

3. PREGUNTAS MAS FRECUENTES 1. ¿Cómo puedo trabajar con números no enteros (de punto flotante)? A partir de la versión 1.4 ya es posible hacer operaciones con estos números usando las instrucciones ADDF SUBF MULF y DIVF, para llevar los números de registros a memoria y viceversa usando LDF y STF, y para mostrar estos en pantalla usando el puerto 1 con las instrucciones IN y OUT.

2. ¿Como trabajar con Números de mas de 16 bits (mayores de 65535)? Con las instrucciones aritméticas para números flotantes, puedes también trabajar con enteros entre -2147483647 y 2147483647.

3. ¿Muchas de las instrucciones que manejas no las he utilizado, podrías proporcionarme información de las instrucciones?

El 90% de las instrucciones son de un procesador Intel, las otras son para abreviar otras instrucciones mas complicadas como interactuar con el usuario para pedir datos de entrada o escribirlos en pantalla.

Ing. Larisa Toro - Ing. Rocío Andrea Rodríguez – Ing. Mónica Larrosa

Página 11 de 11