Tengo una pregunta sobre el registro de una 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 recuperará. Me pareció claro hasta que comencé a razonar sobre una arquitectura segmentada. Por ejemplo, imagine la siguiente tubería RISC clásica con 5 etapas (Obtener, Decodificar, Ejecutar, Acceso a memoria, Reescribir) que se completa con 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 canalización, ya está llena con instrucciones posteriores y puntos de IP a una instrucción en la dirección 0x18 (la siguiente a buscar). Cuando se ejecuta "call [0x100]", 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 la LLAMADA, efectivamente saltamos sobre 2 instrucciones ya que la tubería se vacía durante la ejecución de la LLAMADA.
Lo que significa que:
Leyendo el manual de referencia sobre el ensamblaje X86... https://courses.cs.washington.edu/courses/cse548/05wi/files/x86-reference-long.pdf
encontrará esto... "La instrucción de llamada llama a procedimientos cercanos utilizando un puntero completo. La llamada hace que se ejecute el procedimiento nombrado en el operando. Cuando se completa el procedimiento llamado, el flujo de ejecución se reanuda en la instrucción que sigue a la instrucción de llamada (consulte la instrucción de retorno)"
Esto le indica que la llamada debe devolverse primero. Esto significa que cuando se ejecute, las instrucciones noop se colocarán después hasta que regrese.
Inmediatamente después de que se llame, el bloque de control determinará que se trata de una llamada, que es un comando que requiere la acción de la unidad de detección de peligros. Esta unidad dispara lo que es esencialmente una interrupción de llamada. Entonces, inmediatamente después de ver esta instrucción, se produce esta interrupción para llamar a noops y no permitirá que la PC aumente.
usuario_1818839