CLD及串操作

news/2025/2/22 5:34:19

来自:http://www.cnblogs.com/cykun/archive/2010/10/27/1862940.html

   计算机中,大部分数据存放在主存中,8086CPU提供了一组处理主存中连续存放的数据串的指令——串操作指令。串操作指令中,源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越;目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越。每执行一次串操作指令,作为源地址指针的SI和作为目的地址指针的DI将自动修改:+/-1(对于字节串)或+/-2(对于字串)。地址指针时增加还是减少取决于方向标志DF。在系统初始化后或者执行指令CLD指令后,DF=0,此时地址指针增1或2;在执行指令STD后,DF=1,此时地址指针减1或2。

1、串传送指令MOVS
MOVSB           ;字节串传送:ES:[DI]←DS:[SI],SI←SI+/-1,DI←DI+/-1
MOVSW           ;字串传送:ES:[DI]←DS:[SI],SI←SI+/-2,DI←DI+/-2
MOVS  目的串名,源串名   ;这种格式需要使用前缀WORD PTR或BYTE PTR指明

例:将数据段SOURCE指示的100个字节数据传送到附加段DESTINATION指示的主存区

       MOV SI,OFFSET SOURCE
       MOV DI,OFFSET DESTINATION
       MOV CX,100
       CLD
AGAIN: MOVSB
       DEC CX
       JNZ AGAIN

2、串存储指令STOS
STOSB        ;字节串存储:ES:[DI]←AL,DI←DI+/-1
STOSW        ;字串存储:ES:[DI]←AX,DI←DI+/-2
存储指令将AL或AX寄存器的内容存入由DI指定的附加段主存单元中,并根据DF和传送单位修改DI寄存器。STOS不影响标志。


3、串读取指令LODS
LODSB        ;字节串读取:AL←DS:[SI],SI←SI+/-1
LODSW        ;字串读取:AX←DS:[SI],SI←SI+/=2
LODS指令和STOS指令功能互逆,它将SI寄存器指向的主存单元的内容送至AL或AX寄存器,并相应修改SI使其指向下一个元素。不影响标志。


4、串比较指令CMPS
CMPSB       ;字节串比较:DS:[SI]-ES:[DI],SI←SI+/-1,DI←DI+/-1
CMPSW       ;字串比较:DS:[SI]-ES:[DI],SI←SI+/-2,DI←DI+/-2
船比较指令的功能是比较源串与目的串是否相同,并根据其减法结果设置标志位;指令在每次比较后修改SI和DI寄存器的值,使之指向下一个元素。


5、串扫描指令SCAS
SCASB         ;字节串扫描:AL-ES:[DI],DI←DI+/-1
SCASW         ;字串扫描:AX-ES:[DI],DI←DI+/-2
串扫描指令SCAS将附加段中的字节或字内容与AL/AX寄存器内容进行比较,根据比较的结果设置标志,每次比较后修改DI寄存器的值,使之指向下一个元素。


6、重复前缀指令
任何一个串操作指令,都可以在前面加一个重复前缀,以实现串操作的重复执行,重复次数隐含在CX寄存器中
REP        ;REP前缀用在MOVS、STOS、LODS指令前,每次执行一次指令,CX减1;直到CX=0,重复执行结束
REPZ       ;也可以表把为REPE,用在CMPS、SCAS指令前,每执行一次串指令CX减1,并判断ZF标志是否为0
           ;只要CX=0或ZF=0,则重复执行结束
REPNZ      ;也可以表达为REPNE,用在CMPS、SCAS指令前,每执行一次串操作指令CX减1,并判断ZF标志是否为1,只要CX=0或ZF=1,则重复执行结束。

●REP前缀可以理解为“当数据串没有结束(CX≠0),则继续传送”
●REPZ/REPE前缀可以理解为“当数据串没有结束(CX≠0),并且串相等(ZF=1)则继续比较”
●REPNZ/REPNE前缀可以理解为“当数据串没有结束(CX≠0),并且串不相等(ZF=0)则继续比较”
重复操作是否完成的检测是在执行串指令之前,所以,如果初始化CX为0,将不会重复操作。判断标志ZF,则是在执行串指令之后。
在 执行一条重复的基本串操作期间,操作数指示寄存器(变址寄存器SI,DI)和操作计数器CX在每次重复后都要自动进行修改,而指令指示器(IP)将保持重 复前缀字节的偏移地址(假定重复前缀是紧放在字符串操作指令之前)。于是,当控制由中断数据服务返回时,一个被中断了的重复串操作能够得到正确的恢复。除 了重复前缀以外,IBM-PC还提供了两个前缀:一个是缺省段寄存器的取代前缀(加段寄存器前缀),另一个是封锁总线前缀LOCK以禁止其他的总线访问。 不要把这两个前缀用在具有重复前缀的串操作指令前面。如果在基本串操作指令之前出现一个以上的前缀,那么中断恢复时只能恢复一个字节(紧放在串操作指令之 前的一个)前缀,多于一个字节的前缀就丢掉了(一个前缀占一个字节)。所以在串操作指令前用了重复前缀后就不能用其他两个前缀了。
另外,在字符串操作指令中不能使用带有[BX]或[BP]的寻址方式。

2.CLD(汇编语言指令)
  CLD与STD是用来操作方向标志位DF(Direction Flag)。CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中。
  例如:
  MOVS ( MOVe String) 串传送指令
  MOVSB //字节串传送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
  MOVSW //字串传送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
  执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.
  在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.
  MOVS DST , SRC //同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数.
  1.目的串必须在附加段中,即必须是ES:[DI]
  2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].



http://www.niftyadmin.cn/n/1737747.html

相关文章

转变以data为中心的架构设计

我们需要从Code/Program观念转变成Data观念,在做任何设计和开发时,要把Data放在第一位,一切围绕数据的收集,存储和处理。

Jataayu提供三种WAP网关:个人网关、企业网关和高性能网关,下面将分别给予介绍。

5.10.1 个人网关 随时随地操作用户的电子邮件和地址本 Jataayu Personal WAP Server(如图5-3所示)允许用户通过家里的拨号上网,并通过移动设备直接取得个人信息。用户所需要做的仅仅是在机器上安装Jataayu Personal WAP Server,并…

MTK平台学习--MTK笔记

MTK平台学习--MTK笔记(ZT) MTK笔记 L4是MMI/AT和协议栈的适配层。ATCI是AT命令解析器。UEM是用于抽象如键盘、LED、通用输入/输出等基本设备,是用户设备模块。PHB就是电话本。SMU是安全管理单元(SIM、STK)。CSM是呼叫…

什么是ETL

来自:http://zhidao.baidu.com/question/310870638.html 1、 术语描述ETL:Extract-Transform-Load的缩写,数据抽取(Extract)、转换(Transform)、装载(Load)的过程。DW&am…

网络广告术语说明

(一)从用户行为来看,任何网络广告要达到一定的效果,必须有以下基本的两步,一是展示广告,二是用户点击广告,对于某些网站而言,广告还要达到效果,必须有第三步,…

MTK的控件和窗体绘制机制及其事件响应机制(一)

MTK的控件和窗体绘制机制及其事件响应机制(一) 一、entryfunction在文档里面我们看到下面的条款: 以下引自:write applications using pixtel MMI platform.pdfBefore display the new screen over previous screen the f…

关于如何学习MTK的问题

关于如何学习MTK的问题 假如你以前在其它手机平台上开发过MMI APP,现在公司要更换手机平台,你如何能快速了解新的手机平台? 首先,你要有一个该平台的运行环境(象MTK,展讯都提供一套完整的软件方案)。经…

关于效率的随想

效率包括两个方面:产品,即产生出什么东西;产能,即生产这些东西的能力或者资本,本领等,在互联网研发团队中,对应的,需要关注:团队建设产能,软件研发产品。