提供8个子程序:
1. 字符串长度 STRLEN
2. 字符串替换 REPLACE
3. 字节查找 SEARCHB
4. 双字节查找 SEARCHW
5. 输入字符串 GETSTR
6. 输出字符串 OUTSTR
7. 复制字符串 COPYSTR
8. 查找字符串 SRCHSTR
具体功能及参数描述如下
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| STRLEN PROC FAR ; IN: ; DS:DX=STRING ; OUT: ; CF=0 AX=STRING LENGTH ; CF=1 ERROR ; __________________________________ REPLACE PROC FAR ; IN: ; DS:DX=STRING ; AL=OLD CHAR ; BL=NEW CHAR ; OUT: ; CF=1 error ; CF=0 ok ; __________________________________ SEARCHB PROC FAR ; IN: ; DS:DX=STRING ; AL=CHAR ; OUT: ; CF=0 ZF=1 DS:DX=STRING END(NULL) ; CF=0 ZF=0 DS:DX=CHAR POSITION ; CF=1 ERROR ; __________________________________ SEARCHW PROC FAR ; IN: ; DS:DX=STRING ; AX=CHAR WORD ; OUT: ; CF=0 ZF=1 DS:DX=STRING END (NULL) ; CF=0 ZF=0 DS:DX=CHAR POSITION ; CF=1 ERROR ; __________________________________ GETSTR PROC FAR ; IN: ; DS:DX=BUFFER [DX]=MAX LENGTH ; OUT: ; DS:DX=BUFFER WITH STRING (NULL END) [DX+1]=REALITY LENGTH ; __________________________________ OUTSTR PROC FAR ; IN: ; DS:DX=BUFFER WITH STRING (NULL END) ; BL=COLOR ; BH=0 OUT AT CURRENT POSITION ; 1 CH=X_CORD CL=Y_CORD ;______________________________ COPYSTR PROC FAR ; IN: ; DS:SI = SOURCE STRING(NULL END) ; ES:DI = DEST STRING ;______________________________ SRCHSTR PROC FAR ; IN: ; DS:SI = SUB_STRING ; ES:DI = MAIN_STRING ; OUT: ; ZF=0 FOUND, ES:BX = FOUND POSITION ; ZF=1 NOT FOUND |
; more source code at http://www.ahjoe.com/source/srcdown.asp
.286
PUBLIC REPLACE, SEARCHB, SEARCHW, GETSTR, OUTSTR, STRLEN
PUBLIC COPYSTR, SRCHSTR
CODE SEGMENT
ASSUME CS:CODE
REPLACE PROC FAR
; IN:
; DS:DX=STRING
; AL=OLD CHAR
; BL=NEW CHAR
; OUT:
; CF=0 OK
; CF=1 ERROR
PUSH DI
MOV DI, DX
REPLR0:
CMP [DI], AL
JZ REPLOK0
INC DI
JC REPLAERR
JMP REPLR0
REPLOK0:
MOV [DI], BL
REPLAERR:
POP DI
RETF
REPLACE ENDP
STRLEN PROC FAR
; IN:
; DS:DX=STRING
; OUT:
; CF=0 AX=STRING LENGTH
; CF=1 ERROR
PUSH DI
MOV DI, DX
XOR AX, AX
STRLENREP:
CMP BYTE PTR [DI], 0
JZ STRLENOK
INC DI
JC STRLENOK
INC AX
JC STRLENOK
JMP STRLENREP
STRLENOK:
POP DI
RETF
STRLEN ENDP
SEARCHB PROC FAR
; IN:
; DS:DX=STRING
; AL=CHAR
; OUT:
; CF=0 ZF=1 DS:DX=STRING END (NULL)
; CF=0 ZF=0 DS:DX=CHAR POSITION
; CF=1 ERROR
PUSH DI
MOV DI, DX
DEC DI
CLD
RESCHB:
INC DI
JC SCHBOVER
CMP BYTE PTR [DI], 00
JZ SCHBOVER
CMP BYTE PTR [DI], AL
JNZ RESCHB
OR AL, AL
SCHBOVER:
MOV DX, DI
POP DI
RETF
SEARCHB ENDP
SEARCHW PROC FAR
; IN:
; DS:DX=STRING
; AX=CHAR WORD
; OUT:
; CF=0 ZF=1 DS:DX=STRING END (NULL)
; CF=0 ZF=0 DS:DX=CHAR POSITION
; CF=1 ERROR
PUSH DI
MOV DI, DX
DEC DI
CLD
RESCHW:
INC DI
JC SCHWOVER
CALL SEARCHB
MOV DI, DX
JZ SCHWOVER
CMP [DI+1], AH
JNZ RESCHW
OR AX, AX
SCHWOVER:
MOV DX, DI
POP DI
RETF
SEARCHW ENDP
GETSTR PROC FAR
; IN:
; DS:DX=BUFFER [DX]=MAX LENGTH
; OUT:
; DS:DX=BUFFER WITH STRING (NULL END) [DX+1]=REALITY LENGTH
PUSH BX
MOV AH, 0AH
INT 21H
MOV AL, 0DH
MOV BL, 0
ADD DX, 2
CALL REPLACE
SUB DX, 2
POP BX
RETF
GETSTR ENDP
OUTSTR PROC FAR
; IN:
; DS:DX=BUFFER WITH STRING (NULL END)
; BL=COLOR
; BH=0 OUT AT CURRENT POSITION
; 1 CH=X_CORD CL=Y_CORD
PUSH AX
PUSH BX
PUSH CX
PUSH DI
MOV DI, DX
MOV DX, CX
XCHG DH, DL
CMP BH, 0
JNZ OUTNEX
MOV AH, 03
INT 10H
OUTNEX:
MOV BH, 0
MOV AH, 02
INT 10H
OUTREP:
MOV AL, [DI]
INC DI
OR AL, AL
JZ OUTEND
MOV AH, 09H
CMP AL, 20H
JA OUTJ0
CMP AL, 09H
JZ TABCHA
MOV AH, 0EH
INT 10H
MOV AH, 3
INT 10H
JMP OUTREP
TABCHA:
ADD DL, 8
AND DL, NOT 07H
DEC DL
JMP INCDL
OUTJ0:
MOV CX, 1
INT 10H
MOV AH, 03
INT 10H
INCDL:
INC DL
CMP DL, 50H
JB OUTJ2
MOV AX, 0E0DH
INT 10H
MOV AX, 0E0AH
INT 10H
JMP OUTJ3
OUTJ2:
MOV AH, 02
INT 10H
OUTJ3:
JMP OUTREP
OUTEND:
POP DI
POP CX
POP BX
POP AX
RETF
OUTSTR ENDP
COPYSTR PROC FAR
; IN:
; DS:SI = SOURCE STRING(NULL END)
; ES:DI = DEST STRING
CLD
COPYREP:
LODSB
STOSB
OR AL, AL
JNZ COPYREP
COPYOK:
RETF
COPYSTR ENDP
SRCHSTR PROC FAR
; IN:
; DS:SI = SUB_STRING
; ES:DI = MAIN_STRING
; OUT:
; ZF=0 FOUND, ES:BX = FOUND POSITION
; ZF=1 NOT FOUND
PUSH SI
PUSH DI
PUSH CX
PUSH DX
MOV CX, SI
MOV DX, DI
CLD
REPEA0:
CMPREPEA:
CMP BYTE PTR DS:[SI], 0
JZ FOUNDSTR
CMP BYTE PTR ES:[DI], 0
JZ FOUNDOVER
CMPSB
JZ CMPREPEA
INC DX
MOV SI, CX
MOV DI, DX
JMP REPEA0
FOUNDOVER:
CMP BYTE PTR ES:[DI], 1
JMP FOUNDSTR
RETF
FOUNDSTR:
MOV BX, DX
POP DX
POP CX
POP DI
POP SI
RETF
SRCHSTR ENDP
CODE ENDS
END REPLACE