Architecture externe et jeu d'instructions - Processeur MIPS R3000.

 
CONTINUER À LIRE
Ensimag - Filières SLE/ISI

                                 Processeur M IPS R3000.
                  Architecture externe et jeu d’instructions

M IPS R3000 jeu d’instructions                                              page - 1
Ensimag - Filières SLE/ISI

A)      Introduction

Ce document décrit l’architecture externe ainsi que le jeu d’instructions du processeur M IPS R3000. Le M IPS
R3000 est la deuxième génération de processeur de la société M IPS1 , et n’est plus commercialisé aujourd’hui.
Son successeur est le R4000 qui lui ressemble fort. Des informations sur cette famille de processeurs, très uti-
lisée dans les applications embarquées et dans les machines parallèle à mémoire partagées, sont disponibles
sur le site www.mips.com.

L’architecture externe est le niveau d’abstraction nécessaire à l’écriture de programmes assembleur, de la
partie génération de code d’un compilateur, et du programmeur de systèmes d’exploitation multi-processus
(et/ou multi-tâches). Sont détaillés :
– les registres visibles du logiciel ;
– l’adressage de la mémoire ;
– le jeu d’instruction ;
– les mécanismes de traitement des exceptions, interruptions et appels systèmes.
L’architecture interne sera décrite en détail durant le cours.

B)      Notations

Par convention, nous utiliserons les notations du langage C pour la description des constantes, et pour la
terminologie en général.

La description des instructions nécessite également l’introduction de quelques notations :

                          =          test d’égalité
                          +          addition entière en complément à deux
                          −          soustraction entière en complément à deux
                          ×          multiplication entière en complément à deux
                           .
                           .
                                     division entière en complément à deux
                      mod            reste de la division entière en complément à deux
                       and           opérateur et bit-à-bit
                        or           opérateur ou bit-à-bit
                       nor           opérateur non-ou bit-à-bit
                       xor           opérateur ou-exclusif bit-à-bit
                     memb [a]        contenu de la mémoire à l’adresse a accédée sur b octets
                       ←             assignation
                       ⇒             implication
                        k            concaténation de chaînes de bits
                       xn            réplication du bit x dans une chaîne de n bits. Notons que x est
                                     un unique bit
                       xp...q        sélection des bits p à q de la chaîne de bits x

Certains opérateurs n’étant pas évidents, nous donnons ici quelques exemples.

  1 M IPS   signifie Microprocessor without Interlocked Pipeline Stage.

M IPS R3000 jeu d’instructions                                                                             page - 2
Ensimag - Filières SLE/ISI

          15 14 13 12 11 10 9   8   7   6   5   4   3   2   1   0

Posons 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 la chaîne de bit x, qui a une longueur de 16 bits, le bit le plus à
droite étant le bit de poids faible et de numéro zéro, et le bit le plus à gauche étant le bit de poids fort et de
numéro 15. x6...3 est la chaîne 1001. x16 15 crée une chaîne de 16 bits de long dupliquant le bit 15 de x, zéro
                       16
dans le cas présent. x15 k x15...0 est la valeur 32 bits avec extension de signe d’un immédiat en complément
à deux de 16 bits.

M IPS R3000 jeu d’instructions                                                                           page - 3
Ensimag - Filières SLE/ISI

C)     Architecture externe

Le processeur possède deux modes, le mode utilisateur (ou user) pour exécuter les applications, et le mode
noyau (ou kernel) pour exécuter le système. Ces 2 modes sont nécessaires à l’exécution sure de plusieurs
processus sur un même processeur.

1)   Registres visibles du logiciel

Les registres du M IPS R3000 visibles du logiciel, c.-à-d. qui sont manipulés par les instructions implicitement
ou explicitement, ont tous une taille de 32 bits.

Le M IPS R3000 visant par construction l’exécution de multiples processus, des mécanismes de protections
sont mis en œuvre pour l’accès aux registres relatifs au système. Ces derniers registres appartiennent à un
coprocesseur système dit coprocesseur 0 ou cop0. Les accès à ce coprocesseur ne peuvent avoir lieu qu’en
mode noyau.

registres du processeur
      hormis $0 et $31, ils sont identiques du point de vue du matériel, et ils peuvent être accèdes dans les
      2 modes.
     $i , (0 ≤ i ≤ 31)
           ce sont les registres d’usage général. Les opérandes des instructions et leur(s) résultat(s) y sont
           placés.
           Le registre $0 peut être écrit mais retourne toujours 0x00000000 lors de la lecture.
           Le registre $31 est utilisé implicitement (c.-à-d. que le matériel en impose l’utilisation et qu’il
           n’apparaît donc pas dans l’instruction) pour sauvegarder l’adresse de retour d’appels de foncions
           lors des instructions bgezal, bltzal, et jal ;
     pc , program counter
          ce registre contient l’adresse de l’instruction à exécuter. Sa valeur est modifiée par toutes les
          instructions ;
     ir , instruction register
          ce registre contient l’instruction en cours d’exécution. Il n’est pas directement accessible
     hi et lo
          ces registres contiennent le résultat de la multiplication sur 64 bits, ou le résultat de la division
          euclidienne (quotient dans lo et reste dans hi).

registres du coprocesseur 0
      ces registres concernent la gestion des exceptions, interruptions et appels systèmes.
     badvaddr , bad virtual address
         ce registre contient l’adresse fautive en cas d’exception de type « adresse illégale » ;
     status
         c’est le registre d’état. Il contient les masques d’interruption et le mode ;
     cause
         c’est le registre qui contient la cause de l’exception ;

M IPS R3000 jeu d’instructions                                                                           page - 4
Ensimag - Filières SLE/ISI

                                         $0                     $pc

                                         $1                      $ir

                                                                $hi

                                        $31                     $lo

                                 F IG . 1 – Registres généraux du M IPSR3000.

     epc , exception program counter
         ce registre contient l’adresse de retour en cas d’interruption et l’adresse de l’instruction fautive en
         cas d’exception ou d’appel système.
     Ces registres concernent la gestion de la mémoire virtuelle.
     TLB , Transaltion Lookaside Buffer
         c’est la mémoire associative pour la traduction adresse virtuelle vers adresse physique ;
     index
         registre contenant l’index de la TLB dans lequel faire les accès ;
     random
         registre contenant un index aléatoire valide pour les accès à la TLB ;
     context
         registre utilisé partiellement par le logiciel (une partie sert à pointer sur la structure des pages
         du système d’exploitation) et par le matériel (l’autre partie contient les poids forts de l’adresse
         fautive lors d’une traduction qui échoue) pour faciliter l’écriture en logiciel de la gestion de la
         mémoire virtuelle ;
     entryhi et entrylo
         valeur à comparer aux entrées de la TLB pour savoir s’il y a une erreur de page (page fault).

                 entryhi   10         entrylo    2           index      0            status     12

                                                            random      1            cause      13

                             TLB                            context     4              epc      14

                                                           badvaddr 8                 prid      15

                            F IG . 2 – Registres du coprocesseur 0 du M IPSR3000.

M IPS R3000 jeu d’instructions                                                                         page - 5
Ensimag - Filières SLE/ISI

2)   Adressage mémoire

Toutes les adresses émises par le processeur sont des adresses octet (byte), codées sur 32 bits.

Le processeur peut lire des instructions (32 bits), des mots (32 bits), des demi-mots (16 bits) et des octets
(8 bits). Il peut écrire des mots, des demi-mots et des octets.

Les adresses des mots et les instructions doivent être des multiples de 4, et celles des demi-mots doivent être
des multiples de 2. Un accès à une adresse non alignée génère une exception.

Il n’y a qu’un seul mode d’adressage, qui est le mode « indirect registre ». L’adresse effective est a =
$i + offset. Ou $i est n’importe quel registre général et offset un immédiat sur 16 bits étendu de signe.
L’immédiat se trouve dans les 16 bits de poids faible du registre ir.

La conversion des adresses virtuelles vers les adresses physiques se fait grâce à une table de translation
d’adresses totalement associative. Le cache est en adresses physiques.

                                 0xFFFFFFFF      1 Giga octets
                                    kseg2          Traduites
                                 0xc0000000        Cachées
                                 0xbFFFFFFF     0.5 Giga octets    segment
                                    kseg1       Non traduites
                                 0xa0000000      Non cachées         noyau
                                 0x9FFFFFFF     0.5 Giga octets
                                    kseg0       Non traduites
                                 0x80000000        Cachées
                                 0x7FFFFFFF

                                                 2 Giga octets     segment
                                    kuseg          Traduites
                                                   Cachées        utilisateur

                                 0x00000000

                              F IG . 3 – Segmentation mémoire du M IPSR3000.

D)     Reset, appels systèmes, interruptions et exceptions

1)   Fonctionnement

Ces actions passent toutes en mode noyau.

Le reset à lieu lors de la mise sous tension du processeur, ou lors de la mise à zéro de la broche reset. Le
registre pc prend la valeur 0xbfc00000, les interruptions sont masquées, le registre random prend la valeur
du dernier index de la TLB et les interruptions sont masqués par action sur le registre status.

Les « appels systèmes » correspondent à des services fournies par le noyau auxquels on accède grâce aux
deux instructions syscall et break. Le registre pc prend la valeur 0x80000080, et les interruptions sont
masquées. Le registre epc contient l’adresse de l’instruction qui à causé l’appel système.

M IPS R3000 jeu d’instructions                                                                        page - 6
Ensimag - Filières SLE/ISI

                                      TAB . 1 – Raisons des déroutements
 Int     0x0    interruption.
 MOD     0x1    modification de TLB. Cette exception est levée lorsque
                que l’adresse virtuelle d’une écriture correspond à une
                entrée de la TLB marqué non-inscriptible ;
 TLBL    0x2    rechargement de la TLB. Indique que le système d’ex-
                ploitation doit recharger la TLB pour effectuer une lec-
                ture ;
 TLBS    0x3    rechargement de la TLB. Indique que le système d’ex-
                ploitation doit recharger la TLB pour effectuer une
                écriture ;
 AdEL    0x4    erreur d’adressage lors de la lecture d’une donnée ou
                d’une instruction ;
 AdES    0x5    erreur d’adressage lors de l’écriture d’une donnée ;
 IBE     0x6    erreur lors d’un accès mémoire pour la lecture d’une
                instruction ;
 DBE     0x7    erreur lors d’un accès mémoire pour la lecture ou
                l’écriture d’une donnée ;
 Sys     0x8    appel système ;
 Bp      0x9    point d’arrêt ;
 RI      0xA    instruction inconnue (ou réservée) ;
 CpU     0xB    tentative avortée d’accès à un coprocesseur ;
 Ovf     0xC    dépassement de capacité lors d’un calcul arithmétique.

Les interruptions matérielles sont des évènements asynchrones déclenchés par la mise à 1 d’une broche du
processeur. Il y a 6 broches d’interruption sur le M IPS, et elles sont masquables soit individuellement soit
collectivement par action sur le registre status. L’interruption doit être maintenue par le périphérique tant
qu’elle n’a pas été acquittée. Le registre pc prend la valeur 0x80000080, et les interruptions sont masquées.
L’instruction en cours d’exécution lors d’une interruption est achevée, puis le programme est dérouté. Le
registre epc contient l’adresse de l’instruction qui suit l’instruction durant laquelle l’interruption a été levée.
Il existe également deux interruptions logicielles, qui sont levées par la mise à 1 d’un bit dans le registre
cause, et donc le comportement est identique aux interruptions matérielles.

Les exceptions sont des évènements synchrones liés à la mauvaise exécution d’une instruction. Le registre pc
prend la valeur 0x80000080 dans le cas général, ou 0x80000000 dans certain cas particulier liés à la gestion
de la mémoire virtuelle. les interruptions sont masquées, et le registre epc contient l’adresse de l’instruction
fautive, ce qui permet d’émettre des diagnostiques.

Si une des ces actions à lieu dans une instruction qui suit un branchement, ce n’est pas l’adresse de l’instruc-
tion qui est mise dans epc, mais celle du branchement, et le bit bd du registre cause est mis à 1.

2)     Détail des registres liés aux exceptions autres que celles relatives à la gestion de
       la mémoire virtuelle

Ces registres ne sont accessibles que par les instructions mfc0 et mtc0, qui elles mêmes ne sont utilisables
qu’en mode noyau. Les registres ci-dessous sont mis à jour lors d’un déroutement. Les mécanismes à mettre
en œuvre lorsque la gestion de la mémoire virtuelle est concernée sont complémentaires, et présentés dans
la section suivante.

M IPS R3000 jeu d’instructions                                                                            page - 7
Ensimag - Filières SLE/ISI

Registre status($12 du coprocesseur 0, accessible en lecture/écriture)
  31      30    29    28   27 26 25 24    23   22 21 20 19 18 17 16    15        14        13            12       11       10           9       8        7       6       5   4   3   2   1   0

 CU3 CU2 CU1 CU0               0         BEV            0             HIM5 HIM4 HIM3 HIM2 HIM1 HIM0 SIM1 SIM0 0 KUo IEo KUp IEp KUc IEc
CUi coprocessor usable. Ces 4 bits sont des bits de présence des coprocesseurs. Le M IPSde base n’en comporte
    qu’un, CP0. D’autres implantations peuvent en avoir jusqu’à trois autres. Un bit à 1 indique que le
    coprocesseur est utilisable ;
BEV bootstrap exception vector. Ce bit définit l’adresse du gestionnaire d’interruption. Les dif-
    férents cas, en fonction de BEV et de la cause du déroutement sont tabulés ici.
      BEV cause                    adresse
      x      reset                 0xbfc00000
      0      !reset && !TLB refill 0x80000080
      0      !reset && TLB refill 0x80000000
      1      !reset && !TLB refill 0xbfc00180
      1      !reset && TLB refill 0xbfc00100
HIMi , SIMi hardware and software interrupt mask. Ces bits contrôlent individuellement le fait qu’une cer-
      taine ligne d’interruption puisse interrompre le processeur. Un et logique avec les bits d’interruption
      en attente dans le registre cause permet au logiciel de connaître les interruptions actives. Un bit à 1
      autorise l’interruption ;
KU kernet/user. Indique le mode d’exécution. Un 0 indique le mode noyau, un 1 le mode utilisateur ;
IE interrupt enable. Autorise ou inhibe toutes les interruptions. Un 0 masque les interruptions, un 1 les
      autorise.
Lors d’un déroutement, le registre status est modifié par le matériel. Les bits KUo et IEo sont perdus. Les
bits KUp et IEp sont copiés dans KUo et IEo . Les bits KUc et IEc sont copiés dans KUp et IEp . Les bits KUc et
IEc sont mis à zéro.

Le suffixe indique donc le niveau d’imbrication des déroutements : c signifie current, p previous et o old.

L’opération à peu près inverse est effectuée sur le registre status lors de l’exécution de l’instruction rfe : les
bits KUp et IEp sont copiés dans KUc et IEc , et les bits KUo et IEo sont copiés dans KUp et IEp .

Registre cause($13 du coprocesseur 0, accessible en lecture)
  31   30 29 28 27 26 25 24 23 22 21 20 19 18 17 16     15     14      13       12        11        10        9        8        7   6   5   4   3    2       1       0

 BD 0 CE                         0                    HIP5 HIP4 HIP3 HIP2 HIP1 HIP0 SIP1 SIP0 0 EXCODE 0
BD branch delay. Ce bit est à 1 si l’exception ou l’interruption a été levée dans le delayed slot d’un branche-
    ment ;
CE coprocessor error. Indique le numéro du coprocesseur en erreur sur une exception de type CpU ;
HIPi , SIPi hardware and software interrupt pending. Ces bits reflètent l’état des lignes d’interruption. Un et
       logique avec les bits de masque d’interruption du registre status permet au logiciel de connaître les
       interruptions actives. Un 1 signifie que l’interruption est présente sur la ligne ;
EXCODE exception code. Code indiquant la raison pour laquelle le déroutement a eu lieu. La valeur du code
    sur 4 bits est donnée par la table 1.
Registre epc($14 du coprocesseur 0, accessible en lecture)
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9        8    7    6    5    4   3     2   1   0

                                                 EPC

M IPS R3000 jeu d’instructions                                                                                                                                                       page - 8
Ensimag - Filières SLE/ISI

EPC exception program counter. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une
    interruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si
    le bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette
    instruction si BD est à 1.
Registre badvaddr($8 du coprocesseur 0, accessible en lecture)
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9   8   7   6   5   4   3   2   1   0

                                             BVA
BVA bad virtual address. Ce registre contient l’adresse à laquelle doit reprendre l’exécution après une inter-
    ruption. Pour les exceptions, il contient soit l’adresse de l’instruction qui a causé l’interruption, si le
    bit BD du registre cause est à zéro, soit l’adresse du branchement qui précède immédiatement cette
    instruction si BD est à 1.

E)      Gestion de la mémoire virtuelle

La gestion de la mémoire virtuelle est intimement liée aux exceptions, car la possibilité d’exécuter du code
est directement lié à la présence physique des données et des instructions, et ne doit en rien être visible du
programmeur d’applications. Le chargement des pages doit donc être géré de manière transparente vis-à-vis
du programme qui s’exécute par le système d’exploitation.

L’objectif de la mémoire virtuelle est de rendre disponible à un programme donné tout l’espace adressable
par le M IPS, même si la mémoire physique est d’une part partagée par plusieurs programmes et d’autre part
de taille inférieure à 232 (ou 264 sur les machines 64 bits).

Il y a donc 2 idées derrière la mémoire virtuelle :
  1. pouvoir partager l’espace mémoire physique entre divers processus sans qu’ils se perturbent les uns les
     autres (c’est la différence entre un process et un thread dans l’acception Unixienne de ces termes) ;
  2. rendre accessible la totalité de l’espace adressable à un processus.
Pour ce faire, a) la mémoire (physique ou virtuelle) est découpée en pages, b) chaque processus reçoit un
identifiant unique parmi tous les processus connus du processeur, et c) le disque est utilisé pour sauver les
pages de mémoire physique qui sont utilisées plusieurs fois à des dates différentes (qu’elles appartiennent
au même processus ou à différents processus).

La traduction associe, à un instant t, une adresse (de page) physique à un couple (identifiant de processus,
adresse (de page) virtuelle). Dans le M IPSR3000, les mécanismes nécessaires pour garantir la gestion cohé-
rente de ces traductions (par ex., s’il n’y a plus de pages physiques libres, il faut en évincer une sur le disque
(le swap) et la réaffecter temporairement à un nouveau couple ((identifiant de processus, adresse virtuelle))
reposent complètement sur le logiciel. Ces aspects seront étudiés dans le cours de Système d’exploitation.
Néanmoins, comme l’exécution doit être transparente aux programmes applicatifs, le matériel doit détecter
l’absence d’une page en mémoire physique et donner suffisamment d’information au système d’exploitation
pour effectuer sa gestion de manière cohérente.

Pour ce faire, le M IPSR3000 possède une table de traduction (Translation Lookaside Buffer ou TLB) de 64
entrées de 64 bits. Cette table permet d’associer une adresse de page physique à un couple (identifiant
de processus, adresse virtuelle). Il se peut que, vu sa petite taille, la table ne contienne pas l’information
nécessaire à la traduction. Dans ce cas une exception de type TLB refill (TLBL ou TLBS) est levée, et c’est au

M IPS R3000 jeu d’instructions                                                                                              page - 9
Ensimag - Filières SLE/ISI

système d’exploitation d’aller la mettre à jour. Notez que le système peut lui même avoir une des pages le
concernant évincée, ce qui va lever un nouveau TLB refill durant la gestion du précédent TLB refill. Le support
spécifique fourni par le M IPSdans ce cas est que l’adresse du gestionnaire d’exception est différente dans les
2 cas, car l’écriture d’un gestionnaire de rechargement réentrant n’est simplement pas possible, puisque ce
sont des variables globales qui sont utilisées.

Format du couple (identifiant, adresse virtuelle) :
 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9                  8   7   6   5   4   3   2   1   0

      ASID                                   VPN                                                            OFFSET
ASID address space identifier. L’identifiant du processus dont il est question ici n’est pas le process id obtenu
    par getpid (2), mais un nombre sur 6 bits (car log2 64 = 6) calculé par le système d’exploitation
    uniquement pour la gestion de la TLB ;
VPN virtual page number. Ces 20 bits représentent le numéro de page virtuelle. Il y a donc 220 , soit 1 Mega,
    pages virtuelles. Les 3 bits de poids fort de l’adresse définissent le type de traduction à effectuer (voir
    la figure 3). Les adresses dans les segments kseg0 et kseg1 ne subissent pas la traduction d’adresse
    standard. Une adresse a de kseg0 sera émise sur le bus comme a - Ox80000000, et une adresse a de
    kseg1 sera émise sur le bus comme a - Oxa0000000 ;
OFFSET ces 12 bits représentent le déplacement dans la page sont passés sans modification sur le bus
    mémoire. La taille de la page est de 212 , soit 4 Kilo.
Les entrées de la TLB sont sur 64 bits, et correspondent à la concaténation des registres entryhi et entrylo.
Ne sont donc ici décrit que ces 2 registres.

Registre entryhi($10 du coprocesseur 0, accessible en lecture/écriture) :
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9    8   7   6   5   4       3       2   1   0

                           VPN                                   ASID                               0
VPN virtual page number. Les 20 bits de poids fort de l’adresse virtuelle ;
ASID address space identifier. L’identifiant du processus qui permet de savoir si deux adresses virtuelles
    identiques appartiennent à deux processus différents ou non.
Registre entrylo($2 du coprocesseur 0, accessible en lecture/écriture) :
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9    8   7   6   5   4       3       2   1   0

                           PFN                              NDVG                            0
PFN page frame number. Les 20 bits de poids fort de l’adresse physique. Si la traduction d’adresse est valide,
    alors les bits de PFN sont substitué à ceux de VPN dans le cycle ;
N non cachable. L’accès mémoire se fait sans passer par le cache ;
D dirty. Si ce bit est à 0, la page est protégée en écriture, et un accès en écriture dans la page lèvera
     l’exception MOD. Ceci permet au système d’exploitation de gérer des zones en lecture seulement (comme
     le code ou les constantes d’un programme par exemple) ;
V valid. Indique que l’entrée dans la TLB est valide. Si ce bit est à zéro, une exception de type TLBS ou TLBL
     est levée ;
G global. La translation d’adresse se fait en ignorant purement et simplement le champs ASID lors de la
     traduction.
Registre index($0 du coprocesseur 0, accessible en lecture/écriture) :
  31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9   8   7   6   5   4       3       2   1   0

 PF                          0                             INDEX                            0
PF probe failure. Ce bit est mis à un si l’instruction tlbp n’a pas détecté d’entrée valide dans la TLB ;

M IPS R3000 jeu d’instructions                                                                                                                              page - 10
Ensimag - Filières SLE/ISI

INDEX index de l’entrée de la TLB qui sera affectée par les instructions tlbr et tlbw.
Registre random($1 du coprocesseur 0, accessible en lecture) :
 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9   8   7   6   5   4       3   2   1   0

                          0                             RANDOM                             0
RANDOM index de l’entrée de la TLB qui sera affectée par l’instruction tlbwr. Cet index est compris entre
    8 et 63. Les 7 premiers index peuvent donc être réservés à des usages spécifiques par le système
    d’exploitation.

M IPS R3000 jeu d’instructions                                                                                                 page - 11
Ensimag - Filières SLE/ISI

F)     Instructions

Une instruction M IPSest un mot de 32 bits. Il y a trois catégories (formats) d’instruction :
             31               2625         2120         1615            1110            65             0

 Format R : opcode                    rs           rt            rd              sh            func

 Format I : opcode                    rs           rt                           imm16

 Format J : opcode                                              imm26

Dans ce qui suit, nous notons rd la valeur du champs rd, c’est à dire un entier entre 0 et 31 car rd est codé
sur 5 bits, et indiquons par $rd le registre indexé par ce champs. Si $rd est le membre de gauche d’une
affectation, alors nous en imposons la valeur, si il fait parti du membre de droite, nous en lisons la valeur.
Nous ne pouvons en aucun cas modifier rd qui est une constante décidée lors de la compilation. Notons
qu’un registre source peut être le registre destination d’une même instruction assembleur. Un opérande
immédiat sera noté imm, et sa taille sera spécifié dans la description de l’instruction. Les instructions de saut
prennent comme argument une étiquette, où label, qui est utilisée pour calculer l’adresse de saut. Toutes
les instructions modifient implicitement ou explicitement un registre non accessible du logiciel, le program
counter noté $pc. Pour lever l’ambiguïté liée aux calculs des sauts relatifs au $pc, nous noterons que l’adresse
de l’instruction en cours d’exécution est toujours égale à $pc − 4, car $pc est incrémenté (pour passer
à l’instruction suivante) en même temps que l’instruction à exécutée est chargée. Le $pc à droite d’une
affectation est donc toujours égal à l’adresse de l’instruction courante plus 4. Attention : le M IPS R3000 est
un processeur pipeline tel que l’instruction qui suit un branchement (relatif ou absolu) est toujours exécutée.
On appel cet emplacement le delay slot et on dit que le branchement effectif est retardé d’une instruction.

Le résultat d’une multiplication ou d’une division est mis dans deux registres spéciaux, $hi pour les poids
forts (multiplication) ou le reste (division), et $lo pour les poids faibles (multiplication) ou le quotien
(division).

add
       format
                31            26 25        21 20        16 15           11 10           6 5            0

                     000000           rs           rt            rd             00000         100000
       action
            Addition registre registre signée
       syntaxe
            add $rd, $rs, $rt
       description
           Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé
           dans le registre $rd.
       opération
           $rd ← $rs + $rt
       exception
           génération d’une exception si dépassement de capacité.
addi
M IPS R3000 jeu d’instructions                                                                                             page - 12
Ensimag - Filières SLE/ISI

       format
                31            26 25        21 20        16 15                                       0

                     001000           rs           rt                        imm16
       action
            Addition registre immédiat signée
       syntaxe
            addi $rt, $rs, imm
       description
           La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre
           $rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi
           utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1.
       opération
           $rt ← imm16
                    15 k imm15...0 + $rs

       exception
           génération d’une exception si dépassement de capacité.
addiu
       format
                31            26 25        21 20        16 15                                       0

                     001001           rs           rt                        imm16
       action
            Addition registre immédiat non-signée
       syntaxe
            addiu $rt, $rs, imm
       description
           La valeur immédiate sur 16 bits subit une extension de signe, et est ajoutée au contenu du registre
           $rs pour former un résultat sur 32 bits qui est placé dans le registre $rt. Cette instruction est aussi
           utilisée pour faire une soustraction en utilisant un immédiat dont le bit de poids (15) fort est à 1.
       opération
           $rt ← imm16
                    15 k imm15...0 + $rs

addu
       format
                31            26 25        21 20        16 15        11 10           6 5            0

                     000000           rs           rt           rd           00000         100001
       action
            Addition registre registre non-signée
       syntaxe
            addu $rd, $rs, $rt
       description
           Les contenus des registres $rs et $rt sont ajoutés pour former un résultat sur 32 bits qui est placé
           dans le registre $rd.
       opération
           $rd ← $rs + $rt
and

M IPS R3000 jeu d’instructions                                                                                          page - 13
Ensimag - Filières SLE/ISI

       format
                31            26 25        21 20           16 15        11 10           6 5            0

                     000000           rs            rt             rd           00000         100100
       action
            Et bit-à-bit registre registre
       syntaxe
            and $rd, $rs, $rt
       description
           Un et bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé dans
           le registre $rd.
       opération
           $rd ← $rs and $rd
andi
       format
                31            26 25        21 20           16 15                                       0

                     001100           rs            rt                          imm16
       action
            Et bit-à-bit registre immédiat
       syntaxe
            andi $rt, $rs, imm
       description
           La valeur immédiate sur 16 bits subit une extension de zéros. Un et bit-à-bit est effectué entre
           cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre
           $rt.
       opération
           $rt ← 016 k imm and $rs
beq
       format
                31            26 25        21 20           16 15                                       0

                     000100           rs            rt                          imm16
       action
            Branchement si registre égal registre
       syntaxe
            beq $rs, $rt, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immé-
           diate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres $rs
           et $rt sont comparés. S’ils sont égaux, le programme saute à l’adresse précédemment calculée.
       opération
           $addr ← $pc + imm1415 k imm k 0
                                          2

           $rs = $rt ⇒ $pc ← $addr
bgez
       format
                31            26 25        21 20           16 15                                       0

                     000001           rs           00001                        imm16

M IPS R3000 jeu d’instructions                                                                                             page - 14
Ensimag - Filières SLE/ISI

       action
            Branchement si registre supérieur ou égal à zéro
       syntaxe
            bgez $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur im-
           médiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre
           $rs a son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
       opération
           $addr ← $pc + imm1415 k imm k 0
                                          2

           $rs31 = 0 ⇒ $pc ← $addr
bgezal
       format
                31            26 25        21 20           16 15                  0

                     000001           rs           10001           imm16
       action
            Branchement à une fonction si registre supérieur ou égal à zéro
       syntaxe
            bgezal $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur im-
           médiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement,
           l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre
           $rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
       opération
           $addr ← $pc + imm1415 k imm k 0
                                           2

           $31 ← $pc
           $rs31 = 0 ⇒ $pc ← $addr
bgtz
       format
                31            26 25        21 20           16 15                  0

                     000111           rs           00000           imm16
       action
            Branchement si registre strictement supérieur à zéro
       syntaxe
            bgtz $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immé-
           diate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $ri
           à son bit de signe à zéro et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment
           calculée.
       opération
           $addr ← $pc + imm14  15 k imm k 0
                                            2

           $rs31 = 0 ∧ $rs 6= 0 ⇒ $pc ← $addr

M IPS R3000 jeu d’instructions                                                                          page - 15
Ensimag - Filières SLE/ISI

blez
       format
                31            26 25        21 20           16 15                  0

                     000110           rs           00000           imm16
       action
            Branchement si registre inférieur ou égal à zéro
       syntaxe
            blez $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur immé-
           diate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre $rs
           à son bit de signe à un et qu’il ne vaut pas zéro, le programme saute à l’adresse précédemment
           calculée.
       opération
           $addr ← $pc + imm14  15 k imm k 0
                                            2

           $rs31 = 1 ∧ $rs 6= 0 ⇒ $pc ← $addr
bltz
       format
                31            26 25        21 20           16 15                  0

                     000001           rs           00000           imm16
       action
            Branchement si registre strictement inférieur à zéro
       syntaxe
            bltz $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur im-
           médiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Si le contenu du registre
           $rs à son bit de signe à zéro, le programme saute à l’adresse précédemment calculée.
       opération
           $addr ← $pc + imm1415 k imm k 0
                                          2

           $rs31 = 1 ⇒ $pc ← $addr
bltzal
       format
                31            26 25        21 20           16 15                  0

                     000001           rs           10000           imm16
       action
            Branchement à une fonction si registre supérieur ou égal à zéro
       syntaxe
            bltzal $rs, imm
       description
           L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur im-
           médiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Inconditionnellement,
           l’adresse de l’instruction suivant le bgezal est sauvée dans le registre $31. Si le contenu du registre
           $rs à son bit de signe à un, le programme saute à l’adresse précédemment calculée.

M IPS R3000 jeu d’instructions                                                                          page - 16
Ensimag - Filières SLE/ISI

      opération
          $addr ← $pc + imm1415 k imm k 0
                                          2

          $31 ← $pc
          $rs31 = 1 ⇒ $pc ← $addr
bne
      format
               31            26 25        21 20        16 15                                0

                    000101           rs           rt                 imm16
      action
           Branchement si registre différent de registre
      syntaxe
           bne $rs, $rt, imm
      description
          L’adresse de branchement est la somme de l’adresse de l’instruction courante plus la valeur im-
          médiate sur 16 bits, avec extension de signe, décalée à gauche de 2 bits. Le contenu des registres
          $rs et $rt sont comparés. S’ils sont différents, le programme saute à l’adresse précédemment
          calculée.
      opération
          $addr ← $pc + imm14 15 k imm k 0
                                          2

          $rs 6= $rt ⇒ $pc ← $addr
break
      format
               31            26 25                                           6 5            0

                    000000                             code                        001101
      action
           Arrêt et saut à la routine d’exception
      syntaxe
           break code
      description
          Un point d’arrêt est detecté, et le programme saute à l’adresse de la routine de gestion des excep-
          tions. Le champs code est utilisable par le logiciel pour identifier le type de point d’arrêt.
      opération
          pc ← 0x80000080
      exception
          Déclenchement d’une exception de type point d’arrêt.
div
      format
               31            26 25        21 20        16 15                 6 5            0

                    000000           rs           rt           0000000000          011010
      action
           Division entière et reste signé registre registre
      syntaxe
           div $rs, $rt

M IPS R3000 jeu d’instructions                                                                                  page - 17
Ensimag - Filières SLE/ISI

       description
           Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres
           étant considéré comme des nombres en complément à deux. Le résultat de la division est placé
           dans le registre spécial $lo, et le reste dans $hi. La division est une opération multicycles.
       opération
           $lo ← $rs
                 $rt
           $hi ← $rs mod $rt
divu
       format
                31            26 25        21 20        16 15                 6 5            0

                     000000           rs           rt            0000000000         011011
       action
            Division entière et reste non-signé registre registre
       syntaxe
            divu $rs, $rs
       description
           Le contenu du registre $rs est divisé par le contenu du registre $rt, le contenu des deux registres
           étant considéré comme des nombres non signés. Le résultat de la division est placé dans le registre
           spécial $lo, et le reste dans $hi.
       opération
           $lo ← 0k$rs
                 0k$rt
           $hi ← 0 k $rs mod 0 k $rt
j
       format
                31            26 25                                                          0

                     000010                                     imm26
       action
            Branchement inconditionnel immédiat
       syntaxe
            j imm
       description
           L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2
           bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. Le programme saute incondi-
           tionnellement à l’adresse ainsi calculée.
       opération
           $pc ← $pc31...28 k imm k 02
jal
       format
                31            26 25                                                          0

                     000011                                     imm26
       action
            Appel de fonction inconditionnel immédiat
       syntaxe
            jal imm

M IPS R3000 jeu d’instructions                                                                                   page - 18
Ensimag - Filières SLE/ISI

       description
           L’adresse de saut est calculée à partir de la valeur immédiate sur 26 bits, décalée à gauche de 2
           bits, en recopiant les bits 32 à 28 du $pc de l’instruction courante. L’adresse de l’instruction suivant
           le jal est sauvée dans le registre $31. Le programme saute inconditionnellement à l’adresse ainsi
           calculée.
       opération
           $31 ← $pc
           $pc ← $pc31...28 k imm k 02

jalr
       format
                31            26 25        21 20           16 15        11 10           6 5            0

                     000000           rs           00000           rd           00000         001001
       action
            Appel de fonction inconditionnel registre
       syntaxe
            jalr $rs ou
            jalr $rd, $rs
       description
           Le programme saute à l’adresse contenue dans le registre $rs. L’adresse de l’instruction suivant
           le jalr est sauvée dans le registre $rd. Si le registre $rd n’est pas spécifié, alors l’assembleur
           y mettra par défaut le registre $31. Attention, l’adresse contenue dans le registre $rs doit être
           aligné sur une frontière de mots.
       opération
           $rd ← $pc
           $pc ← $rs
jr
       format
                31            26 25        21 20                                        6 5            0

                     000000           rs                 000000000000000                      001000
       action
            Branchement inconditionnel registre
       syntaxe
            jr $rs
       description
           Le programme saute à l’adresse contenue dans le registre $ri. Attention, cette adresse doit être
           aligné sur une frontière de mots.
       opération
           $pc ← $rs
lb
       format
                31            26 25        21 20           16 15                                       0

                     100000           rs            rt                          imm16
       action
            Lecture d’un octet signé de la mémoire

M IPS R3000 jeu d’instructions                                                                                             page - 19
Ensimag - Filières SLE/ISI

      syntaxe
           lb $rt, imm($rs)
      description
          L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
          signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et
          est ensuite placé dans le registre $rt.
      opération
          $rt ← mem1 [imm + $rs]24
                                7 k mem1 [imm + $rs]7...0

      exception

           – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
           – Mémoire inexistante à l’adresse de chargement.
lbu
      format
               31            26 25        21 20        16 15                    0

                    100100           rs           rt           imm16
      action
           Lecture d’un octet non-signé de la mémoire
      syntaxe
           lbu $rt, imm($rs)
      description
          L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
          et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite
          placé dans le registre $rt.
      opération
          $rt ← 024 k mem1 [imm + $rs]7...0
          – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
          – Mémoire inexistante à l’adresse de chargement.
lh
      format
               31            26 25        21 20        16 15                    0

                    100001           rs           rt           imm16
      action
           Lecture d’un demi-mot signé de la mémoire
      syntaxe
           lh $rt, imm($rs)
      description
          L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
          signe, et du contenu du registre $rs. Le contenu de cette adresse subit une extension de signe et
          est ensuite placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit
          être à zéro.
      opération
          $rt ← mem2 [imm + $rs]16
                                15 k mem2 [imm + $rs]15...0

M IPS R3000 jeu d’instructions                                                                        page - 20
Ensimag - Filières SLE/ISI

      exceptions

           – Adresse non alignée sur une frontière de demi-mot. ;
           – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
           – Mémoire inexistante à l’adresse de chargement.
lhu
      format
               31            26 25           21 20        16 15                  0

                    100101            rs             rt           imm16
      action
           Lecture d’un demi-mot non-signé de la mémoire
      syntaxe
           lhu $rt, imm($rs)
      description
          L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
          et du contenu du registre $rs. Le contenu de cette adresse est étendu avec des zéro et est ensuite
          placé dans le registre $rt. Attention, le bit de poids faible de l’adresse résultante doit être à zéro.
      opération
          $rt ← 016 k mem2 [imm + $rs]15...0
      exceptions

           – Adresse non alignée sur une frontière de demi-mot. ;
           – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
           – Mémoire inexistante à l’adresse de chargement.
lui
      format
               31            26 25           21 20        16 15                  0

                    001111           00000           rt           imm16
      action
           Lecture d’une constante dans les poids forts
      syntaxe
           lui $rt, imm
      description
          La constante immédiate de 16 bits est décalée de 16 bits à gauche, et est complétée de zéro. La
          valeur ainsi obtenue est placée dans $rt.
      opération
          $rt ← imm k 016
lw
      format
               31            26 25           21 20        16 15                  0

                    100011            rs             rt           imm16
      action
           Lecture d’un mot de la mémoire

M IPS R3000 jeu d’instructions                                                                         page - 21
Ensimag - Filières SLE/ISI

       syntaxe
            lw $rt, imm($rs)
       description
           L’adresse de chargement est la somme de la valeur immédiate sur 16 bits, avec extension de
           signe, et du contenu du registre $rs. Le contenu de cette adresse est placé dans le registre $rt.
           Attention, les deux bits de poids faible de l’adresse résultante doivent être à zéro.
       opération
           $rt ← mem4 [imm + $rs]
       exceptions

            – Adresse non alignée sur une frontière de mot ;
            – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
            – Mémoire inexistante à l’adresse de chargement.
mfc0
       format
                31            26 25           21 20        16 15        11 10                          0

                     010000           00000           rt           rd            0000000000
       action
            Copie d’un registre spécialisé dans d’un registre général
       syntaxe
            mfc0 $rt, $rd
       description
           Le contenu du registre spécialisé $rd — non directement accessible au programmeur — est reco-
           pié dans le registre général $rt. Les registres possibles pour $rd sont ceux du coprocesseur 0 qui
           servent à la gestion des exceptions et interruptions.
       opération
           $rt ← copro0 [$rd]
       exception

            – Utilisation de l’instruction en mode utilisateur.
mfhi
       format
                31            26 25                        16 15        11 10           6 5            0

                     000000            0000000000                  rd           00000         010000
       action
            Copie le registre $hi dans un registre général
       syntaxe
            mfhi $rd
       description
           Le contenu du registre spécialisé $hi — qui est mis à jour par l’opération de multiplication ou de
           division — est recopié dans le registre général $rd.
       opération
           $rd ← $hi

M IPS R3000 jeu d’instructions                                                                                             page - 22
Ensimag - Filières SLE/ISI

mflo
       format
                31            26 25                         16 15        11 10           6 5            0

                     000000            0000000000                   rd           00000         010010
       action
            Copie le registre $lo dans un registre général
       syntaxe
            mflo $rd
       description
           Le contenu du registre spécialisé $lo — qui est mis à jour par l’opération de multiplication ou de
           division — est recopié dans le registre général $rd.
       opération
           $rd ← $lo
mtc0
       format
                31            26 25           21 20         16 15        11 10                          0

                     010000           00100           rt            rd            0000000000
       action
            Copie d’un registre général dans un registre spécialisé
       syntaxe
            mtc0 $rt, $rd
       description
           Le contenu du registre général $rt est recopié dans le registre spécialisé $rd — non directement
           accessible au programmeur —. Ces registres sont ceux du coprocesseur 0 qui servent à la gestion
           des exceptions et interruptions.
       opération
           copro0 [$rd] ← $rt
mthi
       format
                31            26 25           21 20                                      6 5            0

                     000000            rs                  000000000000000                     010001
       action
            Copie d’un registre général dans le registre $hi
       syntaxe
            mthi $rs
       description
           Le contenu du registre général $rs est recopié dans le registre spécialisé $hi.
       opération
           $hi ← $rs
mtlo
       format
                31            26 25           21 20                                      6 5            0

                     000000            rs                  000000000000000                     010011

M IPS R3000 jeu d’instructions                                                                                              page - 23
Ensimag - Filières SLE/ISI

       action
            Copie d’un registre général dans le registre $lo
       syntaxe
            mtlo $rs
       description
           Le contenu du registre général $rs est recopié dans le registre spécialisé $lo.
       opération
           $lo ← $rs
mult
       format
                31            26 25        21 20        16 15                         6 5            0

                     000000           rs           rt           0000000000                  001110
       action
            Multiplication signé registre registre
       syntaxe
            mult $rs, $rt
       description
           Le contenu du registre $rs est multiplié par le contenu du registre $rs, le contenu des deux
           registres étant considéré comme des nombres en complément à deux. Les 32 bits de poids fort du
           résultat sont placés dans le registre $hi, et les 32 bits de poids faible dans $lo. La multiplication
           est une opération multicycles.
       opération
           $lo ← ($rs × $rt)31...0
           $hi ← ($rs × $rt)63...32
multu
       format
                31            26 25        21 20        16 15                         6 5            0

                     000000           rs           rt           0000000000                  011000
       action
            Multiplication signé registre registre
       syntaxe
            multu $rs, $rt
       description
           Le contenu du registre $rs est multiplié par le contenu du registre $rt, le contenu des deux
           registres étant considéré comme des nombres non-signés. Les 32 bits de poids fort du résultat
           sont placés dans le registre $hi, et les 32 bits de poids faible dans $lo. La multiplication est une
           opération multicycles.
       opération
           $lo ← (0 k $rs × 0 k $rt)31...0
           $hi ← (0 k $rs × 0 k $rt)63...32
nor
       format
                31            26 25        21 20        16 15        11 10            6 5            0
                                                                                                         100111
                     000000           rs           rt           rd           000000         00000

M IPS R3000 jeu d’instructions                                                                                            page - 24
Ensimag - Filières SLE/ISI

      action
           Non-ou bit-à-bit registre registre
      syntaxe
           nor $rd, $rs, $rt
      description
          Un non-ou bit-à-bit est effectué entre les contenus des registres $rs et $rt. Le résultat est placé
          dans le registre $rd.
      opération
          $rd ← $rs nor $rt
or
      format
               31            26 25             21 20        16 15        11 10            6 5            0
                                                                                                             100101
                    000000                rs           rt           rd           000000         00000
      action
           Ou bit-à-bit registre registre
      syntaxe
           or $rd, $rs, $rt
      description
          Un ou bit-à-bit est effectué entre les contenus des registres $rs et $rs. Le résultat est placé dans
          le registre $rd.
      opération
          $rd ← $rs or $rt
ori
      format
               31            26 25             21 20        16 15                                        0

                    001101                rs           rt                        imm16
      action
           Ou bit-à-bit registre immédiat
      syntaxe
           ori $rt, $rs, imm
      description
          La valeur immédiate sur 16 bits subit une extension de zéros. Un ou bit-à-bit est effectué entre
          cette valeur étendue et le contenu du registre $rs pour former un résultat placé dans le registre
          $rt.
      opération
          $rt ← (016 k imm) or $rs
rfe
      format
               31            26 25   24                                                   6 5            0

                    010000      1                00000000000000000000                           010000
      action
           Restauration des bits d’état en fin d’exception
      syntaxe
           rfe

M IPS R3000 jeu d’instructions                                                                                                page - 25
Ensimag - Filières SLE/ISI

     description
         Recopie les anciennes valeurs des bits de masques d’interruption et de mode (noyau ou utilisateur)
         du registre d’état — un des registres spécialisé — à la valeur qu’il avait avant l’exécution du
         programme d’exception courant.
     opération
         $sr ← $sr31...4 k $sr5...2
     exception
         Utilisation de l’instruction en mode utilisateur.
sb
     format
              31            26 25        21 20        16 15                  0

                   101000           rs           rt           imm16
     action
          Écriture d’un octet en mémoire
     syntaxe
          sb $rt, imm($rs)
     description
         L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe,
         et du contenu du registre $rs. L’octet de poids faible du registre $rt est écrit à l’adresse ainsi
         calculée.
     opération
          mem1 [imm + $rs] ← $rt7...0
     exceptions

          – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
          – Mémoire inexistante à l’adresse de chargement.
sh
     format
              31            26 25        21 20        16 15                  0

                   101001           rs           rt           imm16
     action
          Écriture d’un demi-mot en mémoire
     syntaxe
          sh $rt, imm($rs)
     description
         L’adresse d’écriture est la somme de la valeur immédiate sur 16 bits, avec extension de signe, et
         du contenu du registre $rs. Les deux octets de poids faible du registre $rt sont écrit à l’adresse
         ainsi calculée. Le bit de poids faible de cette adresse doit être à zéro.
     opération
          mem2 [imm + $rs] ← $rt15...0
     exceptions

          – Adresse non alignée sur une frontière de demi-mot ;

M IPS R3000 jeu d’instructions                                                                   page - 26
Ensimag - Filières SLE/ISI

            – Adresse de chargement en segment noyau alors que le code tourne avec le bit utilisateur ;
            – Mémoire inexistante à l’adresse de chargement.
sll
       format
                31            26 25           21 20        16 15        11 10           6 5            0

                     000000           00000           rt           rd           shamt         000000
       action
            Décalage à gauche immédiat
       syntaxe
            sll $rd, $rt, shamt
       description
           Le registre $rt est décalé à gauche de la valeur immédiate codée sur 5 bits, des zéros étant
           introduits dans les bits de poids faibles. Le résultat est placé dans le registre $rd.
       opération
           $rd ← $rt31−shamt...0 k 0shamt
sllv
       format
                31            26 25           21 20        16 15        11 10           6 5            0

                     000000            rs             rt           rd           00000         000100
       action
            Décalage à gauche registre
       syntaxe
            sllv $rd, $rt, $rs
       description
           Le registre $rt est décalé à gauche du nombre de bits spécifiés dans les 5 bits de poids faibles du
           registre $rs, des zéros étant introduits dans les bits de poids faibles. Le résultat est placé dans le
           registre $rr.
       opération
           $rd ← $rt31−$rs4...0 ...0 k 0$rs4...0
slt
       format
                31            26 25           21 20        16 15        11 10           6 5            0

                     000000            rs             rt           rd           00000         101010
       action
            Comparaison signée registre registre
       syntaxe
            slt $rd, $rs, $rt
       description
           Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant consi-
           dérées comme des quantités signées. Si la valeur contenue dans $rs est inférieure à celle contenue
           dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro.
       opération
           $rs < $rt ⇒ $rd ← 031 k 1
           $rs ≥ $rt ⇒ $rd ← 032

M IPS R3000 jeu d’instructions                                                                                             page - 27
Ensimag - Filières SLE/ISI

slti
       format
                31            26 25        21 20        16 15                                       0

                     001010           rs           rt                        imm16
       action
            Comparaison signée registre immédiat
       syntaxe
            slti $rt, $rs, imm
       description
           Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une extension
           de signe. Les deux valeurs étant considérées comme des quantités signées, si la valeur contenue
           dans $rs est inférieure à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon il prend
           la valeur zéro.
       opération
           $rs < imm16
                    15 k imm ⇒ $rt ← 0
                                      31
                                         k1
           $rs ≥ imm15 k imm ⇒ $rt ← 032
                    16

sltiu
       format
                31            26 25        21 20        16 15                                       0

                     001011           rs           rt                        imm16
       action
            Comparaison non-signée registre immédiat
       syntaxe
            sltiu $rt, $rs, imm
       description
           Le contenu du registre $rs est comparé à la valeur immédiate sur 16 bits qui à subit une exten-
           sion de signe. Les deux valeurs étant considérées comme des quantités non-signées, si la valeur
           contenue dans $rs est inférieur à celle de l’immédiat étendu, alors $rt prend la valeur un, sinon
           il prend la valeur zéro.
       opération
           0 k $rs < 0 k imm16
                            15 k imm ⇒ $rt ← 0
                                              31
                                                 k1
           0 k $rs ≥ 0 k imm15 k imm ⇒ $rt ← 032
                            16

sltu
       format
                31            26 25        21 20        16 15        11 10           6 5            0

                     000000           rs           rt           rd           00000         101011
       action
            Comparaison non-signée registre registre
       syntaxe
            sltu $rd, $rs, $rt
       description
           Le contenu du registre $rs est comparé au contenu du registre $rt, les deux valeurs étant considé-
           rés comme des quantités non-signées. Si la valeur contenue dans $rs est inférieur à celle contenue
           dans $rt, alors $rd prend la valeur un, sinon il prend la valeur zéro.

M IPS R3000 jeu d’instructions                                                                                          page - 28
Vous pouvez aussi lire