0%

第四章-串操作

串操作特点

  1. 串操作指令使用专用的寻址方式:源操作数地址由DS:[SI]提供,目的操作数由ES:[DI]提供。
  2. 串操作指令每次只对串中的一个字或一个字节单元进行操作,并自动修改SI和(或)DI,使其指向下一个字或字节单元。
  3. 当标志位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恢复标志