串操作特点
- 串操作指令使用专用的寻址方式:源操作数地址由DS:[SI]提供,目的操作数由ES:[DI]提供。
- 串操作指令每次只对串中的一个字或一个字节单元进行操作,并自动修改SI和(或)DI,使其指向下一个字或字节单元。
- 当标志位DF=0时,SI和DI的修改为递增,即加2(字操作)或加1(字节操作)。当DF=1时,SI和DI的修改为递减,即减2或减1。
取串指令LODS
指令格式
LODS 源串名字
功能
将源串中的一个字或字节内容送入AX或AL中,并根据DF修改SI
由于源串是由SI指定,如果程序中在执行该指令时已经明确是字或字节,则可以用无操作数指令LODSB(字节操作)或LODSW(字操作)替代
存串指令STOS
指令格式
STOS 目的串
功能
将AX或AL中的内容送入目的串中的一个字单元或字节单元,并根据DF修改DI。
同样,指令可以用无操作数指令STOSB或STOSW替代。该指令对标志无影响。
串传送指令MOVS
指令格式
MOVS 目的串 源串
功能
将由SI指向的源串的一个字或字节传送到DI所指向的目的串中。并根据DF修改SI和DI
同样,指令可以用无操作数指令MOVSB或MOVSW替代。指令对标志无影响
串比较指令CMPS
指令格式
CMPS 源串,目的串
功能
将源串中的一个字节或字减去目的串中的一个字或字节,结果不回送。但将影响标志寄存器。同时,将根据DF修改SI和DI。
同样,指令可以用无操作数指令CMPSB或CMPSW替代
串搜索指令SCAS
指令格式
SCAS 目的串
功能
在目的串中查找AX或AL指定的内容。
查找的方法:用AX或AL的内容减去目的串中的一个字或字节,相减的结果反映在标志寄存器中。每查找一次,将按照DF修改DI。
同样,指令可以用无操作数指令SCASB或SCASW替代。
重复前缀REP
指令格式
REP
功能
在前面各种串指令之前加
重复内容由CX控制
举例:
REPE/REPZ 重复执行串操作指令的条件是:(CX)≠0和ZF=1
REPNE/REPNZ 重复执行串操作指令的条件是: (CX)≠0和ZF=0
字符串中查找指定字符
关键代码:REPNE SCASB 如果当前位置与AX相减使得ZF=1,说明两者相等,说明找到了,就要跳出REPNE
同时需要提前CLD将DF置为0,这样表示从前往后搜
KMP算法
冒泡排序
二分查找
为了便于移位,先将表长修改为\(2^n\)
使用BX记录当前对分点,DX记录每次对分后表的长度,向上查就是将BX减去DX中记录的对分后表长,向下查就是加上DX中记录的对分后表长
因为CMP会修改标志,所以需要再CMP前用PUSHF暂存标志,之后用POPF恢复标志