《字符串指令》PPT课件.ppt

上传人:牧羊曲112 文档编号:5491650 上传时间:2023-07-12 格式:PPT 页数:55 大小:284.49KB
返回 下载 相关 举报
《字符串指令》PPT课件.ppt_第1页
第1页 / 共55页
《字符串指令》PPT课件.ppt_第2页
第2页 / 共55页
《字符串指令》PPT课件.ppt_第3页
第3页 / 共55页
《字符串指令》PPT课件.ppt_第4页
第4页 / 共55页
《字符串指令》PPT课件.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《《字符串指令》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《字符串指令》PPT课件.ppt(55页珍藏版)》请在三一办公上搜索。

1、第9章 字符串指令,9.1 字符串指令的性质 9.2 指令重复前缀 9.3 字符串传送、装入与存储指令 9.4 字符串的比较与扫描 9.5 字符串指令的应用,9.1 字符串指令的性质,为方便对字符串进行操作,简化程序设计,指令系统提供了类字符串操作指令。MOVS:从存储器中的某一位置传送一个字节或字到存储器的另一位置。LODS:从存储器中取一个字节或字数据装入寄存器AL或AX中。,STOS:将AL或AX寄存器的内容存入存储器中。CMPS:两个数据块里的字符串进行比较(字节串或字串的比较)。SCAS:AL或AX的内容与存储器中的字符串进行比较。利用指令重复前缀还可实现字符串指令的重复处理。字符串

2、指令都要求先把数据串首元素(或者最后一个元素)的地址,放在指定的索引寄存器中,每处理一个数据元素,字符串指令本身自动把索引寄存器的内容做相应的变化(增值或减值),使其指向下一个待处理的元素。,各种字符串操作指令具有一些共同的特征:(1)用SI来指定在数据段DS 中源字符串的起始地址(第一个字符的段内偏移地址)。(2)用DI来指定在另一个数据段ES中的字符串起始地址(第二个字符的段内偏移地址)。(3)用CX来指定所要处理字符串的总长度。若以字节方式来处理字符串:用CX的值反映字符串所有字符的个数;若以字的方式来处理字符串,则CX的值应为字符串中所有字符个数的1/2。,(4)标志位DF决定字符串操

3、作方向,是按增量还是减量增值。若DF=0,递增,字节操作时加1,字操作时加2;若DF=1,递减,字节操作时减1,字操作时减2。(5)每执行一条字符串操作指令只能完成字符串中一个字或一个字节的操作,同时自动修改SI 和DI 的内容,以指向字符串中下一个元素;SI、DI和CX都要发生相应的变化。(6)使用时,在它们的前面放置指令前缀,可提高处理速度,增强处理能力。以下列出每一条字符串指令所用到的寄存器和指令格式。假设DI和SI包含了正确的偏移地址。,指令 隐含操作 字节格式 字格式MOVS DI,SI MOVSB MOVSWLODS AL,SI or AX,SI LODSB LODSWSTOS D

4、I,AL or DI,AX STOSB STOSWCMPS SI,DI CMPSB CMPSWSCAS DI,AL or DI,AX SCASB SCASW,9.2 指令重复前缀,虽然字符串指令只允许一次处理一个字节或一个字数据,但是字符串操作指令前均可以加REP 指令重复前缀,以实现对字符串中数据的重复处理。指令重复前缀包括无条件指令重复前缀REP、条件指令重复前缀REPE/REPZ与REPNE/REPNZ,它们必须置于字符串指令之前,其间用空格间隔,不能单独使用。,使用指令重复前缀,还必须先将重复的次数送入CX。每执行一次字符串操作指令,CX自动减1,直到CX=0时终止重复。方向标志位决定

5、重复运算的方向:(1)使用CLD指令,设定DF=0;寄存器SI、DI由低地址到高地址变化。(2)使用STD指令,设定DF=1;寄存器SI、DI由高地址到低地址变化。使用指令重复前缀的一般格式为:指令重复前缀 字符串指令,9.2.1 无条件重复前缀REP 指令有四种格式:REP MOVSB/MOVSW/STOSB/STOSW REP将使得紧跟其后的字符串操作指令无条件地重复执行CX寄存器中内容指定的次数,直到CX=0为止。它通常用在字符串传送指令(MOVS)、字符串存储指令(STOS)之前。若CX的初值为0,则字符串指令一次也不执行。,例9.1 从字符串1(STRING1)搬移20个字节数据到字

6、符串2(STRING2)。假设,DS、ES属于同一数据段(即DS与ES相同)。STRING1 DB 20 DUP(*)STRING2 DB 20 DUP()CLD;清除DF标志位 MOV CX,20;设定20个字节数据长度,LEA DI,STRING2;设定接收名字 LEA SI,STRING1;设定送出位地址 REP MOVSB;将STRING1搬移到STRING2,9.2.2 条件重复前缀REPE(REPZ)/REPNE(REPNZ)字符串比较指令CMPS与字符串扫描指令SCAS也会影响状态标志,使指令的执行在指定的条件下能够立即停止。为配合此目的,REP还有两种条件重复形式:REPE和R

7、EPNE。与REPE配合使用的指令有以下4种格式:REPE(或REPZ)SCASB(SCASW CMPSB CMPSW)REPE与REPZ功能相同;其重复执行字符串操作指令的条件是CX0,且ZF=1。,它们用在字符串比较和字符串扫描指令之前,用于通过相等比较,寻找字符串中不相等的字节数据或字数据。另外,与REPNE配合使用的指令亦有以下4种格式:REPNE(或REPNZ)SCASB(SCASW CMPSB CMPSW)REPNE与REPNZ功能相同;其重复执行字符串指令的条件是CX0,且ZF=0。它们与REPE/REPZ指令一样,用在字符串比较和字符串扫描指令之前。但它们通常用于不相等比较,以

8、寻找字符串中相等的字节数据或字数据。,9.3 字符串传送、装入与存储指令,9.3.1 字符串传送指令MOVS 在例6.4中搬移9个字节数据的程序中使用了3条设定初值的指令,循环体中使用了5条指令。现在,若用一条字符串传送指令MOVS与REP配合,再加上一条设定CX长度值的指令,就可以实现例6.4的效果。,接收字符串(目的)时,以ES:DI作为数据区的首地址。取出字符串(源)时,以DS:SI为数据区的首地址。在程序的开始,需要先设定ES和DS的初值;在执行MOVS指令之前,先使用LEA指令来设定DI和SI的初值。依DF标志位为0或1,MOVS递增或递减DI和SI中的值。,REP MOVSB的指令

9、等价为:JCXZ LABEL2 LABEL1:MOV AL,SI MOV DI,AL INC/DEC DI INC/DEC SI LOOP LABEL1 LABEL2:,例9.2中,子程序C10MVSB使用MOVSB指令复制10个字节数据,一次一个字节从NAME1复制到NAME2。第一条指令CLD将方向标志位DF清0,使得字符串的处理按递增方向进行。DF在执行之前通常为0,但在此使用CLD更是明智的做法。两条LEA指令将NAME1和NAME2的偏移地址送入SI和DI中,在这之前也要设定 DS、ES的初值为字符串的段地址;所以,ES:DI和DS:SI的段地址、偏移地址是正确无误的,注意:一个CO

10、M的程序将会自动地设定DS、ES段寄存器的初值。,MOV指令设定CX的初值为10(NAME1与NAME2的长度)。REP MOVSB指令的功能如下:(1)将NAME1(DS:SI)开始的第一个字节数据复制到NAME2(ES:DI)开始的第一个字节单元中。(2)DI与SI加1,准备处理下一个字节数据。(3)CX减1。(4)重复上述操作,直到CX成为0。,因为DF=0,MOVSB指令使SI和DI分别加1,每次向高地址循环处理一个数据,从NAME1复制NAME2。若DF=1,MOVSB指令使SI与DI分别减1,由高地址向低地址处理;不过在此情况下,需要将SI和DI的初值设定为NAME1+9和NAME

11、2+9。例9.2中的另外一个子程序D10MVSW,使用MOVSW一次复制一个字数据;因为MOVSW指令使DI和SI每次加2,所以复制10个字节仅需要循环5次。若由高地址到低地址依次复制,应将SI的初值设为NAME1+8,将DI的初值设为NAME2+8。,9.3.2 字符串装入指令LODS LODS指令是从存储器中装入一个字节到AL或一个字到AX;存储器地址由DS:SI决定,DF方向标志位为0或 1,决定SI寄存器递增或递减。因为LODS是装入寄存器的操作,REP对此指令没有用处;平常一条简单的MOV指令也可完成这个功能,但使用MOV指令通常会配合使用三条指令;而LODS指令只需要一条。你可以使

12、用LODS指令一次一个字节或一个字连续地检查一个特定的值。,与LODSB相等价的指令为:MOV AL,SI INC SI 例9.2中,子程序E10LODS只处理一个字数据,将NAME1第一个字数据(As)搬入AX寄存器;第一个字节搬入AL,第二个字节搬入AH,所以AX内容为sA。,9.3.3 字符串存储指令STOS STOS指令将AL或AX寄存器的内容,一个字节数据或一个字数据存入存储器中;存储器地址取决于ES:DI。STOS指令由DF方向标志位为0或1决定DI寄存器是递增还是递减;当为字节操作时,加1或减1;当为字操作时,加2或减2。,一条带有REP的STOS指令的实际应用是设定数据区的起始

13、值。例如,将显示区清理成空白,其长度放于CX中。等价于REP STOSB的指令为:JCXZ LABEL2LABEL1:MOV DI,AL INC/DEC DI LOOP LABEL1 LABEL2:,子程序F10STOS说明了STOSW指令的使用,此子程序重复5次将十六进制2020存入NAME3。将AL存入第一个字节单元,将AH存入下一个字节单元;结束时,DI寄存器为NAME3+10的地址。,例9.2 字符串指令的应用。源程序清单如下:;filename:L92.ASM TITLE STRING.(EXE)TESTS OF STRING OPERATIONS;STACKSG SEGMENT P

14、ARA STACK Stack DW 32 DUP(?)STACKSG ENDS;,DATASG SEGMENT PARA Data NAME1 DB Assemblers;Data items NAME2 DB 10 DUP()NAME3 DB 10 DUP()DATASG ENDS;CODESG SEGMENT PARA CodeBEGIN PROC FAR;Main procedureASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG,PUSH DSSUB AX,AXPUSH AXMOV AX,DATASGMOV DS,AXMOV ES,AXC

15、ALL C10MVSB;MVSB subroutineCALL D10MVSW;MVSW subroutineCALL E10LODS;LODSB subroutine,CALL F10STOS;STLSB subroutineCALL G10CMPS;CMPSB subroutineCALL H10SCAS;SCASB subroutine RETBEGIN ENDP;Use of MOVSB;,C10MVSB PROC NEARCLDLEA SI,NAME1LEA DI,NAME2MOV CX,10REP MOVSBRETC10MVSB ENDP;,;Use of MOVSW;D10MVS

16、W PROC NEARCLDLEA SI,NAME2LEA DI,NAME3MOV CX,05REP MOVSWRETD10MVSW ENDP;,;Use of LODSW;E10LODS PROC NEARCLDLEA SI,NAME1LODSWRETE10LODS ENDP;Use of STOSW,;F10STOS PROC NEARCLDLEA DI,NAME3MOV CX,05MOV AX,2020HREP STOSWRETF10STOS ENDP,;Use of CMPSB;G10CMPS PROC NEARCLDMOV CX,10LEA SI,NAME1LEA DI,NAME2R

17、EPE CMPSBJNE G20MOV BH,01,G20:MOV CX,10LEA SI,NAME2LEA DI,NAME3REPE CMPSBJE G30MOV BL,02G30:RETG10CMPS ENDP;Use of SCASB,;H10SCAS PROC NEARCLDMOV CX,10LEA DI,NAME1MOV AL,mREPNE SCASBJNE H20MOV AH,03,H20:RETH10SCAS ENDP;CODESG ENDSEND BEGIN,9.4 字符串的比较与扫描,本节介绍字符串比较指令CMPS和字符串扫描指令SCAS,然后介绍它们的应用。9.4.1 字符

18、串比较指令CMPS CMPS比较一个存储器单元的内容与另外一个存储器单元的内容,并设定AF、CF、OF、PF、SF与ZF标志位;同时CMPS根据DF方向标志位为0或1,递增或递减SI与DI寄存器的值,以字节数据操作时加1或减1,以字数据操作时加2或减2。,当CMPS与指令前缀和CX连用时,CMPS可以连续比较任意个字节或字。指令有4种格式:REPE(或REPZ)CMPSB REPE(或REPZ)CMPSW REPNE(或REPNZ)CMPSB REPNE(或REPNZ)CMPSW,例9.2中,子程序G10CMPS包含了使用CMPSB的两个例子。第一个例子比较NAME1与NAME2;由于子程序C

19、10MVSB中的REP MOVSB,将NAME1的内容复制到NAME2,因此REPE CMPSB连续比较10个字节数据,并产生一个相等/零的结果:SF标志位为0,ZF标志位为1。第二个例子比较NAME2与NAME3,先前STOSW将空格存入NAME3,因此REPE CMPSB将在比较第一个字节之后停止操作,并产生一个高于/不相等的结果:SF标志位为0,ZF标志位为0。,第一个例子的结果为相等/零,并将01送到BH寄存器。第二个例子产生不相等的情况并将02送到BL寄存器。如果你使用DEBUG来追踪指令的执行,在子程序G10CMPS的最后,BX寄存器的内容应为0102。,注意:这些使用CMPSB的

20、例子中。一次只比较一个字节组数据。如果使用CMPSW一次比较一个字数据,则CX之初值须为5,但这些都不是问题,问题在于比较字数据时,CMPSW将字数据内的两个字节反向排列;例如,比较“SAMUEL”与“ARNOLD”这两个字字符串时,因为是字数据比较,所以SA与AR实际比较应是AS与RA做比较,所以原本是高于就成了低于;因此,CMPSW只有在数据定义为DW、DD或DQ的数据类型时才有正确的结果。,9.4.2 字符串扫描指令SCAS SCAS与CMPS有许多的差别,因为SCAS是扫描一个字符串以找出特定的字节或字;SCAS是将一连续存储器单元的内容(ES:DI)与AL或AX寄存器的内容比较,依D

21、F方向标志位为0或1,递增或递减DI寄存器;字节操作时DI加1或减1,字操作时DI加2或减2。SCAS设定标志位AF、CF、OF、PF、SF和ZF。当与指令前缀和CX合用时,SCAS能扫描任意长度的字符串。,SCAS还有一个特别的用途是用作文字编辑,例如,在程序中扫描标点符号,如逗号、句号、空格等。例9.2中,子程序H10SCAS扫描NAME1字符串中的小写字母m。方法是:SCAS运算在比较二者不相等时连续扫描直到二者相等或CX=0时才停止。如:REPNE SCASB 因为NAME1内容为Assemblers,所以在第5次扫描比较时会相等。如果使用DEBUG来追踪指令执行的过程,在H10SCA

22、S最后将发现AH寄存器内容为03,表示m被找到。REPNE SCASB运算也将CX的值由10递减为06。,SCASW扫描存储器中的一字字符串,与AX寄存器中的一个字相比较。如果你使用LODSW或MOV将一个字传送到AX寄存器中,第一个字节将在AL中,第二个字节将在AH中。因为SCASW的比较是以反向顺序为准,故其结果将正确无误。SCAS指令常用来从一个字符串中查找一个指定的字符。,9.4.3 扫描与替换 在实际中可能用某个字符代替另一个字符。下面的程序片段是扫描字符串中的“&”符号并以空格(20H)替换,如果SCASB找到“&”,则结束运算。“&”出现于STRING+8的位置,将DI减1(修正

23、)为替换的空格地址。STRLEN EQU 15;STRING的长度 STRING DB The time&is now,CLDMOV AL,&;搜寻&关键字MOV CX,STRLEN;送STRING的长度LEA DI,STRING;STRING的首地址REPNE SCASB;扫描JNZ K20;是否发现?DEC DI;是,则调整地址MOV BYTE PTRDI,20H;以空格替换K20:RET,9.5 字符串指令的应用,在应用程序设计中,经常会遇到各种字符或字符串的处理。在系统软件中,对大量字符串的操作则更加频繁。因此,字符串的处理是计算机应用的一个重要方面。,例9.3 口令设置程序。程序执行

24、首先显示提示:Please input the password:(请输入口令:)如果用户输入正确的口令:USER 则输出:OK!WELCOME YOU否则显示提示:Error!Input again:(有错误请重新输入:)三次口令输入不对,就退出。,口令设置,实际上就是两个字符串进行比较看它们是否相等。源程序清单如下:,;filename:L93.ASM;DATA SEGMENTPASSWORD DB USER,0DHCOUNT EQU$PASSWORDINPUT DB COUNT,DB?STRING DB COUNT DUP(?)PROMPT DB Please input the pas

25、sword:$MSG1 DB OK!WELCOME YOU,0DH,0AH,$MSG2 DB Error!Input again:$DATA ENDS;CODE SEGMENT ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,OFFSET PROMPT MOV AH,09H INT 21H MOV BX,3,AGAIN:LEA DX,INPUT MOV AH,0AH INT 21H LEA SI,PASSWORD LEA DI,STRING MOV CX,COUNT CLD REPE CMPS JZ EXIT,CALL CRLF LEA DX,MSG2 MOV AH,9 INT 21H DEC BX JNZ AGAIN,JMP DONEEXIT:CALL CRLF LEA DX,MSG1 MOV AH,09H INT 21HDONE:MOV AH,4CH INT 21H;,CRLF PROC MOV AH,02H MOV DL,0DH INT 21H MOV DL,0AH INT 21H RETCRLF ENDP;CODE ENDS END START,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号