ITEEDU

例10.3 编写一个从字符串中拷贝子串的子程序Strncpy,它有四个参数str1、str2、idx和num,其具体功能为把字符串str2中从第idx个(从0开始记数)字符开始、num个字符传送给str1,字符串str1和str2都是以ASCII码0为结束符。

解:

.MODEL        SMALL, C

.DATA

str1? DB "12345ABCDEF", 0

str2? DB 20 DUP('A')

.CODE

      Strlen  PROC      USES AX BX, String:PTR BYTE

…… ;参见例10.1

      Strlen  ENDP

Strncpy PROC?USES AX CX DI SI DS ES, str1:FAR PTR BYTE, str2:FAR PTR BYTE, idx:WORD, num:WORD

              LES       DI, str1

              LDS       SI, str2    ;取两个字符串的首地址

              INVOKE    Strlen, SI  ;计算源字符串的长度,在CX中

              MOV       AX, idx

.IF           AX >= CX                   ;若字符起点就超过源串的长度

              MOV       BYTE PTR ES:[DI], 0     ;拷贝的字符串为“空”

              JMP       over

.ENDIF

              ADD       SI, AX      ;定源串中字符的起点SI

              MOV       CX, num

              CLD

.REPEAT

              LODSB

              STOSB

.UNTILCXZ     AL==0

.IF           AL!=0       ;设置目标串的结束符

              MOV       BYTE PTR[DI], 0

.ENDIF

       over:  RET

     Strncpy  ENDP

.STARTUP

              INVOKE    Strncpy, ADDR str2, ADDR str1, 3, 5

.EXIT         0

              END