La pile et les fonctions · Leçon 21 sur 30 · environ 15 minutes
Préserver l’état de l’appelant
Utilisez une convention de sauvegarde et restauration quand une fonction a besoin d’un espace temporaire.
01 / Expliquer
Comprendre l’idée
Une fonction peut modifier les registres, sauf convention contraire du programme. Une fonction appelée qui promet de préserver R1 doit sauvegarder sa valeur avant de l’utiliser comme espace temporaire, puis la rétablir avant le retour.
PUSH et POP sauvegardent des données ; CALL et RETURN gèrent des cadres d’appel distincts. Une fonction appelée peut revenir correctement même si l’appelant a une boucle LOOP active. Restaurer des données avec POP ne consomme pas l’adresse de retour d’une fonction.
02 / Essayer
Observer le fonctionnement
Les résultats attendus sont 2, 4, 6. CALL revient dans le corps de la boucle ; il ne termine pas la boucle extérieure.
LOAD 1 R1
LOOP 3
LOAD R1
CALL double
PRINT
LOAD R1
ADD 1
COPY R0 R1
RETURN
HALT
double: MUL 2
RETURNAvancez pas à pas pour suivre une instruction à la fois. Vous pouvez modifier l’exemple et le rejouer.
03 / Défi
Le faire fonctionner
Lisez une valeur à conserver dans R1, puis un argument de fonction. Appelez une fonction auxiliaire qui renvoie argument + 1 tout en utilisant temporairement R1 comme espace de travail. Affichez le résultat puis la première valeur préservée. Utilisez PUSH et POP pour préserver R1.
Le vérificateur exécute votre programme actuel de l’éditeur sur une nouvelle machine pour chacun des 3 cas de test. Il fournit lui-même les entrées et la mémoire préparée ; la sortie et la mémoire actuelles du laboratoire ne décident pas du résultat.
INPUT
COPY R0 R1
INPUT
CALL helper
PRINT
LOAD R1
PRINT
HALT
helper:
#
RETURNBesoin d’un indice ?
Sauvegardez l’argument dans R2 avant de charger R1 pour l’empiler. Conservez le résultat pendant que POP restaure l’ancienne valeur de R1.
Afficher une solution expliquée
Lisez le programme, prévoyez l’effet de chaque instruction, puis suivez-le pas à pas dans le laboratoire.
INPUT
COPY R0 R1
INPUT
CALL helper
PRINT
LOAD R1
PRINT
HALT
helper: COPY R0 R2
LOAD R1
PUSH
LOAD 99 R1
LOAD R2
ADD 1
COPY R0 R2
POP
COPY R0 R1
LOAD R2
RETURNLaboratoire du processeur en émojis
Programme en émojis
Saisissez LOAD, ADD ou un autre nom d’instruction, puis Espace pour insérer l’émoji. Ctrl/⌘ + Entrée exécute ou suspend ; Échap suspend ; Ctrl/⌘ + ] indente. Tab déplace le focus. Les étiquettes utilisent deux-points. Les sauts utilisent des adresses d’instructions à partir de zéro.
Carte des instructions et points d’arrêt (0)
Un point d’arrêt suspend avant son instruction. Exécuter franchit une fois le point d’arrêt actuel ; Pas à pas exécute directement son instruction. Modifier le code efface les anciens points d’arrêt et l’état machine.
Registres du processeur
- R0
- 0
- R1
- 0
- R2
- 0
- R3
- 0
- R4
- 0
- R5
- 0
- R6
- 0
- R7
- 0
Piles et cadres de boucle
SP = 255 − profondeur des données − profondeur des appels. La pile est distincte de la mémoire.
Pile de données (bas → haut)
Vide
Adresses de retour des appels (bas → haut)
Vide
Cadres de boucle
Vide
Sorties et entrées
Exécutez une instruction PRINT pour voir une sortie.
Entrées en attente: Vide
Mémoire · 256 octets · 0 non nuls
Chaque case indique adresse:valeur. R = lecture à ce pas ; W = écriture à ce pas. Sélectionnez une case pour l’examiner ou l’initialiser avant l’exécution. Les flèches déplacent la sélection, Début/Fin visent les extrémités de la ligne et Ctrl/⌘ + Début/Fin celles de toute la mémoire.
Trace d’exécution · 0 entrées
Les entrées récentes sont ci-dessous. Examinez n’importe quel indice à partir de zéro pour voir les états complets et indépendants avant et après.
Vérifier votre défi
Vous pouvez lancer cette vérification à tout moment. Tous les cas doivent réussir pour enregistrer la leçon comme terminée.
La progression utilise seulement localStorage. Elle reste dans ce navigateur et n’est jamais envoyée à un serveur.