若要处理连续内存单元中的一批数据,通常需要借助于循环。80x86CPU提供了一组串操作指令,可用来处理内存中的数据(字节、字、双字)串。这些指令包括MOVS\LODS\STOS\SCAS\CMPS。为了指出操作对象的长度,在助记符后加上B\W\D,分别表示操作类型为字节、字、双字。
1、MOVS(Move String):串传送
MOVS指令的语法格式为:
MOVSB
MOVSW
MOVSD
功能:
ES:[DI] =DS:[SI];
if(DF=0) then
SI=SI+size;
DI=DI+size;
else
SI=SI-szie;
DI=DI-size;
endif
其中size等于1(B)、2(W)、4(D)
MOVSB\MOVSW\MOVSD将DS:SI所指源串的一个字节、字、双字复制到ES:DI所指的内存单元。然后,若DF=0,则SI和DI增加1,2,4.否则SI和DI减少1,2,4。
对标志位的影响:无
其中涉及到串寻址方式
源操作数用寄存器SI寻址,默认在数据段DS中,但是允许段超越:DS:[SI]
目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]
因此
MOVSB:字节串传送
ES:[DI]<-DS:[SI]
SI<-SI+(-)1,DI<-DI+(-)1
MOVSW:字串传送
ES:[DI]<-DS:[SI]
SI<-SI+(-)2,DI<-DI+(-)2
2、STOS(Store String):串存储
STOS指令的语法格式为:
STOSB
STOSW
STOSD
功能:
ES:[DI]=AL\AX\EAX;
if(DF=0) then
DI=DI+size;
else
DI=DI-size;
endif
STOSB\STOSW\STOSD将AL\AX\EAX的值复制到ES:DI所指的内存单元,然后,若DF=0,则DI增加1,2,4。否则DI减少1,2,4。
对标志位的影响:无
因此
STOSB:字节串存储
ES:[DI]<-AL
DI<DI+(-)1
STOSW:字串存储
ES:[DI]<-AX
DI<-DI+(-)2
3、LODS(Load String):串读取\串装入
LODS指令的语法格式为:
LODSB
LODSW
LODSD
功能:
AL\AX\EAX=DS:[SI];
if(DF=0) then
SI=SI+szie;
else
SI=SI-szie;
endif
LODSB\LODSW\LODSD将DS:SI所指源串的一个字节、字、双字复制到AL\AX\EAX,然后,若DF=0,则SI增加1,2,4。否则SI减少1,2,4。
对标志位的影响:无
因此
LODSB:字节串读取
AL<-DS:[SI]
SI<-SI+(-)1
LODSW:字串读取
AX<-DS:[SI]
SI<-SI+(-)2
4、CMPS(Compare String):串比较
CMPS指令的语法格式为:
CMPSB
CMPSW
CMPSD
功能:
DS:[SI] - ES:[DI];
if(DF=0) then
SI=SI+size;
DI=DI+size;
else
SI=SI-size;
DI=DI-size;
CMPSB\CMPSW\CMPSD将DS:SI所指源串的一个字节、字、双字与ES:DI所指目的串的一个字节、字、双字进行比较,根据比较结果设置标志位。然后,若DF=0,则SI和DI增加1,2,4。否则SI和DI减少1,2,4。
对标志位的影响:有,同CMP
因此
CMPSB:字节串比较
DS:[SI] - ES:[DI]
SI<-SI+(-)1,DI<-DI+(-)1
CMPSW:字串比较
DS:[SI] - ES:[DI]
SI<-SI+(-)2,DI<-DI+(-)2
5、SCAS(Scan String):串扫描
SCAS指令的语法格式为:
SCASB
SCASW
SCASD
功能:
AL\AX\EAX - ES:[DI];
if(DF=0) then
DI=DI+size;
else
DI=DI-size;
endif
SCASB\SCASW\SCASD将AL\AX\EAX于ES:DI所指目的串的一个字节、字、双字进行比较,根据比较结果设置标志位。然后,若DF=0,则DI增加1,2,4。否则DI减少1,2,4。
对标志位的影响:有,同CMP
因此
SCASB:字节串扫描
AL - ES:[DI]
DI=DI+(-)1
SCASW:字串扫描
AX - ES:[DI]
DI=DI+(-)2
以上串操作指令具有下列共性:
1、DS:SI指向源串,ES:DI指向目的串
2、SI和DI自动增加或者减少1,2,4,关键要看DF的值以及操作类型是字节、字、双字。若DF=0,则SI和DI增加,否则减少。
6、重复前缀指令(repeat)
当以上5种串操作指令与重复前缀REP,REPZ\REPE,REPNZ\REPNE结合使用时,可以处理整个数据串。
重复前缀分2类,3条指令:
1、配合不影响标志的MOVS\STOS\LODS指令的REP前缀
2、配合影响标志的CMPS\SCAS指令的REPZ\REPNA前缀
(1)REP:重复
REP指令的语法格式为:
当cx<>0时,重复执行后面的串指令(每执行一次,cx=cx-1)
只能用在MOVS\LODS\STOS之前
功能:
使其后的一条串指令重复执行cx次。若cx的初值为0,则不执行任何操作。
说明:
REP LODS: AL\AX\EAX 等于最后一次的装入值,故没有使用价值。REP LODSW\REP LODSD也类似;
REP STOSB: 将ES:DI所指内存单元的cx个字节均置为ALOREP STOSW,与REP STOSD也类似。
(2)REPZ\REPE:为零、等于时重复
REPZ\REPE指令的语法格式为:
当cx<>0且ZF=1时,重复执行后面的串指令
每执行一次,则cx=cx-1
只能用在CMPS\SCAS之前
(3)REPNZ\REPNE:非零、不等时重复
REPNZ\REPNE指令的语法格式为:
当cx<>0且ZF=0时,重复执行后面的串指令
每执行一次,cx=cx-1
只能用在CMPS\SCAS之前
说明:
若cx的初值为0,则不执行任何操作,而且标志位不变;
REPNE SCASB\REPNE SCASW\ REPNE SCASD适用于在多字节、字、双字数据结构种搜索特定值
参考书籍:
80x86汇编语言程序设计(第2版) 王成耀
汇编语言程序设计(第2版) 宋人杰 主编
汇编语言程序设计 肖刚强 张晓艳 王艳娟
汇编语言 王晓虹 毕于深 李飒