Le jeu d’instructions d’un processeur précise
On trouve dans à peu près tous les processeurs :
des registres
des “drapeaux” (flags), qui sont levés ou non après des opérations; par exemple :
des bus d’entrée et de sortie, pour communiquer avec l’extérieur (mémoire,…)
une ALU : unité d’aritmétique et logique
une unité de contrôle : reçoit et décode les instructions
RISC = Reduced Instruction Set Computing
Dans le simulateur https://peterhigginson.co.uk/RISC/V2.php
Une instruction machine contient
Cette instruction est représentée par une séquence de bits, contenant une information sur l’instruction à faire (opcode) et des opérandes
Selon l’architecture du processeur, les instructions sont plus ou moins nombreuses et ont des fonctions plus ou moins étendues.
Exemples :
Pour plus d’infos : fr.wikipedia.org/wiki/Jeu_d’instructions
Historiquement :
Détails : fr.wikipedia.org/wiki/X86
et évolution du jeu d’instruction : fr.wikipedia.org/wiki/Jeu_d’instructions_x86
Dans le jeu d’instruction RISC16,
0010101011111111 = placer la valeur 0xFF dans le
registre R2
00101 placer la valeur xx dans le registre yy010 registre 211111111 valeur FFPas très lisible….
Les instructions sont écrites dans un langage “humain”, et traduites ensuite en code binaire par le compilateur.
Exemple 1:
00101 010 11111111
MOV R2, #255
Exemple 2:
// Addition de deux nombres
INP R0,2
INP R1,2
ADD R2,R1,R0
OUT R2,4
HLT
traduit par
0111000100000010
0111000100010010
0110000010001000
0111000110100100
0000000000000000
Jeu d’instruction correspondant au simulateur :
https://www.peterhigginson.co.uk/RISC/instruction_set_V2.pdf
ADD R3, #15Uniquement celles que nous allons utiliser :
MOVADD, SUB,
MUL, UDV, MODLSR, LSL,
AND, ORR, XORLDR /
STRCMPBxxLes accès en mémoire se font en utilisant une adresse; cette adresse peut être exprimée
INP R0
INP R1
ADD R2,R1,R0
OUT R2
HLT
LDR R0, .dn
LDR R1, .da
.l1 ADD R1, R1
SUB R0, #1
BPL .l1
STR R1, .dres
OUT R1
HLT
.dn DAT 5
.da DAT 4
.dres DAT
DAT : directive pour réserver une case mémoire en
mettant éventuellement une valeur initialeINP R0 : lit une valeur sur le bus d’entrée et la place
dans le registre R0OUT R1 : envoie la valeur contenue dans le registre
R1 sur le bus de sortieHLT : arrête le programmeLDR R0, .dn : charge dans R0 la valeur
contenue à l’adresse marquée par le label .dnADD R1, R1 : ajoute R1 à lui-même (double
la valeur de R1), met le résultat dans R1,
c’est un raccourci pour ADD R1, R1, R1 BPL :
branch if plus (zéro est considéré comme positif) MOV R1, #5
MOV R2, #65
LDR R3, .data
.loop STR R2, 0(R3)
ADD R2, #1
ADD R3, #1
SUB R1, #1
BPL .loop
HLT
.data DAT .data
DAT .data : réserve une case mémoire, initialisée avec
l’adresse de cette case (utile pour faire des accès en mémoire)BPL : branch if plus (zéro est considéré comme
positif)STR R2, 0(R3) : enregistre le contenu de
R2 dans la case mémoire dont l’adresse est contenue dans
R3, plus zéro. LDR R0, .di
MOV R1, #42
LDR R2, .ds
.l1 ADD R1, R0
STR R1, 2(R2)
ADD R0, #1
STR R0, .di
ADD R2, #1
CMP R0, #6
BLE .l1
HLT
.di DAT 0
.ds DAT .ds
BLE : branche if lower or equal du CMP du
dessus (si R0 <= 6)
INP R0, 2
INP R1, 2
LDR R2, .dres
.l1 ADD R0, R0
STR R0, 1(R2)
ADD R2, #1
SUB R1, #1
BPL .l1
STR R0, .dres
OUT R0, 4
HLT
.dres DAT
// Tester avec différentes valeurs
// en utilisant INP R0, 2
MOV R0, #129
STR R0, .dfnd
LDR R1, .dlft
LDR R2, .drgt
.centr ADD R3, R1, R2
LSR R3, #1
CMP R3, R0
BEQ .equal
BHI .great
.lower MOV R1, R3
BRA .centr
.great MOV R2, R3
BRA .centr
.equal LDR R3, .dres
HLT
.dlft DAT 0
.drgt DAT 1000
.dcnt DAT
.dfnd DAT
.dres DAT