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
相关推荐
熙曦Sakura2 小时前
【Linux】基础开发工具
linux·运维·服务器
小南家的青蛙6 小时前
Linux的网络配置的资料
linux·运维·网络
HinsCoder7 小时前
使用SSH解决在IDEA中Push出现403的问题
运维·笔记·git·ssh·github·intellij-idea
迷雾骑士7 小时前
CentOS Stream release 9安装 MySQL(一)
linux·mysql·centos
良许Linux7 小时前
国内有哪些嵌入式公司?
linux
良许Linux7 小时前
为什么学完了 C 语言觉得自己什么都干不了?
linux
良许Linux7 小时前
嵌入式行业真的没前途吗?
linux
良许Linux7 小时前
有哪些相见恨晚的stm32学习的方法?
linux
良许Linux7 小时前
学会stm32,RTOS,QT后能找到工作吗?
linux