Una de las cosas básicas que necesita una computadora para realizar un seguimiento es dónde se encuentran las instrucciones que se están ejecutando en la memoria.
Esto normalmente lo hace la CPU utilizando lo que a menudo se conoce como puntero de instrucción o contador del programa register . El nombre exacto depende de la arquitectura, pero el concepto se generaliza en todas las arquitecturas. Se llama puntero de instrucción en las CPU de Intel, y ese es el término que usaré en esta respuesta. El puntero de instrucción se incrementa continuamente mientras se ejecutan las instrucciones desde la memoria, y también se actualiza cada vez que se ejecuta una instrucción de salto de algún tipo. Las arquitecturas modernas de CPU con múltiples tuberías de ejecución paralelas y múltiples núcleos hacen que lo que realmente está sucediendo dentro de la CPU sea más complejo, pero para un observador externo, la explicación simple es suficiente para comprender qué está sucediendo y el propósito de los registros relevantes. p>
En virtud de que los procesadores Intel 8086/8088, 80186 y 80286 antiguos son procesadores de 16 bits, el puntero de instrucción se expresó normalmente como un par de valores de 16 bits conocido como segmento de código (selector de código en el 80286, pero excepto en los selectores de modo protegido funcionan de manera muy similar a los segmentos) y el puntero de instrucción. En el ensamblado de ensamblador, CS:IP
donde los dos puntos indican el emparejamiento de un segmento y un desplazamiento como un par para formar una dirección de memoria. CS e IP aquí son registros de CPU , pequeñas ubicaciones de memoria dentro del chip de la CPU, en este caso particular, cada 16 bits de tamaño. (También tenía elementos como DS:DX
, que era convencionalmente la ubicación donde leer o escribir datos en la memoria; DS era segmento de datos y DX es un registro de propósito general que en este caso contenía los datos desviación del segmento. Originalmente, había cuatro registros destinados a uso general, denominados AX, BX, CX y DX respectivamente, cada uno de los cuales podría abordarse en términos de la mitad alta, AH, por ejemplo, o la mitad baja, - AL, más un pequeño número de registros de propósito general que tenían usos específicos específicos. Las CPU modernas tienen muchos, muchos más registros, con docenas de registros comunes y más de cien no desconocidos.)
Al crear la CPU 80386 a fines de la década de 1980, Intel hizo muchos cambios, incluida la ampliación del espacio de direcciones a 32 bits mientras mantiene los selectores como concepto . Por esta razón, los antiguos valores de 16 bits ya no eran suficientes, y el puntero de instrucción se extendió a 32 bits. Para mantener la compatibilidad total con versiones anteriores (en este punto, Intel probablemente había aprendido la lección del 80286 que era más compatible en una sola dirección; era fácil pasar del modo real del 8086/8088 al modo modo protegido de 80286, pero regresar fue mucho más difícil, y esto resultó ser un problema en la práctica), esto requería un nuevo registro para que la CPU mantuviera el puntero de instrucción cuando operaba en 32- modo bit.
En el 80386, los registros extendidos (de 32 bits) se llamaron Exx, mientras que los registros de 16 bits correspondientes eran como xx. Entonces obtendríamos, por ejemplo, el antiguo registro de acumuladores de 16 bits AX más el registro de acumuladores extendido de 32 bits EAX (con mitades de 16 bits EAH y EAL). De acuerdo con esta convención de denominación, el registro Extended Instruction Pointer se denominaba EIP.
Aparte de esto, la mayoría de las veces, el valor correcto no es simplemente EIP, sino CS: EIP, porque el valor de EIP sigue siendo un offset desde una ubicación inicial que está definida por el selector de código .