¡Descarga Transparencias 2.1 y más Apuntes en PDF de Ingeniería Infórmatica solo en Docsity!
Programación a Nivel-Máquina I:
Conceptos Básicos
Estructura de Computadores Semana 3
Bibliografía: [BRY11] Cap.3 Computer Systems: A Programmer’s Perspective. Bryant, O’Hallaron. Pearson, 2011 Signatura ESIIT/C.1 BRY com
Transparencias del libro CS:APP, Cap. Introduction to Computer Systems: a Programmer’s Perspective Autores: Randal E. Bryant y David R. O’Hallaron http://www.cs.cmu.edu/afs/cs/academic/class/15213-f11/www/schedule.html
2
Guía de trabajo autónomo (4h/s)
Lectura: del Cap.3 CS:APP (Bryant/O’Hallaron)
Historical perspective, Program Encodings, Data Formats, Accessing Info.
- 3.1 - 3.4 pp.187- Procedures, Stack frame, Transferring control (opcional por ahora)
- 3.7.1 - 3.7.2 pp.253- x86-64, History, Overview, Accessing Info. (hasta Arithmetic)
- 3.13 - 3.13.3 pp.301-
Ejercicios: del Cap.3 CS:APP (Bryant/O’Hallaron)
Probl. 3.1 - 3.5 pp.204, 208, 210- Probl. 3.30 p. Probl. 3.46 - 3.47 pp.305, 310
Bibliografía: [BRY11] Cap.3 Computer Systems: A Programmer’s Perspective. Bryant, O’Hallaron. Pearson, 2011 Signatura ESIIT/C.1 BRY com
Procesadores Intel x
Dominan totalmente mercado portátil/sobremesa/servidor
Diseño evolutivo
Compatible ascendentemente hasta el 8086, introducido en 1978
Va añadiendo características conforme pasa el tiempo
Computador con repertorio instrucciones complejo (CISC)
Muchas instrucciones diferentes, con muchos formatos distintos
Pero sólo un pequeño subconjunto aparece en programas Linux
Difícil igualar prestaciones Computadores Repertorio Instr. Reducido
(RISC)
Sin embargo, Intel lo ha conseguido
En lo que a velocidad se refiere. No tanto en (bajo) consumo.
Evolución Intel x86: Hitos significativos
Nombre Fecha Transistores MHz
8086 1978 29K 5-
Primer procesador Intel 16-bit. Base para el IBM PC & MS-DOS
Espacio direccionamiento 1MB
386 1985 275K 16-
Primer procesador Intel 32-bit de la familia IA32 (x86)
Agregó “direccionamiento plano” (“flat addressing”)
Capaz de arrancar Unix
Linux/gcc 32-bit no usa instrucciones introducidas en modelos posteriores
Pentium 4F 2004 125M 2800-
Primer procesador 64-bit Intel, familia Intel 64 (EM64t, x86-64)
Core i7 2008 731M 2667-
4 cores, hyperthreading (2 vías)
Procesadores Intel x86, cont.
Evolución de las máquinas
386 1985 0.3M
Pentium 1993 3.1M
Pentium/MMX 1997 4.5M
PentiumPro 1995 6.5M
Pentium III 1999 8.2M
Pentium 4 2001 42M
Core 2 Duo 2006 291M
Core i7 2008 731M
Características añadidas
Instrucciones de soporte para operación multimedia
Operaciones paralelas con datos 1B, 2B y 4-byte, tanto enteros & p. flot.
Instrucciones para posibilitar operaciones condicionales más eficientes
Evolución Linux/GCC
2 etapas principales: 1) soporte 32-bit 386. 2) soporte 64-bit x86-
Microfotografía de un dado Core i
Más Información
Procesadores Intel (Wikipedia) List_of_Intel_microprocessors
Microarquitecturas Intel ark.intel.com
List_of_Intel_CPU_microarchitectures Wikipedia EMT64 / EM64T / x86_
Clones x86: Advanced Micro Devices (AMD)
Históricamente
AMD ha ido siguiendo a Intel en todo
CPUs un poco más lentas, mucho más baratas
Y entonces
Reclutaron los mejores diseñadores de circuitos de Digital Equipment
Corp. y otras compañías con tendencia descendente
Construyeron el Opteron: duro competidor para el Pentium 4
Desarrollaron x86-64, su propia extensión a 64 bits
11
Los 64-Bit de Intel
Intel intentó un cambio radical de IA32 a IA
Arquitectura totalmente diferente (Itanium)
Ejecuta código IA32 sólo como herencia*
Prestaciones decepcionantes
AMD intervino con una Solución Evolutiva
x86-64 (ahora llamado “AMD64”)
Intel se sintió obligado a concentrarse en IA
Difícil admitir error, o admitir que AMD es mejor
2004: Intel anuncia extensión EM64T de la IA
Extended Memory 64-bit Technology
Casi idéntica a x86-
Todos los procesadores x86 salvo gama baja soportan x86-
Pero gran cantidad de código se ejecuta aún en modo 32-bits
* “legacy” = herencia de características
Programación Máquina I: Conceptos Básicos
Historia de los procesadores y arquitecturas de Intel
Lenguaje C, ensamblador, código máquina
Conceptos básicos asm: Registros, operandos, move
Intro a x86-
Definiciones
Arquitectura: (también arquitectura del repertorio de instrucciones:
ISA): Las partes del diseño de un procesador que se
necesitan entender para escribir código ensamblador.
Ejemplos: especificación del repertorio de instrucciones, registros.
Microarquitectura: Implementación de la arquitectura.
Ejemplos: tamaño de las caches y frecuencia de los cores.
Ejemplo de ISAs (Intel): x86, IA, IPF
texto
texto
binario
binario
Compilador (gcc -S)
Ensamblador (gcc ó as)
Enlazador (gcc ó ld)
programa C (p1.c p2.c)
programa asm (p1.s p2.s)
programa objeto (p1.o p2.o)
programa ejecutable (p)
Convertir C en Código Objeto
Código en ficheros p1.c p2.c
Compilar con el comando: gcc –O1 p1.c p2.c -o p
Usar optimizaciones básicas ( -O1 ) Poner binario resultante en fichero p
librerías estáticas (.a)
17
Compilar a ensamblador
Código C
int sum(int x, int y) { int t = x+y; return t; }
Ensamblador IA32 generado
sum: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax addl 8(%ebp),%eax popl %ebp ret
Obtenerlo con el comando
/usr/local/bin/gcc –O1 -S code.c
Produce el fichero code.s
Algunos compiladores usan
la instrucción “leave” *
* LEAVE deshace ENTER previo: ESP←EBP, POP EBP.
Características ensamblador: Operaciones
Realizan función aritmética sobre datos en registros o memoria
Transfieren datos entre memoria y registros
Cargar datos de memoria a un registro
Almacenar datos de un registro en memoria
Transferencia de control
Llamadas incondicionales a procedimientos / retornos desde ellos
Saltos condicionales
20
Código para sum
0x401040 : 0x 0x 0xe 0x8b 0x 0x0c 0x 0x 0x 0x5d 0xc
Código Objeto
Ensamblador
Traduce .s pasándolo a .o
Instrucciones codificadas en binario
Imagen casi completa del código ejecutable
Le faltan enlaces entre código de ficheros
diferentes
Enlazador
Resuelve referencias entre ficheros
Combina con libs. de tiempo ejec. estáticas*
P.ej., código para malloc(), printf()
Algunas libs. son dinámicamente enlazadas **
En enlace ocurre cuando el programa empieza a ejecutarse
- 11 bytes total
- Cada instrucción 1, 2, ó 3 bytes
- Empieza en direcc. 0x
_** “dynamically linked libraries”, o también “shared libs”
- “static run-time libraries” = bibliotecas estáticas para soporte en tiempo de ejecución_