串操作
-
串操作的寻址方式:
源操作数指针———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仍保持指向重复前缀当前指令的地址
三种重复前缀:
REP
,只检查CX是否为0,为0则进行下一条指令。
与传送和存串结合。
REP MOVSB/MOVSW
REP STOSB/STOSW
REPE/REPZ
,检查CX(计数)和ZF(比较结果)寄存器,任何一个为0 都停止重复。
与扫描和比较结合。不同停止
REPZ CMPSB/CMPSW
REPZ SCASB/SCASW
REPNE/REPNZ
,检查CX(计数)和ZF(比较结果)寄存器,CX为0或ZF不为0 都停止重复。
与扫描和比较结合。相同停止
REPNZ CMPSB/CMPSW
REPNZ SCASB/SCASW
串传送
- 将
[DS:SI]
送入[ES:DI]
,如果加重复前缀,则可以复制源串到目的串 src
用DS:SI
寻址,dst
用ES:DI
寻址
MOVSB(字节) / MOVSW(字)
[DS:SI] -> [ES:DI]
REP MOVSB/MOVSW
串装入(取串)
将当前[SI]
中的值送入AL
或AX
,所以也没有必要进行重复操作
- 不能加重复前缀
- 默认装入
AL
或AX
寄存器 - 默认使用
DS
和SI
寄存器 - 不会改变FLAGS标志位
LODSB(字节) / LODSW(字)
[DS:SI] -> AL / [DS:SI] -> AX
对字:SI
每次加2
对字节:SI
每次加1
串存储(存串)
将AL
或AX
中的值送入[DI]
,加重复前缀,则可以使一段内存赋相同值
STOSB(字节) / STOSW(字)
AL -> [ES:DI] / AX -> [ES:DI]
REP STOSB/STOSW
- 可加重复前缀
- 默认使用
AL
或AX
寄存器 - 默认使用
ES
和DI
寄存器 - 不会改变FLAGS标志位
串比较
比较目的串和源串,只改变标志位,串本身不会变化
加重复前缀,则可以一直比较,直到达到重复前缀的条件
CMPSB(字节)/CMPSW(字)
[DS:SI] - [ES:DI]
REPZ CMPSB/CMPSW
串扫描(串搜索)
不断比较目的串和AL
或AX
寄存器,只影响标志位
如果加重复前缀,则可以一直比较,直到达到重复前缀的条件