le funzioni (procedure) in MIPS
Domanda
Sono nuovo nel linguaggio MIPS e non capisco come funzionano le funzioni (procedure) nel linguaggio assembly MIPS.Eccoli ma specificherò il mio problema:
Cosa fa:
jal
jr
$ra
significa nel linguaggio mips e la cosa importante
- Come possiamo usarli quando vogliamo creare una funzione o (procedura)?
Soluzione
In primo luogo, si potrebbe voler controllare questo MIPS riferimento rapido. E 'davvero mi ha aiutato.
In secondo luogo, per spiegare jal
, jr
e $ra
. Ciò che fa è jal <label>
salto all'etichetta label
e memorizzare il contatore di programma (si pensi come indirizzo dell'istruzione in corso) nel registro $ra
. Ora, quando si desidera tornare da label
a dove inizialmente eri, è sufficiente utilizzare jr $ra
.
Ecco un esempio:
.text
main:
li $t0, 1
jal procedure # call procedure
li $v0, 10
syscall
procedure:
li $t0, 3
jr $ra # return
Si noterà quando si esegue questo in un emulatore SPIM che il valore lasciato in $t0
è 3, quello caricato nella cosiddetta Procedura .
Spero che questo aiuti.
Altri suggerimenti
1. La prime due sono le istruzioni, il terzo è una specie di registro speciale
- JAL = salto e di collegamento (Indirizzo di seguire istruzioni messo in $ ra, e saltate per indirizzo di destinazione)
- jr = salto di specificare registro
- $ ra = indirizzo di ritorno
Spesso si usa l'istruzione come questo ...
- jr $ ra (Copia $ ra al contatore di programma)
significa ritorno (salto) all'indirizzo salvato in $ ra.
2.
Ecco un esempio di funzione (Procedura) in C
int main(){
x=addthem(a,b);
}
int addthem(int a, int b){
return a+b;
}
funzione nel MIPS
.text
main: #assume value a is already in $t0, b in $t1
add $a0,$0,$t0 # it's the same function as move the value
add $a1,$0,$t1
jal addthem # call procedure
add $t3,$0,$v0 # move the return value from $v0 to where we want
syscall
addthem:
addi $sp,$sp,-4 # Moving Stack pointer
sw $t0, 0($sp) # Store previous value
add $t0,$a0,$a1 # Procedure Body
add $v0,$0,$t0 # Result
lw $t0, 0($sp) # Load previous value
addi $sp,$sp,4 # Moving Stack pointer
jr $ra # return (Copy $ra to PC)
Avrai voglia di leggere il Interfaccia binaria dell'applicazione System V, supplemento per processore MIPS RISC.Descrive le convenzioni utilizzate per chiamare le funzioni, in particolare il modo in cui viene gestito lo stack e scambiati i parametri (non esiste uno stack hardware in MIPS, tutto è una questione di convenzioni software e l'ABI definisce tali convenzioni).
Il documento sopra presuppone una conoscenza di base di ciò che fanno le istruzioni MIPS, quindi avrai bisogno anche di Architettura MIPS32 per programmatori, in particolare il volume II (set di istruzioni), che descrive nel dettaglio l'effetto di ciascuna istruzione.Ma fai un favore a te stesso, scarica e leggi prima il volume I (introduzione).
IL jal
l'istruzione è la "salto E collegamento"codice operativo.Esso salta all'indirizzo di destinazione (che è l'indirizzo del primo codice operativo della procedura chiamata) salvando il puntatore dell'istruzione corrente nel registro dei collegamenti, che è il registro 31 (per la precisione salva nel registro 31 il valore X+8, dove X è l'indirizzo del jal
codice operativo stesso).