home *** CD-ROM | disk | FTP | other *** search
- ; INSERT- Inserts one string into another.
- ;
- ; On entry:
- ;
- ; DS:SI Points at the source string to be inserted
- ;
- ; ES:DI Points at the destination string into which the source
- ; string will be inserted.
- ;
- ; DX Contains the offset into the destination string where the
- ; source string is to be inserted.
- ;
- ;
- ; All registers are preserved.
- ;
- ; Error condition-
- ;
- ; If the length of the newly created string is greater than 255,
- ; the insert operation will not be performed and the carry flag
- ; will be returned set.
- ;
- ; If the index is greater than the length of the destination
- ; string,
- ; then the source string will be appended to the end of the destin- ; ation string.
-
- INSERT proc near
- push si
- push di
- push dx
- push cx
- push bx
- push ax
- clc ;Assume no error.
- pushf
- mov dh, 0 ;Just to be safe.
-
- ; First, see if the new string will be too long.
-
- mov ch, 0
- mov ah, ch
- mov bh, ch
- mov al, es:[di] ;AX = length of dest string.
- mov cl, [si] ;CX = length of source string.
- mov bl, al ;BX = length of new string.
- add bl, cl
- jc TooLong ;Abort if too long.
- mov es:[di], bl ;Update length.
-
- ; See if the index value is too large:
-
- cmp dl, al
- jbe IndexIsOK
- mov dl, al
- IndexIsOK:
-
- ; Now, make room for the string thatâ•’s about to be inserted.
-
- push si ;Save for later.
- push cx
-
- mov si, di ;Point SI at the end of current
- add si, ax ; destination string.
- add di, bx ;Point DI at the end of new str.
- std
- rep movsb ;Open up space for new string.
-
- ; Now, copy the source string into the space opened up.
-
- pop cx
- pop si
- add si, cx ;Point at end of source string.
- rep movsb
- jmp INSERTDone
-
- TooLong: popf
- stc
- pushf
-
- INSERTDone: popf
- pop ax
- pop bx
- pop cx
- pop dx
- pop di
- pop si
- ret
- INSERT endp
-