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

x86 16-bits Assembleur Discussion :

Inversion de tableau


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Inversion de tableau
    Salut aux utilisateurs du site developpez.net :

    je suis encore débutant en assembleur 8086, je voudrais avoir quelque astuces de base si c'est possible :

    À chaque fois que j'écris un programme, je trouve de nouvelles choses ; récemment, je viens d'écrire un programme que je n ai pas pu compiler. Le programme est le suivant :

    J'ai défini un tableau d'entiers ; le but de l'exercice est d'inverser le tableau avec le même tableau, puis l'afficher sur le cmd du compiler. Voilà le code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    dim equ 5
    .model small
    .stack
    .data
    vett dw 4,689,5766,7,9
    .code
    .startup
    mov cx,dim/2
    mov di,(dim-1)*2
    mov si,0
    start: mov ax,vett[di]
           mov bx,ax
           mov ax,vett[si]
           mov vett[si],bx 
           dec cx
           inc di
           cmp cx,0
           jnz start
           mov cx,dim*2
     
    love:       MOV Ax,vett[di] 
                mov dx, 0           ;CX = VALUE THAT I WANT TO CONVERT
                MOV Bx,10           
    ASC2:
                DIV BX              ;DIV AX/10
                ADD DX,48           ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER 
                PUSH ax             ;SAVE AX
                MOV AH,2            ;PRINT REMAINDER STORED IN DX
                INT 21H             ;INTERRUP
                POP Ax              ;POP AX BACK
                CMP Ax,0            
                JMP ASC2            ;ELSE REPEAT 
                inc di
                dec cx
                cmp cx,0
                jnz love          
     
    .exit
    J'aimerais savoir les erreurs que j'ai commises.
    Merci d'avance

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Etant dans l'impossibilité de me servir de ma boule de cristal, je te demandrais de bien vouloir fournir les messages d'erreurs que te donnent ton assembleur .
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    merci supersnail pour ta reponse , le probleme est que le compilateur n affiche aucune erreur :
    Nom : Screenshot (4).png
Affichages : 3480
Taille : 76,0 Ko

    pour le resultat , le cmd n affiche qu un zero :
    Nom : Screenshot (5).png
Affichages : 3008
Taille : 79,5 Ko

    le but du programme est d invertir un tableaux d entier et l afficher , le compilateur doit afficher l inverse du vercteur qui le suivant : 9 7 5766 689 4
    merci d avancepour la prochaine reponse

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Bizarre que ton émulateur ne couine pas, "dim" est défini nulle part

    Ensuite ton code ne ressemble à pas grand-chose en l'état, je te recommanderais de créer une procédure pour afficher un nombre plutôt que tout mélanger Sinon j'espère aussi que ton émulateur a un mode "pas à pas" te permettant de suivre le déroulement de ton programme instruction par instruction (très utile pour déboguer un programme )
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  5. #5
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonsoir,

    Si si , "dim" est bien défini tout au début et vaut 5 (le nombre d'éléments du tableau donc)

    Par contre, je ne comprends pas bien ce que tu souhaite faire avec ton tableau
    le but de l exercice est d inverser le tableaux avec le même tableaux ,puis le faire afficher sur le cmd
    Inverser le tableau, avec le tableau ?

    Pourrais-tu indiquer ce que tu attends avec ton exemple (4,689,5766,7,9) ?

    Tu veux inverser les valeurs ? : -4 -689 -5766 -7 -9 ?
    ou inverser le sens ? : 9 7 5766 689 4 ?

    Tu veux que l'inversion porte :
    - sur les valeurs en mémoire : inverser les valeurs en mémoire et les afficher ensuite
    - juste sur l'affichage : afficher directement les valeurs inversées calculées à partir du tableau en mémoire sans toucher à ce dernier

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    merci fothman et supersnail pour vos réponse, j ai un tableau de 5 case dans chaqu une il y a un numero entier : par exemple 45 , 56,67,89,34
    le but de lexercice est d inverser le tableaux dans le meme tableaux donc il devient comme suit : 34,89,67,56,45 , enfin de compte l afficher sur le cmd
    j ai écris le programme dans un language que je maîtrise le c si vous savez le lire voila le code :
    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
    20
    21
    22
    23
    24
    25
    26
    #include <stdio.h>
    #include <stdlib.h>
    #define N 7
    int main()
    {  int vett[N];
       int i ,a;
        printf("entrez 7 numeros ");
        for(i=0;i<N;i++){
            scanf("%d",&vett[i]);
        }
        printf("la sequence initial que j ai ecris :");
         for(i=0;i<N;i++){
        printf("%d\t",vett[i]);
       }
        for(i=0;i<N/2;i++){
            a=vett[i];
            vett[i]=vett[N-i-1];
                   vett[N-i-1]=a;
        }
        printf("\n");
        printf("la sequence inverse : ");
       for(i=0;i<N;i++){
        printf("%d\t",vett[i]);
       }
        return 0;
    }
    voila le résultat que je voudrais avoir en assembleur sauf que celui la est en c:
    Nom : Screenshot (7).png
Affichages : 2994
Taille : 115,7 Ko

    j ai essayer de le traduire en assembleur , ça n a pas donner de résultat sauf que dans le programme en c , c est moi qui entre les numéros qui vont être inverser , merci pour vos prochaines réponse.

  7. #7
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonsoir,

    alors déjà, il faudrait que ta fonction qui affiche un nombre fonctionne correctement
    Tu as fait un copier/coller de ce qu'on avait vu dans ton précédent post ("problème de 8086" je crois),
    mais comme je te l'avais indiqué, les valeurs sont affichées dans le mauvais sens.
    Par exemple, la valeur 1234 va s'afficher en 4321
    Pour afficher une valeur dans le "bon sens", il faut utiliser une chaîne de caractères dont la longueur sera suffisante
    pour l'affichage du nombre.
    En 16 bits, la valeur maximale non signée = 65535 donc il te faudra un chaîne de 5 caractères.

    Avant le traitement du nombre, il faudra veiller à effacer le contenu par des codes ASCII 32 (code de l'espace)
    Et au lieu d'afficher le code ascii, il faudra stocker ce dernier dans la chaîne de caractère en commençant par le chiffre le plus à droite
    à la fin du traitement du nombre, il suffira d'afficher la chaîne grâce à la fonction 9h de l'int 21h du DOS

    Quand l'affichage des nombres fonctionnera correctement, le reste (inverser ton tableau) sera du gâteau

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    je vous remercie forthman pour votre réponse , désole je n ai pas bien compris ce que vous m avez dit ,est ce que vous pouvez récapituler avec plus de détails , pour ce qui est de l affichage , je viens de constater ce que vous avez dit que la séquences s afficher a l envers j aimerais bien savoir comment l afficher correctement

  9. #9
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Chaine db 32,32,32,32,32,"$" ; initialise la chaîne avec des codes espaces et un "$" car DOS sait afficher ce type de chaînes

    AX=valeur à afficher
    DI = adresse de Valeur_chaine+5 , pour pointer à la fin de la chaine (sur "$" en fait)

    boucle1:
    DI=DI-1
    diviser AX par 10 --> DX=reste de la division
    ajouter 48 à DL ( reste + code ASCII "0" )
    placer DL ça à l'adresse pointée par DI
    tester si AX<>0 alors saut à boucle1

    Afficher la chaîne ASCII présente en DS: DI grace à la fonction 09h de l'interruption 21h du DOS
    Pour t'aider plus, il faudrait que j'écrive le code à ta place

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    après avoir vu tes dernières réponses sur la question que j ai pose , le faite que je n ai pas afficher le bon numéro (affichage a l envers),je me suis inspire de ce que tu m as dit et j ai vu plus ce que ça veut dire le push et le pop et quelques exemples de ces dernières instructions , j ai essaye d écrire le programme de l affichage , voila le code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    .model small
    .stack
    .data
    a dw 345
    .code
    .startup
    mov ax,a
    mov si,0 
    	mov cl,10
    boucle1:
    	div cl 
    	mov dl,ah
    	add dl,48 
    	inc si 
    	push dx 
    	cmp al,0 
    	je boucle2
    	mov ah,0
    	jmp boucle1
    boucle2:
    	cmp si,0
    	je exit
    	pop dx
    	mov ah,2
    	int 21h
    	dec si
    	jmp boucle2
    exit:	
    	ret
    .exit
    end
    puisque tu m as dit qu il faut que je resolve le problème d affichage d un numero j ai écris le programme en premier , je vais essaye de lui coller le programme du tableaux .
    merci beaucoup tes réponses était très utiles forthman

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    voila j ai ajoute aux code précédent le code de l inversion et j ai tous afficher , sauf qu a la fin il y a de nouveau 3 zeros , je ne sais pas ce qu il signifie , voila le code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    dim equ 5
    .model small
    .stack
    .data
    vett dw 45 , 36 , 567 , 685, 34
    .code
    .startup  
    mov si,0
    mov cx,dim*2
    invert1: 
            push vett[si]
            inc si
            dec cx
            cmp cx,0
            jne invert1
            mov si,0
            mov cx,dim*2   
    invert2:
            pop vett[si]
            dec cx
            inc si
            cmp cx,0
            jne nouveletape        
    nouveletape:
           mov cx,dim*2
           mov di,0
    print: 
           mov ax,vett[di]
           mov si,0 
    	   mov cl,10
    boucle1:
    	   div cl 
    	   mov dl,ah
    	   add dl,48 
    	   inc si 
    	   push dx 
    	   cmp al,0 
    	   je boucle2
    	   mov ah,0
    	   jmp boucle1
    boucle2:
    	   cmp si,0
    	   je exit
    	   pop dx
    	   mov ah,2
    	   int 21h
    	   dec si    
     
    	   jmp boucle2
    exit:	
    	   dec cx        
    	   add di,2 
    	   mov dl,","
    	   mov ah,2
    	   int 21h
    	   cmp cx,0
    	   jnz print
     
     
    .exit
    end
    Nom : Screenshot (9).png
Affichages : 2521
Taille : 76,3 Ko

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    • sur la dernière capture d'écran que tu postes il y a écrit "divide error", on peut donc supposer que l'erreur survient lors d'un div
    • le programme prend les nombres dans le tableau vett, quand est-ce qu'il est censé s'arrêter, c'est programmé où ?
    • commenter ton code le rendrait plus facile à lire

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    salut buffer bob,merci pour ta réponse , j ai essaye de corriger l erreur de division , je ne sais pas d ou elle survient j aimerais tant le savoir, je ne crois pas que soit le problème,ça doit être autre chose , la procédure que j ai faite est de prendre une valeur du tableau la diviser par 10,le résultat de la division, le reste est stocke dans ah, mettre ah en dl, y ajouter 48, la mettre dans la pile , une procédure que j ai déjà teste sans le tableaux sur un seul numéro e ça a fonctionne .

  14. #14
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par belykia Voir le message
    j ai essaye de corriger l erreur de division , je ne sais pas d ou elle survient j aimerais tant le savoir
    parce que tu ne maîtrises pas ton code, mettre des commentaires efficaces ça peut aider souvent à s'y retrouver

    la procédure que j ai faite est de prendre une valeur du tableau la diviser par 10,le résultat de la division, le reste est stocke dans ah, mettre ah en dl, y ajouter 48, la mettre dans la pile , une procédure que j ai déjà teste sans le tableaux sur un seul numéro e ça a fonctionne .
    ça ne veut rien dire, ça c'est une procédure pour afficher 1 chiffre contenu dans 1 octets, là tu as 5 nombres contenus chacun dans 2 octets, on devrait donc obligatoirement voir dans ton code une boucle de 1 à 5 qui pop des word, et pour chaque nombre pop-é, tu réalises son affichage avec ta procédure (un peu modifiée du coup)

    ps: tu utilises quoi comme émulateur, c'est quoi comme logiciel ?
    trouvé, emu8086 mais il me marque automation error / reinstall, bref tant pis.

  15. #15
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Comme l'a écrit BufferBob, il faudrait que tu commentes ton code, car là il y a trop d'incohérences.
    Tu n'utilises pas de chaîne, et place le contenu à l'adresse de SI qui vaut visiblement 0
    (il ne faut pas placer des valeurs au hazard, ça a toutes les chances de planter)
    Commente chaque ligne, au moins ça nous permettra de voir comment tu penses que ton programme fonctionne,
    et on pourra te corriger

Discussions similaires

  1. Inverser un tableau (ou table)
    Par jlfprofoto dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 15/02/2014, 15h06
  2. Réponses: 3
    Dernier message: 08/08/2007, 09h47
  3. [Débutant] Inverser un tableau
    Par Zhitoune dans le forum Delphi
    Réponses: 9
    Dernier message: 22/06/2007, 10h56
  4. Algorythmie: inverser un tableau c++
    Par corseb-delete dans le forum C++
    Réponses: 12
    Dernier message: 12/12/2006, 02h28
  5. Inversion de tableau
    Par Florian.L dans le forum Ada
    Réponses: 1
    Dernier message: 21/11/2006, 10h03

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