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
相关推荐
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing4 天前
WSL+Cpp开发环境配置
linux
蝎子莱莱爱打怪5 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes