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

Assembleur Discussion :

Problème sur exercice de manip de tableaux


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 10
    Points
    10
    Par défaut Problème sur exercice de manip de tableaux
    Bonjour,

    J'ai un devoir en assembleur que je dois faire. Ca porte sur la manipulation de tableau et des operations. j'ai reussi a faire quelque trucs avec l'aide de quelqu'un mais j'arrive pas a tout faire et je suis pas sûre si ce que j'ai fait est correct... Si vous pouviez m'aider ça serait sympa

    Je vous écris l'enoncé :

    QUESTIONS :

    1) Créer deux tableaux de 10 octets chacun : TAB le tableau à filtrer, TABR le tableau filtré. Initialiser TAB avec les valeurs suivantes : 0,5,7,4,3,9,15,20,50,30. Initlaiiser le tableau résultat TABR à la valeur nulle.

    2) Créer la structure de boucle la plus simple permettant le parcours du tableau de l'indice 0 à l'indice 8. Ecrire ensuite les instructions permettant d'accéder la valeur du tableau d'indice 9. On utilisera le registre BX pour pointer la memoire. Faire tab[BX] pour montrer l'accès à l'élément courant du tableau

    3) L'algo doit contenir :
    TABR[k]=(TAB[k]+TAB[k+1])/2 pour k allant de 0 a 8
    TABR[9]=TAB[9]

    3a) La somme de 2 octets non signés est-elle toujours un octet non signé ? par exemple donner la valeur en octet de la somme des 2 octets suivants : 250+255

    3b) Sur quel type de données intermédiaire travailler pour ne pas corrompre les resultats ?

    3c) En utilisant les registres AX (AH et Al) et BX (BH et BL), réaliser le calcul sans corrompre les données

    4) Donnez l'ensemble du programme.


    REPONSES

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TAB DB 0,5,7,4,3,9,15,20,50,30  
    NELT DB  10
    TABR DB 10DUP(10)

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                      MOV AX,NELT
                      DEC AX      ;on fait NELT-1 car on ve aller de lindice 0 a 8
                      MOV AX,CX
                      MOV BX,0
          boucle: MOV DX,TAB[BX]
                      INC BX    ; ;passer au prochaine element du tableau
                      LOOP boucle
    3)a) non cela tiendra sur 2 octets car on si on additionne 20 et 255 , ca ne tient plus sur un octet mais 2 octets

    3b)??

    3c) et 4)
    JE NE CROIS PAS QUE LE PROGRAMME SOIT CORRECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                      MOV AX,NELT
                      DEC AX   ;on fait NELT-1 car on ve aller de lindice 0 a 8
                      MOV AX,CX
                      MOV BX,0
        boucle :   MOV DX,TAB[BX]
                      MOV AX,TABR[BX]
                      ADD AX,TABR[BX+1]  ;addition element suivant et courant
                      MOV RESULTAT,AX  
                      SHR AX             ; division par 2 m              
                      MOV TABR[BX],AX    ;afin de restituer les valeur calculé dans le nouveau tableau TABR
                      INC BX          ;passer au prochaine element du tableau
                      LOOP boucle
    y a de la lecture!

    merci de votre aide :o

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    j'oublié, j'ai des probléme d'overflow car je mets nelt dans AX alors que nelt est plu grand que AX... et a d'autre endroits aussi.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Dans le point 2, pour la boucle de parcours du tableau, c'est CX qui doit être le compteur de la boucle donc il faut remplacer
    par
    Point 3a : je pense que la question est d'écrire le résultat sur 1 octet de la somme 250 (FAh) + 255 (FFh), c'est-à-dire 249 (F9h).

    Points 3b et 3c : pour éviter tout dépassement de capacité, il faut travailler sur des mots (en étendant le bit de signe de chaque octet à l'aide de l'instruction CBW - Convert Byte to Word).

    Point 4 : il y a déjà le problème soulevé au point 1 (compteur de boucle). Ensuite, il faut traiter chaque octet donc remplacer
    par
    puis étendre cet octet sur un mot (cf points 3b et 3c).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Merci pour tes reponses rapide!

    tu as dis:
    Point 3a : je pense que la question est d'écrire le résultat sur 1 octet de la somme 250 (FAh) + 255 (FFh), c'est-à-dire 249 (F9h).

    le resultat de 250 H et 255 H fait 249 H ; donc cela devrait tenir sur un octet ?
    mais je trouve etonnant que 250 +255 fasse 249...

    tu peux m'expliquer comment marche le "Convert Byte to Word" stp

    j'ai remplacé AX par AL.. et j'ai enlevé la ligne avec resultat...

    ce qui donne:

    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
    TAB DB 0,5,7,4,3,9,15,20,50,30  
    NELT DB  10
    TABR DB 10DUP(0)
     
                      MOV AX,NELT
                      DEC AX
                      MOV CX,AX
                      MOV BX,0
        boucle :  MOV DX,TAB[BX]
                      MOV AL,TABR[BX]
                      ADD AL,TABR[BX+1]  ;addition
                      SHR AL             ; division par 2              
                      MOV TABR[BX],AL
                      INC BX
                      LOOP boucle

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jurio2005
    tu as dis:
    Point 3a : je pense que la question est d'écrire le résultat sur 1 octet de la somme 250 (FAh) + 255 (FFh), c'est-à-dire 249 (F9h).

    le resultat de 250 H et 255 H fait 249 H ; donc cela devrait tenir sur un octet ?
    mais je trouve etonnant que 250 +255 fasse 249...
    C'est là toute la problématique du dépassement de capacité : une expérience intéressante est de faire l'addition à la main, en binaire ou en hexadécimal. Le positionnement des flags est primordial pour interpréter un résultat et détecter un dépassement de capacité.

    Citation Envoyé par jurio2005
    tu peux m'expliquer comment marche le "Convert Byte to Word" stp
    CBW est une instruction qui n'a pas d'opérande : elle reproduit le bit de signe du registre AL pour convertir son contenu en mot dans le registre AX.
    Par exemple, si AL contient : 1011 0011
    Après CBW, AX contiendra : 1111 1111 1011 0011
    N.B. Il existe également l'instruction CWD, qui fait la même chose depuis un mot vers un double-mot.

    Voici comment je modifierais la boucle pour éviter tout dépassement de capacité :
    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
                      MOV AX,NELT 
                      DEC AX             ; On fait NELT-1 car on ve aller de lindice 0 a 8 
                      MOV CX,AX
                      MOV BX,0 
        boucle :      MOV AL,TAB[BX] 
                      CBW                
                      MOV DX,AX          ; DX contient TAB[k] sur 1 mot
                      MOV AL,TAB[BX+1] 
                      CBW                ; AX contient TAB[k+1] sur 1 mot
                      ADD AX,DX          ; AX contient la somme
                      SHR AX             ; Division par 2
                      MOV TABR[BX],AL    ; Ecriture du résultat
                      INC BX             ; Passer au prochain element du tableau 
                      LOOP boucle
                      ; TABR[9]=TAB[9]
                      MOV AL,TAB[9]
                      MOV TABR[9],AL
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    ok merci pour tes informations et ton aide,
    je commence à comprendre comment marche le depassement.
    lorsqu'on a 1011 0011
    Après CBW, AX contiendra : 1111 1111 1011 0011
    cela mets une serie de 1 dans AX , cela n'est pas un probléme?

    mais j'ai encore un probleme , ca me mets une erreur dans:
    MOV AX,NELT 16 bits register and 8 bits effective adress

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jurio2005
    lorsqu'on a 1011 0011
    Après CBW, AX contiendra : 1111 1111 1011 0011
    cela mets une serie de 1 dans AX , cela n'est pas un probléme?
    C'est le but du jeu : étendre le bit de signe

    Citation Envoyé par jurio2005
    mais j'ai encore un probleme , ca me mets une erreur dans:
    MOV AX,NELT 16 bits register and 8 bits effective adress
    Ah oui, ça m'avait échappé
    NELT est déclaré avec DB (8 bits) et AX est un registre 16bits. Donc, soit il faut déclarer NELT avec DW soit il faut faire
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    d'accord,
    si je modifie et je mets:
    MOV AL,NELT
    je devrai aussi changer le DEC et mettre DEC,AL
    mais et ce que je laisse : MOV CX,AX ? parce que on a modifié le AL
    je laisse DB par rapport a l'enoncé.
    merci

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jurio2005
    mais et ce que je laisse : MOV CX,AX ? parce que on a modifié le AL
    Il faut mettre AH à 0 avant
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

Discussions similaires

  1. Problèmes sur les exercices de Bts
    Par Steve74 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/11/2014, 20h42
  2. Réponses: 4
    Dernier message: 05/03/2008, 09h49
  3. [Tableaux] Problème sur le parcours d'un tableau
    Par gregal dans le forum Langage
    Réponses: 2
    Dernier message: 02/04/2007, 12h22
  4. [Tableaux] Problème sur ouverture fichier txt
    Par yaum4444 dans le forum Langage
    Réponses: 7
    Dernier message: 15/12/2006, 15h10

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