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
    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
    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
    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

    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
    ç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

    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
    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

    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
    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.
    @+

###raw>template_hook.ano_emploi###