前言:学习X86指令体系下的字符串操作指令
串操作数存放在内存当中,串的首地址存放在指定的寄存器中,每执行1次串操作指令,串操作数地址会自动调整,这样便可以完成对一个数据串的操作
串操作数的寻址
源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:ES:[SI]
目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:DS:[DI]
每执行一次串操作指令,SI和DI都会自动修改:±1(字符串)或±2(字串)
如何确定+还是➖呢?通过两个指令CLD和STD来确定:执行指令CLD指令后,DF = 0,地址指针增1或2;执行STD指令之后,DF = 1,地址指针减1或2
在操作数指令执行前都应明确给出:源操作数地址、目的操作数地址、数据串长度(存于CX寄存器)、地址方向的变化(自动增加或减少)
串传送指令
串传送指令就是将一串连续存放的数据移到内存的另一个地方,分为字串传送和字节串传送。本指令不影响标志bb
指令格式:
(1):MOVSB:字节传送指令,将源字节串传送到目的地址,地址自动增减1,即ES:[DI] ⬅ DS:[SI];SI ⬅ SI ± 1,DI ⬅ DI ± 1
(2):MOVSW:字传送指令,将源字串传送到目的地址,地址自动增减2,即ES:[DI] ⬅ DS:[SI];SI ⬅ SI ± 2,DI ⬅ DI ± 2
串传送的方向可以是正向的也可以是反向的,有时只能是正向的或者反向,要根据源串和目标串是否有重叠来判断
串存储指令
将把AL或AX数据传送至目的地址,串为目的操作数,地址为ES:[DI]。本指令不影响标志。分字串存储指令和字节串存储指令
指令格式:
(1):STOSB:字节串存储指令,将AL寄存器的内容传送到ES:[DI]地址中,地址自动增减1,即ES:[DI] ⬅ AL,DI ⬅ DI ± 1
(2):STOSW:字串存储指令,将AX寄存器的内容传送到ES:[DI]地址中,地址自动增减2,即ES:[DI] ⬅ AX,DI ⬅ DI ± 2
串比较指令
串指令用于比较两个数据串是否相等。将主存中的操作数减去目的操作数,通过标志位状态比较两操作数之间的关系。本指令按照减法指令设置标志
指令格式:
- CMPSB:将源字符串的操作数减去目的字符串的操作数,地址自动增减1,即DS:[SI] - ES:[DI],SI ⬅ SI ± 1,DI ⬅ DI ± 1
- CMPSW:将源字串的操作数减去目的字串的操作数,地址自动减2,即DS:[SI] - ES:[DI],SI ⬅ SI ± 2,DI ⬅ DI ± 2
串扫描指令
在数据串中搜索一个数据放入AL,AX中,将AL/AX减去目的操作数,根据标志状态比较AL/AX与操作数的关系
指令格式
- SCASB:字符串扫描指令,将AL寄存器的内容减去目的串中ES:[DI]的内容,地址地址自动增减1,即AL - ES:[DI],DI ⬅ DI + 1
- SCASW:字串扫描指令,将AX寄存器的内容减去目的串中ES:[DI]的内容,地址地址自动增减2,即AX - ES:[DI],DI ⬅ DI + 2
重复前缀指令
串操作指令执行一次,仅对数据串中的一个字节或字进行操作。
串操作指令前都可以加一个重复前缀,实现串操作的重复执行,重复次数隐含在CX中
重复前缀指令不能单独使用,应写在串操作指令前
指令格式:
REP MOVS/REP STOS/REP LODS
指令功能:如CX = 0,退出串操作,CX≠0,CX ⬅ CX - 1,重复执行REP后面根的串操作指令,重复次数由CX控制
指令格式:
REPZ CMPS/REPZ SCAS
指令功能:
如CX = 0或ZF = 0,退出串操作,也就是说当CX ≠ 0且ZF = 1时,CX ⬅ CX - 1重复执行REPZ后跟的串操作指令,重复次数由CX控制
指令格式:
REPZN CMPS/REPNZ SCAS
指令功能:
如CX = 1或ZF = 1,退出串操作,也就是说CX ≠ 0且ZF = 0时,CX ⬅ CX - 1重复执行REPNZ后跟的串操作指令,重复次数由CX控制