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:
Qu'est-ce que:
jal
jr
$ra
dire dans la langue mips et la chose importante
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.
1.les deux premiers sont des instructions, le troisième c'est une sorte de registre spécial
nous utilisons souvent l'instruction comme celle-ci ...
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)
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).