2012-03-03 13 views
11

Non riesco a capire come funziona l'istruzione jal nel processore MIPS. Le mie due domande sono:
a) Qual è il valore memorizzato in R31 dopo "JAL": PC + 4 o PC + 8?
b) Se è davvero PC + 8, cosa succede alla istruzione a PC + 4? Viene eseguito prima del salto o non viene mai eseguito?

a Patterson e Hennessy (quarta edizione), pg 113:

"istruzione di salto-e-link: Istruzione che salta e l'indirizzo e contemporaneamente salva l'indirizzo delle seguenti istruzioni in un registro ($ ra in MIPS)"

"program counter (PC ): il registro contenente l'indirizzo dell'istruzione nel programma in esecuzione"

Dopo aver letto queste due affermazioni, ne consegue che il valore sa ved in $ ra dovrebbe essere (PC + 4).

Tuttavia, nei dati di riferimento MIPS (carta verde) che viene fornito con il libro, l'algoritmo di istruzione JAL è definita in questo modo:
"Jump e Link: JAL: J: R [31] = PC + 8 ; PC = JumpAddr "

Questo website afferma anche che 'è davvero PC + 8', ma stranamente, dopo di che si dice che dal momento che il pipelining è un argomento avanzato" si suppone l'indirizzo di ritorno è PC +4 ".
Provengo dall'assemblaggio 8086, quindi sono consapevole che c'è una grande differenza tra il ritorno a un indirizzo e quello successivo, perché i programmi non funzioneranno se assumo solo qualcosa che non è vero. Grazie.

risposta

12

L'indirizzo in $ ra è in realtà PC + 8. L'istruzione che segue immediatamente l'istruzione jal è "branch delay slot". Viene eseguito prima che la funzione venga inserita, quindi non dovrebbe essere rieseguita quando la funzione ritorna.

Altre istruzioni di diramazione sui Mips hanno anche slot di ritardo di diramazione.

Lo slot di ritardo viene utilizzato per fare qualcosa di utile nel tempo necessario per eseguire l'istruzione jal.

+0

Grazie mille! Stranamente, molti siti Web presentano informazioni errate (PC + 4). – ReimannCL

1

Ho la stessa domanda. Ho cercato su Google questa eccellente risposta di Richard e anche un altro link che desidero aggiungere qui.

Il collegamento è http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html con questa meravigliosa spiegazione della doppia aggiunta di 4 al PC. Quindi l'esecuzione effettiva ha due aggiunte: 1) nuovo PC = PC + 4 tramite pipelining e 2) un'altra aggiunta $ ra = newPC + 4 dall'istruzione jal che risulta l'efficace $ ra = (indirizzo dell'istruzione jal) +8.