《325串操作指令-精品文档资料系列.ppt》由会员分享,可在线阅读,更多相关《325串操作指令-精品文档资料系列.ppt(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、3.2.6 串操作指令串操作指令 l 串操作指令中源操作数地址由串操作指令中源操作数地址由DS:SI提供,提供,目的串操作数地址由目的串操作数地址由ES:DI提供。每条串操提供。每条串操作数指令每次仅对串中一个字或一个字节单元作数指令每次仅对串中一个字或一个字节单元进行查找,且根据进行查找,且根据DF标志自动修改标志自动修改SI/DI。l 为了便于对串中多个字或字节单元进行串为了便于对串中多个字或字节单元进行串操作,指令系统设置有重复前缀,重复次数由操作,指令系统设置有重复前缀,重复次数由CX中的内容确定,每执行一次,中的内容确定,每执行一次,CX内容减内容减1,而对而对CX的检测是在执行指令
2、前进行的,最多的检测是在执行指令前进行的,最多64K。 串操作指令之一:取字符串指令串操作指令之一:取字符串指令LODS LODSBLODSW将地址为将地址为DS:SI的一个字节的一个字节/字装入字装入AL/AX。串装串装入指令没有重复前缀。入指令没有重复前缀。串操作指令之二:写字符串指令串操作指令之二:写字符串指令REP STOS REP STOSBREP STOSW将将AL/AX的值存入地址为的值存入地址为ES:DI的内存单元。的内存单元。利用重复前缀利用重复前缀REP,可以建立一个取值相同的数可以建立一个取值相同的数据串。据串。串操作指令之三:串传送指令串操作指令之三:串传送指令MOVS
3、 MOVSBMOVSW将一个字节将一个字节/字字/双字从双字从DS:SI ES:DI指令前要先将源串首地址指令前要先将源串首地址 DS:SI 目标串首地址目标串首地址 ES:DI完成操作后自动修改完成操作后自动修改SI、DI,使其指向串的下一个元素使其指向串的下一个元素串操作方向由串操作方向由CLD和和STD指令设置指令设置CLD 地址递增方向(地址递增方向(DF=0)STD 地址递减方向(地址递减方向(DF=1)串操作指令之四:串比较指令串操作指令之四:串比较指令REPZ/ REPNZ CMPS REPZ /REPNZ CMPSBREPZ/ REPNZ CMPSW比较地址为比较地址为DS:S
4、I、ES:DI的两个字节的两个字节/字字/双字双字REPZ表示相等重复,即(表示相等重复,即(CX)0且(且(ZF)1继续比较;继续比较;REPNZ表示不等重复,即(表示不等重复,即(CX)0且(且(ZF)0继续比较;继续比较;比较指令前通常加重复前缀比较指令前通常加重复前缀REPZ/REPE,从而从而当发现两个串不同时结束比较。当发现两个串不同时结束比较。串操作指令之五:串扫描指令串操作指令之五:串扫描指令REPZ/ REPNZ SCAS REPZ /REPNZ SCASBREPZ/ REPNZ SCASW在首地址为在首地址为ES:DI的串中搜索某个关键字(字节的串中搜索某个关键字(字节/字
5、),该关键字必须放在字),该关键字必须放在AX或或AL中。中。指令前通常加重复前缀指令前通常加重复前缀REPNZ/REPNE,从而当从而当发现待搜索的元素时结束搜索。发现待搜索的元素时结束搜索。6.重复前缀(重复前缀(Repeat) REP 功能:若功能:若CX0,重复执行后缀的串指令,重复执行后缀的串指令,CXCX-1 若若CX=0,重复执行结束。,重复执行结束。 例:例:REP MOVSB REPE/REPZ 当相等当相等/为零时重复串操作。为零时重复串操作。 功能:若功能:若CX0,且,且ZF=1,重复执行后缀的串,重复执行后缀的串 指令,指令, CXCX- 1 若若CX=0,或,或ZF
6、=0,重复停止。,重复停止。REPNE/REPNZ 当不相等当不相等/不为零时不为零时重复串操作。重复串操作。 功能:若功能:若CX0,且,且ZF=0,重复执行后缀的,重复执行后缀的 串指令,串指令, CXCX- 1 若若CX=0或或ZF=1,重复停止。,重复停止。说明说明: LODS、STOS、MOVS不影响不影响FR,所以使用,所以使用REP。 CMPS、SCAS,结果要反映在,结果要反映在FR上,所以上,所以常使用常使用REPE/REPZ和和REPNE/REPNZ。1、对字节串、字串进行操作2、SI源隐含在DS可段跨越前缀DI目的隐含在ES不可段跨越前缀3、地址指针修改DF=0、SI、D
7、I增量DF=1减量可用STD使DF=1CLD使DF=04、执行时加重复操作前缀,重复次数放在CX中。串处理指令特点串处理指令特点执行串操作之前,应先做好:n(1)源串首地址(末地址) SIn(2)目的串首地址(末地址) DIn(3)串长度 CXn(4)建立方向标志(CLD使DF=0,STD使DF=1) 例题例题l例例1、将首地址为将首地址为SRC的源字符串传送到的源字符串传送到DEST为首地址的内存区,字符串的长度为为首地址的内存区,字符串的长度为N个字节。个字节。lCLD ;DF=0,增量方向增量方向lLEA SI,SRC ;DS:SI字符串首字符串首地址地址lLEA DI,ES:DEST
8、;ES:DI目标地址目标地址lMOV CX,N ;字符串长度;字符串长度lREP MOVSB ;重复字符串传送;重复字符串传送例例2、比较两个字符串是否有相同的元素,它们的首比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为地址和目标地址分别为SRC和和DEST,字符串的长,字符串的长度为度为N个字节。个字节。lCLD ;DF=0,增量方向,增量方向lLEA SI,SRC ;DS:SI字符串首地字符串首地址址lLEA DI,ES:DEST ;ES:DI目标地址目标地址lMOV CX,N ;字符串长度;字符串长度lREPNE CMPSB ;重复比较字符串;重复比较字符串lJNZ NOT
9、_FOUNT ;无相同的元素,转无相同的元素,转l NOT_FOUNT,否则继续执行下条指令,否则继续执行下条指令例题例题例例3、在首地址为在首地址为ES:DEST的字符串中检查是否有的字符串中检查是否有字符字符M,字符串的长度为,字符串的长度为N个字节。个字节。lCLD ;DF=0,增量方向,增量方向lLEA DI,ES:DEST ;ES:DI目标地址目标地址lMOV CX,N ;字符串长度;字符串长度lMOV AL,M ;AL搜索字符搜索字符lREPNE SCASB ;重复搜索字符串是否有字;重复搜索字符串是否有字 符符M例例4、将首地址为将首地址为DS:SRC的字节数据串中非的字节数据串中非0元素送到元素送到首地址为首地址为ES:DEST的内存区中。字符串长度为的内存区中。字符串长度为N。 CLD;DF=0,增量方向 LEA SI,SRC;DS:SI字符串首地址 LEA DI,ES:DEST;ES:DI目标地址 MOV CX,N;字符串长度GOON:LODSB;取字符串的一个元素 CMP AL,0;字符串元素为0吗? JZ NEXT;是0,继续下一个元素 STOSB;非0,存入首地址为ES:DEST的内存区中NEXT:DECCX JNEGOON
限制150内