CentraleSupélecDépartement informatique
Plateau de Moulon
3 rue Joliot-Curie
F-91192 Gif-sur-Yvette cedex
Mini processeur de type ARM étudié en cours

Contenu

Jeu d'instructions

Ce processeur, inspiré des microprocesseurs ARM Cortex, dispose d'un banc de 8 registres de 16 bits. Pour simplifier sa conception, il dispose d'un registre à part pour le compteur ordinal. Son architecture est de type RISC (Reduced Instruction Set), load/store (seules les instructions de chargement et d'écriture de registre accèdent à la mémoire), et dispose d'instructions arithmétiques à 3 adresses (un registre pour le résultat, un registre pour chacun des opérandes).

Pour simplifier sa conception, les instructions tiennent sur un mot de 16 bits lorsqu'elle utilisent l'adressage par registre, et sur 2 mots de 16 bits lorsqu'elles utilisent l'adressage immédiat (opérations arithmétiques) ou direct (branchement), la valeur de l'opérande étant stockée dans le mot qui suit le code de l'instruction. Dernière entorse aux principes des RISC, ce processeur dispose d'un registre d'état qui mémorise le résultat des comparaisons.

Le jeu d'instructions est le suivant :

MnémoniqueDescription
ldr rx,[ry]charge le registre rx avec le contenu de la mémoire à l'adresse contenue dans ry
ldr rx,adressecharge le registre rx avec le contenu de la mémoire à l'adresse adresse
str rz,[ry]écrit le contenu du registre rz en mémoire à l'adresse contenue dans ry
str rz,adresseécrit le contenu du registre rz en mémoire à l'adresse adresse
mov rx,rycharge la valeur du registre ry dans le registre rx
mov rx,#valcharge la valeur immédiate val dans le registre rx
add rx,ry,rzcharge le registre rx avec la somme des registres ry et rz
add rx,ry,#valcharge le registre rx avec la somme du registre ry et de val
sub rx,ry,rzcharge le registre rx avec la différence des registres ry et rz
sub rx,ry,#valcharge le registre rx avec la différence du registre ry et de val
cmp ry,rzchange les indicateurs N et Z du registre d'état en fonction de la différence ry-rz
cmp ry,#valchange les indicateurs N et Z du registre d'état en fonction de la différence ry-val
beq rzsaute à l'adresse contenue dans rz si le bit Z du registre d'état vaut 1
beq addresssaute à l'adresse address si le bit Z du registre d'état vaut 1
blt rzsaute à l'adresse contenue dans rz si le bit N du registre d'état vaut 1
blt addresssaute à l'adresse address si le bit N du registre d'état vaut 1
b rzsaute à l'adresse contenue dans rz
b addresssaute à l'adresse address

Programmes de test

Un assembleur est disponible pour traduire les mnémoniques en code machine. Cet assembleur permet de définir des étiquettes afin de faciliter l'écriture des branchements.

Cet assembleur est très rustique et ne donne pas de message très explicite en cas d'erreur. Quand il parvient à assembler le fichier source, il produit un fichier .lst qui reprend le code source en face du code généré, et un fichier .mem à charger dans le composant mémoire de Logisim.

Voici un petit programme de test pour vérifier le fonctionnement du processeur :

%
% Program for testing the mini ARM
%
% It should stop by looping at address 0x0020 (label 'end')
% If it stops at another address, there is a bug...
%
        mov r0,#5       % load 5 into r0
        str r0, var     % store 5 in var
        ldr r1, var     % load var into r2
        cmp r1,r0       % did we read the same value?
        beq okls
@errls  b errls         % no => loop here
@okls   add r2,r1,r1    % r2 <- 2*r1
        cmp r2,r1       % is r2 < r1
        blt err1        % yes => error
        b ok1           % no, continue
@err1   b err1          % loop here
@ok1    cmp r1,#5       % is r1 = 5
        beq ok2         % yes, it's ok
@err2   b err2          % no => error, loop here
@ok2    sub r3,r1,r2    % r3 <- r1-r2
        cmp r3,#0       % is r3 < 0
        blt end         % yes => ok
@err3   b err3          % no => error, loop here
@end    b end           % end of program, loop here

@var    rmw 1           % reserve a word for a variable

L'assembleur reconnaît les pseudo-instructions smw qui permet de réserver un mot mémoire en lui donnant une valeur, et rmw qui réserve un certain nombre de mots mémoire :

@compteur smw 0   % réserve un mot mémoire initialisé à 0
@tableau  rmw 10  % réserve 10 mots mémoire pour un tableau

L'assembleur reconnaît également les noms symboliques sp (Stack Pointer) pour r6 et lr (Link Register) pour r7. Il accepte aussi les instructions push et pop qu'il émule en générant le code pour empiler la valeur d'un registre ou dépiler une valeur dans un registre.

push r2  % incrémente le pointeur de pile et range la valeur de r2 au sommet de la pile
pop  r5  % range dans r5 la valeur située au sommet de la pile et décrément le pointeur de pile

Format des instructions

instructioncodeimmrxryrz 
 4 bits1 bit3 bits3 bits3 bits2 bits
ldr rx,[ry]00000rxry  
ldr rx,adresse00001rx   
adresse
str rz,[ry]00010 ryrz 
str rz,adresse00011  rz 
adresse
mov rx,ry00100rxry  
mov rx,#val00101rx   
val
add rx,ry,rz00110rxryrz 
add rx,ry,#val00111rxry  
val
sub rx,ry,rz01000rxryrz 
sub rx,ry,#val01001rxry  
val
cmp ry,rz01010 ryrz 
cmp ry,#val01011 ry  
val
beq rz01100 rz 
beq adresse01101 
adresse
blt rz01110 rz 
blt adresse01111 
adresse
b rz10000 rz 
b adresse10001 
adresse

Chemin de données

Logisim

Vous trouverez ci-dessous les versions de Logisim pour :

Mac OS
Logisim-mac-Java.zip, décompressez l'archive et placez l'application Logisim où vous voulez, par exemple dans le dossier Applications de votre Mac.
Linux
logisim-linux.tgz, décompressez l'archive, placez le dossier Logisim là où vous le souhaitez, puis, dans un terminal, placez vous dans ce dossier et exécutez la commande ./install.sh. Il suffit ensuite de double-cliquer sur le fichier Logisim pour lancer l'application.
Windows
logisim-windows.exe