home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / stdlib.zip / STRINS.ASM < prev    next >
Assembly Source File  |  1990-08-03  |  2KB  |  107 lines

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3. ;
  4. ;
  5. ; strins- Inserts one string within another.
  6. ;
  7. ; inputs:
  8. ;
  9. ;    ES:DI- Points at destination string, the one into which the source
  10. ;           string will be appended.
  11. ;
  12. ;    DX:SI- Points at the string to insert.
  13. ;
  14. ;    CX-    Index into source string (ES:DI) to begin insertion.
  15. ;
  16. ;
  17. ; Note: The destination string's (ES:DI) buffer must be sufficiently large
  18. ;    to hold the result of the concatentation of the two strings.
  19. ;
  20.         public    sl_strins
  21. ;
  22. srcseg        equ    -2[bp]
  23. destseg        equ    -4[bp]
  24. insindx        equ    -6[bp]
  25. source        equ    -8[bp]
  26. dest        equ    -10[bp]
  27. ;
  28. sl_strins    proc    far
  29.         push    bp
  30.         mov    bp, sp
  31.         push    dx
  32.         push    es
  33.         push    cx
  34.         push    si
  35.         push    di
  36.         pushf
  37.         push    ax
  38.                 push    bx
  39.         push    ds
  40. ;
  41.         cld
  42. ;
  43. ; Compute the length of the string to insert.
  44. ;
  45.         xchg    si, di
  46.         mov    es, dx            ;(srcseg)
  47.         mov    al, 0
  48.         mov    cx, 0ffffh
  49.     repne    scasb
  50.         neg    cx
  51.         dec    cx
  52.         dec    cx
  53.         mov    bx, cx            ;Save for later.
  54. ;
  55. ; Find the length of the dest string.
  56. ;                 
  57.         xchg    si, di
  58.         mov    es, destseg
  59.         mov    cx, 0ffffh
  60.     repne    scasb
  61. ;
  62. ; Compute the address of the insertion point:
  63. ;
  64.         mov    dx, dest
  65.         add    dx, insindx
  66.         cmp    dx, di            ;See if beyond end of string.
  67.         jb    InsOkay
  68.         lea    dx, -1[di]
  69. InsOkay:
  70. ;
  71. ; Make room for the insertion.
  72. ;
  73.         mov    ds, destseg
  74.         mov    si, di
  75.         add    si, bx
  76.         xchg    si, di
  77.         mov    cx, bx
  78.         std
  79.     rep    movsb
  80. ;
  81. ; Now perform the insertion.
  82. ;
  83.         cld
  84.         mov    si, source
  85.         mov    di, dx
  86.         mov    cx, bx
  87.         mov    ds, srcseg
  88.     rep    movsb
  89. ;
  90. ;
  91.         pop    ds
  92.         pop    bx
  93.         pop    ax
  94.         popf
  95.         pop    di
  96.         pop    si
  97.         pop    cx
  98.         pop    es
  99.         pop    dx
  100.         pop    bp
  101.         ret
  102. sl_strins    endp
  103. ;
  104. ;
  105. stdlib        ends
  106.         end
  107.