home *** CD-ROM | disk | FTP | other *** search
-
- procedure CopySubStr( Str1: string; start, nrchars: byte; var Str2: string );
- assembler;
- { copy part of Str1 (beginning at start for nrchars) to Str2
- if start > length of Str1, Str2 will contain a empty string.
- if nrchars specifies more characters than remain starting at the
- start position, Str2 will contain just that remainder of Str1. }
- asm
- { setup }
- LDS SI,Str1 { load in DS:SI pointer to str1 }
- CLD { string operations forward }
- LES DI,Str2 { load in ES:DI pointer to str2 }
- MOV AH,[SI] { length str1 --> AH }
- AND AH,AH { length str1 = 0? }
- JE @null { yes, empty string in Str2 }
- MOV BL,[start] { starting position --> BL }
- CMP AH,BL { start > length str1? }
- JB @null { yes, empty string in Str2 }
-
- { start + nrchars - 1 > length str1? }
- MOV AL,[nrchars] { nrchars --> AL }
- MOV DH,AL { nrchars --> DH }
- ADD DH,BL { add start }
- DEC DH
- CMP AH,DH { nrchars > rest of str1? }
- JB @rest { yes, copy rest of str1 }
- JMP #copy
- @null:
- MOV AL,0 { return a empty string }
- JMP #done
- @rest:
- SUB AH,BL { length str1 - start }
- INC AH
- MOV AL,AH
- @copy:
- MOV CL,AL { how many chars to copy }
- XOR CH,CH { clear CH }
- XOR BH,BH { clear BH }
- ADD SI,BX { starting position }
- MOV DX,DI { save pointer to str2 }
- INC DI
- REP MOVSB { copy part str1 to str2 }
- MOV DI,DX { restore pointer to str2 }
- @done:
- MOV [DI],AL { overwrite length byte of str2 }
- @exit:
- end { CopySubStr };
-
-
- procedure StrCopy( var Str1, Str2: string ); assembler;
- { copy str1 to str2 }
- asm
- LDS SI,Str1 { load in DS:SI pointer to str1 }
- CLD { string operations forward }
- LES DI,Str2 { load in ES:DI pointer to str2 }
- XOR CH,CH { clear CH }
- MOV CL,[SI] { length str1 --> CX }
- INC CX { include length byte }
- REP MOVSB { copy str1 to str2 }
- @exit:
- end { StrCopy };