home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / lexsearc.asm < prev    next >
Assembly Source File  |  1985-06-21  |  3KB  |  79 lines

  1. ;ROUTINE TO SEARCH FOR A WORD IN AN ORDERED LIST OF WORDS        00000100
  2. ;                                    00000200
  3. lexsearch     proc    far                        00000300
  4. ;                                    00000400
  5.           push    si      ;SAVE    REGISTERS            00000500
  6.           push    di                        00000600
  7.           push    cx                        00000700
  8. ;                                    00000800
  9. ;POINT TO BEGINNING OF LIST AND    GET IT'S LENGTH                00000900
  10.           mov    di,bp      ;BEGINNING OF    LIST            00001000
  11.           mov    cx,[di]      ;GET LENGTH                00001100
  12.           inc    di                        00001200
  13.           inc    di                        00001300
  14. ;                                    00001400
  15. ;COMPARE SOURCE    WORD WITH WORDS    IN THE LIST                00001500
  16. ;                                    00001600
  17. lexsearch1:                                00001700
  18. ;                                    00001800
  19.           mov    dx,di      ;SAVE    BEGINNING OF DEST WORD        00001900
  20. ;                                    00002000
  21. ;FORWARD DIRECTION                            00002100
  22.           cld          ;FORWARD DIRECTION            00002200
  23. ;                                    00002300
  24. ;POINT TO BEGINNING OF SOURCE                        00002400
  25.           mov    si,bx      ;POINT TO BEGINNING OF SOURCE        00002500
  26.           inc    si                        00002600
  27.           inc    si                        00002700
  28. ;                                    00002800
  29. ;COMPARE SOURCE    WORD WITH A WORD OF THE    LIST                00002900
  30. lexsearch2:                                00003000
  31. ;                                    00003100
  32. ;CHECK FOR END OF LIST                            00003200
  33.           jcxz    lexsearch5    ;END OF LIST - INSERT IT        00003300
  34. ;                                    00003400
  35. ;SET UP    CARRIAGE RETURN    AS CHARACTER FOR SCANNING            00003500
  36.           mov    al,0dh      ;SCAN    FOR CARRIAGE RETURN        00003600
  37. ;                                    00003700
  38. ;CHECK FOR END OF SOURCE WORD                        00003800
  39.           cmp    [si],al      ;SOURCE BYTE = CARRIAGE RETURN?    00003900
  40.           je    lexsearch4    ;END OF SOURCE WORD FOUND        00004000
  41. ;                                    00004100
  42. ;CHECK FOR END OF DESTINATION WORD                    00004200
  43.           cmp    es:[di],al   ;DEST. BYTE = CARRIAGE RETURN?    00004300
  44.           je    lexsearch3   ;NO MATCH - GOTO NEXT WORD        00004400
  45. ;                                    00004500
  46. ;COMPARE CHARACTER BY CHARACTER                        00004600
  47.           dec    cx                        00004700
  48.           cmpsb          ;CHECK FOR MATCH            00004800
  49.           je    lexsearch2    ;MATCHED - CHECK NEXT CHARACTER    00004900
  50.           jb    lexsearch5    ;TOO HIGH    - THIS SI THE PLACE    00005000
  51. ;                                    00005100
  52. ;SCAN FOR NEXT CARRIAGE    RETURN                        00005200
  53. lexsearch3:                                00005300
  54.           repnz    scasb      ;SCAN    UNTIL CARRIAGE RETURN        00005400
  55.           jmp    lexsearch1    ;NEXT WORD            00005500
  56. ;                                    00005600
  57. ;END OF    SOURCE WORD WAS    FOUND                        00005700
  58. lexsearch4:                                00005800
  59.           cmp    [di],al      ;DEST    CHARACTER WAS CARRIAGE RETURN?    00005900
  60.           je    lexsearch6    ;END OF DESTINATION WORD?        00006000
  61. ;                                    00006100
  62. ;FOUND SPOT TO INSERT THE WORD                        00006200
  63. lexsearch5:                                00006300
  64.           mov    al,0ffh      ;SUCCESS                00006400
  65.           jmp    lexsearchexit                    00006500
  66. ;                                    00006600
  67. ;WORD IS ALREADY PRESENT                        00006700
  68. lexsearch6:                                00006800
  69.           mov    al,00h      ;ALREADY THERE            00006900
  70.           jmp    lexsearchexit                    00007000
  71. ;                                    00007100
  72. lexsearchexit:                                00007200
  73.           pop    cx      ;RESTORE REGISTERS            00007300
  74.           pop    di                        00007400
  75.           pop    si                        00007500
  76.           ret                            00007600
  77. ;                                    00007700
  78. lexsearch     endp                            00007800
  79.