Tengo una pregunta relacionada con un registro de PC (IP en la jerga x86). En la mayoría de las arquitecturas, se actualiza durante una etapa de ejecución y, por lo tanto, almacena una dirección de la siguiente instrucción que se debe buscar. Me pareció claro hasta que empecé a razonar sobre una arquitectura segmentada. Por ejemplo, imagine la siguiente canalización RISC clásica con 5 etapas (Recuperar, Decodificar, Ejecutar, Acceso a memoria, Escritura) que contiene las siguientes instrucciones (designadas como "a", "b", "c", "d" ):
F D E M W
c b a - -
0x12 call [0x100] ; a
0x14 mov ax, 10 ; b
0x16 add ax, 2 ; c
0x18 nop ; d <- IP
En el momento en que una instrucción "a" llega a la etapa E (Ejecutar) en la tubería, ya está llena con instrucciones subsiguientes e IP apunta a una instrucción en la dirección 0x18 (la siguiente para buscar). Cuando "call [0x100]" se ejecuta, guarda el contenido de la IP (una dirección de retorno) en la pila. ¡Pero obviamente no es la dirección de la instrucción que sigue a "call [0x100]"! Entonces, cuando regresamos de CALL, efectivamente saltamos más de 2 instrucciones ya que la tubería se vacía durante la ejecución de CALL.
Lo que significa que:
- Hay otro registro oculto que almacena la dirección de las instrucciones que se están ejecutando y se almacena en la pila en lugar de IP
- No funciona de esta manera
- Me estoy perdiendo algo :)