串操作指令

串操作

  • 串操作的寻址方式:
    源操作数指针———DS:SI(DS可超越)
    目的操作数指针——ES:DI

  • 每次串操作:
    串操作指令自动修改SI和DI——字节±1,字±2,DF标志决定±(DF=1,减量修改,DF=0,增量修改)。

  • 串操作指令执行前,须对SI、DI和DF进行设置,且把串的长度设置在CX中。

  • 源串地址由DS:SI指定(可用段超越前缀修改)目的串地址在ES:DI中

  • 串长送CX寄存器

  • 设置方向标志位DF
    当DF=0(指令CLD)时为增量修改(+1 或 +2)
    当DF=1(指令STD)时为减量修改(-1 或 -2)

  • 各指令所使用的默认寄存器是:SI(源串地址),DI(目的地址),CX(字串长度),AL(存、取或搜索的默认值)

  • 每条指令有两种形式,B对应Byte,W对应Word

重复前缀

  • 串操作很高效。一个指令就能执行一直自动加减,数据自动比较等功能。但是单独一条串指令只能进行一次(即CX-=1)。如果想对一串多个数据进行依次进行串操作,则需要加上重复前缀。
  • 重复操作有两个判断依据,一个是FLAGS里的标志位,一个是CX寄存器计数是否为零
  • 所以说重复前缀后面的串操作指令改变了FLAGS和CX寄存器,而重复前缀只是会去判断标志位
  • 尽管重复多次,但指令指针IP仍保持指向重复前缀当前指令的地址

三种重复前缀:

  1. REP,只检查CX是否为0,为0则进行下一条指令。
    与传送和存串结合。
REP MOVSB/MOVSW
REP STOSB/STOSW
  1. REPE/REPZ,检查CX(计数)和ZF(比较结果)寄存器,任何一个为0 都停止重复。
    与扫描和比较结合。不同停止
REPZ CMPSB/CMPSW
REPZ SCASB/SCASW
  1. REPNE/REPNZ,检查CX(计数)和ZF(比较结果)寄存器,CX为0或ZF不为0 都停止重复。
    与扫描和比较结合。相同停止
REPNZ CMPSB/CMPSW
REPNZ SCASB/SCASW



串传送

  • [DS:SI]送入[ES:DI],如果加重复前缀,则可以复制源串到目的串
  • srcDS:SI寻址,dstES:DI寻址
MOVSB(字节) / MOVSW(字)
   [DS:SI]  ->  [ES:DI]
REP MOVSB/MOVSW

在这里插入图片描述



串装入(取串)

将当前[SI]中的值送入ALAX,所以也没有必要进行重复操作

  • 不能加重复前缀
  • 默认装入ALAX寄存器
  • 默认使用DSSI寄存器
  • 不会改变FLAGS标志位
LODSB(字节)  /   LODSW(字) 
[DS:SI] -> AL / [DS:SI] -> AX

对字:SI每次加2
对字节:SI每次加1

在这里插入图片描述

在这里插入图片描述



串存储(存串)

ALAX中的值送入[DI],加重复前缀,则可以使一段内存赋相同值

STOSB(字节)  /   STOSW(字)
AL -> [ES:DI] / AX -> [ES:DI]
REP STOSB/STOSW
  • 可加重复前缀
  • 默认使用ALAX寄存器
  • 默认使用ESDI寄存器
  • 不会改变FLAGS标志位

在这里插入图片描述



串比较

比较目的串和源串,只改变标志位,串本身不会变化
加重复前缀,则可以一直比较,直到达到重复前缀的条件

CMPSB(字节)/CMPSW(字)
[DS:SI] - [ES:DI]
REPZ CMPSB/CMPSW

在这里插入图片描述



串扫描(串搜索)

不断比较目的串和ALAX寄存器,只影响标志位
如果加重复前缀,则可以一直比较,直到达到重复前缀的条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值