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 32-bits / 64-bits Assembleur Discussion :

Remplir un tableau


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Remplir un tableau
    Bonjour, je veux remplir un tableau en utilisant MASM32
    quand j'ai essayé ce code il entre en boucle infini et il m'affiche le msg "entrez un entier" 3 fois pour chaque itération , j'ai pas compris ou l'erreur
    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
    .586
    .model flat,stdcall
    option casemap:none
    include windows.inc 
    include kernel32.inc 
    include user32.inc 
    includelib kernel32.lib 
    includelib user32.lib 
    include masm32.inc
    includelib masm32.lib
    .data
    msg db "entrez un entier",0Dh,0Ah,0
    .data?
    tab dd 5 dup(?)
    en db ?
    .code
    start:
    xor esi,esi
    lea esi,tab
    xor ecx,ecx
    mov cl,5
    boucle: 
    	invoke StdOut,addr msg
    	invoke StdIn,addr en,1
    	invoke atodw,addr en 
    	mov [esi],eax
    	add esi,2
    	loop boucle
     
    end start

  2. #2
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    je ne connais pas les fonctions que tu utilise avec invoke mais il est possible que cela modifie le registre ecx et empêche donc la boucle par loop de fonctionner correctement

    essaye comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        boucle: 
    push ecx
    	invoke StdOut,addr msg
    	invoke StdIn,addr en,1
    	invoke atodw,addr en 
    pop ecx
    	mov [esi],eax
    	add esi,4
    	loop boucle

    en plus sur cette partie du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov [esi],eax
    add esi,2
    eax est un registre qui tient sur 4 octet, donc il faut incrémenter esi de 4 car avec 2 tu vas écraser les bit de poids fort que tu avait écrit le cycle précédent, donc il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov [esi],eax
    add esi,4
    si par contre ton but est de faire un tableau d'élément sur 16bits, ça fonctionne parfaitement mais ça vas déborder du tableau de 2 octet, donc il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov [esi],ax
    add esi,2
    pour ne pas consommer 2 octet de trop en mémoire (ax=16bit de poid faible de eax)

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 106
    Points
    43 106
    Par défaut
    Tu peux aussi utiliser l'opcode :

    qui fera la même choseque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov eax,[esi]
    add esi,4
    pour du 16 bits, tu pourras faire :
    équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov ax,[esi]
    add esi,2
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    J'ai essayé de faire push ecx et pop ecx mais le problème reste encore

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 106
    Points
    43 106
    Par défaut
    où mets tu ton push et ton pop ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    quand j'ai entrée au boucle j'ai ajouté push et puis aprés la lecture d'une case je fais pop

  7. #7
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    quelqu'un aurait la doc pour les fonction suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    invoke StdOut,addr msg
    	invoke StdIn,addr en,1
    	invoke atodw,addr en
    j'arrive pas comprendre (n'étant pas un utilisateur de MASM32 et de ses biblihothèque de fonction)

  8. #8
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    Les 3 procédures atodw, StdOut, StdIn font partie de la librairie MASM32

    A - Extraits de MASM32 Library Reference ( fichier Masmlib.hlp situé dans le dossier Help )

    1) atodw

    atodw proc String : PTR BYTE

    Note that the parameter String is an address of DWORD size.

    Description :
    atodw converts a decimal string to dword.

    Parameter :
    1. String : The address of the decimal string to convert

    Return Value : The DWORD value is returned in eax.
    2) StdOut

    StdOut proc lpszText : DWORD

    Description :
    StdOut will display a zero terminated string at the current position in the console.

    Parameter :
    1. lpszText : A zero terminates string.

    Return Value : There is no return value.

    Comments :
    There is no effective length limit on the string displayed.
    The position of the displayed text on the console can be set with the locate function.
    3) StdIn

    StdIn proc lpszBuffer : DWORD, bLen : DWORD

    Description :
    StdIn receives text input from the console and places it in the buffer required as a parameter.
    The function terminates when Enter is pressed.

    Parameters :
    1. lpszBuffer : The buffer to receive the text input from the console.
    2. bLen : The length of the buffer.

    Return Value : There is no return value.

    Comments :
    The console determines the length of the maximum buffer size.
    128 bytes should handle most console input needs.
    The position of the input on the console can be set with the locate function.
    B - Code de ces 3 procédures ( fichiers *.asm situés dans le dossier M32lib )

    1) atodw

    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
    atodw proc String:DWORD
     
        push esi
        push edi
     
        xor eax, eax
        mov esi, [String]
        xor ecx, ecx
        xor edx, edx
        mov al, [esi]
        inc esi
        cmp al, 2D
        jne proceed
        mov al, byte ptr [esi]
        not edx
        inc esi
        jmp proceed
     
      @@: 
        sub al, 30h
        lea ecx, dword ptr [ecx+4*ecx]
        lea ecx, dword ptr [eax+2*ecx]
        mov al, byte ptr [esi]
        inc esi
     
      proceed:
        or al, al
        jne @B
        lea eax, dword ptr [edx+ecx]
        xor eax, edx
     
        pop edi
        pop esi
     
        ret
     
    atodw endp
    2) StdOut

    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
    StdOut proc lpszText:DWORD
     
        LOCAL hOutPut  :DWORD
        LOCAL bWritten :DWORD
        LOCAL sl       :DWORD
     
        invoke GetStdHandle,STD_OUTPUT_HANDLE
        mov hOutPut, eax
     
        invoke StrLen,lpszText
        mov sl, eax
     
        invoke WriteFile,hOutPut,lpszText,sl,ADDR bWritten,NULL
     
        mov eax, bWritten
        ret
     
    StdOut endp
    3) StdIn

    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
    StdIn proc lpszBuffer:DWORD, bLen:DWORD
     
        LOCAL hInput :DWORD
        LOCAL bRead  :DWORD
     
        invoke GetStdHandle,STD_INPUT_HANDLE
        mov hInput, eax
     
        invoke SetConsoleMode,hInput,ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT or ENABLE_PROCESSED_INPUT
     
        invoke ReadFile,hInput,lpszBuffer,bLen,ADDR bRead,NULL
     
        mov eax, bRead
     
        ret
     
    StdIn endp
    C - Commentaires

    atodw est une procédure standalone de Masm32.
    StdOut utilise GetStdHandle, StrLen, WriteFile.
    StdIn utilise GetStdHandle, SetConsoleMode, ReadFile.

    GetStdHandle, WriteFile, SetConsoleMode, ReadFile sont des procédures de l'API Win32 ( Kernel32.dll).

    StrLen est une procédure standalone de Masm32.
    Elle retourne la longueur de la chaine à 0 terminal dont l'adresse est passée en paramètre.
    Elle modifie eax, ecx, edx mais elle conserve ebx.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/12/2005, 16h39
  2. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43
  3. Remplir un tableau associatif
    Par photorelief dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2005, 18h20
  4. Lire et remplir un tableau
    Par harris_macken dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 26/09/2005, 01h10
  5. [PHP-JS] Remplir un tableau javascript selon un tableau php
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2005, 14h02

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