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
相关推荐
csdn_aspnet2 分钟前
告别重复造轮子:Codex写脚本,运维/DevOps场景下,用Codex批量生成Shell/Python自动化脚本
运维·python·ai·自动化·devops·codex·辅助编程
木心术17 分钟前
DevOps全流程实践:从CI/CD到自动化测试的最佳实践
运维·ci/cd·devops
一直会游泳的小猫7 分钟前
Homebrew - macOS 与 Linux 的包管理器
linux·运维·macos·brew·包管理工具
开开心心_Every16 分钟前
文件强制删除工具,单文件拖入解锁删除简单
运维·edge·pdf·计算机外设·逻辑回归·散列表·启发式算法
代码论斤卖23 分钟前
OpenHarmony的watchdog service频繁崩溃问题分析
linux·harmonyos
halazi10026 分钟前
WSL 安装与 Ubuntu 24.04 配置使用指南
linux·运维·ubuntu·wsl
MDIOT旗舰35 分钟前
4G低功耗边缘计算网关:让智能抄表与远程运维从未如此简单
运维·人工智能·边缘计算·modbus·红外抄表·plc智能网关
2302_8031322535 分钟前
ensp中关于交换机S3700不被识别的错误列举以及vlan 绑定acl后无法删除问题
运维·服务器·网络
拾贰_C35 分钟前
【Ubuntu | Nvidia | driver | installation | commend】
linux·运维·ubuntu
.柒宇.42 分钟前
Linux 时间同步服务:Chrony 深度笔记
linux·运维·服务器