四、串操作类指令 串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。 1.重复指令前缀 串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2所示。
2.串指令 串指令共有五种,具体见表3。 对串指令要注意以下几个问题: (1) 各指令所使用的默认寄存器 SI(源串地址),DI(目的地址),CX(字串长度),AL(存取或搜索的默认值)。 (2) 源串在数据段,目的串在附加段。
(3) 方向标志与地址指针的修改。 DF=1,则修改地址指针时用减法;DF=0时,则修改地址指针时用加法,MOVS、STOS、LODS指令不影响标志位。 MOVS指令的功能 把数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后,根据方向标志DF及所传送数据的类型(字节或字)对SI及DI进行修改,在指令重复前缀REP的控制下,可将数据段中的整串数据传送到附加段中去。 【例2】 在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;MESS2为附加段中用以存放字符串区域的首地址。 实现上述功能的程序段如下: LEA SI,MESS1 ;置源串偏移地址 LEA DI,MESS2 ;置目的串偏移地址 MOV CX,17 ;置串长度 CLD ;方向标志复位 REP MOVSB ;字符串传送 其中,最后一条指令也可写成 REP MOVS ES:BYTE PTR[DI],DS:[SI] 或 REP MOVS MESS2,MESS1 CMPS指令的功能 把数据段中由SI间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作,使比较的结果影响标志位,然后根据方向标志DF及所进行比较的操作数类型(字节或字)对SI及DI进行修改,在指令重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字),或者第一个相等的字节(或字)。 【例3】在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。 实现上述功能的程序段如下; LEA SI,MESS1 ;装入源串偏移地址 LEA DI,MESS2 ;装入目的串偏移地址 MOV CX,17 ;装入字符串长度 CLD ;方向标志复位 REPE CMPSB 上述程序段执行之后,SI或DI的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符.则当比较完毕后,CX=0,退出重复操作状态。 ·SCAS指令的功能 用由指令指定的关键字节或关键字(分别存放在AL及AX 寄存器中),与附加段中由DI间接寻址的字节串(或字串)中的一个字节(或字)进行比较操 作,使比较的结果影响标志位,然后根据方向标志DF及所进行操作的数据类型(字节或字) 对DI进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字)匹配的字节(或字),或者搜索第一个与关键字节(或字)不匹配的字节(或字)。 【例4】在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H)。 实现上述功能的程序段如下: LEA DI,MESS2 ;装入目的串偏移地址 MOV AL,20H ;装入关键字节 MOV CX,17 ;装入字符串长度 REPNE SCASB 上述程序段执行之后,DI的内容即为相匹配字符的下一个字符的地址,CX中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字),则当查完之后(CX)=0退出重复操作状态。 STOS指令的功能 把指令中指定的一个字节或一个字(分别存放在AL及AX寄存器中),传送到附加段中由DI间接寻址的字节内存单元(或字内存单元)中去,然后,根据方向标志DF及所进行操作的数据类型(字节或字)对DI进行修改操作。在指令重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。 【例5】要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可用下列程序段实现: LEA DI,MESS2 ;装入目的区域偏移地址 MOV AL,00H ;为清零操作准备 MOV CX,5 ;设置区域长度 REP STOSB LODS指令的功能 从串中取指令实现从指定的字节串(或字串)中读出信息的操作。 【例6】比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。 CLD LEA DI,ES:DEST LEA SI,SOURCE MOV CX,500 REPE CMPSB JCXZ NEXT MATCH:DEC SI MOV AL,BYTE PTR[SI] NEXT:
|
电工学习网 ( )
GMT+8, 2021-12-6 20:45