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
相关推荐
hgdlip30 分钟前
电脑的ip地址会自动变怎么办?原因解析和解决方法
运维·网络·tcp/ip·电脑
ZZH1120KQ33 分钟前
Linux账号和权限管理
linux·运维
@Liu_GuoXing40 分钟前
Registry和docker有什么关系?
运维·docker·容器·registry
XMAIPC_Robot1 小时前
基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代
linux·数码相机·fpga开发·架构·边缘计算
水水沝淼㵘1 小时前
嵌入式开发学习日志(linux系统编程--系统编程之 进程间通信IPC)Day32
linux·运维·学习
IT小饕餮1 小时前
linux登陆硬件检测脚本
linux·运维·服务器
Dxy12393102161 小时前
DrissionPage 性能优化实战指南:让网页自动化效率飞升
运维·爬虫·python·性能优化·自动化
碎梦归途3 小时前
Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)
linux·运维·centos
啃火龙果的兔子3 小时前
CentOS 7.9 安装 宝塔面板
linux·运维·centos
DexterLien3 小时前
基于 Alpine 定制单功能用途(kiosk)电脑
linux·alpine·kiosk