Professional Documents
Culture Documents
No
Graphics Specifications
Grficos del procesador
3
Expansion Options
Revisin de PCI Express 3.0
Configuraciones de PCI Express
2.0
Tecnologa Intel vPro
Yes
Tecnologa Hyper-Threading Intel
Yes
Tecnologa de virtualizacin Intel (VT-x)
Yes
Tecnologa de virtualizacin Intel para E/S
dirigida (VT-d)
Yes
Intel VT-x con tablas de pginas
extendidas (EPT)
Yes
Intel Transactional Synchronization
Extensions New Instructions
Yes
Intel 64
Yes
Tecnologa Intel My WiFi Yes
Estados de inactividad Yes
Tecnologa Intel SpeedStep mejorada
Yes
Tecnologas de monitoreo trmico Yes
Tecnologa Intel Identity Protection
Yes
Programa Intel de imagen estable para
plataformas (SIPP)
Yes
Data Protection Technology
Nuevas instrucciones de AES
Yes
Secure Key Yes
Intel Platform Protection Technology
OS Guard Yes
Tecnologa Trusted Execution
Yes
Bit de desactivacin de ejecucin
Yes
Tecnologa antirrobo Yes
Programacin para core i7
El moderno conjunto de instrucciones x86 es un superconjunto de las instrucciones del 8086 y
el 8088 y una serie de extensiones a este conjunto de instrucciones que comenzaron con el
microprocesador Intel 8008. Existe casi una completa compatibilidad binaria desde los chips
Intel 8088 y 8086 con los modernos procesadores Intel Pentium 4,Intel Core Duo, Intel Core
i7, AMD Athlon 64, AMD Opteron, hasta la generacin actual de microprocesadores x86,
aunque existen algunas excepciones. Esta compatibilidad se logra gracias al uso de 2
conjuntos de instrucciones de arquitecturas, lo cual es comnmente criticado. La
compatibilidad de los programas en lenguaje ensamblador con procesadores ms antiguos
slo es posible cuando el programa no incluye instrucciones solo disponibles en los
procesadores nuevos.
Generalmente, cada nuevo procesador de la serie tiene unas cuantas instrucciones
adicionales y ms capacidades y mejor desempeo que los anteriores.
Mnemotcnicos y cdigos de operacin
Cada instruccin del x86 est representada por un mnemotcnico, que traduce directamente a
una serie de bytes la representacin de la instruccin, llamada cdigo de operacin. Por
ejemplo, la instruccin NOP se codifica como 0x90 y la instruccin HLT como 0xF4. Algunos
cdigos de operacin no tienen nombres mnemotcnicos y no estn documentados.
Diferentes procesadores en la familia del x86 pueden interpretar cdigos de operacin
indocumentados de forma distinta, haciendo que un mismo programa se comporte de forma
distinta en diferentes procesadores.
Sintaxis
El lenguaje ensamblador x86 tiene 2 vertientes diferentes en cuanto a su sintaxis de
programacin: sintaxis Intel, usada en sus inicios para la documentacin de la plataforma x86,
y sintaxis AT&T .
1
La sintaxis Intel es la dominante en la plataforma Windows, mientras que
en Unix/Linux ambas son utilizadas aunque GCC solo soportaba la sintaxis AT&T en sus
primeras versiones.
La mayora de los ensambladores x86 utilizan la sintaxis de Intel,
como MASM, TASM, NASM, FASM and YASM. GAS ha soportado ambas sintaxis desde la
versin 2.10 a travs de la directiva .intel_sintax.
1
2
3
Registros
Los procesadores x86 tienen una serie de registros disponibles para almacenar informacin.
Este conjunto de registros son conocidos como registros de propsito general o GPR (del
ingls General Purpose Register).
Adems de los GPR, existen adicionalmente:
registros de segmento (CS, DS, ES, FS, GS, SS)
otros registros (IP, Registro de estado)
registros extra (MMX, 3DNow!, SSE, etc).
El registro IP apunta a la posicin del programa en la que el procesador est ejecutando el
cdigo. EL registro no puede ser accedido por el programador directamente.
Los registros del x86 pueden ser usados mediante la instruccin MOV. Por ejemplo:
mov ax, 1234h
mov bx, ax
copia el valor 1234h en el registro ax y en la siguiente lnea copia el valor de ax en el registro
bx.
Direccionamiento segmentado
La arquitectura x86 utiliza el mtodo de segmentacin para direccionar memoria, en lugar del
mtodo lineal usado en otras arquitecturas. La segmentacin implica descomponer una
direccin lineal en dos partes un segmento y un desplazamiento. El segmento apunta al
inicio de un bloque de 64K direcciones y el desplazamiento indica la diferencia entre el lugar
apuntado y el inicio del segmento.
Este modo de direccionamiento se utiliza para aprovechar las caractersticas del procesador.
El problema estaba en que los registros internos del procesador eran de 16 bits, mientras que
el bus de direcciones era de 20. Faltaban por tanto 4 bits para poder aprovechar al mximo las
capacidades de direccionamiento del procesador. Para resolver esto, cada direccin de
memoria ser especificada como un segmento y un desplazamiento dentro de ese segmento.
Esta solucin divide la memoria en segmentos de 64 K, lo cul limit bastante los diseos de
los procesadores posteriores de la familia (Intel 80286, Intel 80386, etc.); aunque
posteriormente se idearon mtodos para resolver este problema, como la memoria extendida
(no compatible con el x86/x88). Con esto se consigue que el procesador sea capaz de
direccionar 1,048,576 direcciones de 1 byte, o lo que es lo mismo, 1Mbyte.
Se utilizan dos registros para el direccionamiento: uno para indicar el segmento, y el otro para
indicar el desplazamiento.
Para obtener la direccin de memoria (direccin efectiva): se toma el valor de registro de
segmento, se desplaza 4 bits a la izquierda (multiplicacin por 16), y se le suma el valor del
desplazamiento.
Tipos de instrucciones
En general, las caractersticas del repertorio de instrucciones x86 son:
Una codificacin compacta
Longitud variable y alineacin independiente (codificacin en formato little endian)
Instrucciones de una y dos direcciones, en las que el primer operando es tambin el
destino.
Operandos de memoria como origen y destino compatibles (normalmente utilizados
para leer/escribir elementos de la pila usando pequeos desplazamientos inmediatos)
Uso de los registros generales e implcitos; a pesar de que los siete registros
generales (contando 'ebp') pueden ser utilizados como acumuladores o para
direccionar, la mayora de ellos son tambin usados implcitamente por algunas
instrucciones especiales; los registros afectados deben conservar temporalmente la
informacin, si estn siendo utilizados durante el uso de estas instrucciones
(normalmente mediante el uso de la pila).
Produce flags condicionales implcitamente mediante el uso de la mayora de
instrucciones de la ALU
Soporta varios modos de direccionamiento
Incluye punto flotante en una pila de registros
Contiene soporte especial para instrucciones atmicas (XCHG, CMPXCHG(8B), XADD e
instrucciones enteras combinadas con el prefijo LOCK)
Instrucciones SIMD (instrucciones que aplican una misma operacin sobre un conjunto
ms o menos grande de datos)
Instrucciones de pila
La pila es un segmento que es de suma utilidad en estos microprocesadores. En l se
almacenan valores temporales como las variables locales de las funciones, o las direcciones
de retorno de stas. Una funcin no es ms que una subrutina, o un fragmento de cdigo al
que se le llama generalmente varias veces desde el programa principal, o desde una funcin
jerrquicamente superior. Cuando se llama a una funcin se hace un mero salto al punto
donde empieza ese cdigo. Sin embargo esa subrutina puede ser llamada desde distintos
puntos del programa principal, por lo que hay que almacenar en algn sitio la direccin desde
donde se hace la llamada, cada vez que esa llamada tiene lugar, para que al finalizar la
ejecucin de la funcin se retome el programa donde se dej. Esta direccin puede
almacenarse en un sitio fijo (como hacen algunos microcontroladores), pero eso tiene el
inconveniente de que si esa funcin a su vez llama a otra funcin (o a s misma!) podemos
sobreescribir la direccin de retorno anterior, y al regresar de la segunda llamada, no
podramos volver desde la primera. Adems, es deseable que la funcin guarde los valores de
todos los registros que vaya a usar en algn sitio, para que el que la llame no tenga que
preocuparse de ello (pues si sabe que los registros van a ser modificados, pero no sabe
cules, los guardar todos por si acaso). Todas estas cosas, y algunas ms, se hacen con la
pila.
El segmento de pila est indicado por SS, y el desplazamiento dentro del segmento, por SP.
Cuando arranca el programa, SP apunta al final del segmento de pila. Para almacenar
informacin en la pila se decrementa SP para que apunte un poco ms arriba y se copia a esa
posicin de memoria, SS:SP. Para sacarlo, copiamos lo que haya en SS:SP a nuestro destino,
e incrementamos el puntero.
Como con todo lo que se hace con frecuencia, hay dispuestas instrucciones propias para el
manejo de la pila. Las dos bsicas son PUSH origen (empujar) y POP destino(sacar). La
primera decrementa el puntero de pila y copia a la direccin apuntada por l (SS:SP) el
operando origen (de tamao mltiplo de 16 bits), mientras que la segunda almacena el
contenido de la pila (elemento apuntado por SS:SP) en destino y altera el puntero en
consecuencia. Si el operando es de 16 bits se modifica en 2 unidades, de 32 en 4, etc. Lo que
se incrementa/decrementa es siempre SP, claro, porque SS nos indica dnde est ubicado el
segmento de pila.
La instruccin ret size se utiliza para recuperar de la pila los valores de IP o de CS e IP
dependiendo del caso. Al salir de un procedimiento es necesario dejar la pila como estaba;
para ello podemos utilizar la instruccin pop, o bien ejecutar la
instruccin ret size donde size es el nmero de posiciones que deben descartarse de la pila.
Instrucciones de la ALU con enteros
El ensamblador x86 tiene las operaciones matemticas estndar, como add, sub, mul,
y idiv; los operadores lgicos and, or, xor, neg; desplazamientos, sal/sar, shl/shr;
rotacin con/sin acarreo, rcl/rcr, rol/ror, un complemento de instrucciones aritmticas
BCD, aaa, aad, daa y otras.
Instrucciones en coma flotante
El ensamblador x86 incluye instrucciones para pila basada en unidades en coma flotante.
Entre ellas se encuentran la suma, resta, negacin, multiplicacin, divisin, resto, races
cuadradas, truncamiento entero y truncamiento fraccionado. Las operaciones tambin incluyen
instrucciones de conversin con las que se puede cargar o almacenar un valor desde memoria
a cualquiera de los siguientes formatos: BCD, entero de 32 bits, entero de 64 bits, punto
flotante de 32 bits, punto flotante de 64 bits u 80 bits. El x86 tambin incluye funciones como
seno, coseno, tangente, arco tangente, exponente con base 2 y logaritmos de base 2, 10 o e.
La conversin de instrucciones al formato del registro de pila es normalmente F (OP) st,
st(*) o F (OP) st(*), st, donde st es equivalente a st(0), y st(*) es uno de los 8 registros
de pila (st(0), st(1), ..., st(7)). Como con los enteros, el primer operando acta como primera
fuente y como operando destino. La suma, resta, multiplicacin, divisin, almacenamiento y
comparacin de instrucciones incluye modos de instruccin que se encargan de desapilar una
vez completada la operacin.
En el caso de que no exista ningn operando, supone destino = ST(1), fuente = ST y se hace
adems pop sobre la pila, de modo que el resultado se sita en lo alto de la pila. Por ejemplo,
FADD calcula ST(1)=ST(1)+ST y hace pop sobre la pila (incrementando en uno el puntero de
pila), con lo que el nuevo elemento en lo alto de la pila contiene el resultado.
Instrucciones SIMD
Los procesadores x86 modernos tienen instrucciones SIMD, que permiten realizar la misma
operacin en paralelo sobre diversos valores codificados en un registro SIMD. Varias
tecnologas de instrucciones soportan diferentes operaciones sobre distintos repertorios de
registros, pero todos (desde MMX hasta SSE4,2) incluyen clculo general sobre aritmtica
entera o en coma flotante (suma, resta, multiplicacin, desplazamiento, minimizacin,
maximizacin, comparacin, divisin o raz cuadrada). Por ejemplo, PADDW MM0, MM1
aplica 4 sumas paralelas de enteros de 16 bits (debido a la W que indica que son palabras) de
los valores de mm0 hasta mm1, y los almacena en mm0. SSE tambin incluye el modo en
coma flotante en el que el primer valor de los registros est modificado (expandido en el
SSE2).
Instrucciones de manipulacin de datos
El procesador x86 tambin incluye modos de direccionamiento complejo para direccionar
memoria con un desplazamiento inmediato, un registro, un registro con desplazamiento, un
registro escalado con o sin desplazamiento y un registro con desplazamiento opcional y otro
registro escalado. Entonces por ejemplo, uno puede codificar mov eax, [Table + ebx +
esi*4] como una instruccin simple que carga 32 bits de datos desde la direccin localizada
en el desplazamiento (Table + ebx + esi * 4) desde el segmento DS, y almacenarla en el
registro eax. En general, los procesadores x86 pueden cargar y usar memoria ajustada al
tamao del cualquier registro sobre el que est operando.
Los repertorios de instrucciones x86 incluyen instrucciones de carga, almacenamiento y
movimiento de cadenas (LODS, STOS and MOVS) que representan cada operacin con un
tamao especificado (B para bytes, W para palabras de 16-bits, D para dobles palabras de 32
bits) e incrementan/decrementan el registro de direccin implcito (SI para LODS, DI para
STOS y ambos para MOVS). Para la carga y almacenamiento, el registro destino/fuente
implcito es el AL, AX o EAX, dependiendo del tamao. El segmento usado implcitamente es
DS para LODS, ES para STOS y ambos para MOVS.
La pila est implementada con un puntero que disminuye (push) y aumenta (pop)
implcitamente. En el modo de 16 bits, este puntero se corresponde a la direccin SS:[SP], en
32- bits sera SS:[ESP] y en 64-bits [RSP]. El puntero de pila se encarga de apuntar al ltimo
valor almacenado, asumiendo que su tamao coincide con el modo del procesador (12, 32 o
64 bits) para que coincida con el ancho por defecto de las instrucciones
PUSH/POP/CALL/RET. Otras instrucciones para manipular la pila son PUSHF y POPF, que se
utilizan para almacenar y recuperar el registro de FLAGS, almacenndolo o retirndolo de la
parte alta de la pila.
Flujo del programa
El ensamblador x86 tiene una operacin de salto incondicional, jmp, que admite una direccin
inmediata, un registro o una direccin indirecta mediante registro como parmetro.
Tambin se permiten los saltos condicionales, como je (saltar cuando hay
igualdad), jne (saltar en desigualdad), jg (saltar si 'mayor que', con signo), jl (saltar si
'menor que', con signo), ja (saltar si 'superior/mayor que', sin signo), jb (saltar si
'inferior/menor que', sin signo). Estas operaciones condicionales se basan en el estado
especfico de los bits del registro de FLAGS. La mayora de las operaciones aritmticas se
encargan de actualizar estos flags segn su resultado. Las instrucciones de
comparacin cmp y testmodifican el estado del registro de flags sin modificar los operandos.
Las comparaciones en coma flotante se realizan mediante las instrucciones FCOM o FICOM.
Cada operacin de salto tiene tres formas diferentes, dependiendo del tamao del operando.
Un salto sort usa un operando con signo de 8bits, que se corresponde con el desplazamiento
relativo a la instruccin actual. El salto near es similar al corto pero usa un operando de 16 o
32 bits con signo. Un salto far utiliza el segmento entero base:desplazamiento como una
direccin total. Tambin hay forma indirecta e indexada para cada uno de ellos.
Adems de las operaciones de salto, existen las instrucciones call y ret para llamar y
regresar de una subrutina. Antes de transferir el control a la subrutina, call apila el
desplazamiento de la instruccin siguiente a la llamada en la pila; ret desapila este valor de la
pila, y transfiere el control a la direccin que indicaba el valor desapilado. En el caso de que se
trate de una llamada a una funcin lejana, far call, la base tambin se apila siguiendo al
desplazamiento.
Existen algunas instrucciones similares, como la interrupcin int. sta activa el procedimiento
de interrupcin especificado por el operando y guarda el valor del registro de flags en la pila .
La activacin de la interrupcin se realiza mediante una llamada a un procedimiento lejano
(far call), pero en lugar de una direccin, utiliza ese vector de interrupcin. La direccin de
este vector se calcula multiplicando por 4 el operando, que es un valor entre 0 y 255.
Normalmente, el manejador de interrupciones guarda todos los registros que el procesador
est usando, a menos que estn siendo usados para almacenar el resultado de una
operacin. Por otro lado, para volver al programa desde una interrupcin se utiliza iret, que
se encarga de restablecer el valor de los flags. Las interrupciones ligeras descritas
anteriormente son usadas por algunos sistemas operativos para las llamadas del sistema, y
pueden tambin ser usadas para depurar los manejadores de interrupciones fuertes. stas
son provocadas por eventos hardware externos, y deben mantener los valores de todos los
registros ya que el estado del programa en ejecucin se desconoce. En el Modo Protegido, las
interrupciones pueden ser activadas por el Sistema Operativo para realizar un cambio de
tarea, almacenando automticamente todos los registros de la tarea en ejecucin.