Énoncé - ENSTA ParisTech

publicité
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
Téléchargement