transistores registros proposito procesador instrucciones general caracteristicas x86 intel x86-16

x86 - proposito - registros del procesador



¿Cuál es el propósito de los registros de CS e IP en el ensamblaje de Intel 8086? (6)

Entonces, como dice la pregunta, ¿cuál es el propósito de los registros CS e IP en Intel 8086

Encontré esta explicación:

El segmento de código (CS) es un registro de 16 bits que contiene la dirección del segmento de 64 KB con las instrucciones del procesador. El procesador utiliza el segmento CS para todos los accesos a las instrucciones a las que hace referencia el registro del puntero de instrucción (IP). El registro CS no se puede cambiar directamente. El registro CS se actualiza automáticamente durante las instrucciones de salto lejano, llamada lejana y retorno lejano.

y esto para IP:

Puntero de instrucción (IP) es un registro de 16 bits.

Realmente no entiendo lo que esto significa básicamente, así que si alguien pudiera dar una explicación más "vívida", sería genial :)


Como IP es de 16 bits, significa que solo puede tener 64k instrucciones (2 ^ 16), que no era mucho incluso en los 80. Entonces, para expandir el espacio de direcciones, tiene un segundo registro que aborda 64k bloques. Podría considerar cs: ip como un registro de 32 bits que luego es capaz de direccionar 2 ^ 32 bytes ... es decir, 4G que es lo que obtiene en un procesador que usa direcciones de 32 bits. El 8086 usaba 20 bits de direcciones, por lo que podía acceder a 1M de memoria.


La dirección física se calcula a partir de 2 partes. i) dirección del segmento. ii) dirección de desplazamiento. El CS (registro de segmento de código) se usa para direccionar el segmento de código de la memoria, es decir, una ubicación en la memoria donde se almacena el código. El IP (puntero de instrucción) contiene el desplazamiento dentro del segmento de código de la memoria. Por lo tanto, CS: IP se usa para señalar la ubicación (es decir, para calcular la dirección física) del código en la memoria.


Una vez que escribe .code en el texto de su programa de ensamblaje, ese .code apunta al valor de cs. cualquier comando posterior o anterior en el archivo se tratará como por cs: ip, donde ip es un valor de desplazamiento de cs.

Por supuesto, debe tener en cuenta que el compilador ensamblador convertirá primero el texto en instrucciones de código de máquina.


dado que el procesador 8086 usa direccionamiento de 20 bits, podemos acceder a 1MB de memoria, pero los registros de 8086 son solo 16 bits, así que para acceder a los datos de la memoria combinamos los valores presentes en los registros del segmento de código y registros de puntero de instrucción para generar dirección física, se realiza moviendo el valor de CS 4 bits hacia la izquierda y luego agregándolo con el valor IP

EJEMPLO:

el valor de CS es 1234Hex (hexa decimal)

el valor de IP es 5678 Hex

ahora el valor de CS después de mover 4 bits a la izquierda es 12340Hex y después de agregar con el valor de IP es 179B8Hex, que es la dirección física


Registro IP - IP es puntero de instrucción. Su función es la misma que la de PC (contador de programa) en otro microprocesador, que es apuntar a la siguiente instrucción que la unidad BIU debe obtener para alimentar a la unidad EU.


La instrucción que se ejecutará a continuación es aquella en la dirección de memoria igual a:

16 * CS + IP

Esto permite abordar 20 bits de memoria, a pesar de que los registros tienen solo 16 bits de ancho (y también crea dos formas distintas de codificar la mayoría de las direcciones).

El efecto de CS es análogo al de los otros registros de segmento. Por ejemplo, DS incrementa los accesos de datos (que no especifican otro registro de segmento) mediante 16 * DS .

CS

Las instrucciones que modifican CS son:

  • ljmp (salto lejano)
  • lcall (far call), que empuja ip y cs a la pila, y luego salta lejos
  • lref (retorno lejano), que invierte la llamada lejana
  • int, que lee IP / CS de la tabla de vectores de interrupción
  • iret, que invierte una int

CS no me puede modificar por mov como los otros registros de segmento. Intentando codificarlo con el identificador estándar para CS, que GNU GAS 2.24 hace sin quejarse si escribe:

mov %ax, %cs

conduce a una excepción de código no válido cuando se ejecuta.

Para observar el efecto de CS, intente agregar lo siguiente a un sector de arranque y ejecutarlo en QEMU como se explica aquí https://.com/a/32483545/895245

/* $1 is the new CS, $1f the new IP. */ ljmp $1, $after1 after1: /* Skip 16 bytes to make up for the CS == 1. */ .skip 0x10 mov %cs, %ax /* cs == 1 */ ljmp $2, $after2 after2: .skip 0x20 mov %cs, %ax /* cs == 2 */

IP

IP aumenta automáticamente cada vez que se ejecuta una instrucción por la duración de la codificación de esa instrucción: ¡esta es la razón por la cual el programa avanza!

La IP se modifica por las mismas instrucciones que modifican CS, y también por las versiones no lejanas de esas instrucciones (caso más común).

La IP no se puede observar directamente, por lo que es más difícil jugar con ella. Consulte esta pregunta por alternativas: Lectura del contador del programa directamente