Del programa en C a sus resultados
Introducción a la Programación
Clase 3
De un programa C a su carga en
memoria para su ejecución
Compilar, Enlazar, cargar
• Tres procesos deben efectuarse sobre el
programa fuente (hello.c) para que éste pueda
ejecutarse.
– Proceso de Compilación (Compile)
• Toma como entrada un archivo fuente (.c)
• Saca como salida un archivo objeto (.o)
– Proceso de Enlace (Link)
• Toma como entrada uno o varios archivos objeto
• Saca como salida un archivo ejecutable
– Proceso de Carga en memoria (Load)
• Toma como entrada un archivo ejecutable
• No hay salida
Compilación
• Si no especificamos nada, gcc compila,
ensambla y enlaza, es decir, genera el
ejecutable. A ese conjunto de funciones se
las llama «
build»
.
• En
http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/
tenemos un manual on-line de las
opciones de compilación del gcc
Compilación sin enlazar: opción -c
C:\Users\Patricia\programas_c> gcc -c euler1.c
C:\Users\Patricia\programas_c>dir
El volumen de la unidad C no tiene etiqueta. El número de serie del volumen es: 1C16-BCF3 Directorio de C:\Users\Patricia\programas_c 30/03/2011 08:57 p.m. <DIR> . 30/03/2011 08:57 p.m. <DIR> .. 25/03/2011 10:42 a.m. 236 euler1.c 27/03/2011 11:47 a.m. 25.126 euler1.exe 30/03/2011 08:57 p.m. 610 euler1.o
Compilación sin ensamblar: opción -S
C:\Users\Patricia\programas_c> gcc -S euler1.c
C:\Users\Patricia\programas_c>dir
El volumen de la unidad C no tiene etiqueta. El número de serie del volumen es: 1C16-BCF3 Directorio de C:\Users\Patricia\programas_c 30/03/2011 09:41 p.m. <DIR> . 30/03/2011 09:41 p.m. <DIR> .. 27/03/2011 03:50 p.m. 25.126 euler.exe 25/03/2011 10:42 a.m. 236 euler1.c 27/03/2011 11:47 a.m. 25.126 euler1.exe 30/03/2011 08:57 p.m. 610 euler1.o 30/03/2011 09:41 p.m. 776 euler1.s 5 archivos 51.874 bytes
Programa Hello.s (ensamblador ia32)
.file "euler1.c"
.def ___main; .scl 2; .type 32; .endef .section .rdata,"dr"
LC0:
.ascii "El resultado es %d\12\0" .text
.globl _main
.def _main; .scl 2; .type 32; .endef _main:
pushl %ebp
movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $0, 24(%esp) movl $3, 28(%esp) jmp L2
Programa Hello.s (cont)
L5:
movl 28(%esp), %eax movl $3, %edx
movl %edx, %ecx cltd
idivl %ecx
movl %edx, %eax testl %eax, %eax je L3
movl 28(%esp), %eax movl $5, %edx
movl %edx, %ecx cltd
idivl %ecx
movl %edx, %eax testl %eax, %eax jne L4
L3:
movl 28(%esp), %eax addl %eax, 24(%esp) L4:
incl 28(%esp) L2:
cmpl $999, 28(%esp) jle L5
movl 24(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret .def _printf; .scl 2; .type 32; .endef