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.