asm汇编字符串操作

提供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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tjsoft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值