¿Cómo se evita la omisión de instrucciones durante las llamadas de procedimiento en arquitecturas segmentadas?

2

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 :)
pregunta raiks

1 respuesta

2

Leyendo el manual de referencia en el ensamblaje X86 ... enlace

encontrarás esto ... "La instrucción de llamada llama a los procedimientos cercanos utilizando un puntero completo. La llamada hace que se ejecute el procedimiento nombrado en el operando. Cuando finaliza el procedimiento llamado, se reanuda el flujo de ejecución en la instrucción que sigue a la instrucción de llamada (consulte la instrucción de retorno)"

Esto le indica que la llamada tiene que volver primero. Esto significa que cuando se ejecute, las instrucciones de Noop se colocarán después de él hasta que vuelva.

Inmediatamente después de llamar, el bloque de control determinará que se trata de una llamada, que es un comando que requiere la intervención de la unidad de detección de peligros. Esta unidad dispara lo que es esencialmente una interrupción de llamada. Inmediatamente después de ver esta instrucción, se produce esta interrupción para llamar a noops y no permitirá que la PC se incremente.

    
respondido por el mcmiln

Lea otras preguntas en las etiquetas