sllALib.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sllALib.s - i80x86 assembly singly linked list manipulation */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,22aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  7. 01c,01jun93,hdn  updated to 5.1.
  8.   - fixed #else and #endif
  9.   - changed VOID to void
  10.   - changed ASMLANGUAGE to _ASMLANGUAGE
  11.   - changed copyright notice
  12. 01b,13oct92,hdn  debugged.
  13. 01a,07apr92,hdn  written based on TRON version.
  14. */
  15. /*
  16. DESCRIPTION
  17. This subroutine library supports the creation and maintenance of a
  18. singly linked list.  The user supplies a list descriptor (type SL_LIST)
  19. that will contain pointers to the first and last nodes in the list.
  20. The nodes in the list can be any user-defined structure, but they must reserve
  21. space for a pointer as their first element.  The forward chain is terminated
  22. with a NULL pointer.
  23. .ne 16
  24. NON-EMPTY LIST:
  25. .CS
  26.    ---------             --------          --------
  27.    | head--------------->| next----------->| next---------
  28.    |       |             |      |          |      |      |
  29.    |       |             |      |          |      |      |
  30.    | tail------          | ...  |    ----->| ...  |      |
  31.    |-------|  |                      |                   v
  32.               |                      |                 -----
  33.               |                      |                  ---
  34.               |                      |                   -
  35.               ------------------------
  36. .CE
  37. .ne 12
  38. EMPTY LIST:
  39. .CS
  40. -----------
  41.         |  head------------------
  42.         |         |             |
  43.         |  tail----------       |
  44.         |         |     |       v
  45.         |         |   -----   -----
  46.         -----------    ---     ---
  47.                         - -
  48. .CE
  49. INCLUDE FILE: sllLib.h
  50. */
  51. #define _ASMLANGUAGE
  52. #include "vxWorks.h"
  53. #include "asm.h"
  54. .data
  55. .globl FUNC(copyright_wind_river)
  56. .long FUNC(copyright_wind_river)
  57. #ifndef PORTABLE
  58. /* internals */
  59. .globl GTEXT(sllPutAtHead) /* put node at head of list */
  60. .globl GTEXT(sllPutAtTail) /* put node at tail of list */
  61. .globl GTEXT(sllGet) /* get and delete node from head */
  62. .text
  63. .balign 16
  64. /*******************************************************************************
  65. *
  66. * sllPutAtHead - add node to beginning of list
  67. *
  68. * This routine adds the specified node to the beginning of the specified list.
  69. *
  70. * RETURNS: void
  71. *
  72. * SEE ALSO: sllPutAtTail (2)
  73. * void sllPutAtHead (pList, pNode)
  74. *     SL_LIST *pList; /* pointer to list descriptor *
  75. *     SL_NODE *pNode; /* pointer to node to be added *
  76. * INTERNAL
  77.     {
  78.     if ((pNode->next = pList->head) == NULL)
  79. pList->head = pList->tail = pNode;
  80.     else
  81. pList->head = pNode;
  82.     }
  83. */
  84. FUNC_LABEL(sllPutAtHead)
  85. movl SP_ARG1(%esp),%eax /* pList */
  86. movl SP_ARG2(%esp),%edx /* pNode */
  87. movl (%eax),%ecx /* pNode->next = pList->head */
  88. movl %ecx,(%edx)
  89. cmpl $0,%ecx /* (pList->head == NULL) ? */
  90. jne sllHead1
  91. movl %edx,4(%eax) /* pList->tail = pNode */
  92. sllHead1:
  93. movl %edx,(%eax) /* pList->head = pNode */
  94. ret
  95. /*******************************************************************************
  96. *
  97. * sllPutAtTail - add node to end of list
  98. *
  99. * This routine adds the specified node to the end of the specified singly
  100. * linked list.
  101. *
  102. * RETURNS: void
  103. *
  104. * SEE ALSO: sllPutAtHead (2)
  105. * void sllPutAtTail (pList, pNode)
  106. *     SL_LIST *pList; /* pointer to list descriptor *
  107. *     SL_NODE *pNode; /* pointer to node to be added *
  108. * INTERNAL
  109.     {
  110.     pNode->next = NULL;
  111.     if (pList->head == NULL)
  112. pList->tail = pList->head = pNode;
  113.     else
  114. pList->tail->next = pNode;
  115. pList->tail = pNode;
  116.     }
  117. */
  118. .balign 16,0x90
  119. FUNC_LABEL(sllPutAtTail)
  120. movl SP_ARG1(%esp),%eax /* pList */
  121. movl SP_ARG2(%esp),%edx /* pNode */
  122. movl $0,(%edx) /* pNode->next = NULL */
  123. cmpl $0,(%eax) /* if (pList->head == NULL) */
  124. je sllTail1
  125. movl 4(%eax),%ecx /* ecx = pList->tail */
  126. movl %edx,(%ecx) /* pList->tail->next = pNode */
  127. movl %edx,4(%eax) /* pList->tail = NODE */
  128. ret
  129. .balign 16,0x90
  130. sllTail1:
  131. movl %edx,(%eax) /* pList->head = NODE */
  132. movl %edx,4(%eax) /* pList->tail = NODE */
  133. ret
  134. /*******************************************************************************
  135. *
  136. * sllGet - get (delete and return) first node from list
  137. *
  138. * This routine gets the first node from the specified singly linked list,
  139. * deletes the node from the list, and returns a pointer to the node gotten.
  140. *
  141. * RETURNS
  142. * Pointer to the node gotten, or
  143. * NULL if the list is empty.
  144. *SL_NODE *sllGet (pList)
  145. *    FAST SL_LIST *pList; /* pointer to list from which to get node *
  146. * INTERNAL
  147.     {
  148.     FAST SL_NODE *pNode;
  149.     if ((pNode = pList->head) != NULL)
  150. pList->head = pNode->next;
  151.     return (pNode);
  152.     }
  153. */
  154. .balign 16,0x90
  155. FUNC_LABEL(sllGet)
  156. movl SP_ARG1(%esp),%edx /* pList */
  157. movl (%edx),%eax /* %eax = pList->head */
  158. cmpl $0,%eax
  159. je sllGet1 /* if pList->head == NULL then done */
  160. movl (%eax),%ecx /* (pNode)->next to pList->head */
  161. movl %ecx,(%edx)
  162. sllGet1:
  163. ret
  164. #endif /* !PORTABLE */