Banner 728x90px

vendredi 9 novembre 2018

thumbnail

C3-Opérateurs arithmétiques et logiques MIPS

CHAP3 

Opérateurs arithmétiques et logiques MIPS

     Les instructions MIPS sont quasi-implémentées en matériel,  mais très peu nombreuses (57 au total). Les pseudo-instructions MIPS remplacent des petites portions de MIPS fréquentes (mais non implémentés dans le matériel), basées   sur   les instructions réelles du MIPS et  utilisent un registre intermédiaire spécifique ($at).
Exemple :      li $t0, 0xabcd     à     ori $t0, $zero, 0xabcd

1 Addition dans l'assembleur MIPS

  Il y a 4 opérateurs addition dans l'assembleur MIPS:
  • add , 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. Génération d’une exception si dépassement de capacité.

      Syntaxe: add Rd, Rs, Rt
      signification: Rd 
<-- Rs + Rt

R :
000000
rs
rt
rd
00000
100000
  • addi , 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. Génération d’une exception si dépassement de capacité.
      Syntaxe: addi Rt, Rs, Immediate
      signification: Rt <- Rs + Immediate
I :
001000
rs
rt
imm16
  • addu , Addition registre registre non-signée. qui est identique à l'opérateur add, sauf que les valeurs dans les registres sont supposées être des nombres binaires non signés ou entiers. Comme il n'y a pas de valeur négative, les valeurs vont de 0..(2^32)-1.
      Syntaxe: addu Rd, Rs, Rt
      signification: Rd  Rs + Rt

R :
000000
rs
rt
rd
00000
100001
  • addiu , qui est identique à l'opérateur addi, mais là encore, les nombres sont supposés non signés
      Syntaxe: addiu Rt, Rs, Immediate
      signification: Rt  Rs + Immediate

 I : 
001001
rs
rt
imm16 


 En plus des vrais opérateurs, il y a un certain nombre d'opérateurs  pseudo-add , qui sont:

  • add en utilisant une valeur immédiate de 16 bits. Ceci est un raccourci pour que l'opérateur add implémente un opérateur addi. Le même principe s'applique pour addu si une valeur immédiate est utilisée, et l'opérateur est converti en un addiu. Le format, la signification et la traduction de cette instruction sont:
      Syntaxe: add Rt, Rs, Immediate
      Signification: Rt  Rs + Immediate
      Traduction: addi Rt, Rs, Immédiat
  • add, addi, addu ou addiu avec une valeur immédiate 32 bits. Lors de l'examen de cet opérateur, il est important de noter que dans l'instruction de format I, la valeur immédiate ne peut contenir que 16 bits. Donc, si une instruction immédiate contient un nombre nécessitant plus de 16, le nombre doit être chargé en deux étapes. La première étape consiste à charger les 16 bits supérieurs du nombre dans un registre à l'aide de Load Upper Immediate (lui), puis à charger les 16 bits inférieurs à l'aide de ou à l'aide de Or Immediate (ori). L'addition est ensuite effectuée à l'aide de l'opérateur d'ajout d'instruction R. Ainsi, l'instruction:
       addi Rt, Rs,  Immediat(32 bits)

          sera traduit en:

       lui $at,  Immediat(16 bits sup.)      # charger les 16 bits supérieurs du nombre dans $at
       ori $at, $at, Immediat(16 bits inf.)  # charger les 16 bits inférieurs dans $at
       add Rt, Rs, $at

2 Soustraction dans l'assembleur MIPS

   La soustraction dans l'assembleur MIPS est similaire à l'addition avec une seule exception. Les sub, subu et subui se comportent comme les opérateurs add, addu et addui. La seule différence majeure avec la soustraction est que le subi est implémenté sous la forme d'une pseudo-instruction, avec la valeur à soustraire chargée dans le registre $at, puis l'opérateur  sub (format R) est utilisé. 

  • sub, qui prend la valeur des registres Rs et Rt contenant des entiers, soustrait les nombres et stocke la valeur dans le registre Rd. Génération d’une exception si dépassement de capacité. Le format et la signification sont:
          Syntaxe: sub Rd, Rs, Rt
          signification: Rd  Rs - Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100010
    • sub pseudo-opérateur , qui prend la valeur de Rs, soustrait la valeur immédiate(16 bits) de l'instruc-tion et stocke le résultat dans Rt. Le format, la signification et la traduction sont:
           format: sub Rt, Rs, Immédiat
           signification: Rt  Rs - Immédiat
           traduction: addi $at, $zero, immédiat
                            sub Rt, Rs, $at
    • subi pseudo-opérateur , qui prend la valeur de Rs, soustrait la valeur immédiate(16 bits) de l'instruc-tion et stocke le résultat dans Rt. Le format, la signification et la traduction sont:
           format: subi Rt, Rs, Immédiat
           signification: Rt  Rs - Immédiat
           traduction: addi $at, $zero, immédiat
                            sub Rt, Rs, $at
    • subu, opérateur identique à sub, sauf que les valeurs dans les registres sont supposées être des nombres binaires non signés ou entiers. Il n'y a pas de valeurs négatives, les valeurs vont donc de 0..(2^32)-1. Le format et la signification sont les mêmes que ceux de l'opérateur sub au dessus:
          format: subu Rd, Rs, Rt
          signification: Rd  Rs - Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100011
    • subiu pseudo-opérateur, identique au pseudo-opérateur subi, mais là encore, les nombres sont supposés non signés:
          format: subiu Rt, Rs, Immediate
          signification: Rt  Rs - immédiat
          traduction: addi $at, $zero, immédiat
                           subu Rt, Rs, $at

    3 Multiplication dans l'assembleur MIPS

      La multiplication et la division sont plus compliquées que l'addition et la soustraction et nécessitent l'utilisation de deux nouveaux registres à usage spécial, les registres hi et lo. Les registres hi et lo ne sont pas inclus dans les 32 registres d'usage général qui ont été utilisés jusqu'à présent et ne sont donc pas directement sous le contrôle du programmeur.
       Dans MIPS, toutes les valeurs entières doivent être sur 32 bits. Donc, s’il existe une réponse valide, elle doit figurer dans les 32 bits inférieurs de la réponse. Ainsi, pour mettre en œuvre la multiplication dans MIPS, les deux nombres doivent être multipliés à l’aide de l’opérateur mult et le résultat valide doit être déplacé du registre lo. Ceci est montré dans le fragment de code suivant qui multiplie la valeur dans $t1 par la valeur dans $t2 et stocke le résultat dans $t0.

       mult $t1, $t2   #  [hi , lo] <- Rs * Rt
       mflo $t0        # $t0  lo

       Les  opérateurs de multiplication MIPS  examinés sont:
    • mult, opérateur qui multiplie les valeurs de Rs et Rt et enregistre le résultat dans les registres  lo et hi. Le format et la signification de cet opérateur est:
           format: mult Rs Rt 
           signification: [hi, lo]  Rs * Rt

    R :
    000000
    rs
    rt
    00000
    00000
    011000
    • mflo, opérateur  qui déplace la valeur du registre hi dans le registre Rd. Le format et la signification de cet opérateur sont:
          format: mflo Rd
          signification: Rd <- lo

    R :
    000000
    00000
    00000
    rd
    00000
    010010


    • mfhi, opérateur qui déplace la valeur du registre hi dans le registre Rd. Le format et la signification de cet opérateur sont:
          format: mfhi Rd
          signification: Rd  hi

    R :
    000000
    00000
    00000
    rd
    00000
    010000


    • mthi, Copie d’un registre général dans le registre Hi.

    format: mthi Rd
    signification: Hi <- Rd

    R :
    000000
    rs
    00000
    00000
    00000
    010001


    • mtlo, Copie d’un registre général dans le registre Li.

    format: mtlo Rd
    signification: Lo <- Rd

    R :
    000000
    rs
    00000
    00000
    00000
    010011


    • mulpseudo-opérateur qui multiplie (multiplication sans débordement) les valeurs dans Rs et Rt et les stocke dans Rd. Le format et la signification de cet opérateur sont:
          format: mul Rd, Rs, Rt
          signification: Rd  Rs * Rt
          traduction:   mult  Rs, Rt

                             mflo  Rd
    • mulo, pseudo-opérateur qui multiplie les valeurs dans Rs et Rt et les stocke dans Rd, vérifie le débordement. Si un dépassement de capacité se produit, une exception est déclenchée et le programme est arrêté avec une erreur. Le format et la signification de cet opérateur sont:
          format: mulo Rd, Rs, Rt
          signification: Rd ← Rs * Rt
          traduction:  mult  Rs, Rt
                            mfhi $at
                            mflo Rd
                            sra Rd, Rd,0x000000f1
                            beq $at, Rd, 0x00000001
                            break
                            mflo Rd          
    • Notez que l'opérateurs mul a une implémentation immédiate16 de pseudo-opérateur. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: mul Rd, Rs, immédiat16
           signification: Rd  Rs * Immediate16
           traduction: addi $Rd, $zéro, immédiat16
                            mult Rd, Rs, Rt

    4 Division en assembleur MIPS

       Dans MIPS, lorsque la division entière est terminée, le registre lo contiendra le quotient et le registre hi contiendra le reste. Cela signifie qu'en arithmétique entière MIPS, lorsque le quotient est extrait du registre bas, les résultats sont tronqués. Si le programmeur veut arrondir le nombre, celui-ci peut être implémenté en utilisant le reste. Maintenant que les bases de la division entière ont été couvertes, deux opérateurs de division MIPS seront examinés:
    • div, opérateur qui a 3 formats. Le premier format est le seul format réel de cet opérateur. L'opérateur divise Rs par Rt et stocke le résultat dans la paire de registres [hi, lo] avec le quotient dans le bas (lo) et le reste dans le haut (hi). Le format et la signification de cet opérateur sont:
          format: div Rs, Rt
          signification: [Lo]<-- Rs / Rt
                                [Ho] <-- Rs % Rt

    R :
    000000
    rs
    rt
    00000
    00000
    011010
    • Le deuxième format de l'opérateur div est une pseudo-instruction. C'est un format à 3 adresses, mais c'est toujours une pseudo-instruction. En plus d'exécuter une instruction de division, cette pseudo-instruction vérifie également une division par zéro. Les détails de la vérification ne seront pas abordés à ce stade, car ils s'agit d'instructions bne et break. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
          format: div Rd, Rs, Rt
          signification: [si Rt != 0] Rd <-- Rs / Rt
                              sinon arrêt
           traduction: bne Rt, $ zero, 0x00000001
                            break
                            div Rs, Rt
                            mflo Rd
    • Le troisième format (immédiat) de l'opérateur div est une pseudo-instruction. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: div Rd, Rs, immédiat
           signification: Rd  Rs / Immediat
           traduction: addi $ Rt, $ zéro, immédiat
                            div Rs, Rt
                            mflo Rd

    • divu, division entière et reste non-signé registre avec registre. 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 le registre spécial Hi. Le format et la signification de cet opérateur sont:

          format: divu Rs, Rt
          signification: [Lo] <-- Rs / Rt
                                [Ho] <-- Rs % Rt

    R :
    000000
    rs
    rt
    00000
    00000
    011011


    • rem (reste), opérateur qui a 2 formats. Il n'y a que des pseudo formats pour cette instruction. Le premier format de l'opérateur rem est une pseudo-instruction. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:

           format: div Rd, Rs, Rt
           signification: [si Rt! = 0] Rd <-- Rs% Rt
                               sinon arrêt
           traduction: bne Rt, $zero, 0x00000001
                            break
                            div Rs, Rt
                            mfhi Rd

    • Le deuxième format (immédiat) de l'opérateur rem est également une pseudo-instruction. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:

           format: rem Rd, Rs, immédiat
           signification: Rd  Rs / Immediat
           traduction: addi $ Rt, $ zéro, immédiat
                            div Rs, Rt
                            mfhi Rd

    5 Opérateurs logiques

        Les opérateurs logiques couverts sont:
    •  and, opérateur qui a trois formats. Le premier format est le seul format réel de cet opérateur. L'opérateur effectue un ET binaire sur Rs et Rt et stocke le registre de résultat Rd. Le format et la signification de cet opérateur sont:
           format: and Rd, Rs, Rt
           signification: Rd  Rs ET Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100100
    • Le second format de l'opérateur and est une pseudo-instruction. Dans ce cas, le 3ème opérateur est une valeur immédiate, il ne s'agit donc que d'un raccourci pour la mise en œuvre de l'opérateur andi. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: and Rt, Rs, immédiat16
           signification: Rt  Rs ET Immédiat16
           traduction: andi Rt, Rs, immédiat16
    • Le troisième format de l'opérateur and est également une pseudo-instruction et est étrange en ce sens que seuls les opérateurs logiques ont ce format. Dans cette instruction, Rs et Rt sont supposés être le même registre et le troisième opérateur est une valeur immédiate. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: and Rs, immédiat16
           signification: Rs  Rs ET Immediate16
           traduction: andi Rs, Rs, immédiat16

    • andi. l'opérateur effectue un ET binaire sur Rs et une valeur immédiate16, et stocke le résultat dans Rt. Le format et la signification de cet opérateur sont:
           format: andi Rt, Rs, immédiat16
           signification: Rt  Rs ET Immédiat16

    I :
    001100
    rs
    rt
    Immediat16

               Le raccourci avec un seul registre (pseudo-instruction) s'applique également à  andi.

           format: andi Rs, immédiat16
           signification: Rs  Rs AND Immediat16
           traduction: andi Rs, Rs, immédiat16


    • or, opérateur qui a trois formats. Le premier format est le seul format réel de cet opérateur. L'opérateur effectue une opération OR par bits de Rs et Rt et stocke le registre de résultat Rd. Le format et la signification de cet opérateur sont:
           format: or Rd, Rs, Rt
           signification: Rd  Rs OU Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100101
    • Le second format de l'opérateur or est une pseudo-instruction. Dans ce cas, le 3ème opérateur est une valeur immédiate16 et il ne s'agit donc que d'un raccourci pour la mise en œuvre de l'opérateur ori. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: or Rt, Rs, immédiat16
           signification: Rt  Rs OU Immédiate16
           traduction: ori Rt, Rs, Immédiat16

              Le raccourci avec un seul registre (pseudo-instruction) s'applique également à l'instruction or.

           format: or Rs, immédiat16
           signification: Rs  Rs OU Immédiate16
           traduction: ori Rs, Rs, immédiat16

    • ori, l’opérateur fait un OU un à un de Rs et une valeur immédiate16, et stocke le résultat dans Rt. Le format et la signification de cet opérateur sont:
          format: ori Rt, Rs, immédiat16
          signification: Rt  Rs OU Immédiat16

    I :
    001101
    rs
    rt
    Immediat16

           
    Le raccourci avec un seul registre (pseudo-instruction) s'applique également à l'instruction ori.

           format: ori Rs, immédiat16
           signification: Rs  Rs OU Immédiat16
           traduction: ori Rs, Rs, Immédiat16
    • xor, opérateur qui a trois formats. Le premier format est le seul format réel de cette  opérateur. L'opérateur effectue une opération OU exclusive par bits de Rs et Rt et stocke le  résultat dans Rd. Le format et la signification de cet opérateur sont:
           format: xor Rd, Rs, Rt
           signification: Rd  Rs XOR Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100110

    • Le second format de l'opérateur xor est une pseudo-instruction. Dans ce cas la 3ème l'opérateur est une valeur immédiate16, et il ne s'agit donc que d'un raccourci pour la mise en œuvre de l'opérateur ori. Le format, la signification et la traduction des pseudo-opérateurs sont les suivants:
           format: xor Rt, Rs, immédiat16
           signification: Rt  Rs XOR Immediat16
           traduction: xori rt, rs, immédiat16

               Le raccourci avec un seul registre (pseudo-instruction) s'applique également à l'instruction xor.

            format: xor Rs, immédiat16
            signification: Rs  Rs XOR Immediat16
            traduction: xori Rs, Rs, immédiat16


    • xori. L’opérateur fait un OU Exclusif un à un de Rs et une valeur immédiate16, et stocke le résultat dans Rt. Le format et la signification de cet opérateur sont:
           format: xori Rt, Rs, Immediat16
           signification: Rt  Rs XOR Immediat16

    I :
    001110
    rs
    rt
    Immediat16

           
    Le raccourci avec un seul registre (pseudo-instruction) s'applique également à l'instruction xori.

           format: xori Rs, Immediat16
           Signification: Rs  Rs XOR Immediat16
           traduction: xori Rs, Rs, Immediat16

    • nor, opérateur Non_ou bit-à-bit registre avec registre. Un non_ou bit-à-bit est effectué entre les contenus des registres Rs et Rt Le résultat est placé dans le registre R.
          format: nor Rd, Rs, Rt
          Signification: Rd Rs Non_Ou Rt

    R :
    000000
    rs
    rt
    rd
    00000
    100111
    • not, Pseudo-opérateur fait une inversion (NON) des bits de Rs et stocke le registre de résultat Rt. Le format et la  signification de cet opérateur et la traduction des pseudo-opérateurs sont les suivants:
           format: not Rt, Rs
           Signification: Rs  NON (Rt)
           traduction: nor Rs, Rs, Rs


    • syscall, Appel à une fonction du système (en mode noyau). Un appel système est effectué, transférant immédiatement, et inconditionnellement le contrôle au gestionnaire d’exception.

    Note : par convention, le numéro de l’appel système, c.-à-d. le code de la fonction système à effectuer, est placé dans le registre $V0.
           format: syscall
           Signification: pc
    ß0x80000080

    R :
    000000
    00000
    00000
    00000
    00000
    001100
           

    6 Accès à la mémoire

    .  Les données statiques sont définies à l'aide de la directive .data assembler. Toute la mémoire allouée dans le programme dans un segment .data est une donnée statique. Le segment de données statique (ou simplement les données) de la mémoire est la partie de la mémoire commençant à l'adresse 0x10000000 et se poursuivant jusqu'à l'adresse 0x10040000. Les éléments de données définis entrent en existence au démarrage du programme et le restent jusqu'à son achèvement. Ainsi, bien que les valeurs de données puissent changer au cours de l'exécution du programme, la taille et l'adresse des données ne changent pas. Lorsque l'assembleur commence à s'exécuter, il garde trace de la prochaine adresse disponible dans le segment de données. Initialement, la valeur du prochain emplacement disponible dans le segment de données est définie sur 0x10010000.

    Exemple: 

           .data
    A:     .word 0x1234567
           .space 14
    B:    .word 0xFEDCBA98

       Un mot (.word) correspond à 4 octets. Par conséquent, l'étiquette A: pointe sur une allocation de 4 octets d'adresse 0x10010000 et allant jusqu'à 0x10010003. La prochaine adresse disponible dans le segment de données est mise à jour pour devenir 0x10010004. 
     La directive .space met de côté 14 octets, commençant à 0x10010004 et s'étendant à 0x10010011. Il n'y a pas d'étiquette (label) sur cette partie du segment de données, ce qui signifie que le programmeur doit y accéder directement via une adresse. Ceci est valide, mais n’est vraiment pas très utile, en particulier lorsque plusieurs directives .data sont utilisées, car il est difficile de garder la trace de l’adresse suivante. 
     Enfin, un autre mot  mémoire est alloué à l’étiquette B:. Cette mémoire aurait pu être placée à 0x10010012 (18)10, car il s'agit du prochain octet disponible. Cependant, spécifier que cet élément de données est un mot signifie qu'il doit être placé sur une limite de mot. Si l'adresse suivante disponible ne se trouve pas sur une limite de mot lorsqu'une allocation de mot est demandée, l'assembleur passe au mot suivante et l'espace entre les deux est simplement perdu pour le programme c.a.d il est placé à 0x10010014.
       Tous les accès mémoire dans MIPS sont effectués via une forme d’operteur "Load" ou "Store". Ces opérateurs incluent le chargement / stockage d'un: octet (lb, sb); demi-mot (lh, sh); mot (lw, sw); ou double mot (ld, sd). L'opérateur de lecture de constante (lui) ne fait pas d’accès mémoire. Dans cette section, seuls les entiers d'un octet seront considérés, donc seuls les opérateurs lb, lbu et sb seront présentés:
    • lui : opérateur de lecture d’une constante dans les poids forts. La constante immédiate(16bits) est décalée de 16 bits à gauche, et est complétée de zéro. La valeur ainsi obtenue est placée dans Rs.
           format: lui Rs, Imm      # Rs=BBBBBBBBBBBBBBBB0000000000000000    , B: bites (0 ou 1)
           Signification: Rs Imm 


    I :
    001111
    00000
    rt
    Immediat16


    • lb : opérateur de lecture d’un octet signé de la mémoire. 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.      
           format: lb Rt, Imm(Rs)    # Rt = SSSSSSSS SSSSSSSS SSSSSSSS BBBBBBBB  , S: signe, B: bit
           Signification: Rt  Mémoire [Imm + Rs]

    I :
    100000
    rs
    rt
    Immediat16

           
    Le deuxième format de lb est un pseudo-opérateur qui permet de stocker l'adresse d'une étiquette  (Label) dans Rs, puis l'opérateur réel lb est appelé pour charger la valeur.

            format: lb Rt, Label
            signification: Rt  Mémoire [Label]
            traduction: lui Rs, 0x10010000
                            lb Rt, offset (Rs) # offset est le déplacement de la valeur dans le segment de données
    • lbu : opérateur de lecture d’un octet non-signé de la mémoire. 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.
          format:  lbu Rt, Imm(Rs)  # Rt = 00000000 00000000 0000000 BBBBBBBB,   B: bit
          Signification: Rt  Mémoire [Imm + Rs]

    I :
    100100
    rs
    rt
    Immediat16

    • sb: opérateur d'écriture d’un octet en mémoire. 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.
           format:sb Rt, Imm(Rs)
           signification: Mémoire [Imm+Rs]  Rt

    I :
    101000
    rs
    rt
    Immediat16

           
    Le deuxième format de l'opérateur  sb est un pseudo-opérateur qui permet à l'adresse d'une étiquette (Label) d'être stockée dans Rs. L'opérateur sb réel est ensuite appelé pour stocker la valeur.

           format: sb Rs, Label
           signification: Mémoire [Label]  Rs
           traduction: lui Rs, 0x10010000
                          sb Rt, offset (Rs)  # offset est le déplacement de la valeur dans le segment de données

    Exemple 1: 

    # Illustrer l'opérateur d'addition add de format R
    li $t1, 100
    li $t2, 50
    add $t0, $t1, $t2
    # illustrer add avec un immédiat. Notez qu'une
    # operation add avec une pseudo-instruction
    # traduite dans une instruction addi
    addi $t0, $t0, 50
    add $t0, $t0, 50
    # En utilisant un nombre non signé. Notez que le
    # résultat n'est pas ce qui est attendu
    # pour les nombres négatifs.
    addiu $t0, $t2, -100
    # addition utilisant un  immédiat32. Notez que
    # 5647123 base 10 est 0x562b13
    addi $t1, $t2, 5647123


       Un détail important de cette capture d'écran est la représentation du programme dans deux colonnes. La première colonne est intitulée Source et cette colonne contient le programme exactement tel que vous l'avez entré. La deuxième colonne s'intitule Basic et contient le code source tel qu'il est fourni à l'assembleur. Il y a un certain nombre de changements entre le code source d'origine et le code de base. Tous les codes mnémoniques du registre ont été modifiés pour le code de base. Mais le plus gros changement est que toutes les instructions utilisant des pseudo-opérateurs ont été changées en instructions utilisant un ou plusieurs opérateurs réels.
        Par exemple, à la ligne 14, où on a add $t0, $t0, 50, l'opérateur add a été remplacé par l'opérateur addi, comme indiqué dans la section précédente. Il en va de même pour la ligne 22, où l'instruction addi $t1, $t2, 5647123 a été associée à une instructions lui, ori et add (instruction. au format R).
         Cette capture d'écran montre que certains opérateurs utilisés dans le chapitre précédent sont en réalité des pseudo-opérateurs. L'opérateur li était suspect car il ne disposait que de 2 paramètres d'adresse, une source et une destination, et il s'avère en réalité ne pas être un véritable opérateur. Il est souvent utile de regarder la colonne Basic dans le simulateur Mars pour voir comment votre source est réellement présentée par l’assembleur.

    Exemple 2:

    #################################
    # Calculer le résultat de 2 * x ^ 3+ 5 * x^2 + 4
    #################################
              .text
              .globl main
    main:
              addi $v0, $zero, 4   # Donner une valeur d'entrée
              la $a0, prompt
              syscall

              addi $v0, $zero, 5
              syscall

              move $s0, $v0
           
              mul $t0, $s0, $s0  # Calcule de 2*x*x*x+5*x+4 et le stocke dans $s1.
              mul $t0, $s0, $t0
              mul $t0, $t0, 2
              mul $t1, $s0, $s0
              mul $t1, $t1, 5
              add $t0, $t0, $t1
              addi $s1, $t0, 4

              addi $v0, $zero, 4 # Imprimer la chaîne de résultat
              la $a0, result
              syscall

              addi $v0, $zero, 1 # Imprimer le résultat
              move $a0, $s1
              syscall

              addi $v0, $zero, 10  # Fin du programme
              syscall
    #################################
              .data
    prompt: .asciiz "\nEntrer une valeur entière: "
    result:   .asciiz "\nLe résultat est: "


    Subscribe by Email

    Follow Updates Articles from This Blog via Email

    No Comments