traduciendo y ejecutando programas. universidad de sonoraarquitectura de computadoras2 el camino de...
Post on 28-Jan-2016
224 Views
Preview:
TRANSCRIPT
Traduciendo y ejecutando programas
Universidad de Sonora Arquitectura de Computadoras 2
El camino de un programa en C
Universidad de Sonora Arquitectura de Computadoras 3
CompiladorCompilador
Traduce de lenguaje C a lenguaje ensamblador.
Universidad de Sonora Arquitectura de Computadoras 4
Hola Mundo en C# include <stdio.h>
void main (){
printf ("Hola mundo\n");}
Universidad de Sonora Arquitectura de Computadoras 5
Ensamblador (BCC55)ifdef ??versionif ??version GT 500H.mmxendifendifmodel flatifndef ??version?debug macroendmendif?debug S "hola_mundo.c"?debug T "hola_mundo.c"
_TEXT segment dword public use32 'CODE'_TEXT ends_DATA segment dword public use32 'DATA'_DATA ends_BSS segment dword public use32 'BSS'_BSS endsDGROUP group _BSS,_DATA
Universidad de Sonora Arquitectura de Computadoras 6
Ensamblador (BCC55)_TEXT segment dword public use32 'CODE'_main proc near?live1@0: ; ; void main () ;
push ebpmov ebp,esp
; ; { ; printf ("Hola mundo\n"); ;@1:
push offset s@call _printfpop ecx
; ; } ;@2:
pop ebpret
_main endp_TEXT ends
Universidad de Sonora Arquitectura de Computadoras 7
Ensamblador (BCC55)_DATA segment dword public use32 'DATA's@ label byte
; s@+0:db "Hola mundo",10,0align 4
_DATA ends_TEXT segment dword public use32 'CODE'_TEXT ends
public _main extrn _printf:near
?debug D "c:\Borland\BCC55\Include\_nfile.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_null.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_defs.h" 10459 6176?debug D "c:\Borland\BCC55\Include\_stddef.h" 10459 6176?debug D "c:\Borland\BCC55\Include\stdio.h" 10459 6176?debug D "hola_mundo.c" 14910 22993end
Universidad de Sonora Arquitectura de Computadoras 8
Programa EnsambladorAcepta 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.
Universidad de Sonora Arquitectura de Computadoras 9
Típico OBJ de Unix1. 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.
Universidad de Sonora Arquitectura de Computadoras 10
Típico OBJ de Unix5. 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.
Universidad de Sonora Arquitectura de Computadoras 11
Microsoft COFFCommon 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.
Universidad de Sonora Arquitectura de Computadoras 12
Microsoft COFFEncabezado
Encabezados de sección
CódigoDatosInformación para relocalizarInformación para depuración
Universidad de Sonora Arquitectura de Computadoras 13
LinkerPega (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.
Universidad de Sonora Arquitectura de Computadoras 14
RelocalizaciónEnsamblador
bne $t0, $t1, brinco ; if t0 != t1 goto brinco
…brinco: etc.
Lenguaje máquina1000 bne $8, $9, 1020
…1020 etc.
Universidad de Sonora Arquitectura de Computadoras 15
RelocalizaciónLa instrucción
1000 bne $8, $9, 1020está 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.
Universidad de Sonora Arquitectura de Computadoras 16
RelocalizaciónLa 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.
Universidad de Sonora Arquitectura de Computadoras 17
Ejemplo – archivo objeto AEncabezado Nombre: Procedure A
Tamaño de código: 0x100
Tamaño de datos: 0x20
Segmento de texto Dirección Instrucción Significado
0 lw $a0, 0($gp) $a0 ← Mem[X]
4 jal 0 call B
… … …
Segmento de datos 0 (X)
… …
Información de relocalización
Dirección Tipo de instrucción Dependencia
0 lw X
4 jal B
Tabla de símbolos Etiqueta Dirección
X ---
B ---
Universidad de Sonora Arquitectura de Computadoras 18
Ejemplo – archivo objeto BEncabezado Nombre: Procedure B
Tamaño de código: 0x200
Tamaño de datos: 0x30
Segmento de texto Dirección Instrucción Significado
0 sw $a1, 0($gp) Mem[Y] ← $a1
4 jal 0 call A
… … …
Segmento de datos 0 (Y)
… …
Información de relocalización
Dirección Tipo de instrucción Dependencia
0 sw Y
4 jal A
Tabla de símbolos Etiqueta Dirección
Y ---
A ---
Universidad de Sonora Arquitectura de Computadoras 19
Ejemplo - relocalizandoEl 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,00016.
A se carga a partir de 400,00016 y como el código de A mide 10016, B se carga a partir de 400,10016.
Universidad de Sonora Arquitectura de Computadoras 20
Ejemplo - relocalizandoEl segmento de datos comienza en la dirección
10,000,00016.
Los datos de A se cargan en 10,000,00016 y como miden 2016, los datos de B se cargan en 10,000,02016.
El registro $gp se inicializa en 10,008,00016.
Los datos de A se accesan con $gp – 8,00016.
Los datos de B se accesan con $gp – 7,98016.Con esta información, el linker puede relocalizar
el código y generar un archivo ejecutable.
Universidad de Sonora Arquitectura de Computadoras 21
Ejemplo - ejecutableEncabezado Tamaño de código: 0x300
Tamaño de datos: 0x50
Segmento de texto Dirección Instrucción
0x400,000 lw $a0, 0x8000($gp)
0x400,004 jal 0x400100
… …
0x400,100 sw $a1, 0x8020($gp)
0x400,104 jal 0x400000
… …
Segmento de datos Dirección
0x10,000,000 (X)
… …
0x10,000,020 (Y)
… …
Universidad de Sonora Arquitectura de Computadoras 22
Referencias externasSe generan al compilar archivos por separado.Archivo “hola.c”
void foo (void); // prototipo
void main (){
foo (); // referencia externa}
Universidad de Sonora Arquitectura de Computadoras 23
Referencias externasArchivo “mundo.c”
#include <stdio.h>
void foo (){ printf ("hola mundo\n");}
Universidad de Sonora Arquitectura de Computadoras 24
Referencias externasCompilación usando Borland C 5.5
1. bcc32 –c hola.cCompila sin ligar y genera hola.obj
2. bcc32 –c mundo.cCompila sin ligar y genera mundo.obj
3. bcc32 hola.obj mundo.objInvoca al linker y genera hola.exe
Universidad de Sonora Arquitectura de Computadoras 25
Archivos ejecutablesDefinició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).
Universidad de Sonora Arquitectura de Computadoras 26
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.
Universidad de Sonora Arquitectura de Computadoras 27
Microsoft PE7. 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.
Universidad de Sonora Arquitectura de Computadoras 28
Microsoft PE
Universidad de Sonora Arquitectura de Computadoras 29
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.
Universidad de Sonora Arquitectura de Computadoras 30
Cargador típico de Unix1. 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.
Universidad de Sonora Arquitectura de Computadoras 31
Cargador típico de Unix5. 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.
Universidad de Sonora Arquitectura de Computadoras 32
Resumen1. 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.
Universidad de Sonora Arquitectura de Computadoras 33
Camino de un programa en Java
Universidad de Sonora Arquitectura de Computadoras 34
CompiladorEl 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).
Universidad de Sonora Arquitectura de Computadoras 35
JVMLa 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.
Universidad de Sonora Arquitectura de Computadoras 36
Universidad de Sonora Arquitectura de Computadoras 37
ExplicaciónAlgunos 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.
Universidad de Sonora Arquitectura de Computadoras 38
ExplicaciónLa 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.
Universidad de Sonora Arquitectura de Computadoras 39
ExplicaciónTOS = 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.
Universidad de Sonora Arquitectura de Computadoras 40
Diferencias entre JVM y MIPS1. 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.
Universidad de Sonora Arquitectura de Computadoras 41
Diferencias entre JVM y MIPS4. 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.
Universidad de Sonora Arquitectura de Computadoras 42
Comparación entre JVM y MIPSCompilar el siguiente código en C/Java a
MIPS y JVM:
while (save[i] == k)i += 1;
Universidad de Sonora Arquitectura de Computadoras 43
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:
Universidad de Sonora Arquitectura de Computadoras 44
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)
Universidad de Sonora Arquitectura de Computadoras 45
Comparación entre JVM y MIPSMIPS: 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.
Universidad de Sonora Arquitectura de Computadoras 46
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 arreglociclo:
slt $t0, $s3, 0 ; if i < 0bne $t0, $zero, IndexOutOfBounds ; goto Errorslt $t0, $s3, $t2 ; if i tamañobeq $t0, $zero, IndexOutOfBounds ; goto Error
Universidad de Sonora Arquitectura de Computadoras 47
Ciclo while en MIPSsll $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:
Universidad de Sonora Arquitectura de Computadoras 48
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.
Universidad de Sonora Arquitectura de Computadoras 49
Compilado vs. InterpretadoVentaja de un programa interpretado:
portabilidad.
Ventaja de un programa compilado: rapidez de ejecución.
Los compiladores JIT tratan de reducir esa ventaja.
Universidad de Sonora Arquitectura de Computadoras 50
Compilado vs. Interpretado
Universidad de Sonora Arquitectura de Computadoras 51
Conceptos importantesCompilador.Ensamblador.Linker.Cargador o loader.Relocalización.Referencias internas.Referencias externas.Intérprete.Compilador JIT (just-in-time).
top related