字符串是字符的一个序列。字符串的操作处理包括:复制,检索、插入、删除和替换等。处理字符串的指令称为字符串操作指令。
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时结束
Comments 3 条评论
这是8086吗?
@霉菌和野蜂蜜
还有建议开个评论审核,不然有些人乱发不太好.