📄 dllalib.s
字号:
/* dllALib.s - i80x86 assembly doubly linked list manipulation *//* Copyright 1984-2001 Wind River Systems, Inc. *//*modification history--------------------01d,22aug01,hdn added FUNC/FUNC_LABEL, replaced .align with .balign01c,01jun93,hdn updated to 5.1. - fixed #else and #endif - changed VOID to void - changed ASMLANGUAGE to _ASMLANGUAGE - changed copyright notice01b,13oct92,hdn debugged.01a,07apr92,hdn written based on TRON version.*//*DESCRIPTIONThis subroutine library supports the creation and maintenance of adoubly linked list. The user supplies a list descriptor (type DL_LIST)that will contain pointers to the first and last nodes in the list.The nodes in the list can be any user-defined structure, but they must reservespace for a pointer as their first element. The forward chain is terminatedwith a NULL pointer.This library in conjunction with dllLib.c, and the macros defined in dllLib.h,provide a reduced version of the routines offered in lstLib(1). Forefficiency, the count field has been eliminated, and enqueueing and dequeueingfunctions have been hand optimized..ne 16NON-EMPTY LIST:.CS --------- -------- -------- | head--------------->| next----------->| next--------- | | | | | | | | | ------ prev |<---------- prev | | | | | | | | | | | tail------ | | ... | ----->| ... | | |-------| | v | v | ----- | ----- | --- | --- | - | - ------------------------.CE.ne 12EMPTY LIST:.CS ----------- | head------------------ | | | | tail---------- | | | | v | | ----- ----- ----------- --- --- - -.CE*/#define _ASMLANGUAGE#include "vxWorks.h"#include "asm.h" .data .globl FUNC(copyright_wind_river) .long FUNC(copyright_wind_river) #ifndef PORTABLE /* internals */ .globl GTEXT(dllInsert) .globl GTEXT(dllAdd) .globl GTEXT(dllRemove) .globl GTEXT(dllGet) .text .balign 16/********************************************************************************* dllInsert - insert node in list after specified node** This routine inserts the specified node in the specified list.* The new node is placed following the specified 'previous' node in the list.* If the specified previous node is NULL, the node is inserted at the head* of the list.* void dllInsert (pList, pPrev, pNode)* FAST DL_LIST *pList; /* pointer to list descriptor ** FAST DL_NODE *pPrev; /* pointer to node after which to insert ** FAST DL_NODE *pNode; /* pointer to node to be inserted ** INTERNAL { FAST DL_NODE *pNext; if (pPrev == NULL) { /* new node is to be first in list * pNext = pList->head; pList->head = pNode; } else { /* make prev node point fwd to new * pNext = pPrev->next; pPrev->next = pNode; } if (pNext == NULL) pList->tail = pNode; /* new node is to be last in list * else pNext->previous = pNode; /* make next node point back to new * pNode->next = pNext; /* set pointers in new node * pNode->previous = pPrev; }*/FUNC_LABEL(dllInsert) pushl %ebx pushl %esi movl SP_ARG1+8(%esp),%eax /* pList into %eax */ movl SP_ARG2+8(%esp),%edx /* pPrev into %edx */ movl SP_ARG3+8(%esp),%ecx /* pNode into %ecx */ movl %eax,%esi /* %esi = pList */ cmpl $0,%edx je dllInsert1 movl %edx,%esi /* %esi = pPrev */dllInsert1: movl (%esi),%ebx /* %ebx = (%esi)->next */ movl %ecx,(%esi) /* (%esi)->next = pNode */dllInsert2: movl %eax,%esi /* %esi = pList */ cmpl $0,%ebx /* (pNext == NULL)? */ je dllInsert3 movl %ebx,%esi /* %esi = pPrev */dllInsert3: movl %ecx,4(%esi) /* (%esi)->previous = pNode */ movl %ebx,(%ecx) /* pNode->next = pNext */ movl %edx,4(%ecx) /* pNode->previous = pPrev */ popl %esi popl %ebx ret/********************************************************************************* dllAdd - add node to end of list** This routine adds the specified node to the end of the specified list.* void dllAdd (pList, pNode)* DL_LIST *pList; /* pointer to list descriptor ** DL_NODE *pNode; /* pointer to node to be added ** INTERNAL { dllInsert (pList, pList->tail, pNode); }*/ .balign 16,0x90FUNC_LABEL(dllAdd) movl SP_ARG1(%esp),%eax /* %eax = pList */ movl SP_ARG2(%esp),%ecx /* %ecx = pNode */ movl 4(%eax),%edx /* %edx = pList->tail = pPrev */ movl %ecx,4(%eax) /* pList->tail = pNode */ movl %edx,4(%ecx) /* pNode->previous = pPrev/NULL */ movl $0,(%ecx) /* pNode->next = NULL */ cmpl $0,%edx je dllAdd1 movl %ecx,(%edx) /* pPrev->next = pNode */ ret .balign 16,0x90dllAdd1: movl %ecx,(%eax) /* pList->head = pNode */ ret/********************************************************************************* dllRemove - remove specified node in list** Remove the specified node in the doubly linked list.* void dllRemove (pList, pNode)* DL_LIST *pList; /* pointer to list descriptor ** DL_NODE *pNode; /* pointer to node to be deleted ** INTERNAL { if (pNode->previous == NULL) pList->head = pNode->next; else pNode->previous->next = pNode->next; if (pNode->next == NULL) pList->tail = pNode->previous; else pNode->next->previous = pNode->previous; }*/ .balign 16,0x90FUNC_LABEL(dllRemove) pushl %ebx pushl %esi movl SP_ARG1+8(%esp),%edx /* %edx = pList */ movl SP_ARG2+8(%esp),%eax /* %eax = pNode */ movl 4(%eax),%ecx /* %ecx = pNode->previous */ movl %edx,%ebx /* %ebx = pList */ cmpl $0,%ecx /* (pNode->previous == NULL)? */ je dllRemove1 movl %ecx,%ebx /* %ebx = pNode->previous */dllRemove1: movl (%eax),%esi /* (%ebx) = pNode->next */ movl %esi,(%ebx) movl %edx,%ebx /* %ebx = pList */ cmpl $0,%esi /* (pNode->next == NULL)? */ je dllRemove2 movl %esi,%ebx /* %ebx = pNode->next */dllRemove2: movl %ecx,4(%ebx) /* 4(%ebx) = pNode->previous */ popl %esi popl %ebx ret/********************************************************************************* dllGet - get (delete and return) first node from list** This routine gets the first node from the specified list, deletes the node* from the list, and returns a pointer to the node gotten.** RETURNS* Pointer to the node gotten, or* NULL if the list is empty.* DL_NODE *dllGet (pList)* FAST DL_LIST *pList; /* pointer to list from which to get node ** INTERNAL { FAST DL_NODE *pNode = pList->head; if (pNode != NULL) dllRemove (pList, pNode); return (pNode); }*/ .balign 16,0x90FUNC_LABEL(dllGet) movl SP_ARG1(%esp),%edx /* %edx = pList */ movl (%edx),%eax /* %eax = pList->head(is pNode) */ cmpl $0,%eax /* if (%eax == NULL) we're done */ je dllGet2 movl (%eax),%ecx /* %ecx = pNode->next */ movl %ecx,(%edx) /* (%edx) = %ecx */ cmpl $0,%ecx /* (pNode->next == NULL)? */ je dllGet1 movl %ecx,%edx /* %edx = pNode->next */dllGet1: movl $0,4(%edx) /* 4(%edx) = NULL */dllGet2: ret#endif /* (!PORTABLE) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -