web-dev-qa-db-fra.com

les fonctions (procédures) dans MIPS

Je suis nouveau dans le langage MIPS et je ne comprends pas comment fonctionnent les fonctions (procédures) du langage MIPS Assembly. Voici mais je préciserai mon problème:

  1. Qu'est-ce que:

    • jal
    • jr
    • $ra

    dire dans la langue mips et la chose importante

  2. Comment pouvons-nous les utiliser lorsque nous voulons créer une fonction ou (procédure)?
16
Sneimeh

Tout d'abord, vous voudrez peut-être vérifier this référence MIPS rapide. Cela m'a vraiment aidé.

Deuxièmement, pour expliquer jal, jr et $ra. Quelle jal <label> ne fait que passer à l'étiquette label et stocker le compteur de programme (pensez-y comme l'adresse de l'instruction en cours) dans les $ra S'inscrire. Maintenant, lorsque vous souhaitez revenir de label à l'endroit où vous étiez initialement, vous utilisez simplement jr $ra.

Voici un exemple:

.text
main:
li $t0, 1
jal procedure # call procedure
li $v0, 10
syscall

procedure:
li $t0, 3
jr $ra # return

Vous remarquerez lors de l'exécution de cela dans un émulateur SPIM que la valeur laissée dans $t0 est 3, celui chargé dans la procédure dite .

J'espère que cela t'aides.

20
Mihai Scurtu

1.les deux premiers sont des instructions, le troisième c'est une sorte de registre spécial

  • jal = saut et lien (adresse de l'instruction suivante insérée dans $ ra et saut à l'adresse cible)
  • jr = sauter pour spécifier le registre
  • $ ra = adresse de retour

nous utilisons souvent l'instruction comme celle-ci ...

  • jr $ ra (Copier $ ra sur le compteur de programme)

cela signifie retourner (sauter) à l'adresse enregistrée dans $ ra.

2.

Voici un exemple de fonction (procédure) en C

int main(){
   x=addthem(a,b);
}
int addthem(int a, int b){
   return a+b;
}

fonction dans 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)
10
pohchen

Vous voudrez lire Interface binaire d'application System V, Supplément processeur MIPS RISC . Ceci décrit les conventions utilisées pour appeler des fonctions, en particulier comment la pile est gérée et les paramètres sont échangés (il n'y a pas de pile matérielle dans MIPS, tout est une question de conventions logicielles, et l'ABI définit ces conventions).

Le document ci-dessus suppose une connaissance de base de ce que font les instructions MIPS, vous aurez donc également besoin de Architecture MIPS32 pour les programmeurs , en particulier le volume II (jeu d'instructions), qui décrit l'effet détaillé de chaque instruction. Mais faites-vous plaisir, téléchargez et lisez d'abord le volume I (introduction).

L'instruction jal est le lien " saut et "opcode. Il saute à l'adresse cible (qui est l'adresse du premier opcode de la procédure appelée) tout en enregistrant le pointeur d'instruction actuel dans le registre de liaison , qui est le registre 31 (pour être précis, il enregistre dans le registre 31 la valeur x + 8, où x est l'adresse de l'opcode jal lui-même).

2
Thomas Pornin