CLDSTD汇编指令
在计算机中,⼤部分数据存放在主存中,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)则继续⽐较”
比较指令cmp怎么用●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].

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。