串操作指令


//转载大神博客:点击打开链接

串操作指令

分类: 其它技术文章 2008-04-15 14:51 1032人阅读 评论(0) 收藏 举报
存储汇编语言串操作类指令

在内存一个存储区域连续存放着若干个字节(或字)数据,这样一组数据称为“数据串”(高级语言视为数组)。若每个数据是一个字节,称“字节串”;若是字,则称“字串”。串操作指令可以用来实现内存区域的数据串操作。

1.重复前缀
串操作指令每次只处理数据串中的一个数据,但与重复前缀配合使用(重复前缀+串操作指令),则可使操作重复进行(其执行过程相当于一个循环程序的运行,重复次数由寄存器CX决定)。重复前缀的几种形式见表1所示。
表1 重复前缀
汇编格式 执行过程 影响指令
REP
无条件重复

(1)若(CX)=02)CX=CX-1;
(3)4)重复(1)-(3)
执行后续串指令;
(,则退出;
( MOVS,STOS,LODS

REPE/REPZ

相等/结果

为0时重复

(1)若(CX)=0或ZF=02)CX=CX-1;
(3)4)重复(1)-(3)执行后续串指令;
(,则退出;
( CMPS,SCAS
REPNE/REPNZ
不相等/结果
不为0时重复

(1)若(CX)=0或ZF=12)CX=CX-1;
(3)4)重复(1)-(3) 执行后续串指令;
(,则退出;
(

CMPS,SCAS


2.串操作指令

串操作指令共有五种(MOVS、STOS、LODS、CMPS、SCAS),其基本操作各不相同,但有以下共同特点:
(1)源数据串在数据段,以寄存器SI作为地址指针。
目的数据串在附加段,以寄存器DI作为地址指针。
(2)每次操作后,地址指针SI、DI自动修改,修改的方向取决于方向标志DF。
DF=1DF= 0,地址指针增量(即字节操作加1,字操作加2)。
(3)串操作指令与重复前缀结合,可进行多次重复操作。
(4)串操作指令都具有3种指令格式:(以串传送指令MOVS为例)
MOVS dest,src ;由操作数说明是字节或字操作
MOVSB ;字节操作
MOVSW ;字操作
综上所述为实现串操作,程序设计时要掌握3个要点:
(1)利用方向标志DF设定串操作中地址指针修改的方向。
(2)利用DS:SI和ES:DI设定源数据串和目的数据串的首地址。
(3)利用CX设定被处理数据串的字节个数或字个数(即数据串中数据个数) 。


MOVS指令(串传送)的功能,地址指针减量(即字节操作减1,字操作减2);


[(ES:DI)]←[(DS:SI)],即将数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后根据DF及所传送数据的类型(字节或字)对SI及DI进行修改(SI←SI±1,DI←DI±1或SI←SI±2,DI←DI±2)。在重复前缀REP的控制下,可将数据段中的整串数据传送到附加段中去。



from: http://www.gxjmzy.com/dfwjyl/Article_Print.asp?ArticleID=66


【例】把数据段中从符号地址STR1开始的100个字节内容传送到附加段中从STR2开始的单元中。
CLD ;清方向标志DF(DF=0)
LEA SI,STR1 ;(SI)←源串首地址指针
LEA DI,STR2 ;(DI)←目的串首地址指针
MOV CX,100 ;(CX)←字节串长度
REP MOVSB ;字符串传送
实现上述功能的程序段如下:


STOS指令(存串)的功能

AL/AX→[(ES:DI)],即把指令中指定的一个字节或一个字(分别存放在AL及AX寄存器中),传送到附加段中由DI间接寻址的字节单元(或字单元)中去,然后自动修改地址指针。在重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段存储区域中。

【例】对从符号地址STR2开始的256个字单元清0。
CLD LEA DI,STR2 ;(DI)←目的串首地址指针
MOV AX,0 ;AX寄存器清0
MOV CX,256 ;(CX)←字串长度
REP STOSW
;清方向标志DF


LODS指令(取串)的功能

[(DS:SI)]→AL/AX,即将数据串中的字节(或字)逐个装入寄存器AL(或AX)中。

CMPS指令(串比较)的功能

[(DS:SI)]-[(ES:DI)],即把数据段中由SI间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作(即相减),使比较的结果影响标志位,然后自动修改地址指针。在重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,通常用于检查两个字符串是否相等。


【例】字符串STR1是数据段中的一个4字节字符串, STR2是附加段中的一个4字节字符串, 比较两字符串是否相等。
CLD ;清方向标志DF
LEA SI,STR1 ;(SI)←源串首地址指针
LEA DI,STR2 ;(DI)←目的串首地址指针
MOV CX,4 ; (CX)←字节串长度
REPE CMPSB ;若比较结果相等(ZF=1)且未比较完(CX≠0)则继续比较下一个字节

本例中退出REPE CMPSB有两种可能:
一种可能是在两字符串中找到不相等字符,从而退出,此时表明两字符串不相等,ZF=0;
另一种可能是两字符串中各字符都相等,一直到串比较完毕,从而退出,此时ZF=1,CX=0。
故在退出后,可根据对ZF标志的检测来判断属于哪种可能。

SCAS指令(串搜索)的功能

AL/AX-[(ES:DI)],即把要搜索的关键字存放在AL(字节)或AX(字)中,将AL中的字节(或AX中的字)与附加段中由DI间接寻址的数据串中的一个字节(或字)进行比较操作(相减),使比较的结果影响标志位,然后自动修改地址指针,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索某一关键字。


【例】 搜索字符串STR中是否有字符‘M’,字符串长度为12。
CLD
LEA DI,STR
MOV AL,'M' ←关键字‘M’
MOV CX,12
REPNE SCASB ;若比较结果不相等(ZF=0)且未比较完(CX≠0)则继续比较下一个字节;AL

本例中退出REPNE SCASB有两种可能:
一种可能是已找到关键字,从而退出,此时ZF=1;
另一种可能是未搜索到关键字,但字符串已搜索完毕,从而退出,此时ZF=0,CX=0。
故在退出后,可根据对ZF标志的检测来判断属于哪种可能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值