汇编语言——串操作指令

若要处理连续内存单元中的一批数据,通常需要借助于循环。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版) 宋人杰 主编
汇编语言程序设计 肖刚强 张晓艳 王艳娟
汇编语言 王晓虹 毕于深 李飒

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值