2012-03-03 12 views
11

Tengo problemas para entender cómo funciona la instrucción jal en el procesador MIPS. Mis dos preguntas son:
a) ¿Cuál es el valor almacenado en R31 después de "jal": PC + 4 o PC + 8?
b) Si es realmente PC + 8, lo que ocurre con la instrucción en PC + 4? ¿Se ejecuta antes del salto o nunca se ejecuta?

En Patterson y Hennessy (cuarta edición), página 113:

"instrucción de salto-y-link: Una instrucción que salta a la dirección y al mismo tiempo guarda la dirección de la siguiente instrucción en un registro ($ ra en MIPS)"

'contador de programa (PC ): el registro que contiene la dirección de la instrucción en el programa en ejecución'

Después de leer estas dos declaraciones, se deduce que el valor sa ved en $ ra debe ser (PC + 4).

Sin embargo, en los datos de referencia MIPS (tarjeta verde) que viene con el libro, el algoritmo de la instrucción jal se define así:
"Jump y Link: jal: J: R [31] = PC + 8 , PC = JumpAddr "

Este website también afirma que 'es realmente PC + 8', pero extrañamente, después de que se dice que, dado que la canalización es un tema avanzado" vamos a asumir la dirección de retorno es PC +4 ".
Vengo del ensamblado 8086, así que soy consciente de que hay una gran diferencia entre volver a una dirección y la siguiente, porque los programas no funcionarán si asumo algo que no es cierto. Gracias.

Respuesta

12

La dirección en $ ra es realmente PC + 8. La instrucción que sigue inmediatamente a la instrucción jal se encuentra en "branch delay slot". Se ejecuta antes de que se ingrese la función, por lo que no se debe volver a ejecutar cuando la función regrese.

Otras instrucciones de bifurcación en los Mips también tienen ranuras de retardo de derivación.

La ranura de retardo se utiliza para hacer algo útil en el tiempo que lleva ejecutar la instrucción jal.

+0

¡Muchas gracias! Curiosamente, muchos sitios web presentan información incorrecta (PC + 4). – ReimannCL

1

Tengo la misma pregunta. Busqué en Google esta excelente respuesta de Richard y también otro enlace que deseo agregar aquí.

El enlace es http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html con esta maravillosa explicación de la doble adición de 4 a la PC. Entonces la ejecución real tiene dos adiciones: 1) nueva PC = PC + 4 por canalización y 2) otra suma $ ra = nuevaPC + 4 por la instrucción jal resultando la efectiva $ ra = (dirección de la instrucción jal) +8.