Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación a Nivel‐Máquina I:
Conceptos Básicos
Estructura de Computadores
Semana 2
Bibliografía:
[BRY11] Cap.3 Computer Systems: A Programmer’s Perspective. Bryant, O’Hallaron. Pearson, 2011
Signatura ESIIT/C.1 BRY com
Bibliografía:
[BRY11] Cap.3 Computer Systems: A Programmer’s Perspective. Bryant, O’Hallaron. Pearson, 2011
Signatura ESIIT/C.1 BRY com 2
Diseño evolutivo
Compatible ascendentemente hasta el 8086, introducido en 1978
Va añadiendo características conforme pasa el tiempo
286
X86 / IA32 386
486
Pentium
MMX Pentium MMX
SSE2 Pentium 4
SSE3 Pentium 4E
X86‐64 / EM64t Pentium 4F tiempo
Core 2 Duo
SSE4 Core i7
Más Información
Procesadores Intel (Wikipedia) List_of_Intel_microprocessors
List_of_Intel_CPU_microarchitectures
10
Nosotros veremos:
IA32
El x86 tradicional
x86‐64/EM64T
El “nuevo” estándar
Comentaremos brevemente las diferencias
Presentación
El libro presenta IA32 en las Secciones 3.1—3.12
Cubre x86‐64 en 3.13
Nosotros los veremos a la vez
Las prácticas se concentran en IA32
12
13
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.
14
16
Compilar a ensamblador
Código C Ensamblador IA32 generado
int sum(int x, int y) sum:
{ pushl %ebp
int t = x+y; movl %esp,%ebp
return t; movl 12(%ebp),%eax
} addl 8(%ebp),%eax
popl %ebp
ret
18
Transferencia de control
Llamadas incondicionales a procedimientos / retornos desde ellos
Saltos condicionales
19
Código Objeto
Código para sum
Ensamblador
0x401040 <sum>:
0x55
Traduce .s pasándolo a .o
0x89 Instrucciones codificadas en binario
0xe5 Imagen casi completa del código ejecutable
0x8b
0x45 Le faltan enlaces entre código de ficheros
0x0c diferentes
0x03 Enlazador
0x45
0x08 Resuelve referencias entre ficheros
• 11 bytes total
0x5d Combina con libs. de tiempo ejec. estáticas*
0xc3 • Cada instrucción P.ej., código para malloc(), printf()
1, 2, ó 3 bytes
• Empieza en direcc.
Algunas libs. son dinámicamente enlazadas**
0x401040 En enlace ocurre cuando el programa
empieza a ejecutarse
Desensamblador
objdump -d p
Herramienta útil para examinar código objeto
Analiza el patrón de bits de series de instrucciones
Produce versión aproximada del código ensamblador (correspondiente)
Puede ejecutarse sobre el fich. a.out (ejecutable completo) ó el .o
22
Desensamblado Alternativo
Objeto Desensamblado
0x401040: Dump of assembler code for function sum:
0x55 0x080483c4 <sum+0>: push %ebp
0x89 0x080483c5 <sum+1>: mov %esp,%ebp
0xe5 0x080483c7 <sum+3>: mov 0xc(%ebp),%eax
0x8b 0x080483ca <sum+6>: add 0x8(%ebp),%eax
0x45 0x080483cd <sum+9>: pop %ebp
0x0c 0x080483ce <sum+10>: ret
0x03
0x45
0x08
0x5d Desde el Depurador gdb
0xc3 gdb p
disassemble sum
Desensamblar procedimiento
x/11xb sum
Examinar 11 bytes a partir de sum
23
No symbols in "WINWORD.EXE".
Disassembly of section .text:
30001000 <.text>:
30001000: 55 push %ebp
30001001: 8b ec mov %esp,%ebp
30001003: 6a ff push $0xffffffff
30001005: 68 90 10 00 30 push $0x30001090
3000100a: 68 91 dc 4c 30 push $0x304cdc91
25
índice
%esi %si fuente
índice
%edi %di destino
puntero
%esp %sp
de pila
puntero
%ebp %bp
base
movl (%ecx),%eax
movl 8(%ebp),%edx
popl %ebx
popl %ebp Fin
ret
30
popl %ebx
popl %ebp Fin
ret
31
Comprendiendo swap*
void swap(int *xp, int *yp) •
{ • Pila
int t0 = *xp; • (en memoria)
Offset
int t1 = *yp;
*xp = t1; 12 yp
*yp = t0; 8 xp
}
4 Dir.retorno
0 Ant.%ebp %ebp
-4 Ant.%ebx %esp
Registro Valor
%edx xp
%ecx yp
movl 8(%ebp), %edx # edx = xp
%ebx t0
movl 12(%ebp), %ecx # ecx = yp
%eax t1 movl (%edx), %ebx # ebx = *xp (t0)
movl (%ecx), %eax # eax = *yp (t1)
movl %eax, (%edx) # *xp = t1
movl %ebx, (%ecx) # *yp = t0
* “swap” = intercambio 32
33
34
35
36
37
38
39
Casos Especiales
(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]]
D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D]
(Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]]
40
41
42
Instrucciones
palabra Long l (4 Bytes) ↔ palabra Quad q (8 Bytes)
Nuevas instrucciones:
movl ➙ movq
addl ➙ addq
sall ➙ salq
etc.
44
popl %ebx
popl %ebp Fin
ret
45
47
48
Bibliografía:
[BRY11] Cap.3 Computer Systems: A Programmer’s Perspective. Bryant, O’Hallaron. Pearson, 2011
Signatura ESIIT/C.1 BRY com 49