; Fonction Assembleur appelable depuis le C pour insérer un noeud dans une liste ; chaînée triée selon l'ordre ascendant du champ Value. La liste est circulaire. ; C'est-à-dire qu'un nœud factice est à la fois la tête et la queue de la ; liste. Le nœud factice est une sentinelle, qui contient le plus grand ; champ Value possible. Testé avec TASM. MAX_TEXT_LENGTH equ 100 ;longueur maximale du champ Text SENTINEL equ 32767 ;largeur maximale du champ Value LinkNode struc NextNode dw ? Value dw ? Text db MAX_TEXT_LENGTH+1 dup(?) ;*** Champs de données supplémentaires*** LinkNode ends .model small .code ; Insère le nœud spécifié dans la liste chaînée en ordre ascendant ; afin que l'ordre soit maintenu. Retourne un pointeur sur le nœud ; précédant celui qui vient d'être inséré. ; Appelable en C near: ; struct LinkNode *InsertNodeSorted(struct LinkNode *HeadOfListNode, ; struct LinkNode *NodeToInsert) parms struc dw 2 dup (?) ;adresse de retour & BP ;empilés HeadOfListNode dw ? ;pointeur sur le nœud de tête NodeToInsert dw ? ;pointeur sur le nœud à insérer parms ends public _InsertNodeSorted _InsertNodeSorted proc near push bp mov bp,sp ;pointe sur la stack frame push si ;préserve les variables registre push di mov si,[bp].NodeToInsert ;pointe sur le nœud à ;insérer mov ax,[si].Value ;valeur recherchée mov di,[bp].HeadOfListNode ;pointe sur la liste ;chaînée SearchLoop: mov bx,di ;passe au prochain nœud mov di,[bx].NextNode ;pointe sur le nœud suivant cmp [di].Value,ax ;La valeur du nœud suivant est- ;elle inférieure à celle ;du nœud à insérer? jl SearchLoop ;oui, poursuivons la recherche ;non, nous avons trouvé ;notre point d'insertion mov ax,[bx].NextNode ;lien du nouveau nœud mov [si].NextNode,ax ;entre le nœud courant et mov [bx].NextNode,si ;le nœud suivant mov ax,bx ;retour du pointeur sur le nœud ;qui précède celui que nous ;avons inséré pop di ;restaure les variables registre pop si pop bp ret _InsertNodeSorted endp end