Domanda

Sono nuovo nel linguaggio MIPS e non capisco come funzionano le funzioni (procedure) nel linguaggio assembly MIPS.Eccoli ma specificherò il mio problema:

  1. Cosa fa:

    • jal
    • jr
    • $ra

    significa nel linguaggio mips e la cosa importante

  2. Come possiamo usarli quando vogliamo creare una funzione o (procedura)?
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top