【2017年整理】字符串处理指令

上传人:豆浆 文档编号:1070565 上传时间:2017-05-27 格式:DOC 页数:5 大小:44.50KB
返回 下载 相关 举报
【2017年整理】字符串处理指令_第1页
第1页 / 共5页
【2017年整理】字符串处理指令_第2页
第2页 / 共5页
【2017年整理】字符串处理指令_第3页
第3页 / 共5页
【2017年整理】字符串处理指令_第4页
第4页 / 共5页
【2017年整理】字符串处理指令_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《【2017年整理】字符串处理指令》由会员分享,可在线阅读,更多相关《【2017年整理】字符串处理指令(5页珍藏版)》请在金锄头文库上搜索。

1、字符串处理指令字符串:一系列存放在存储器中的字或字节数据,不管他们是不是 ASCII 码。字符串长度可达 64K 字节,组成字符串的字节或字称为字符串元素,每种字符串指令对字符串对字符串元素只进行同一种操作。8086 提供 5 条 1 字节的字符串操作指令,专门对存储器中的字节串和字串数据进行传送、比较、扫描、存储及装入等 5 种操作。使用字符串操作指令时,可以有两种方法告诉汇编程序是进行字节操作还是字操作。一种方法是用指令中的源串和目的串名来表明是字节还是字,另一种方法是在指令助记符后加B 说明是字节,加 W 说明是字操作。这样每种指令都有 3 种格式。字符串传送,MOVS 目的串,源串 M

2、OVSB MOVSW字符串比较,CMPS 目的串,源串 CWPSB CMPSW字符串扫描,SCAS 目的串 SCASB SCASW字符串装入,LODS 源串 LODSB LODSW字符串存储,STOS 目的串 STOSB STOSW字符串指令执行时,必须遵守以下隐含约定:(1)源串位于当前数据段,由 DS 寻址,源串的元素由 SI 作指针,即源串字符的起始地址为 DS:SI。源串允许使用段超越前缀来修改段地址。(2)目的串必须位于当前的附加段中,由 ES 寻址,目的串元素由 DI 做指针,即目的串字符的首地址为 ES:DI,但目的串不允许使用短超越前缀修改 ES。如果要在同一段内进行串运算,必

3、须使 DS 和 ES 指向同一段。(3)每执行一次字符串指令,指针 SI 和 DI 会自动进行修改,以便指向下一待操作单元。(4)DF 标志控制字符的处理方向。DF=0 为递增方向,这时 DS:SI 指向源串首地址,每进行一次串操作,使 SI 和 DI 增加,字节串操作时,SI 和 DI 分别增 1,字串操作时,SI和 DI 分别增 2,;DF=1 为递减方向,这时,DS:SI 指向源串末地址,每执行一次串操作,使 SI 和 DI 分别减量,字节串操作时减 1,字串操作时减 2.可用标志操作指令 STD 和 CLD来改变 DF 的值,STD 使 DF 置 1,CLD 使 DF 清零。(5)要处

4、理的字符串长度(字或字节数)放在 CX 寄存器中。为了加快串运算指令的执行速度,可在基本指令前加重复前缀,是数据传指令重复执行。每重复执行一次,地址指针 SI 和 DI 都根据方向标志自动进行修改, CX 的值则将自动减 1.能与基本指令配合使用的重复前缀有:REP 无条件重复REPEREPZ 相等结果为零则重复REPNEREPNZ 不相等结果不为零则重复无条件重复指令 REP 常与传送指令(MOVS)连用,连续进行字符串传送操作,直到整个字符串传送完毕,CX=0 为止。重复前缀 REPE 和 REPZ 具有相同的含义,它们常与串比较指令(CMPS)连用,用于字符串比较操作。当两个字符串相等(

5、 ZF=1)和 CX 0 时,则进行重复比较,直到 ZF=0 或 CX=0 为止。重复前缀 REPNE 和 REPNZ 也具有相同的意义,它们常与串扫描指令(SCAS)连用,当结果非零时(ZF=0)和 CX 0 时,重复进行,直到 ZF=1 或 CX=0 为止。带有重复前缀的串运算时间可能很长,在指令执行过程中允许有中断进入,因此在处理每个元素之前都在查询是否有中断请求,一旦外部有中断进入,CPU 将暂停执行当前的串操作指令,转去执行相应得中断服务程序,使中断服务完成后,再去执行被中断的串操作指令。分别介绍:1.MOVS 字符串操作指令指令格式:MOVS 目的串, 源串指令功能:把由 SI 指

6、针的源串中的一个字节或一个字传送到由 DI 作指针的目的串中,且自动修改指针 SI 和 DI在实际应用中,人们经常需要在存储单元之间传送数据。然而,MOVS 指令不能直接在存储单元之间传送数据,为了实现这种操作,必须以某一通用寄存器为桥梁,先把一个存储单元的数据送到指定的通用寄存器中,再把寄存器中的数据传送到另一个存储单元中,每进行一次传送操作,还必须修改地址指针。如果改用 MOVS 指令,便能方便地实现这种功能,它不但能把数据从内存中的某一地址传送到另一地址,还能自动修改源和目的地址。若使用重复前缀,还可以利用一条指令传送一批数据。例要求把数据段中以 SRC_MESS 为偏移地址的一串字符“

7、HELLO!传送到附加段中以NEW_LOC 开始的单元中。实现该操作的程序如下:DATA SEGMENT ;数据段SRC_MESS DB HELLO! ;源串DATA ENDS ;EXTRA SEGMENT ;附加段NEW_LOC DB 6 DUP(?) ;存放目的串EXTRA ENDS;CODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,ES:EXTRASTART: MOV AX, DATAMOV DS,AN ;DS=数据段段址MOV AX,EXTRAMOV ES,AX ;ES=附加段段址LEA SI, SRC_MESS ;SI 指向源串偏移地址LEN DI, N

8、EW_LOC ;DI 指向目的串偏移地址MOV CX, 6 ;CX 作串长度计数器CLD ;清方向标志,地址增量REP MOVSB ;重复传送串中的各字节,直到 CX=0 为止CODE ENDS END START例中的 REP MOVSB 也可用指令代替:AGAIN: MOVS NEW_LOC, SRC_MESSDEC CXJNZ AGAIN比较这两种方法,显然可以发现,使用有重复前缀 REP 的 MOVSB 指令,程序更简洁。2/CMPS 字符串比较指令指令格式:CMPS 目的串, 源串指令功能:从 SI 做指针的源串中减去由 DI 指针的目的串数据,相减后的结果反映在标志位上,但不改变两

9、个数据串的原始值。同时,操作后源串和目的串的指针会自动修改,指向下一对待比较的串。常用这条指令来比较两个串是否相同,并由加在 CMPS 指令后的一条条件转移指令,根据CMPS 执行后的标志位值决定程序的转向。在 CMPS 指令前可加重复前缀,即:REPE CMPS或 REPZ CMPS这两条指令的功能相同,若比较结果为 CX 0(指令的长度还未比较完)和 ZF=1(两串相等) ,则重复比较,直至 CX=0,比较完了或 ZF=0,或两串不相等时才停止操作。也可以用重复前缀 REPNE 或 REPNZ,它们表示:若串没有结束( CX 0)和串不等(ZF=0),则重复比较,直至 CX=0 或 ZF=

10、1 时进行比较。例比较两个字符串,一个是你在程序中设定的口令串 PASSWORD,另一个是从键盘输入的字符串 IN_WORD,若输入串与口令串相同,程序将开始进行。否则,程序驱动 PC 机的扬声器发声,警告用户口令不符,拒绝往下执行。这可以用 CMPS 指令来实现,有关程序如下:DATA SEGMENT ;数据段PASSWORD DB 8086 CPUI ;口令串IN_WORD DB 8086 CPU ;键盘输入的串COUNT EQU 8 ;串长度DATA ENDSCODE SEGMENT ;代码段ASSUME DS:DATA,ES:DATA LEA SI, PASSWORD ;源串指针LEA

11、 DI, IN_WORD ;目的串指针MOV CX, COUNT ; 串长度 CLD ;地址增量REPZ CMPSB ;CX 0 且串相等时重复比较JNE SOUND ;若不相等,转发声程序OK: ;比完且相等,往下执行SOUND: ;使 PC 扬声器发声 ;使退出CODE ENDS3 SCAS 字符串扫描指令指令格式:SCAS 目的串指令功能:从 AL(字节操作)或 AX(字操作)寄存器的内容减附加段以 DI 为指针的目的串元素,结果反映在标志位上,但不改变源操作数。同时,操作后目的串指针会自动修改,指向下一个待搜索的串元素。利用 SCAS 指令,可在内存中搜索需要的数据。这个被搜索的数据也

12、称为关键字。指令执行前,必须事先将它存在 AL(字节)或 AX(字)中,才能用 SCAS 指令进行搜索。SCAS 指令前也可以加重复前缀。例在某一字符串中搜索是否有字符 A,若有,则把搜索次数记下来,送到 BX 寄存器中,若没有查到,则将 BX 寄存器清零。设字符串的起始地址 STRING 的偏移地址是 0,字符串长度是 CX。程序段如下:MOV DI, OFFSET STRING ;DI=字符串偏移地址MOV CX, COUNT ;CX=字符串长度MOV AL, A ;AL=关键字的 ASCII 码CLD ;清方向标志REPNE SCASB ;CX 0(没查完)和 ZF=0(不相等)时重复J

13、Z FIND ;若 ZF=1,表示已搜到MOV DI,0 ;若 ZF=0,表示没搜到,DI 赋值 0FIND:MOV BX, DI ;将搜索次数 DI 赋给 BXHLT ;停机上述程序中,DI 初值起始地址偏移量 0,搜索一次后,DI 自动加 1,使 DI 的值等于 1,以后,每执行一次搜索操作,DI 自动增 1,。所以,正好用 DI 的值来表示搜索次数。4 LODS 数据串装入指令指令格式:LODS 源串指令功能:把数据段中以 SI 为指针的串元素,传送到 AL(字节操作)或 AX(字操作)中,同时修改 SI,使它指向串中的下一个元素,SI 修改量由方向标志 DF 和源串类型确定,即遵守上述

14、隐含规定(4)为该指令加重复前缀没有意义,这是因为每传送一次数据,累加器的内容就会被改写,执行重复传送操作后,只能保留最后写入的那个数据5STOS 数据串存储指令指令格式:STOS 目的串指令功能:将累加器 AL 或 AX 中的一个字或字节,传送到附加段中以 DI 为目标指针的目的串中,同时修改 DI,以指向串中的下一个单元。STOS 指令与 REP 重复前缀连用,即执行 REP STOS,能方便的用累加器中的一个常数,对一个数据串进行初始化。例如,初始化全 0 的串例若在数据段中有一个数据块,起始地址 BLOCK,数据块中的数为 82 位带符号数,要求将其中的正、负数分开,然后把正数送到附加段始址为 PLUS_DATA 的缓冲区,负数送到附加段中始址为 MINUS_DATA 的缓冲区我们可以将这块数据看作是一个数据串,用 SI 作源串指针,DI 和 BX 分别作缓冲区的指针,CX 用于控制循环次数,于是写出如下程序段:START: MOV SI, OFFSET BLOCK ;SI 为源串指针MOV DI, OFFSET PLUS_DATA ;DI 为正数目的区指针MOV BX, OFFSET MINUS_DATA ;BX 为负数目的区指针MOV CX,COUNT ;CX 放循环次数CLD GOON:LODS BLOCK ;源目的串的一个字节送

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号