IN 103 - TD 07 Énoncé L’énoncé est long, mais pas les exercices. 1 Structure d’un CPU simple Q1 Quelles sont les composantes principales d’un microprocesseur, celles que l’on regroupera dans une struct pour faire notre simulateur ? Q2 Quel est le ≪ cycle infini ≫ de traitement qu’effectue un microprocesseur ? Q3 Comment peut-on représenter la mémoire de la machine ? Q4 On considère que notre CPU dispose des instructions qui suivent. Déduisez-en une structure C permettant de représenter cette variété d’instructions. MovImm constant → register : move the constant to the register. MovRegAddr register → address : moves the content of the register to the address. MovAddrReg address → register : move the content of the address to the register. MoveRegReg register → register : move the content of the first register to the second register. Add register + register → register : add the contents of the 2 first registers and store the result in the 3rd. Sub register - register → register : substract the content of the second register from the first one and store the result in the 3rd. Jmp address : jump to the address. Jnz address : jump at the address if previous computation didn’t set the 0-flag. Halt - : stop the CPU. Q5 Où doit arriver le code binaire ? De quoi est-il constitué ? Qu’est-ce que cela implique au niveau de notre représentation de la mémoire ? On vous donne dans le fichier cpu core.h toutes les définitions de types introduites jusqu’à présent ainsi que la structure permettant de représenter le CPU : typedef #define #define #define #define #define unsigned char s t a t e r e g t ; CLEARED SR MASK ( 0 ) Zero Flag (0) ZERO FLAG MASK ( 1 << Z e r o F l a g ) Sign Flag (1) /∗ 0 neg , 1 pos . ∗/ SIGN FLAG MASK ( 1 << S i g n F l a g ) typedef struct i n s t r t ∗ p r o g r a m c o u n t e r t ; struct p r o c e s s o r t { p r o g r a m c o u n t e r t pc ; /∗ ∗ Program c o u n t e r . ∗/ 1 state reg t sr ; w o r d t ∗ sp ; w o r d t r e g i s t e r s [ NB REGISTERS ] ; /∗ ∗ S t a t e r e g i s t e r . ∗/ /∗ ∗ S t a c k p o i n t e r . ∗/ /∗ ∗ User r e g i s t e r s . ∗/ }; Q6 1) De par sa définition C, que représente pc ? 2) Comment sont interprétées les conditions remplies/non remplies dans sr ? 3) Pourquoi ce type pour sp, quel problème y voyez-vous à l’avance ? 2 Implémentation du CPU Nous allons maintenant nous intéresser à l’implémentation du simulateur de notre CPU. Q7 Suite à la réponse à la question Q2 quelle va être la forme globale de la fonction cpu run chargée de traiter une instruction, et que le main appellera dans une boucle infinie ? Pour la suite des exercices, on vous met à disposition les fichiers : — cpu env.c|h contient la définition de l’environnement du CPU, à savoir sa structure, les tableaux représentant les zones mémoires qui serviront à loger la pile, les données et le code. — cpu utils.c|h contient des fonctions ≪ d’affichage ≫ : — print instr qui affiche une instruction, — print cpu qui affiche une instruction l’état actuel du CPU, — disassemble code qui affiche le contenu d’une zone mémoire contenant du code sous forme d’une séquence d’instruction. Ces fonctions sont appelées dans le squelette ci-dessous et vous permettront si nécessaire de débugger. — cpu emu skel.c qui vous fournit une fonction cpu run à trous qu’il conviendra de remplir (après l’avoir renommé en cpu emu.c). Le fichier cpu emu.h contient le prototype de la fonction cpu run. Pour compiler votre programme, il faudra compiler tous les fichiers .c en même temps (vous pouvez copier-coller la ligne ci-dessous qui génère un exécutable nommé cpu.x) : gcc -Wall cpu_emu.c cpu_env.c cpu_main.c cpu_utils.c loader.c -o cpu.x Q8 Implémentez le comportement de l’instruction MovImm. Attention à penser à positionner les flags de sr en fonction de si la constante ≪ mov-ée ≫ est positive, négative et/ou nulle. Une fonction update sr flags à trous vous est donnée, permettant de mettre à jours les flags en fonction d’une valeur passée en argument. Remplissez les trous, cette fonction étant déjà utilisée ailleurs dans le squelette de code qui vous est donné (cpu emu skel.c). Q9 Implémentez le comportement de l’instruction MovRegAddr. Q10 Implémentez le comportement de l’instruction MovAddrReg. Q11 Implémentez le comportement de l’instruction Jnz. 2 3 Programmer le CPU Maintenant que notre CPU possède quelques instructions on souhaite lui faire exécuter des programmes dans notre pseudo assembleur. Le fichier prog.myasm qui vous est fourni contient le squelette d’un programme qu’il va falloir compléter. Q12 Dans le fichier prog.myasm, remarquez le tableau my program data sensé représenter les données de votre (futur) programme. En avez-vous ? Ne vous souciez pas pour le moment du tableau my reloc code tbl. Dans ce fichier, écrivez l’équivalent du programme C suivant : accu = 0 ; i = 100 ; do { accu = accu + i ; i −− ; } while ( i != 0 ) ; Q13 Lancez le programme, que se passe-t-il et pourquoi ? Q14 Quel sont le type et la ≪ forme ≫ de la fonction permettant le chargement du programme en mémoire ? Si vous avez le temps / pour aller plus loin Q15 Le jeu d’instructions actuel ne vous permet pas d’implémenter le mécanisme des variables locales d’un programme C. Pour rappel, les variables locales sont stockées sur la pile. Qu’est-ce qu’il vous manque ? Q16 Imaginez deux nouvelles instructions pour palier ce manque, l’une qui permettra de ≪ lire ≫ et l’autre d’≪ écrire ≫. Q17 Vous pouvez modifier à votre convenance le programme de Q12 pour y insérer une variable locale. 3