字符串处理指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符串处理指令
字符串:一系列存放在存储器中的字或字节数据,不管他们是不是ASCII码。
字符串长度可达64K字节,组成字符串的字节或字称为字符串元素,每种字符串指令对字符串对字符串元素只进行同一种操作。
8086提供5条1字节的字符串操作指令,专门对存储器中的字节串和字串数据进行传送、比较、扫描、存储及装入等5种操作。
使用字符串操作指令时,可以有两种方法告诉汇编程序是进行字节操作还是字操作。一种方法是用指令中的源串和目的串名来表明是字节还是字,另一种方法是在指令助记符后加B 说明是字节,加W说明是字操作。这样每种指令都有3种格式。
字符串传送,MOVS 目的串,源串MOVSB MOVSW
字符串比较,CMPS 目的串,源串CWPSB CMPSW
字符串扫描,SCAS 目的串SCASB SCASW
字符串装入,LODS 源串LODSB LODSW
字符串存储,STOS 目的串STOSB STOSW
字符串指令执行时,必须遵守以下隐含约定:
(1)源串位于当前数据段,由DS寻址,源串的元素由SI作指针,即源串字符的起始地址为DS:SI。源串允许使用段超越前缀来修改段地址。
(2)目的串必须位于当前的附加段中,由ES寻址,目的串元素由DI做指针,即目的串字符的首地址为ES:DI,但目的串不允许使用短超越前缀修改ES。如果要在同一段内进行串运算,必须使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)要处理的字符串长度(字或字节数)放在CX寄存器中。
为了加快串运算指令的执行速度,可在基本指令前加重复前缀,是数据传指令重复执行。每重复执行一次,地址指针SI和DI都根据方向标志自动进行修改,CX的值则将自动减1.能与基本指令配合使用的重复前缀有:
REP 无条件重复
REPE\REPZ 相等\结果为零则重复
REPNE\REPNZ 不相等\结果不为零则重复
无条件重复指令REP常与传送指令(MOVS)连用,连续进行字符串传送操作,直到整个字符串传送完毕,CX=0为止。重复前缀REPE和REPZ具有相同的含义,它们常与串比较指令(CMPS)连用,用于字符串比较操作。当两个字符串相等(ZF=1)和CX≠0时,则进行重复比较,直到ZF=0或CX=0为止。重复前缀REPNE和REPNZ也具有相同的意义,它们常与串扫描指令(SCAS)连用,当结果非零时(ZF=0)和CX≠0时,重复进行,直到ZF=1或CX=0为止。
带有重复前缀的串运算时间可能很长,在指令执行过程中允许有中断进入,因此在处理每个元素之前都在查询是否有中断请求,一旦外部有中断进入,CPU将暂停执行当前的串操作指令,转去执行相应得中断服务程序,使中断服务完成后,再去执行被中断的串操作指令。分别介绍:
1.MOVS字符串操作指令
指令格式:MOVS 目的串,源串
指令功能:把由SI指针的源串中的一个字节或一个字传送到由DI作指针的目的串中,且自动修改指针SI和DI
在实际应用中,人们经常需要在存储单元之间传送数据。然而,MOVS指令不能直接在存储单元之间传送数据,为了实现这种操作,必须以某一通用寄存器为桥梁,先把一个存储单元的数据送到指定的通用寄存器中,再把寄存器中的数据传送到另一个存储单元中,每进行一次传送操作,还必须修改地址指针。如果改用MOVS指令,便能方便地实现这种功能,它不但能把数据从内存中的某一地址传送到另一地址,还能自动修改源和目的地址。若使用重复前缀,还可以利用一条指令传送一批数据。
例
要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!"传送到附加段中以NEW_LOC开始的单元中。实现该操作的程序如下:
DA TA SEGMENT ;数据段
SRC_MESS DB "HELLO!" ;源串
DA TA ENDS
;
EXTRA SEGMENT ;附加段
NEW_LOC DB 6 DUP(?) ;存放目的串
EXTRA ENDS
;
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DA TA,ES:EXTRA
START: MOV AX, DATA
MOV DS,AN ;DS=数据段段址
MOV AX,EXTRA
MOV ES,AX ;ES=附加段段址
LEA SI, SRC_MESS ;SI指向源串偏移地址
LEN DI, NEW_LOC ;DI指向目的串偏移地址
MOV CX, 6 ;CX作串长度计数器
CLD ;清方向标志,地址增量
REP MOVSB ;重复传送串中的各字节,直到CX=0为止
CODE ENDS
END START
例中的REP MOVSB也可用指令代替:
AGAIN: MOVS NEW_LOC, SRC_MESS
DEC CX
JNZ AGAIN
比较这两种方法,显然可以发现,使用有重复前缀REP的MOVSB指令,程序更简洁。
2/CMPS字符串比较指令
指令格式:CMPS 目的串,源串
指令功能:从SI做指针的源串中减去由DI指针的目的串数据,相减后的结果反映在标志位上,但不改变两个数据串的原始值。同时,操作后源串和目的串的指针会自动修改,指向下一对待比较的串。
常用这条指令来比较两个串是否相同,并由加在CMPS 指令后的一条条件转移指令,根据