IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[MIPS] Copie d'une suite de mots


Sujet :

Autres architectures Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [MIPS] Copie d'une suite de mots
    Bonjour,

    j'ai un devoir à rendre en langage assembleur mais je ne comprends pas vraiment tout ça. J'ai fait des recherches par-ci par-la et je suis arrivé à un programme qui me semble bien - mais il ne marche pas. Pourriez-vous me dire mes erreurs (ce que je cherche à faire ne correspond pas à ce que j'écris) et/ou des pistes svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    .data
    .word
    source: 1 2 3 4 0 6 7
    destination : 0 1 1 1 1 1 1
     
    .text
    la $a0 source ; (Je mets l'adresse de source dans $a0)
    la $a1 destination ; (Je mets l'adresse de destination dans $a1)
    la $vo 0 ; (Je déclare un compteur à 0)
     
    loop: ; (Je fais une boucle)
    lw $a1 ($a0) ; (Je copie le contenu de $a0 dans $a1)
    addi $v0 $v0 1 ; (J'augmente $v0 de 1 : $v0 = $v0 + 1)
    addi $a0 $a0 4 ; (J'augmente $a0 de 4 ce qui correspond à un mot)
    addi $a1 $a1 4 ; (J'augmente $a1 de 4 ce qui correspond à un mot)
    if: bne $a0 0 loop ; (Je vérifie que $a0 est différent de 0 et sinon je retourne à loop)
    end: ; (Si $a0 vaut 0 il ne va pas à loop et je fini mon loop)
    Je veux donc me retrouver avec :
    destination : 1 2 3 4 1 1 1
    source : 1 2 3 4 0 6 7
    $v0 : 4

    Merci d'avance

    Edit : Désolé, j'avais interverti destination et source... ils sont maintenant conformes à ce que je veux obtenir.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Ma question est comment veut tu que $a0 est égal a zéro si tu incrément l'adresse ?
    Par logique il faudrait faire une comparaison avec v0 et stopper la boucle quand est égal a 7

    L'autre point la ne veut pas dire load adresse ? pas sur que cela marche bien pour v0

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai pas compris, tu dis que j'incrémente l'adresse de $a0 à la ligne 12 ? Si oui, c'est précisément ce que je cherche à faire.
    En fait, je veux copier les "mots" de la destination dans la source tant que le "mot" est différent de 0. Du coup, avec cette source, il le ferai 4 fois.

    Et du coup, comment incrémenter une variable si la ne marche pas ?

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Tu écris :
    Mais cette condition n'est jamais vraie.

    Il faudrait faire la comparaison avec v0.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ah ok, je croyais que bne comparait les contenus. Mais du coup non, si je compare avec v0 ce sera pas vrai puisque je l'incrémente de 1 à chaque fois. Le but de v0 c'est de compter le nombre de mots que j'ai copié.

    Alternative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    .data
    .word
    source: 1 2 3 4 0 6 7
    destination : 0 1 1 1 1 1 1
     
    .text
    la $a0 source  ; (Je mets l'adresse de source dans $a0)
    la $a1 destination  ; (Je mets l'adresse de destination dans $a1)
    la $vo 0  ; (Je déclare un compteur à 0)
    la $v1 0  ; (Je déclare une variable à 0)
     
    loop:  ; (Je fais une boucle)
    lw $a1  ; ($a0) (Je copie le contenu de $a0 dans $a1)
    addi $v0 $v0 1  ; (J'augmente $v0 de 1 : $v0 = $v0 + 1)
    addi $a0 $a0 4  ; (J'augmente $a0 de 4 ce qui correspond à un mot)
    addi $a1 $a1 4  ; (J'augmente $a1 de 4 ce qui correspond à un mot)
    if: bne $a0 $v1 loop  ; (Je vérifie que $a0 est différent de 0 et sinon je retourne à loop)
    end:  ; (Si $a0 vaut 0 il ne va pas à loop et je fini mon loop)
    Edit : J'ai oublié de prendre en compte le fait que j'utilise 'la' pour mes variables $v0 et $v1. J'ai vu que 'db' serait plus approprié mais je n'ai pas compris la syntaxe. J'ai vu quelqu'un écrire Vil db 12H (il dit déclarer une variable Vil qu'il défini à 12)
    Et j'ai vu quelqu'un d'autre l'écrire db $v0 0 (il dit déclarer une variable $v0 à 0)
    Mais aucun des deux ne marche lorsque je l'essaye, du coup je ne suis pas sûr de la syntaxe.

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if: bne $a0 $v1 loop ; (Je vérifie que $a0 est différent de 0 et sinon je retourne à loop)
    Ceci est toujours faux : tu compares une adresse et un registre.

    Ma première remarque ne demandait pas forcément de remplacer a0 par v0 mais de le faire comme une boucle for.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    .data
    .word
    source: 1 2 3 4 0 6 7 8
    destination: 0 1 1 1 1 1 1 1
     
    .text
    la $a0 source # ; (Je mets l'adresse de source dans $a0)
    la $a1 destination # ; (Je mets l'adresse de destination dans $a1)
     
    loop: # ; (Je fais une boucle)
    lw $t0 ($a0) # ; (Je copie le contenu de $a0 dans $t0)
    sw $t0 ($a1) # ;  Je sauvegarde le contenu de $t0 dans $a1
    addi $a0 $a0 4 # ; (J'augmente $a0 de 4 ce qui correspond à un mot)
    addi $a1 $a1 4 # ; (J'augmente $a0 de 4)
    addi $v0 $v0 1 # ; (J'augmente mon compteur de 1)
    lw $t0 ($a0) # ; (Je copie le contenu de $a0 dans $t0)
    bne $t0 $zero loop  ; (Si $t0 est différent de 0, saute à loop)
    end:
    J'ai compris, t'as raison du coup j'ai utilisé $zero.
    De plus, j'ai modifié la façon de copier, je passe par $t0 en utilisant lw et sw.
    Et là ça marche, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/10/2013, 22h57
  2. Fonction qui renvoie les premières lettres d'une suite de mots
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 16
    Dernier message: 30/06/2010, 13h58
  3. Recherche de mot précis dans une suite de mot
    Par Adrien38240 dans le forum C
    Réponses: 4
    Dernier message: 02/06/2008, 11h25
  4. Réponses: 4
    Dernier message: 27/11/2006, 14h51
  5. Réponses: 1
    Dernier message: 17/10/2006, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo