字符串操作

zhugeshi 发布于 2025-03-25 128 次阅读


字符串是字符的一个序列。字符串的操作处理包括:复制,检索、插入、删除和替换等。处理字符串的指令称为字符串操作指令。

1、字符串操作指令

1.一般说明

DS:SI指向源串
ES:DI指向目的串
DF=0,SI、DI递增
DF=1,  SI、DI递减

2.字符串装入指令:LODS:不影响标志位

LODSB     ;装入字节,SI值为1
LODSW     ;装入字 SI值为2

字符串装入指令是指把字符串中的一个字符装入到累加器AL中,然后根据方向标志DF复位或者置位使SI的值增1或者减1,相当于以下两条指令:

LODSB
Mov al,[si]
inc或者dec si
LODSW
Mov ax,[si]
Add si,2
Sub si,2

3.字符串存储指令:STOS:不影响标志位

格式:

STOSB      ;字节
STOSW      ;字
字符串存储指令是把累加器的值存到字符串中,即替换字符串中的一个字符.
STOSB
Mov ES:[DI],al
INC DI或者DEC DI
STOSW
Mov ES:[DI],AX
ADD  DI,2或者SUB  DI,2

例:将当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中。

CLD
    PUSH DS        ;
    POP ES        ;ES=DS
    MOV SI,1000H
    MOV DI,2000H
    MOV CX,100
NEXT:    LODSB
    STOSB
    LOOP NEXT    ;循环CX次

4.字符串传送指令:不影响标志位

MOVSB ;字节传送

MOVSW ;字传送

格式:MOVS OPRD1,OPRD2

传送指令是把寄存器SI指向的一个字节数据传送到由寄存器DI所指向的存储单元中,然后根据方向标志DF复位或者置位使SI的值增1或者减1,相当于以下两条指令:

LODS

STOS

例:将当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中。

CLD
    PUSH DS
    POP  ES        ;ES=DS
    MOV  SI,1000H
    MOV  DI,2000H
    MOV  CX,100
NEXT:    MOVSB
    LOOP NEXT    ;循环CX次

如果使用MOVSW指令,循环次数减半,效率提高一倍。

5.字符串扫描指令

格式:

SCASB ;字节

SCASW ;字

字符串扫描指令是把累加器AL的内容与寄存器DI所指向一个字节数据采用相减方式比较,相减结果反映到各有关标志位(AF,CF,OF,PF,SF,ZF),但不影响两个操作数,然后根据方向标志DF复位或者置位使SI的值增1或者减1,

SCASW同理

6.字符串比较指令:CMPS

CMPSB ;字节

CMPSW ;字

CMPS OPRD1,OPRD2

串字节比较指令CMPS把寄存器SI所指向的一个字节数据由寄存器DI所指向一个字节数据采用相减方式比较,相减结果反映到各有关标志位(AF,CF,OF,PF,SF,ZF),但不影响两个操作数,然后根据方向标志DF复位或者置位使SI的值增1或者减1.其结果影响标志位。

注意,两个操作数类型应该一致。结果不影响SI、DI、DS、ES值

2、重复前缀

目的:替代重复循环串操作

1.重复前缀REP

REP 重复操作其后的串操作指令动作。每次重复前先判断CX是否为0,

如果为0,结束重复,否则CX减一,继续。

注意:与LOOP指令区别,LOOP指令是CX先减一,然后再循环

REP指令通常用于MOVS和STOS指令前,不用于LODS前

CLD ;如果已清方向标志,则可省

......

MOV CX,50

REP MOVSW ;重复执行CX次

2.REPZ/REPE指令

CX=0或者操作指令使ZF=0时,结束重复串操作。条件检查在重复开始之前进行。

通常用于CMPS和SCAS指令前。

重复前缀REPZ与串操作指令CMPSB配合,实现两个字符串的比较。

3.重复前缀REPNZ/REPNE

与REPZ相似,CX=0或ZF=1时结束

超级大菜鸡!!!
最后更新于 2025-03-31