La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C.

Presentaciones similares


Presentación del tema: "Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C."— Transcripción de la presentación:

1 Traduciendo y ejecutando programas

2 Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C

3 Universidad de SonoraArquitectura de Computadoras3 Compilador Traduce de lenguaje C a lenguaje ensamblador.

4 Universidad de SonoraArquitectura de Computadoras4 Hola Mundo en C # include void main () { printf ("Hola mundo\n"); }

5 Universidad de SonoraArquitectura de Computadoras5 Ensamblador (BCC55) ifdef ??version if ??version GT 500H.mmx endif model flat ifndef??version ?debugmacro endm endif ?debugS "hola_mundo.c" ?debugT "hola_mundo.c" _TEXTsegment dword public use32 'CODE' _TEXTends _DATAsegment dword public use32 'DATA' _DATAends _BSSsegment dword public use32 'BSS' _BSSends DGROUPgroup_BSS,_DATA

6 Universidad de SonoraArquitectura de Computadoras6 Ensamblador (BCC55) _TEXTsegment dword public use32 'CODE' _mainprocnear ?live1@0: ; ;void main () ; push ebp mov ebp,esp ; ;{ ;printf ("Hola mundo\n"); ; @1: push offset s@ call _printf pop ecx ; ;} ; @2: pop ebp ret _mainendp _TEXTends

7 Universidad de SonoraArquitectura de Computadoras7 Ensamblador (BCC55) _DATAsegment dword public use32 'DATA' s@labelbyte ;s@+0: db"Hola mundo",10,0 align4 _DATAends _TEXTsegment dword public use32 'CODE' _TEXTends public_main extrn _printf:near ?debugD "c:\Borland\BCC55\Include\_nfile.h" 10459 6176 ?debugD "c:\Borland\BCC55\Include\_null.h" 10459 6176 ?debugD "c:\Borland\BCC55\Include\_defs.h" 10459 6176 ?debugD "c:\Borland\BCC55\Include\_stddef.h" 10459 6176 ?debugD "c:\Borland\BCC55\Include\stdio.h" 10459 6176 ?debugD "hola_mundo.c" 14910 22993 end

8 Universidad de SonoraArquitectura de Computadoras8 Programa Ensamblador Acepta un programa en lenguaje ensamblador y genera un archivo objeto. El archivo objeto contiene: Instrucciones en lenguaje de máquina. Datos. Información necesaria para cargar el programa en memoria.

9 Universidad de SonoraArquitectura de Computadoras9 Típico OBJ de Unix 1. Encabezado. Describe el tamaño y posición de otras secciones del archivo objeto. 2. Segmento de texto. Contiene el código en lenguaje máquina. 3. Segmento de datos estáticos. Variables accesibles durante todo el programa (globales y variables static de C). 4. Información de relocalización. Identifica instrucciones que dependen de direcciones absolutas.

10 Universidad de SonoraArquitectura de Computadoras10 Típico OBJ de Unix 5. Tabla de símbolos. Etiquetas que no han sido definidas como variables externas. 6. Información útil para un debugger. Permite asociar instrucciones de máquina con líneas del código fuente original.

11 Universidad de SonoraArquitectura de Computadoras11 Microsoft COFF Common Object File Format. Inicialmente definido para Unix V, fue extendido por Microsoft para Windows 3.1. Se usa en todas las versiones de Windows de 32 y 64 bits.

12 Universidad de SonoraArquitectura de Computadoras12 Microsoft COFF Encabezado Encabezados de sección Código Datos Información para relocalizar Información para depuración

13 Universidad de SonoraArquitectura de Computadoras13 Linker Pega (link) varios archivos objeto compilados posiblemente por separado. Resuelve referencias externas e internas. En algunos sistemas como Windows, el linker relocaliza el código. Produce un solo archivo ejecutable.

14 Universidad de SonoraArquitectura de Computadoras14 Relocalización Ensamblador bne $t0, $t1, brinco ; if t0 != t1 goto brinco … brinco: etc. Lenguaje máquina 1000 bne $8, $9, 1020 … 1020 etc.

15 Universidad de SonoraArquitectura de Computadoras15 Relocalización La instrucción 1000 bne $8, $9, 1020 está asumiendo que va ser cargada en la dirección 1000. Los sistemas operativos modernos (multiusuario y/o multitarea) cargan en memoria varios programas a la vez y pueden ser colocados en áreas distintas cada vez que corren.

16 Universidad de SonoraArquitectura de Computadoras16 Relocalización La solución (para este caso) es hacer el brinco relativo. 1000 bne $8, $9, +20 En general, hay que guardar información sobre dependencias en el código.

17 Universidad de SonoraArquitectura de Computadoras17 Ejemplo – archivo objeto A Encabezado Nombre:Procedure A Tamaño de código:0x100 Tamaño de datos:0x20 Segmento de texto DirecciónInstrucciónSignificado 0lw $a0, 0($gp)$a0 ← Mem[X] 4jal 0call B ……… Segmento de datos 0(X)(X) …… Información de relocalización DirecciónTipo de instrucciónDependencia 0lwX 4jalB Tabla de símbolos EtiquetaDirección X--- B

18 Universidad de SonoraArquitectura de Computadoras18 Ejemplo – archivo objeto B Encabezado Nombre:Procedure B Tamaño de código:0x200 Tamaño de datos:0x30 Segmento de texto DirecciónInstrucciónSignificado 0sw $a1, 0($gp)Mem[Y] ← $a1 4jal 0call A ……… Segmento de datos 0(Y)(Y) …… Información de relocalización DirecciónTipo de instrucciónDependencia 0swY 4jalA Tabla de símbolos EtiquetaDirección Y--- A

19 Universidad de SonoraArquitectura de Computadoras19 Ejemplo - relocalizando El procedimiento A necesita encontrar la dirección de la variable X y del procedimiento B. El procedimiento B necesita encontrar la dirección de la variable Y y del procedimiento A. En MIPS, el segmento de texto comienza en la dirección 400,000 16. A se carga a partir de 400,000 16 y como el código de A mide 100 16, B se carga a partir de 400,100 16.

20 Universidad de SonoraArquitectura de Computadoras20 Ejemplo - relocalizando El segmento de datos comienza en la dirección 10,000,000 16. Los datos de A se cargan en 10,000,000 16 y como miden 20 16, los datos de B se cargan en 10,000,020 16. El registro $gp se inicializa en 10,008,000 16. Los datos de A se accesan con $gp – 8,000 16. Los datos de B se accesan con $gp – 7,980 16. Con esta información, el linker puede relocalizar el código y generar un archivo ejecutable.

21 Universidad de SonoraArquitectura de Computadoras21 Ejemplo - ejecutable Encabezado Tamaño de código:0x300 Tamaño de datos:0x50 Segmento de texto DirecciónInstrucción 0x400,000lw $a0, 0x8000($gp) 0x400,004jal 0x400100 …… 0x400,100sw $a1, 0x8020($gp) 0x400,104jal 0x400000 …… Segmento de datos Dirección 0x10,000,000(X)(X) …… 0x10,000,020(Y)(Y) ……

22 Universidad de SonoraArquitectura de Computadoras22 Referencias externas Se generan al compilar archivos por separado. Archivo “hola.c” void foo (void); // prototipo void main () { foo (); // referencia externa }

23 Universidad de SonoraArquitectura de Computadoras23 Referencias externas Archivo “mundo.c” #include void foo () { printf ("hola mundo\n"); }

24 Universidad de SonoraArquitectura de Computadoras24 Referencias externas Compilación usando Borland C 5.5 1. bcc32 –c hola.c Compila sin ligar y genera hola.obj 2. bcc32 –c mundo.c Compila sin ligar y genera mundo.obj 3. bcc32 hola.obj mundo.obj Invoca al linker y genera hola.exe

25 Universidad de SonoraArquitectura de Computadoras25 Archivos ejecutables Definición del Merriam-Webster: Archivo que hace que una computadora “realice tareas de acuerdo a instrucciones codificadas.” Formatos más comunes: a.out (Unix).com (CP/M y MS-DOS).exe (MS-DOS y Windows) formalmente llamado PE (Portable executable).

26 Universidad de SonoraArquitectura de Computadoras26 Microsoft PE Portable Executable. Formato: 1. Encabezado EXE de MS-DOS (por compatibilidad). 2. Mini-programa MS-DOS: “This program cannot be run in DOS mode”. 3. Encabezado PE. 4. Encabezados de las secciones. 5. Sección.text: código. 6. Sección.data: datos estáticos.

27 Universidad de SonoraArquitectura de Computadoras27 Microsoft PE 7. Sección.edata: tabla de símbolos exportados (usado por DLLs). 8. Sección.idata: tabla de símbolos importados. 9. Sección.rdata: datos de solo lectura (constantes y strings). 10. Sección.tls: variables globales que pueden ser accesadas como variables locales por hilos (threads). 11. Sección.rsrc: recursos como menús y diálogos. 12. Sección.reloc: información de relocalización.

28 Universidad de SonoraArquitectura de Computadoras28 Microsoft PE

29 Universidad de SonoraArquitectura de Computadoras29 Cargadores Conocidos en inglés como “loaders”. Carga el programa ejecutable en la memoria y le cede el control. En algunos sistemas operativos como MS-DOS el cargador es el que relocaliza el código.

30 Universidad de SonoraArquitectura de Computadoras30 Cargador típico de Unix 1. Lee el ejecutable y determina el tamaño de los segmentos de texto y datos. 2. Crea un espacio de direcciones suficientemente grande para el texto y los datos. 3. Copia las instrucciones y datos a la memoria. 4. Copia los parámetros del programa principal (si es que existen) en la pila.

31 Universidad de SonoraArquitectura de Computadoras31 Cargador típico de Unix 5. Inicializa los registros incluyendo el apuntador a la pila (sp). 6. Brinca a una rutina de start-up que copia los parámetros en los registros y llama a la rutina principal. 7. Cuando la rutina principal regresa, la rutina de start- up termina el programa con una llamada al sistema de exit.

32 Universidad de SonoraArquitectura de Computadoras32 Resumen 1. Compilador. Traduce el programa a lenguaje ensamblador. 2. Ensamblador. Genera un archivo objeto por cada archivo en ensamblador. 3. Linker. Resuelve referencias, relocaliza y genera un ejecutable. 4. Cargador. Carga el ejecutable en memoria y lo corre. El compilador típico incluye los 3 primeros pasos. El cargador es parte del sistema operativo.

33 Universidad de SonoraArquitectura de Computadoras33 Camino de un programa en Java

34 Universidad de SonoraArquitectura de Computadoras34 Compilador El compilador de Java genera un archivo class por cada clase compilada. El archivo class contiene: Tabla de métodos válidos con sus bytecodes. Información extra, como la clase padre. Los bytecodes son las instrucciones de la máquina virtual de Java (JVM) y son independientes del hardware. “Compila una vez, corre donde sea” (compile once, run anywhere).

35 Universidad de SonoraArquitectura de Computadoras35 JVM La máquina virtual de Java interpreta y ejecuta los bytecodes. Algunas JVMs incluyen un compilador JIT (just-in- time) que compila los bytecodes a código máquina conforme el programa está corriendo.

36 Universidad de SonoraArquitectura de Computadoras36

37 Universidad de SonoraArquitectura de Computadoras37 Explicación Algunos mnemónicos usan un prefijo: a – dirección. b – byte (8 bits). i – entero (32 bits). s – short (16 bits). I8 es una constante de 8 bits. I16 es una constante de 16 bits.

38 Universidad de SonoraArquitectura de Computadoras38 Explicación La JVM usa una pila para guardar resultados intermedios. Los operandos se guardan en la pila, se hace la operación y se sacan. El compilador sabe el tamaño máximo de la pila de operandos para cada método y le asigna espacio en el frame actual.

39 Universidad de SonoraArquitectura de Computadoras39 Explicación TOS = tope de la pila. NOS = siguiente posición debajo del TOS. NNOS = siguiente posición debajo del NOS. pop. Quita el TOS. pop2. Quita el TOS y el NOS. push. Agrega un elemento a la pila. Const[] se refiere al pool de constantes de la clase creado por la JVM al momento de correr. Frame[] a las variables en el frame local del método.

40 Universidad de SonoraArquitectura de Computadoras40 Diferencias entre JVM y MIPS 1. Para guardar resultados temporales: MIPS usa registros, JVM una pila. 2. Tamaño de instrucción: MIPS 4 bytes, JVM de 1 a 5 bytes para ahorrar espacio. 3. JVM tiene seguridad integrada. Por ejemplo, en un arreglo, la JVM checa que la referencia al arreglo sea válida y que el índice esté dentro del límite.

41 Universidad de SonoraArquitectura de Computadoras41 Diferencias entre JVM y MIPS 4. Para que el recolector de basura encuentre los apuntadores “vivos”, JVM tiene instrucciones distintas para operar con direcciones y para operar con enteros. 5. JVM tiene instrucciones complejas como crear espacio para un arreglo o invocar un método.

42 Universidad de SonoraArquitectura de Computadoras42 Comparación entre JVM y MIPS Compilar el siguiente código en C/Java a MIPS y JVM: while (save[i] == k) i += 1;

43 Universidad de SonoraArquitectura de Computadoras43 MIPS ; s3 = i, s5 = k, s6 = dirección de save ciclo: sll $t1, $s3, 2; t1 = i * 4 / t1 = tiene el offset add $t1, $t1, $s6; t1 apunta a save[i] lw $t0, 0($t1); t0 = save[i] bne $t0, $s5, Exit; if save[i]  k goto Exit add $s3, $s3, 1; i++ j ciclo; goto ciclo Exit:

44 Universidad de SonoraArquitectura de Computadoras44 JVM ; i, k y save son las primeras tres variables locales. 0 aload_3; push variable local 3 (save) 1 iload_1; push variable local 1 (i) 2 iaload; pop TOS y NTOS y push save[i] 3 iload_2; push variable local 2 (k) 4 if_icompne, Exit; compara TOS y NTOS, los saca y ; brinca si no son iguales 7 iinc, 1, 1; i++ 10 go to 0; brinca al inicio (byte 0)

45 Universidad de SonoraArquitectura de Computadoras45 Comparación entre JVM y MIPS MIPS: 6 instrucciones, 24 bytes. JVM: 7 instrucciones, 13 bytes. La diferencia es mayor si tomamos en cuenta que la JVM checa automáticamente que los accesos al arreglo estén dentro del rango. Ciclo while modificado en MIPS para checar rangos ocupa 11 instrucciones, es decir, 44 bytes.

46 Universidad de SonoraArquitectura de Computadoras46 Ciclo while en MIPS ; s3 = i, s5 = k, s6 = dirección de save ; s6 apunta a la lista de métodos legales para save ; s6 + 4 apunta al tamaño del arreglo ; s6 + 8 apunta a save[0] (primer elemento) lw $t2, 4($s6); t2 = tamaño del arreglo ciclo: slt $t0, $s3, 0; if i < 0 bne $t0, $zero, IndexOutOfBounds ; goto Error slt $t0, $s3, $t2; if i  tamaño beq $t0, $zero, IndexOutOfBounds ; goto Error

47 Universidad de SonoraArquitectura de Computadoras47 Ciclo while en MIPS sll $t1, $s3, 2; t1 = i * 4 / t1 = tiene el offset add $t1, $t1, $s6; t1 apunta a save[i] lw $t0, 8($t1); t0 = save[i] bne $t0, $s5, Exit; if save[i]  k goto Exit add $s3, $s3, 1; i++ j ciclo; goto ciclo Exit:

48 Universidad de SonoraArquitectura de Computadoras48 Invocando métodos en Java El compilador escoge el método apropiado dependiendo del tipo (clase) del objeto. El compilador genera código para: 1. Revisar que objeto no sea nulo, y en su caso brincar a una rutina de error. 2. Cargar la lista de métodos válidos para ese objeto. La primera palabra guarda un apuntador a esa tabla. 3. Cargar la dirección del método apropiado, dejando la dirección de regreso en la pila. 4. Brincar al inicio del método.

49 Universidad de SonoraArquitectura de Computadoras49 Compilado vs. Interpretado Ventaja de un programa interpretado: portabilidad. Ventaja de un programa compilado: rapidez de ejecución. Los compiladores JIT tratan de reducir esa ventaja.

50 Universidad de SonoraArquitectura de Computadoras50 Compilado vs. Interpretado

51 Universidad de SonoraArquitectura de Computadoras51 Conceptos importantes Compilador. Ensamblador. Linker. Cargador o loader. Relocalización. Referencias internas. Referencias externas. Intérprete. Compilador JIT (just-in-time).


Descargar ppt "Traduciendo y ejecutando programas. Universidad de SonoraArquitectura de Computadoras2 El camino de un programa en C."

Presentaciones similares


Anuncios Google