home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #3.1 / RBBSIABOX31.cdr / inst / instring.asm < prev    next >
Encoding:
Assembly Source File  |  1990-09-29  |  3.5 KB  |  85 lines

  1. ;*********************************************************************
  2. ;* INSTRING.ASM dd 850619, Auteur P.J. Huizinga.                     *
  3. ;*********************************************************************
  4. ;  routine zoekt naar source string in destination string
  5. ;  let op: case sensitive; evt. eerst uppercase maken.
  6. ;
  7. ;  input : DS:SI wijst naar 1e karakter source string
  8. ;          ES:DI wijst naar 1e karakter destination string
  9. ;          AX    bevat lengte source string
  10. ;          CX    bevat lengte destination string
  11. ;
  12. ;  output: AX    bevat offset source string in destination string
  13. ;                = 0 indien geen exact match gevonden
  14. ;          overige registers ongewijzigd
  15. ;
  16. ;  vb.   : als DS:SI wijst naar 'MNO'                   en AX = 3
  17. ;           en ES:DI wijst naar 'ABCDEFGHIJKLMNOP'      en CX = 16,
  18. ;          dan is na return AX = DI + 12
  19. ;
  20. INSTRING        PROC    NEAR
  21.                 PUSH    SI              ; red gebruikte registers
  22.                 PUSH    DI
  23.                 PUSH    DX
  24.                 PUSH    CX
  25.                 PUSH    BX
  26.                 PUSH    AX
  27.                 MOV     DX,DI           ; offset 1e karakter destination
  28.                 MOV     BX,SI           ; idem source
  29.                 CMP     AX,0            ; controleer lengtes:
  30.                 JG      INSTRING_01     ; moeten positief zijn
  31.                 JMP     INSTRING_05
  32. INSTRING_01:    CMP     CX,0
  33.                 JG      INSTRING_02
  34.                 JMP     INSTRING_05
  35. INSTRING_02:    CMP     AX,CX           ; vergelijk lengtes:
  36.                 JNG     INSTRING_03     ; source str mag niet langer zijn
  37.                 JMP     INSTRING_05
  38. ;
  39. ; zoek naar 1e karakter van source in destination string
  40. ;
  41. INSTRING_03:    MOV     DI,DX
  42.                 MOV     SI,BX
  43.                 MOV     AL,[SI]         ; AL := 1e karakter source string
  44.                 CLD                     ; zet direction flag voorwaarts
  45.         REPNZ   SCASB                   ; zoek tot match of tot CX=0
  46.                 JNZ     INSTRING_05     ; geen match gevonden
  47. ;
  48. ; match van 1e karakter gevonden,
  49. ; controleer of rest ook matcht.
  50. ;
  51.                 MOV     DX,DI           ; onthou positie in dest. str.
  52.                 DEC     DI              ; DI op match-karakter dest. str.
  53.                 POP     AX              ; lengte source string van stack
  54.                 PUSH    AX              ; herstel stackpointer
  55.                 XCHG    AX,CX           ; lengte in CX en bewaar CX
  56.         REPZ    CMPSB                   ; vergelijk source met destination
  57.                 JZ      INSTRING_04     ; ZF=0 -->> match gevonden
  58. ;
  59. ; mis. verder zoeken
  60. ;
  61.                 XCHG    AX,CX           ; herstel waar we waren
  62.                 JMP     INSTRING_03     ; en verder zoeken
  63. ;
  64. ; raak. outputparm zetten en return
  65. ;
  66. INSTRING_04:    MOV     AX,DX           ; offset in dest. str.
  67.                 DEC     AX              ; was al 1 opgehoogd
  68.                 JMP     SHORT E_INSTRING ; klaar
  69. ;
  70. ; source string komt niet voor in destination string
  71. ; (of inputparms niet correct)
  72. ;
  73. INSTRING_05:    MOV     AX,0            ; geen match gevonden
  74. ;
  75. ; exit
  76. ;
  77. E_INSTRING:     POP     BX              ; AX op stack, is outputparm
  78.                 POP     BX              ; herstel overige registers
  79.                 POP     CX
  80.                 POP     DX
  81.                 POP     DI
  82.                 POP     SI
  83.                 RET                     ; en return
  84. INSTRING        ENDP
  85.