串操作指令能对存贮区中一块(串)字节或字进行操作,其块的长度可达64K字节,任一个这样的基本操作指令前还能用一个重复前缀使它们重复地操作。 重复执行串操作指令(由CX控制次数) ,实现串操作。
注意:所有的基本串操作指令都约定:源串用寄存器SI进行寻址,在无超越前缀时,段地址取自于数据段寄存器DS;目的串则用寄存器DI进行寻址,其段地址总是取自于附加段寄存器ES中。 串操作指令在每一次操作之后能自动修改地址指针SI,DI的值,以便指向串中下一个元素的地址。但按增量还是按减量来修改地址,则取决于方向标志DF。若DF=0,则SI,DI自动增量(字节操作加1,字操作加2);反之,SI,DI自动减量。DF的状态由指令STD(置方向标志)和CLD(清除方向标志)来控制。
注意:MOVS、LODS、STOS指令对标志位无影响,CMPS、SCAS指令对标志位的影响同CMP指令
(1) 串传送指令
MOVS DST , SRC
MOVSB (字节操作)
MOVSW (字操作)
执行操作:((DI))←((SI))
完成操作后: (SI)←(SI)±1,(DI)←(DI)±1
(SI)←(SI)±2,(DI)←(DI)±2
DF=0,取+
DF=1,取-
串传送指令与重复操作前缀联用,就可以传送数据串。
其中第二、三种格式明确地注释是传送字节和字,第一种格式则应在操作数中表明是字还是字节操作,例如:
MOV ES:BYTE PTR[DI] ,DS:[SI]
重复操作前缀有下列三种形式:
1)重复前缀
REP 应用指令:MOVS,STOS
2)相等重复前缀
REPE/REPZ 应用指令:CMPS,SCAS
3)不相等重复前缀
REPNE/REPNZ应用指令:CMPS,SCAS
例子:
REP MOVSB 进行串操作:
1.源串首地址 --> SI
2.目的串首地址-->DI
3.串长度-->CX
4.设置方向标志
CLD--->DF = 0 地址自增
STD--->DF = 1 地址自动减
5.执行串操作 REP MOVSB
程序把buffer1(4个字节拷贝到)--->buffer2
lea si,buffer1
lea di,buffer2
mov cx, 4
cld
rep movsb
(2) 串比较指令
CMPS SRC DST
CMPSB (字节操作)
CMPSW (字操作)
完成操作:((SI)) - ((DI))
例:比较存放在两个数组( string l和string2)中的两个字符串(14个字节) 是否相同,即比较( string l )= (string2 )?
程序实例:
lea si,string1
lea si,string2
mov cx,14
cld
repz cmpsb
(3)串搜索指令
SCASB (字节操作)
SCASW (字操作)
字节操作: (AL)-((DI)),(DI)←(DI)±1
字操作: (AX)-((DI)),(DI)←(DI)±2
(4)存串指令
STOS DST
STOSB (字节操作)
STOSW (字操作)
字节操作:((DI))←(AL),(DI)←(DI)±l
字操作: ((DI))←(AX),(DI)←(DI)±2
(5)取串指令
LODS
LODSB (字节操作)
LODSW (字操作)
字节操作:(AL)←((SI)),(SI)←(SI)±1
字操作: (AX)←((SI)),(SI)←(SI)±2
取串指令举例:
mov si,buf
mov cx,30
cld
lods(相当于 mov al,[si] inc si 这两个指令)
串操作指令与重复操作前缀的搭配:
REP 存串、串传送指令
REPE/REPZ 串比较指令REPNE/REPNZ 串搜索指令
无 取串指令