web-dev-qa-db-fra.com

Langage d'assemblage MIPS - registre temporaire vs registres enregistrés

Jusqu'à présent, j'ai utilisé les registres $ s0- $ s9 et de la même manière que les registres $ t0- $ t9. On m'a dit et lu d'innombrables messages et paragraphes sur le forum ici et sur Google expliquant la différence, mais sans exemples de codage. On me dit que je devrais voir la différence que cela implique d'utiliser des procédures, mais j'ai créé un nombre incalculable de scénarios impliquant des procédures dans le but de trouver la différence entre les registres enregistrés et le registre temporaire, mais j'ai échoué.

Je voudrais voir un exemple relativement simple où un registre $ t0-9 n'agirait pas de la même manière qu'un registre $ s0-9 et, par conséquent, produirait une valeur différente?

23
shawn a

Il n'y a aucune différence entre les variables temporaires et enregistrées dans leur fonctionnement. La différence réside dans la façon dont ils sont utilisés, ou plutôt comment ils doivent être utilisés.

La convention d'appel MIPS spécifie comment les différents registres doivent être utilisés - le $v les registres sont pour les retours de fonction, le $a les registres sont pour les arguments de fonction, le $t les variables sont des registres temporaires enregistrés par l'appelant , tandis que les $s les registres sont appelés .

La différence entre l'appelé et l'appelant enregistré est la suivante: lors de l'appel d'une fonction, la convention garantit que le $s les registres sont les mêmes après retour alors que la convention ne le garantit pas pour les $t registres. Bien sûr, cela signifie que si vous souhaitez utiliser le $s s'inscrit dans une routine, vous devez sauvegarder et restaurer leurs valeurs. Par exemple, si la fonction A utilise des registres $t0 et $s0 puis appelle une fonction B, elle doit sauvegarder le registre $t0 s'il veut l'utiliser après le retour de la fonction B. La fonction B doit enregistrer $s0 avant de pouvoir l'utiliser.

Un exemple:

main:

    li $s0 7
    li $t0 7

    jal myFunction

    #$s0 guaranteed to equal 7
    #$t0 value not guaranteed

Ce lien ressemble à des informations décentes et plus approfondies.

Bien sûr, tout cela n'est qu'une convention, et donc cela ne fonctionne que si vous et les autres programmes respectez la convention en enregistrant et en restaurant $s s'inscrit pour ne pas être écrasé par un appel de fonction.

46
Konrad Lindenbach