cisc : jeu d`instruction complexe

publicité
Département d’Informatique
Université de Nice – Sophia Antipolis
Master 1 Informatique
Techniques de compilation
XSPIM : un simulateur graphique du MIPS R2000
Jacques Farré
email : [email protected]
Architectures CISC et RISC
Pipeline
– Traitement d’une instruction en plusieurs temps
– CISC : jeu d’instruction complexe (machines avant 85, Pentium...)
Fetch
– beaucoup d’instructions, peu orthogonales, de taille variable
Decode
ALU
RES
– Une instruction n’attend pas la fin de la précédente pour commencer à s’exécuter
– Oblige à réordonner les instruction produites, éventuellement à
ajouter des nop. Pour a = b + c; d = a + b; i = j + k;
– opérations entre registres et mémoire
– assez peu de registres
– RISC : jeu d’instruction réduit (Mips, Sparc, Alpha...)
add $s1, $s2, $s3
add $s4, $s1, $s2
add $s5, $s6, $s7
– peu d’instructions, assez orthogonales, de taille fixe en général
– opérations entre registres uniquement
# $s1 pas ecrit
avec réordonnancement
– registres relativement nombreux
add $s1, $s2, $s3
add $s5, $s6, $s7
add $s4, $s1, $s2
– Les deux architectures autorisent un pipeline des instructions
Slide 1
Slide 2
1
# $s1 ecrit
SPIM
Architecture MIPS R2000/R3000
– Le cours et les TPs reposeront sur une machine MIPS
– Architecture simple et régulière
– SPIM est un simulateur du MIPS R2000/R3000 (architecture RISC)
– 32 registres généraux (32 bits)
– Il lit et exécute des fichiers qui contiennent des programmes en
langage d’assemblage MIPS
– Jeu d’instructions simple et orthogonal
– Il peut fonctionner en simulant ou non le pipeline
– Modes d’adressages simples mais puissants
– opération logiques et arithmétiques entre registres uniquement
– L’assembleur définit des pseudos instructions qui regroupent plusieurs instructions de base
– chargement et rangement de la mémoire dans un registre (32
bits) ou un couple de registres (64 bits)
– Il contient un débogueur et un petit système d’exploitation (permettant entre autre de faire des entrées-sorties)
– Co-processeur flottant (32 registres de 32 bits, regroupables en 16
registres de 64 bits)
Slide 3
Techniques de compilation – . XSPIM
Slide 4
2
c Farré
UNSA janvier 2006 J.
Registres
Interface XSPIM
xspim
PC
= 00000000
Status= 00000000
Register
Display
R0
R1
R2
R3
R4
R5
R6
R7
FP0
FP2
FP4
FP6
Control
Buttons
(r0)
(at)
(v0)
(v1)
(a0)
(a1)
(a2)
(a3)
=
=
=
=
=
=
=
=
EPC
HI
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
= 0.000000
= 0.000000
= 0.000000
= 0.000000
Nom du registre
= 00000000
= 00000000
R8
R9
R10
R11
R12
R13
R14
R15
FP8
FP10
FP12
FP14
(t0)
(t1)
(t2)
(t3)
(t4)
(t5)
(t6)
(t7)
Cause = 0000000 BadVaddr = 00000000
LO
= 0000000
General Registers
00000000 R16 (s0) = 0000000 R24 (t8) = 00000000
00000000 R17 (s1) = 0000000 R25 (s9) = 00000000
00000000 R18 (s2) = 0000000 R26 (k0) = 00000000
00000000 R19 (s3) = 0000000 R27 (k1) = 00000000
00000000 R20 (s4) = 0000000 R28 (gp) = 00000000
00000000 R21 (s5) = 0000000 R29 (gp) = 00000000
00000000 R22 (s6) = 0000000 R30 (s8) = 00000000
00000000 R23 (s7) = 0000000 R31 (ra) = 00000000
Double Floating Point Registers
= 0.000000 FP16
= 0.00000 FP24
= 0.000000
= 0.000000 FP18
= 0.00000 FP26
= 0.000000
= 0.000000 FP20
= 0.00000 FP28
= 0.000000
= 0.000000 FP22
= 0.00000 FP30
= 0.000000
Single Floating Point Registers
=
=
=
=
=
=
=
=
quit
load
run
step
clear
print
breakpt
help
terminal
mode
zero
at
set value
Text Segments
User and
Kernel
Text
Segments
[0x00400000]
[0x00400004]
[0x00400008]
[0x0040000c]
[0x00400010]
[0x00400014]
[0x00400018]
[0x0040001c]
0x8fa40000
0x27a50004
0x24a60004
0x00041090
0x00c23021
0x0c000000
0x3402000a
0x0000000c
Data Segments
Data and
Stack
Segments
[0x10000000]...[0x10010000] 0x00000000
[0x10010004] 0x74706563 0x206e6f69 0x636f2000
[0x10010010] 0x72727563 0x61206465 0x6920646e
[0x10010020] 0x000a6465 0x495b2020 0x7265746e
[0x10010030] 0x0000205d 0x20200000 0x616e555b
[0x10010040] 0x61206465 0x65726464 0x69207373
[0x10010050] 0x642f7473 0x20617461 0x63746566
[0x10010060] 0x555b2020 0x696c616e 0x64656e67
[0x10010070] 0x73736572 0x206e6920 0x726f7473
0x726f6e67
0x74707572
0x6e67696c
0x6e69206e
0x00205d68
0x64646120
0x00205d65
SPIM Version 3.2 of January 14, 1990
SPIM
Messages
Slide 5
Techniques de compilation – . XSPIM
0
1
Usage
Constante 0
Réservé
v0-V1
2-3
Résultats de fonction
a0-a3
4-7
Argument 1-4
t0-t7 et t8-t9
lw R4, 0(R29) []
addiu R5, R29, 4 []
addiu R6, R5, 4 []
sll R2, R4, 2
addu R6, R6, R2
jal 0x00000000 []
ori R0, R0, 10 []
syscall
Numéro
8-15 et 24-25
Temporaire
s0-s7
16-23
Temporaire
k0-k1
26-27
Réservé pour l’OS
gp
28
Pointer to global area
sp
29
Stack pointer
fp
30
Frame pointer
ra
31
Addresse de retour
Slide 6
3
c Farré
UNSA janvier 2006 J.
Syntaxe de l’assembleur
Principales instructions de déclaration
– Commentaires : # jusqu’à la fin de ligne
.asciiz ”une chaine”
déclaration de chaı̂ne terminée par 0
– Sections : .data pour les données et .text pour le code
peuvent t̂re mélangées
.byte 3, 25, 12
déclaration et initialisation d’octets
– Étiquettes toujours en colonne 1
.word 55, 3000
déclaration et initialisation d’entiers (32 bits)
.space 100
réservation de 100 octets (non initialisés)
– Exemple :
.data
item: .word 10
.text
.globl main
main: lw $t0, item
...
– Pour les variables globales
const char* mess = "un message";
int tab[] = {1, 2, 3};
struct S { int a, b, c; } stru;
# 1 mot initialise a 10
# main toujours global
=⇒
mess: .asciiz "un message"
tab: .word 1, 2, 3
stru: .space 12
Slide 7
Techniques de compilation – . XSPIM
Slide 8
4
c Farré
UNSA janvier 2006 J.
Modes d’adressage (en assembleur)
Exemples d’utilisation des modes d’adressage
– L’unité d’adressage est l’octet et les adresses doivent être alignées
Format
int* ptr;
struct S { int a; int b[10]; } str;
Résultat
(reg)
contenu du registre
imm
immediat
imm (reg)
immediat + contenu du registre
sym
addresse du symbole
sym ± imm
addresse du symbol ± immediat
sym ± imm (registre)
addresse du symbole
void F (int j, int i) { *ptr = i; str.b[i] = 10; }
=⇒
± (immediat + contenu du registre)
– En fait, un seul mode d’adressage : déplacement(registre)
Slide 9
Techniques de compilation – . XSPIM
lw $t0, 4($fp)
lw $t1, _ptr
sw $t0, 0($t1)
# charger i
# charger ptr
# *ptr = i
sll $t1, $t0, 2
li $t2, 10
sw $t2,_str+4($t1)
# i * 4
# 10
# str.b[i]=10
Slide 10
5
c Farré
UNSA janvier 2006 J.
Appels système
Service
Code ($v0)
Argument(s)
Exemple d’appel système
Résultat
print int
1
$a0 = integer
print float
2
$f12 = float
print double
3
$f12 = double
print string
4
$a0 = string
read int
5
integer (in $v0)
read float
6
float (in $f0)
read double
7
read string
8
$a0 = buffer, $a1 = length
sbrk
9
$a0 = amount
exit
10
str:
li $v0, 1
li $a0, 5
syscall
double (in $f0)
address (in $v0)
# system call code for print_int
# integer to print
# print it
Affiche the answer = 5
Slide 11
Techniques de compilation – . XSPIM
.data
.asciiz "the answer = "
.text
li $v0, 4
# system call code for print_str
la $a0, str # address of string to print
syscall
# print the string
Slide 12
6
c Farré
UNSA janvier 2006 J.
Quelques instructions arithmétiques et logiques
Chargements et rangements
instruction
effet
instruction
effet
li reg, imm
Load Immediate (valeur signée sur 16 bits)
add R, G, D
R=G+D
abs R, O
R = |O|
la reg, addresse
Load Address
sub R, G, D
R=G-D
neg R, O
R = -O
lw reg, addresse
Load Word
mul R, G, D
R=G*D
lb reg, addresse
Load Byte
div R, G, D
R=G/D
ld reg, addresse
Load Double-Word
rem R, G, D
R=G%D
lh reg, addresse
Load Halfword
and R, G, D
R=G&D
sw reg, addresse
Store Word
or R, G, D
R=G|D
sb reg, addresse
Store Byte
xor R, G, D
R = GˆD
sd reg, addresse
Store Double-Word
sll R, G, D
R = G << D
sh reg, addresse
Store Halfword
srl R, G, D
R = G >> D
move reg1, reg2
copie contenu de reg2 dans reg1
not R, O
R = ˜O
où adresse est un mode d’adressage
R, O et G sont des registres, D un registre ou une valeur signée sur 16 bits
Slide 13
Techniques de compilation – . XSPIM
Slide 14
7
c Farré
UNSA janvier 2006 J.
Instructions de saut
Exemple de code
j label
Jump
jr reg
Jump Register
jal label
Jump and Link
sauvegarde de l’adresse
jalr reg
Jump Reg. and Link
de retour dans $ra
beq reg, droit, label
Branch on =
saut si reg==droit
bge reg, droit, label
Branch on ≥
bgt reg, droit, label
Branch on >
$fp de l’appelant
ble reg, droit, label
Branch on ≤
adresse de retour
blt reg, droit, label
Branch on <
bne reg, droit, label
Branch on 6=
int fact (int n) {
if (n == 0) return 1;
return n * fact (n - 1);
}
n
$fp
n
$fp
n
$fp de l’appelant
$sp
$fp de l’appelant
adresse de retour
n−1
f(n−1)
adresse de retour
$sp
n−1
prologue
de fact
$fp
$fp de l’appelant
adresse de retour
$sp
droit : reg ou imm
Variantes avec droit = 0 : beqz reg, label, bgez reg, label...
Slide 15
Techniques de compilation – . XSPIM
Slide 16
8
c Farré
UNSA janvier 2006 J.
Exemple de code - suite
Exemple de code - suite
.text
.globl _fact
# prologue fact
_fact: sw $ra, -8($sp)
sw $fp, -4($sp)
move $fp, $sp
sub $sp, $sp, 8
# corps proprement dit (transparent suivant)
lw $a0, 0($fp)
# charger n en registre
bne $a0, $zero, _L1 # if (n == 0) then
li $v0, 1
# return 1
j _L2
_L1:
sub $sp, $sp, 4
lw $a0, 0($fp)
# charger n (encore)
sub $t0, $a0, 1
# passer argument n - 1
sw $t0, 0($sp)
jal _fact
# appeler fact
add $sp, $sp, 4
lw $a0, 0($fp)
# charger n (encore !!!)
mul $v0, $a0, $v0
# return n * fact (n - 1)
# corps proprement dit (transparent suivant)
# epilogue fact
_L2:
lw $ra, -8($fp)
move $sp, $fp
lw $fp, -4($fp)
jr $ra
Slide 17
Techniques de compilation – . XSPIM
Slide 18
9
c Farré
UNSA janvier 2006 J.
Téléchargement