首页 第9章 字符串指令

第9章 字符串指令

举报
开通vip

第9章 字符串指令null第9章 字符串指令 第9章 字符串指令 9.1 字符串指令的性质 9.2 指令重复前缀 9.3 字符串传送、装入与存储指令 9.4 字符串的比较与扫描 9.5 字符串指令的应用 9.1 字符串指令的性质9.1 字符串指令的性质 为方便对字符串进行操作,简化程序设计,指令系统提供了5类字符串操作指令。 MOVS:从存储器中的某一位置传送一个字节或字到存储器的另一位置。 LODS:从存储器中取一个字节或字数据装入...

第9章  字符串指令
null第9章 字符串指令 第9章 字符串指令 9.1 字符串指令的性质 9.2 指令重复前缀 9.3 字符串传送、装入与存储指令 9.4 字符串的比较与扫描 9.5 字符串指令的应用 9.1 字符串指令的性质9.1 字符串指令的性质 为方便对字符串进行操作,简化程序设计,指令系统提供了5类字符串操作指令。 MOVS:从存储器中的某一位置传送一个字节或字到存储器的另一位置。 LODS:从存储器中取一个字节或字数据装入寄存器AL或AX中。 null STOS:将AL或AX寄存器的内容存入存储器中。 CMPS:两个数据块里的字符串进行比较(字节串或字串的比较)。 SCAS:AL或AX的内容与存储器中的字符串进行比较。 利用指令重复前缀还可实现字符串指令的重复处理。字符串指令都 要求 对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗 先把数据串首元素(或者最后一个元素)的地址,放在指定的索引寄存器中,每处理一个数据元素,字符串指令本身自动把索引寄存器的内容做相应的变化(增值或减值),使其指向下一个待处理的元素。null 各种字符串操作指令具有一些共同的特征: (1) 用SI来指定在数据段DS 中源字符串的起始地址(第一个字符的段内偏移地址)。 (2) 用DI来指定在另一个数据段ES中的字符串起始地址(第二个字符的段内偏移地址)。 (3) 用CX来指定所要处理字符串的总长度。若以字节方式来处理字符串:用CX的值反映字符串所有字符的个数;若以字的方式来处理字符串,则CX的值应为字符串中所有字符个数的1/2。 null (4) 标志位DF决定字符串操作方向,是按增量还是减量增值。若DF=0,递增,字节操作时加1,字操作时加2;若DF=1,递减,字节操作时减1,字操作时减2。 (5) 每执行一条字符串操作指令只能完成字符串中一个字或一个字节的操作,同时自动修改SI 和DI 的内容,以指向字符串中下一个元素;SI、DI和CX都要发生相应的变化。 (6) 使用时,在它们的前面放置指令前缀,可提高处理速度,增强处理能力。以下列出每一条字符串指令所用到的寄存器和指令格式。假设DI和SI包含了正确的偏移地址。null指令 隐含操作 字节格式 字格式 MOVS DI,SI MOVSB MOVSW LODS AL,SI or AX,SI LODSB LODSW STOS DI,AL or DI,AX STOSB STOSW CMPS SI,DI CMPSB CMPSW SCAS DI,AL or DI,AX SCASB SCASW 9.2 指令重复前缀9.2 指令重复前缀 虽然字符串指令只允许一次处理一个字节或一个字数据,但是字符串操作指令前均可以加REP 指令重复前缀,以实现对字符串中数据的重复处理。 指令重复前缀包括无条件指令重复前缀REP、条件指令重复前缀REPE/REPZ与REPNE/REPNZ,它们必须置于字符串指令之前,其间用空格间隔,不能单独使用。 null 使用指令重复前缀,还必须先将重复的次数送入CX。每执行一次字符串操作指令,CX自动减1,直到CX=0时终止重复。方向标志位决定重复运算的方向: (1) 使用CLD指令,设定DF=0;寄存器SI、DI由低地址到高地址变化。 (2) 使用STD指令,设定DF=1;寄存器SI、DI由高地址到低地址变化。使用指令重复前缀的一般格式为: 指令重复前缀 字符串指令 null 9.2.1 无条件重复前缀REP 指令有四种格式: REP MOVSB/MOVSW/STOSB/STOSW REP将使得紧跟其后的字符串操作指令无条件地重复执行CX寄存器中内容指定的次数,直到CX=0为止。它通常用在字符串传送指令(MOVS)、字符串存储指令(STOS)之前。若CX的初值为0,则字符串指令一次也不执行。 null 例9.1 从字符串1(STRING1)搬移20个字节数据到字符串2(STRING2)。假设,DS、ES属于同一数据段(即DS与ES相同)。 STRING1 DB 20 DUP(‘*’) STRING2 DB 20 DUP(‘ ’) … CLD ;清除DF标志位   MOV CX,20 ;设定20个字节数据长度 null LEA DI,STRING2 ;设定接收名字 LEA SI,STRING1 ;设定送出位地址 REP MOVSB ;将STRING1搬移到STRING2 null 9.2.2 条件重复前缀REPE(REPZ)/REPNE(REPNZ) 字符串比较指令CMPS与字符串扫描指令SCAS也会影响状态标志,使指令的执行在指定的条件下能够立即停止。为配合此目的,REP还有两种条件重复形式:REPE和REPNE。 与REPE配合使用的指令有以下4种格式: REPE(或REPZ) SCASB(SCASW CMPSB CMPSW) REPE与REPZ功能相同;其重复执行字符串操作指令的条件是CX≠0,且ZF=1。 null 它们用在字符串比较和字符串扫描指令之前,用于通过相等比较,寻找字符串中不相等的字节数据或字数据。另外,与REPNE配合使用的指令亦有以下4种格式: REPNE(或REPNZ) SCASB(SCASW CMPSB CMPSW) REPNE与REPNZ功能相同;其重复执行字符串指令的条件是CX≠0,且ZF=0。 它们与REPE/REPZ指令一样,用在字符串比较和字符串扫描指令之前。但它们通常用于不相等比较,以寻找字符串中相等的字节数据或字数据。9.3 字符串传送、装入与存储指令9.3 字符串传送、装入与存储指令 9.3.1 字符串传送指令MOVS 在例6.4中搬移9个字节数据的程序中使用了3条设定初值的指令,循环体中使用了5条指令。现在,若用一条字符串传送指令MOVS与REP配合,再加上一条设定CX长度值的指令,就可以实现例6.4的效果。 null 接收字符串(目的)时,以ES:DI作为数据区的首地址。取出字符串(源)时,以DS:SI为数据区的首地址。在程序的开始,需要先设定ES和DS的初值;在执行MOVS指令之前,先使用LEA指令来设定DI和SI的初值。依DF标志位为0或1,MOVS递增或递减DI和SI中的值。 nullREP MOVSB的指令等价为: … JCXZ LABEL2 LABEL1: MOV AL,[SI] MOV [DI],AL INC/DEC DI INC/DEC SI LOOP LABEL1 LABEL2: null 例9.2中,子程序C10MVSB使用MOVSB指令复制10个字节数据,一次一个字节从NAME1复制到NAME2。第一条指令CLD将方向标志位DF清0,使得字符串的处理按递增方向进行。DF在执行之前通常为0,但在此使用CLD更是明智的做法。 两条LEA指令将NAME1和NAME2的偏移地址送入SI和DI中,在这之前也要设定 DS、ES的初值为字符串的段地址;所以,ES:DI和DS:SI的段地址、偏移地址是正确无误的,注意:一个COM的程序将会自动地设定DS、ES段寄存器的初值。 null MOV指令设定CX的初值为10(NAME1与NAME2的长度)。REP MOVSB指令的功能如下: (1) 将NAME1(DS:SI)开始的第一个字节数据复制到NAME2(ES:DI)开始的第一个字节单元中。 (2)  DI与SI加1,准备处理下一个字节数据。 (3)  CX减1。 (4) 重复上述操作,直到CX成为0。 null 因为DF=0,MOVSB指令使SI和DI分别加1,每次向高地址循环处理一个数据,从NAME1复制NAME2。若DF=1,MOVSB指令使SI与DI分别减1,由高地址向低地址处理;不过在此情况下,需要将SI和DI的初值设定为NAME1+9和NAME2+9。 例9.2中的另外一个子程序D10MVSW,使用MOVSW一次复制一个字数据;因为MOVSW指令使DI和SI每次加2,所以复制10个字节仅需要循环5次。若由高地址到低地址依次复制,应将SI的初值设为NAME1+8,将DI的初值设为NAME2+8。 null 9.3.2 字符串装入指令LODS LODS指令是从存储器中装入一个字节到AL或一个字到AX;存储器地址由DS:SI决定,DF方向标志位为0或 1,决定SI寄存器递增或递减。 因为LODS是装入寄存器的操作,REP对此指令没有用处;平常一条简单的MOV指令也可完成这个功能,但使用MOV指令通常会配合使用三条指令;而LODS指令只需要一条。你可以使用LODS指令一次一个字节或一个字连续地检查一个特定的值。 null 与LODSB相等价的指令为: MOV AL,[SI] INC SI 例9.2中,子程序E10LODS只处理一个字数据,将NAME1第一个字数据(As)搬入AX寄存器;第一个字节搬入AL,第二个字节搬入AH,所以AX内容为sA。 null 9.3.3 字符串存储指令STOS STOS指令将AL或AX寄存器的内容,一个字节数据或一个字数据存入存储器中;存储器地址取决于ES:DI。STOS指令由DF方向标志位为0或1决定DI寄存器是递增还是递减;当为字节操作时,加1或减1;当为字操作时,加2或减2。 null 一条带有REP的STOS指令的实际应用是设定数据区的起始值。例如,将显示区清理成空白,其长度放于CX中。等价于REP STOSB的指令为: JCXZ LABEL2 LABEL1: MOV [DI],AL INC/DEC DI LOOP LABEL1 LABEL2: … null 子程序F10STOS说明了STOSW指令的使用,此子程序重复5次将十六进制2020存入NAME3。将AL存入第一个字节单元,将AH存入下一个字节单元;结束时,DI寄存器为NAME3+10的地址。 null例9.2 字符串指令的应用。 源程序清单如下: ; filename:L92.ASM TITLE STRING.(EXE) TESTS OF STRING OPERATIONS ; ————————————————————— STACKSG SEGMENT PARA STACK ‘Stack’ DW 32 DUP (?) STACKSG ENDS ; ————————————————————— nullDATASG SEGMENT PARA ‘Data’ NAME1 DB ‘Assemblers’ ;Data items NAME2 DB 10 DUP (‘ ’) NAME3 DB 10 DUP(‘ ’) DATASG ENDS ; ————————————————————— CODESG SEGMENT PARA ‘Code’ BEGIN PROC FAR ;Main procedure ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG nullPUSH DS SUB AX, AX PUSH AX MOV AX, DATASG MOV DS, AX MOV ES, AX CALL C10MVSB ;MVSB subroutine CALL D10MVSW ;MVSW subroutine CALL E10LODS ;LODSB subroutine nullCALL F10STOS ;STLSB subroutine CALL G10CMPS ;CMPSB subroutine CALL H10SCAS ;SCASB subroutine RET BEGIN ENDP ;Use of MOVSB ; ————————————————————— nullC10MVSB PROC NEAR CLD LEA SI, NAME1 LEA DI, NAME2 MOV CX, 10 REP MOVSB RET C10MVSB ENDP ; ————————————————————— null;Use of MOVSW ; ————————————————————— D10MVSW PROC NEAR CLD LEA SI, NAME2 LEA DI, NAME3 MOV CX, 05 REP MOVSW RET D10MVSW ENDP ; ————————————————————— null;Use of LODSW ; ————————————————————— E10LODS PROC NEAR CLD LEA SI, NAME1 LODSW RET E10LODS ENDP ; ————————————————————— ;Use of STOSWnull; ————————————————————— F10STOS PROC NEAR CLD LEA DI,NAME3 MOV CX, 05 MOV AX, 2020H REP STOSW RET F10STOS ENDP null; ————————————————————— ;Use of CMPSB ; ————————————————————— G10CMPS PROC NEAR CLD MOV CX, 10 LEA SI, NAME1 LEA DI, NAME2 REPE CMPSB JNE G20 MOV BH, 01 nullG20: MOV CX, 10 LEA SI, NAME2 LEA DI, NAME3 REPE CMPSB JE G30 MOV BL, 02 G30: RET G10CMPS ENDP ; ————————————————————— ;Use of SCASB null; ————————————————————— H10SCAS PROC NEAR CLD MOV CX, 10 LEA DI, NAME1 MOV AL, ‘m’ REPNE SCASB JNE H20 MOV AH,03 nullH20: RET H10SCAS ENDP ; ————————————————————— CODESG ENDS END BEGIN 9.4 字符串的比较与扫描9.4 字符串的比较与扫描 本节介绍字符串比较指令CMPS和字符串扫描指令SCAS,然后介绍它们的应用。 9.4.1 字符串比较指令CMPS CMPS比较一个存储器单元的内容与另外一个存储器单元的内容,并设定AF、CF、OF、PF、SF与ZF标志位;同时CMPS根据DF方向标志位为0或1,递增或递减SI与DI寄存器的值,以字节数据操作时加1或减1,以字数据操作时加2或减2。 null 当CMPS与指令前缀和CX连用时,CMPS可以连续比较任意个字节或字。指令有4种格式: REPE (或REPZ) CMPSB REPE (或REPZ) CMPSW REPNE (或REPNZ) CMPSB REPNE (或REPNZ) CMPSW null 例9.2中,子程序G10CMPS包含了使用CMPSB的两个例子。第一个例子比较NAME1与NAME2;由于子程序C10MVSB中的REP MOVSB,将NAME1的内容复制到NAME2,因此REPE CMPSB连续比较10个字节数据,并产生一个相等/零的结果:SF标志位为0,ZF标志位为1。 第二个例子比较NAME2与NAME3,先前STOSW将空格存入NAME3,因此REPE CMPSB将在比较第一个字节之后停止操作,并产生一个高于/不相等的结果:SF标志位为0,ZF标志位为0。 null 第一个例子的结果为相等/零,并将01送到BH寄存器。第二个例子产生不相等的情况并将02送到BL寄存器。如果你使用DEBUG来追踪指令的执行,在子程序G10CMPS的最后,BX寄存器的内容应为0102。 null 注意:这些使用CMPSB的例子中。一次只比较一个字节组数据。如果使用CMPSW一次比较一个字数据,则CX之初值须为5,但这些都不是问题,问题在于比较字数据时,CMPSW将字数据内的两个字节反向排列;例如,比较“SAMUEL”与“ARNOLD”这两个字字符串时,因为是字数据比较,所以SA与AR实际比较应是AS与RA做比较,所以原本是高于就成了低于;因此,CMPSW只有在数据定义为DW、DD或DQ的数据类型时才有正确的结果。 null 9.4.2 字符串扫描指令SCAS SCAS与CMPS有许多的差别,因为SCAS是扫描一个字符串以找出特定的字节或字;SCAS是将一连续存储器单元的内容(ES:DI)与AL或AX寄存器的内容比较,依DF方向标志位为0或1,递增或递减DI寄存器;字节操作时DI加1或减1, 字操作时DI加2或减2。SCAS设定标志位AF、CF、OF、PF、SF和ZF。当与指令前缀和CX合用时,SCAS能扫描任意长度的字符串。 null SCAS还有一个特别的用途是用作文字编辑,例如,在程序中扫描标点符号,如逗号、句号、空格等。 例9.2中,子程序H10SCAS扫描NAME1字符串中的小写字母m。方法是:SCAS运算在比较二者不相等时连续扫描直到二者相等或CX=0时才停止。如: REPNE SCASB 因为NAME1内容为Assemblers,所以在第5次扫描比较时会相等。如果使用DEBUG来追踪指令执行的过程,在H10SCAS最后将发现AH寄存器内容为03,表示m被找到。REPNE SCASB运算也将CX的值由10递减为06。null SCASW扫描存储器中的一字字符串,与AX寄存器中的一个字相比较。如果你使用LODSW或MOV将一个字传送到AX寄存器中,第一个字节将在AL中,第二个字节将在AH中。因为SCASW的比较是以反向顺序为准,故其结果将正确无误。 SCAS指令常用来从一个字符串中查找一个指定的字符。 null 9.4.3 扫描与替换 在实际中可能用某个字符代替另一个字符。下面的程序片段是扫描字符串中的“&”符号并以空格(20H)替换,如果SCASB找到“&”,则结束运算。“&”出现于STRING+8的位置,将DI减1(修正)为替换的空格地址。 STRLEN EQU 15 ;STRING的长度 STRING DB ‘The time&is now’ nullCLD MOV AL,‘&’ ;搜寻‘&’关键字 MOV CX,STRLEN ;送STRING的长度 LEA DI, STRING ;STRING的首地址 REPNE SCASB ;扫描 JNZ K20 ;是否发现? DEC DI ;是,则调整地址 MOV BYTE PTR[DI],20H ;以空格替换 K20: RET9.5 字符串指令的应用9.5 字符串指令的应用 在应用程序设计中,经常会遇到各种字符或字符串的处理。在系统软件中,对大量字符串的操作则更加频繁。因此,字符串的处理是计算机应用的一个重要方面。 null 例9.3 口令设置程序。 程序执行首先显示提示: Please input the password: (请输入口令:) 如果用户输入正确的口令: USER↙ 则输出: OK!WELCOME YOU 否则显示提示: Error!Input again: (有错误请重新输入:) 三次口令输入不对,就退出。null 口令设置,实际上就是两个字符串进行比较看它们是否相等。源程序清单如下:; filename:L93.ASM ; ————————————————————— DATA SEGMENT PASSWORD DB ‘USER’,0DH COUNT EQU $—PASSWORD INPUT DB COUNT null DB ? STRING DB COUNT DUP(?) PROMPT DB ‘Please input the password:$’ MSG1 DB ‘OK!WELCOME YOU’,0DH,0AH, ‘$’ MSG2 DB ‘Error! Input again:$’ DATA ENDS ; ————————————————————— CODE SEGMENT ASSUME CS:CODE, DS:DATA nullSTART: MOV AX,DATA MOV DS, AX MOV ES,AX MOV DX, OFFSET PROMPT MOV AH,09H INT 21H MOV BX,3 nullAGAIN: LEA DX,INPUT MOV AH,0AH INT 21H LEA SI, PASSWORD LEA DI, STRING MOV CX,COUNT CLD REPE CMPS JZ EXIT null CALL CRLF LEA DX , MSG2 MOV AH,9 INT 21H DEC BX JNZ AGAIN null JMP DONE EXIT: CALL CRLF LEA DX,MSG1 MOV AH,09H INT 21H DONE: MOV AH,4CH INT 21H ; ————————————————————— nullCRLF PROC MOV AH,02H MOV DL,0DH INT 21H MOV DL,0AH INT 21H RET CRLF ENDP ; ————————————————————— CODE ENDS END START
本文档为【第9章 字符串指令】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_707274
暂无简介~
格式:ppt
大小:278KB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2012-10-04
浏览量:10