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 :

Insertion d'un noeud dans une liste chaînée


Sujet :

Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    février 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Insertion d'un noeud dans une liste chaînée
    Bonjour,
    voila je cherche à créer une liste chaînée et insérer des éléments dans cette liste, pour cela j'ai utilisé "DATA segment" pour enregistrer les éléments de la liste. Le problème c'est que je dois faire des tests sur l'occupation de la zone mémoire avant chaque nouvelle insertion.
    mes questions :
    1- comment faire ces tests ?
    2- est ce qu'il n'y a pas d'autre méthode de création plus simple?
    3- est ce qu'il y a une documentation sur les listes chaînées en assembleur

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2002
    Messages : 96
    Points : 116
    Points
    116
    Par défaut
    Le problème c'est que je dois faire des tests sur l'occupation de la zone mémoire avant chaque nouvelle insertion.
    Pas besoin de faire ces tests... Utilise malloc ou une fonction du meme type.

    Mais sinon, c'est pareil que les listes chaînées en C

    Responsable du projet SKAN (OS à but didactique)
    Contactez moi pour toutes questions ou remarques sur le projet.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    février 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : février 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par 2PluS4
    Le problème c'est que je dois faire des tests sur l'occupation de la zone mémoire avant chaque nouvelle insertion.
    Pas besoin de faire ces tests... Utilise malloc ou une fonction du meme type.

    Mais sinon, c'est pareil que les listes chaînées en C

    en assembleur je ne pense pas qu il y ait une fonction définit comme malloc en C

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 041
    Points : 1 920
    Points
    1 920
    Par défaut
    Bonjour,

    n'étant pas très sûr de la définition de la liste chaînée j'ai regardé sur ce site


    Définition de la liste chaînée


    Ouch ! autant dire qu'en asm cela relève du casse tête.
    En Asm à part les tableaux où les éléments se suivent sans lien où rapport direct, on peut difficilement ordonner corectement ses données surtout si elle doivent avoir un lien, comme cela est démontré sur l'exemple du site ci-dessus. Tout au plus peut on utiliser les structures, je pense.

    Qu'entendez vous par test de mémoires ? S'agit t'il de chercher à savoir si un emplacement mémoire est occupé ou non ?

    Je n'ai rien trouvé d'intéressant avec google sur "chained list" et asm ou assembly ...

  5. #5
    Nouveau membre du Club
    Inscrit en
    juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    ça n'a rien de compliquer, il suffit d'adapter en conséquence.

    déjà si tu veux utiliser une liste chainée, oublie de suite le data segment. les listes chaînées, par définition, n'ont pas de nombres finis de maillons. il faut donc passer par de l'allocation mémoire.

    la première chose à faire est de déclarer ta structure de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Objet STRUCT
      Poids dd 0
      Volume dd 0
    Objet ENDS
    puis ta structure 'maillon' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaillonObjet STRUCT
      Donnee Objet <0, 0>
      PtrSuivant dd NULL
    MaillonObjet ENDS
    ou tu peux également choisir de faire ça en une structure pour faire plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaillonObjet STRUCT
      Poids dd 0
      Volume dd 0
      PtrSuivant dd NULL
    MaillonObjet ENDS
    ensuite il faut déclarer le dword qui servira d'attache à notre liste chaînée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .data
      PtrRacineListe dd NULL
    voilà après faut juste savoir comment allouer un bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      invoke GlobalAlloc, GPTR, SIZEOF MaillonObjet
    eax reçoit le pointeur vers la zone mémoire allouée (si = 0 alors l'allocation a échoué)

    la libération du bloc se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      invoke GlobalFree, PtrBloc
    PtrBloc étant le pointeur vers la zone mémoire à libérer (ce que renvoit le GlobalAlloc).

    pour finir un petit exemple d'ajout d'un maillon à la liste chaînée :
    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
    AjouterObjet PROC Poids:DWORD, Volume:DWORD
      invoke GlobalAlloc, GPTR, SIZEOF MaillonObjet
      .IF eax
        assume eax : ptr MaillonObjet
        push Poids
        pop dword ptr [eax].Donnee.Poids
        push Volume
        pop dword ptr [eax].Donnee.Volume
        push PtrRacineListe
        pop dword ptr [eax].PtrSuivant
        assume eax : nothing
        mov PtrRacineListe, eax
        mov eax, 1
      .ENDIF
      ret
    AjouterObjet ENDP
    voilà j'espère que ça pourra t'aider.
    bon courage. a+

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 041
    Points : 1 920
    Points
    1 920
    Par défaut
    Bonjour,

    Bien joué executter !

    Je pensais que la question était dévolu au Dos...d'où la prise de tête que ca peut occasionner.

    Reste à savoir i le code est sensé être pour windows où pour Dos.

    Sinon c'est très bon executter.

    Neitsa.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2002
    Messages : 96
    Points : 116
    Points
    116
    Par défaut
    Je pensais que la question était dévolu au Dos...d'où la prise de tête que ca peut occasionner.
    Reste à savoir i le code est sensé être pour windows où pour Dos.
    Bof, un casse tête... Tu as juste à rajouter une gestion d'allocation de la mem. J'avais fait un prog comme ca, la gestion de la mem ne prennait que 300/400 lignes...
    Responsable du projet SKAN (OS à but didactique)
    Contactez moi pour toutes questions ou remarques sur le projet.

  8. #8
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 041
    Points : 1 920
    Points
    1 920
    Par défaut
    la gestion de la mem ne prennait que 300/400 lignes...
    Ah oui effectivement

    Reste à définir la limite (somme toute fluctuante) d'où commence le casse-tête.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    mai 2002
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 78
    Points : 81
    Points
    81
    Par défaut
    La vache vous touchez les gars. Chapeau...

    Dans le même état d'espris la première référence kui m'est venue à l'idée c'est l'exellent tutorial de Jeremy Gordon (Win32 Exception handling)

    Il explikue justement kue les SEH imbrikués sont consus comme des listes chainées.
    Et aussi ku'on peut justement se servir des SEH (en gérant les Exeptions de Pages) pour allouer dynamikuement de la mémoire kuand on ignore la taille de ce kui nous est nécessaire.

    Une explication justement sur les deux points dont vous parliez. Un tut Exellent. Vraiment.
    @+

Discussions similaires

  1. [Free Pascal] Insertion d'éléments dans une liste chaînée
    Par Pacorabanix dans le forum Free Pascal
    Réponses: 4
    Dernier message: 20/04/2010, 01h42
  2. enlever une variable dans une liste chaînée
    Par bisdi dans le forum Débuter
    Réponses: 7
    Dernier message: 24/08/2008, 20h36
  3. [XPATH] Connaître le type d'un noeud dans une liste
    Par mbibim63 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 15/04/2008, 12h45
  4. Réponses: 6
    Dernier message: 29/04/2007, 19h59

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