Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Fundamentos de Arquitectura y Código Máquina Lección 3 Ing. Jorge Castro-Godı́nez MT7003 Microprocesadores y Microcontroladores Área de Ingenierı́a Mecatrónica Instituto Tecnológico de Costa Rica I Semestre 2014 Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 1 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Contenido 1 Generación de código ejecutable 2 Arquitectura del conjunto de instrucciones 3 Fundamentos de x86 Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 2 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 ¿En qué se parecen estos bloques? (1) if (x != 0) y = (y+z)/x; cmpl je movl movl leal movl sarl idivl movl $0, -4(%ebp) .L2 -12(%ebp), %eax -8(%ebp), %edx (%edx, %eax), %eax %eax, %edx $31, %edx -4(%ebp) %eax, -8(%ebp) Jorge Castro-Godı́nez 1000001101111100001001000001110000000000 0111010000011000 10001011010001000010010000010100 10001011010001100010010100010100 100011010000010000000010 1000100111000010 110000011111101000011111 11110111011111000010010000011100 10001001010001000010010000011000 Fundamentos de Arquitectura y Código Máquina 3 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 ¿En qué se parecen estos bloques? (2) if (x != 0) y = (y+z)/x; !* cmpl je movl movl leal movl sarl idivl movl $0, -4(%ebp) .L2 -12(%ebp), %eax -8(%ebp), %edx (%edx, %eax), %eax %eax, %edx $31, %edx -4(%ebp) %eax, -8(%ebp) "# # $* 1000001101111100001001000001110000000000 0111010000011000 10001011010001000010010000010100 10001011010001100010010100010100 100011010000010000000010 1000100111000010 110000011111101000011111 11110111011111000010010000011100 10001001010001000010010000011000 Realmente se trata de una misma lı́nea de código. El HW entiende en 1’s y 0’s. Sin embargo no es un lenguaje “amigable” para el ser humano. Las instrucciones en lenguaje máquina son mucho más cortas que el número de bits que se necesitarı́an para representar los Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 4 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Interfaz HW/SW: Perspectiva histórica El HW inicialmente fue muy primitivo. Diseños de HW eran costosos. Las instrucciones debı́an ser muy simples. E.g., una sola instrucción para sumar dos enteros. El SW también era bastante primitivo. Las primitivas de SW reflejaban el HW de una manera muy cercana. Architecture Specification (Interface) Hardware Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 5 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Interfaz HW/SW: Ensambladores Los ensambladores facilitaron la vida, por mucho... 1 instrucción en ensamblador = 1 instrucción en lenguaje máquina Las instrucciones en ensamblador son cadenas de caracteres. Más fácil de leer y escribir para los humanos. Uso de nombres simbólicos. Assembler specification User program in asm Assembler Jorge Castro-Godı́nez Hardware Fundamentos de Arquitectura y Código Máquina 6 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Interfaz HW/SW: Lenguajes de alto nivel Un mayor nivel de abstracción La complejidad de los programas creció. 1 lı́nea de código en un lenguaje de alto nivel podrı́a ser compilado en muchas lı́neas de lenguaje ensamblador. C language specification User program in C C compiler Jorge Castro-Godı́nez Assembler Hardware Fundamentos de Arquitectura y Código Máquina 7 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Interfaz HW/SW: escritura, compilación y ejecución :+6%*>#=%* :+=?#2%*>#=%* User program in C C compiler .c file Jorge Castro-Godı́nez R4"*>#=%* Assembler Hardware .exe file Fundamentos de Arquitectura y Código Máquina 8 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Rendimiento en la traducción de programas ¿De que depende el tiempo requerido para traducir un programa? Del programa mismo, por ejemplo si está escrito en C. Del compilador: cuál es el conjunto (set) de instrucciones traduce del programa en C. De la arquitectura del conjunto de instrucciones (ISA, Instruction Set Architecture): cuál es el conjunto de instrucciones disponible para el compilador. La implementación de hardware: cuanto tiempo toma ejecutar las instrucciones. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 9 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Arquitectura del Conjunto de Instrucciones El ISA define: El estado del sistema: registros, memoria, contador de programa. Las instrucciones que el CPU puede ejecutar. El efecto que cada una de las instrucciones tiene en el estado del sistema. CPU PC Memory Registers Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 10 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Desiciones de diseño de los ISA Instrucciones ¿Qué instrucciones estarán disponibles? ¿Qué hacen estas instrucciones? ¿Cómo estarán codificadas estas instrucciones? Registros ¿Cuántos registros habrán? ¿Qué tamaño tendrán los registros? Memoria ¿Cómo se especificarán las ubicaciones en memoria? Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 11 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 x86 Aquellos procesadores que implementan el ISA de x86 completamente, dominan el mercado de los servidores, las pc de escritorio y laptop. Diseño evolucionario: Compatibilidad hacia atrás hasta 8086 (de 1978) Cada vez se han agregado más funcionalidades en el tiempo. CISC: Complex Instruction Set Computer Muchas diferentes instrucciones con muchos diferentes formatos. Solo un conjunto pequeño de estas instrucciones se encuentran en programas en Linux. Instrucciones más complejas pero capaces de realizar cosas complejas. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 12 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Evolución de x86 Nombre 8086 386 Pentium 4F Año 1978 1985 2005 Transistores 29k 275k 230M MHz 5-10 16-33 2800-3800 Evolución de 16, 32 y 64 bits. Capacidades para emplear sistemas operativos complejos, como los basados en Unix, fue posible. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 13 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Procesadores x86 486 Pentium Pentium/MMX Pentium Pro Pentium III Pentium IV Core 2 Duo Core i7 (1) 1989 1993 1997 1995 1999 2001 2006 2008 1.9M 3.1M 4.5M 6.5M 8.2M 42M 291M 731M Funcionalidades se han agregado en el tiempo. Instrucciones para soportar funcionalidades multimedias. Operaciones en paralelo de 1, 2 y 4 bytes de datos. Instrucciones para mejorar la eficiencia de operaciones condicionales. Más núcleos! Fin del escalamiendo de Dennard y de la ley de Moore. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 14 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Procesadores x86 Jorge Castro-Godı́nez (2) Fundamentos de Arquitectura y Código Máquina 15 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Evolución de los Procesadores 100,000 Performance (vs. VAX-11/780) 10,000 Intel Xeon 6 cores, 3.3 GHz (boost to 3.6 GHz) Intel Xeon 4 cores, 3.3 GHz (boost to 3.6 GHz) Intel Core i7 Extreme 4 cores 3.2 GHz (boost to 3.5 GHz) 24,129 Intel Core Duo Extreme 2 cores, 3.0 GHz 21,871 19,484 Intel Core 2 Extreme 2 cores, 2.9 GHz 14,387 AMD Athlon 64, 2.8 GHz 11,865 AMD Athlon, 2.6 GHz Intel Xeon EE 3.2 GHz 7,108 6,043 6,681 Intel D850EMVR motherboard (3.06 GHz, Pentium 4 processor with Hyper-Threading Technology) 4,195 IBM Power4, 1.3 GHz 3,016 Intel VC820 motherboard, 1.0 GHz Pentium III processor 1,779 Professional Workstation XP1000, 667 MHz 21264A 1,267 Digital AlphaServer 8400 6/575, 575 MHz 21264 993 AlphaServer 4000 5/600, 600 MHz 21164 649 Digital Alphastation 5/500, 500 MHz 481 Digital Alphastation 5/300, 300 MHz 280 Digital Alphastation 4/266, 266 MHz 183 IBM POWERstation 100, 150 MHz 117 Digital 3000 AXP/500, 150 MHz 80 HP 9000/750, 66 MHz 51 1000 100 10 IBM RS6000/540, 30 MHz MIPS M2000, 25 MHz 18 MIPS M/120, 16.7 MHz 13 Sun-4/260, 16.7 MHz 9 VAX 8700, 22 MHz 5 24 22%/year 52%/year AX-11/780, 5 MHz 25%/year 1.5, VAX-11/785 1 1 1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006 2008 2010 2012 Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 16 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Clones de x86: AMD Historicamente AMD (Advanced Micro Devices) ha seguido de cerca a Intel. Un poco más lentos, pero mucho más baratos En su momento contrataron diseñadores de circuitos de Digital Equipment y otras compañias. Fabricaron el Opteron: fuerte competidor del Pentium 4 Desarrollaron x86-64, su propia extensión de x86 a 64 bits. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 17 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Definiciones Arquitectura También se conoce como ISA o arquitectura abstracta. Las partes del diseño del procesador que deben ser comprendidas para escribir código en lenguaje ensamblador. ¿Qué es visible para el SW? Microarquitectura Es la impementación de la arquitectura o arquitectura abstracta. Arquitectura concreta. ¿Es el tamaño de la memoria caché parte de la arquitectura? ¿La frecuencia de operación de núcleo? ¿El número de registros del procesador? Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 18 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Perspectiva del programador de ensamblador (1) Memory CPU Addresses PC Registers Data Condition Codes Instructions Object Code Program Data OS Data Stack Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 19 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Perspectiva del programador de ensamblador (2) Estado visible al programador. PC: Program Counter (Contador de programa). Dirección de la siguiente instrucción a ser ejecutada. Llamado EIP (IA32) o RIP (x86-64) Archivo de registros Altamente usados por los programas para procesar datos. Códigos de condición Almacena la información del estado de las operaciones ariméticas y lógicas recientemente usadas. Usadas para los saltos condicionales. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 20 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Perspectiva del programador de ensamblador (3) Memoria Arreglos direccionables por bytes. Código/programa, datos, datos del SO. Incluye el uso de la pila (stack) usada para soportar procedimientos. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 21 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Convertir un archivo de C en Código Objeto Suponga código en archivos p1.c y p2.c Comando de compilación: gcc -O1 p1.c p2.c -o p Optimizaciones básicas (-O1) El resultado queda en p p text C program (p1.c p2.c) Compiler (gcc -S) text Asm program (p1.s p2.s) Assembler (gcc or as) binary Object program (p1.o p2.o) Static libraries (.a) Linker (gcc or ld) binary Executable program (p) Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 22 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Convertir un archivo de C en Ensamblador gcc -O1 -S code.c Produce un archivo code.s Generated IA32 Assembly C Code int sum(int x, int y) { int t = x+y; return t; } Jorge Castro-Godı́nez sum: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax addl 8(%ebp),%eax movl %ebp,%esp popl %ebp ret Fundamentos de Arquitectura y Código Máquina 23 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Disassembly “Desensamblar” objdump -d program Es una herramienta útil para examinar el código objeto. Puede ser ejecutado sobre archivos .o o binarios finales. Disassembled 00401040 <_sum>: 0: 55 1: 89 e5 3: 8b 45 0c 6: 03 45 08 9: 89 ec b: 5d c: c3 Jorge Castro-Godı́nez push mov mov add mov pop ret %ebp %esp,%ebp 0xc(%ebp),%eax 0x8(%ebp),%eax %ebp,%esp %ebp Fundamentos de Arquitectura y Código Máquina 24 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Tipos básicos de instrucciones Realizar funciones aritméticas empleando registros o datos en memoria. Transferir/mover información entre registos y memoria Cargar datos de memoria a registros. Almacenar datos de los registros a la memoria. Transferencia de control Saltos incondicionales desde o hacia procedimientos. Saltos condicionales. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 25 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 ¿Qué es un registro? Es una ubicación dentro del CPU que almacena una pequeña cantidad de datos, los cuales pueden ser accesados muy rápidamente (una vez cada ciclo de reloj). Entre más pequeño más rápido. Registros constituyen el corazón/centro de la programación en ensamblador Recurso muy importante, pero escaso, en x86. Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 26 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 general purpose Registros Enteros IA32 %eax accumulate %ecx counter %edx data %ebx base %esi source index %edi destination index stack pointer base pointer %esp %ebp 32-bits wide Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 27 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 general purpose Registros Enteros IA32 %eax %ax %ah %al accumulate %ecx %cx %ch %cl counter %edx %dx %dh %dl data %ebx %bx %bh %bl base %esi %si source index %edi %di destination index %esp %sp %ebp %bp stack pointer base pointer 16-bit virtual registers (backwards compatibility) Instruction Set Architecture Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 28 / 29 Generación de código ejecutable Arquitectura del conjunto de instrucciones Fundamentos de x86 Registros x86-64 %rax %eax %r8 %r8d %rbx %ebx %r9 %r9d %rcx %ecx %r10 %r10d %rdx %edx %r11 %r11d %rsi %esi %r12 %r12d %rdi %edi %r13 %r13d %rsp %esp %r14 %r14d %rbp %ebp %r15 %r15d Jorge Castro-Godı́nez Fundamentos de Arquitectura y Código Máquina 29 / 29