ç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 :
1 2 3 4
| Objet STRUCT
Poids dd 0
Volume dd 0
Objet ENDS |
puis ta structure 'maillon' :
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 :
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 :
1 2
| .data
PtrRacineListe dd NULL |
voilà après faut juste savoir comment allouer un bloc :
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 :
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 :
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+
Partager