8086指令系统---串处理指令

发布者:蓝天飞行最新更新时间:2015-09-23 来源: eefocus关键字:指令系统  串处理指令 手机看文章 扫描二维码
随时随地手机看文章
  串处理指令处理存放在存储器中的字节串或字串,串处理的方向由方向标志位DF决定,串处理指令之前可加重复前缀,在执行串处理指令时,源串的指针SI和目的串的指针DI根据DF的指示自动增量(+1或+2)或自动减量(―1或―2)。
 
       ⑴ 串处理指令
        MOVSB / MOVSW   串传送
        STOSB / STOSW   存串
        LODSB / LODSW   取串
        CMPSB / CMPSW   串比较
        SCASB / SCASW   串扫描

       ⑵ 串重复前缀
        REP        重复串操作
        REPE / REPZ    相等/为零时重复
        REPNE / REPNZ   不等/不为零时重复

       ⑶ 设置方向标志
        CLD        使DF=0
        STD        使DF=1
 
  1 设置方向标志指令

  CLD DF置0(clear direction flag)
  STD DF置1(set direction flag)

  为了处理连续存储单元中的字符串或数串,地址指针需要连续地增量或减量,指针增量或减量决定了串处理的方向。当用CLD指令使DF=0时,源串的指针SI和目的串的指针DI自动增量(+1或+2),当用STD指令使DF=1时,指针SI和DI自动减量(―1或―2)。地址指针是±1还是±2,取决于串操作数是字节还是字,处理字节串时,地址指针每次+1或―1,处理字串时,地址指针每次+2或―2。

  2 串处理指令
  
  MOVSB / MOVSW 串传送(move string byte/word)
  执行操作:
  (ES:DI)←(DS:SI)
  (SI)←(SI)±1(字节)或±2(字)
  (DI)←(DI)±1(字节)或±2(字)

  STOSB / STOSW 存串(load from string byte/word)
  执行操作:
  (ES:DI)←(AL)或(AX)
  (DI)←(DI)±1(字节)或±2(字)

  LODSB / LODSW 取串(store into string byte/word)
  执行操作:
  (AL)或(AX)←(DS:SI)
  (SI)←(SI)±1(字节)或±2(字)

  CMPSB / CMPSW 串比较(compare string byte/word)
  执行操作:
  (DS:SI)-(ES:DI),根据比较的结果设置条件码
  (SI)←(SI)±1(字节)或±2(字)
  (DI)←(DI)±1(字节)或±2(字)

  SCASB / SCASW 串扫描(scan string byte/word)
  执行操作:
  (AL)-(ES:DI)或(AX)-(ES:DI),根据扫描比较的结果设置条件码
  (DI)←(DI)±1(字节)或±2(字)

 

  这组串处理指令用于处理连续存储单元中的字操作数或字节操作数,它们有几个共同点:

  1. 它们一般都分两步执行,第一步完成处理功能,如传送、存取、比较等。第二步进行指针修改,以指向下一个要处理的字节或字。

  2. 源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。

  3. 串处理的方向取决于方向标志DF,DF=0时,地址指针SI和DI增量(+1或+2);DF=1时,地址指针SI和DI减量(-1或-2)。程序员可以使用指令CLD和STD来建立方向标志。

  4. MOVS、STOS、LODS指令不影响条件码,CMPS、SCAS指令根据比较的结果设置条件码。

  与串传送指令MOVS和串存入指令STOS联用的重复前缀是REP,取串指令LODS一般不加重复前缀。 与串比较指令和串扫描指令联用的重复前缀是REPE(REPZ)或REPNE(REPNZ)。


   3 串重复前缀

  REP 重复执行串指令,(CX)=重复次数
  执行操作:
  ① (CX)=0时,串指令执行完毕,否则执行② ~ ④
  ② (CX)←(CX)-1
  ③ 执行串指令(MOVS或STOS)
  ④ 重复执行①

  REPE / REPZ 相等/为零时重复执行串指令,(CX)=比较/扫描的次数
  执行操作:
  ① (CX)=0或ZF=0时,结束执行串指令,否则继续② ~ ④
  ② (CX)←(CX)-1
  ③ 执行串指令(CMPS或SCAS)
  ④ 重复执行①

  REPNE / REPNZ 不等/不为零时重复执行串指令,(CX)=比较/扫描的次数
  执行操作:
  ① (CX)=0或ZF=1,结束执行串指令,否则继续② ~ ④
  ② (CX)←(CX)-1
  ③ 执行串指令(CMPS或SCAS)
  ④ 重复执行①

  REP对其后的串指令(MOVS或STOS)只有一个结束条件,即重复次数(CX)=0。在进行串比较和串扫描时,串指令前应加前缀REPE(REPZ)或REPNE(REPNZ),这两条重复前缀用重复次数(CX)和比较结果(ZF)来控制串指令的结束。当(CX)=0时,说明每个串数据都比较(或扫描)过了,此时串操作正常结束;当因ZF=1或0而结束串操作时,说明在满足比较结果相等或不等的条件下,可提前结束串操作。[page]

 

   例 编写程序,传输20字节的字符串。

      DATSEG  SEGMENT
      DATAX   DB 'ABCDEFGHIJKLMNOPQRST'
      DATAY   DB 20 DUP(?)
      DATSEG  ENDS
      ; - - - - - - - - - - - - - - - - - - - -
      CODSEG  SEGMENT
      ASSUME  CS:CODSEG,DS:DATSEG,ES:DATSEG
  START: MOV    AX,DATSEG
      MOV    DS,AX    ; initialize the data segment
      MOV    ES,AX    ; initialize the extra segment
      CLD          ; clear direction flag for autoincrement
      MOV    SI,OFFSET DATAX  ; load the source pointer
      MOV   DI,OFFSET DATAY  ; load the destination pointer
      MOV    CX,20    ; load the counter
      REP    MOVSB    ; repeat until CX becomes zero
      MOV   AX,4C00H  ; return to DOS
      INT    21H
  CODSEG ENDS
      END    START

  串传送指令将SI所指示的数据段中的数据传送到由DI指示的附加段中,本例将源串和目的串都设置在同一个段DATSEG中,因此,DS和ES都定义为DATSEG。

   例 编写程序:
          (1)用STOS指令将0AAH存入100个存储器字节;
          (2)利用LODS指令测试这些存储器单元的内容是否是0AAH,如果不是则显示"bad memory"。

      DTSEG  SEGMENT
      DATAM  DB 100 DUP(?)
      MESG   DB 'bad memory', '$'
      DTSEG  ENDS
      ; - - - - - - - - - - - - - - - - - -
      CDSEG  SEGMENT
      ASSUME CS:CDSEG,DS:DTSEG,ES:DTSEG
  START: MOV   AX,DTSEG   ; initialize
      MOV   DS,AX    ; DS register
      MOV   ES,AX    ; and ES register
      CLD         ; clear DF for increment
      MOV   CX,50    ; load the counter(50 words)
      MOV   DI,OFFSET DATAM ; load the pointer for destination
      MOV   AX,0AAAAH   ; load the pattern
      REP   STOSW    ; repeat until CX=0
      ; bring in the pattern and test it one by one
      MOV   SI,OFFSET DATAM  ; load the pointer for source
      MOV   CX,100       ; load the counter(100 bytes)
  AGAIN: LODSB           ; load into AL from DS:SI
      XOR   AL,0AAH      ; is pattern the same?
      JNZ   OVER       ; if not the same, then exit
      LOOP  AGAIN       ; continue until CX=0
      JMP   EXIT       ; exit program
  OVER: MOV   AH,09       ; display
      MOV   DX,OFFSET MESG   ; the message
      INT   21H        ; routine
  EXIT: MOV   AX,4C00H      ; return to DOS
      INT   21H
      CDSEG  ENDS
      END   START

  把0AAH存入100个字节是通过执行50次的字操作来完成的。在测试部分,LODSB指令把存储器字节的内容取到AL,并和数据0AAH异或,如果这两个数相同,ZF=1,则继续进行下一个数的测试。如果两数不同,则ZF=0,转去执行显示字符串的BIOS功能调用。显示字符串用了三条指令,首先在AH中装入的显示字符串的功能号09,然后在DX中装入字符串的地址,再用INT 21H调用BIOS例程,完成显示指定字符串的功能。

   例 假设有人将电子字典中的"LABEL"误拼为"LABLE",编写程序比较这两个词,并根据比较结果显示
        (1)如果相同,则显示"The spelling is correct";
        (2)如果不同,则显示"Wrong splling"。

       DATASEG SEGMENT
        DAT_DICT DB 'LABEL'
        DAT_TYPE DB 'LABLE'
        MESS1 DB 'The spelling is correct ','$'
        MESS2 DB 'Wrong spelling ','$'
       DATASEG ENDS
       ; - - - - - - - - - - - - - - - - - - - - -
       CODESEG SEGMENT
       ASSUME CS:CODESEG,DS:DATASEG,ES:DATASEG
   START: MOV  AX,DATASEG
       MOV  DS,AX   ; initialize the data segment
       MOV  ES,AX   ; initialize the extra segment
       CLD       ; DF=0 for autoincrement
       MOV  SI,OFFSET DAT_DICT ; SI is source pointer
       MOV  DI,OFFSET DAT_TYPE ; DI is destination pointer
       MOV  CX,05   ; load the counter
       REPE CMPSB   ; repeat as long as equal or until CX=0
       JE  OVER   ; if ZF=1 then display mess1
       MOV  DX,OFFSET MESS2 ; if ZF=0 then display mess2
       JMP  DISP
    OVER: MOV  DX,OFFSET MESS1
    DISP: MOV  AH,09   ; display message
       INT  21H
       MOV  AX,4C00H ; return to DOS
       INT  21H
   CODSEG ENDS
       END START

   用CMPSB指令可将两个串中的字符逐一比较,在比较SI和DI指向的第一对字符时,根据比较结果设置ZF并使(SI)+1,(DI)+1以及(CX)-1。因为第一对字符是相同的('L'),所以ZF=1,于是由REPE控制再重复比较下一对字符。直到比较第四对字符'E'和'L'时,由于它们不相同,ZF设置为0,所以串比较结束。打印的信息应是:'Wrong spelling '。

   例 编写程序,将姓名中的HU DAMING(胡大明)修改为HU DANING(胡大宁),并显示出正确的姓名。

      DATA SEGMENT
      NAME DB 'HU DAMING', '$'
      DATA ENDS
      ; - - - - - - - - - - - -
      CODE  SEGMENT
      ASSUME CS:CODE,DS:DATA,ES:DATA
   START: MOV   AX,DATA
      MOV  DS,AX    ; initialize the data segment
      MOV  ES,AX    ; initialize the extra segment
      CLD         ; DF=0 for autoincrement
      MOV   AL,'M'
      MOV   DI,OFFSET NAME ; DI is destination pointer
      MOV  CX,09    ; load the counter
      REPNE SCASB    ; repeat as long as equal or until CX=0
      JNE  DISP    ; if ZF=0 then display name
      DEC  DI     ; decrement to point at 'M'
      MOV  BYTE PTR [DI],'N' ; replace 'M' with 'N'
   DISP: MOV  AH,09    ; display the corrected name
      MOV  DX,OFFSET NAME
      INT  21H
      MOV  AX,4C00H   ; return to DOS
      INT  21H
   CODE  ENDS
      END  START

  本例中,AL寄存器中的字符'M'与NAME中的每个字符进行比较,如果串中字符与'M'不同,则DI增量,CX减量,继续进行下一个字符的扫描比较,一直到发现'M'或CX=0为止。在本例中,因为发现了'M',比较的结果使ZF=1,同时DI已指向了下一个字符'I',所以DI退回一个字符位置(DEC DI),并用N取代M。

关键字:指令系统  串处理指令 引用地址:8086指令系统---串处理指令

上一篇:8086的一些答案
下一篇:8086指令系统---算术指令(一)

推荐阅读最新更新时间:2024-03-16 14:32

80C51单片机的指令系统(二)寻址方式
4.2.1 指令系统中使用的常用符号: Rn: 当前寄存器工作区中的寄存器, 其中, n=0 -- 7; direct: 内部数据存储器地址, 可指定一个内部RAM单元(0-- 127)或一个专用寄存器(128-- 255); @Ri: 通过R1或R0间接寻址, 指定数据存储器RAM中的一个单元(0-- 255); #data: 在指令中指明8位常数; #data16: 在指令中指明16位常数; addr11: 11位目的地址, 用在ACALL或AJMP指令中,表示调用或转移地址, 寻址范围为2KB; addr16: 16位目的地址, 用在LCALL或LJ MP指令中, 表示调用或转换地址,
[单片机]
80C51单片机的<font color='red'>指令系统</font>(二)寻址方式
80C51单片机的指令系统(一)程序设计语言和指令
学习指令系统重点要掌握以下几点: 指令功能 寻址方式 操作数的位数和存储结构 对PSW的影响 指令与存储区的对应关系 各类指针及其指向的地址范围 转移指令的转移范围 指令字节数和机器周期数 & 本章主要介绍单片机的寻址方式及指令系统,是必须掌握的内容。 & 一台计算机所有指令的集合, 称为该计算机的指令系统。 & 各种计算机都有专用的指令系统。 4.1.1 程序设计语言和指令: 程序设计语言是实现人机交换信息的重要工具。机器语言指令是单片机能直接识别、分祈和执行的二进制码,用机器语言写的程序称为目标程序。 例如, 要做 10+20 的加法, 在51中可用机器码指令编程: 01110100
[单片机]
80C51单片机的<font color='red'>指令系统</font>(一)程序设计语言和<font color='red'>指令</font>
MCS-51单片机指令系统(1)
指令系统概述 指令是计算机用于控制各种功能部件完成的某一特定动作的指示和命令。一台计算机能识别和执行的指令集合即为其指令系统。指令系统是一套控制计算机执行操作的编码,通常称为机器语言。机器语言是计算机唯一能识别和执行的指令。指令系统由硬件决定,且不具有通用性。汇编语言可以准确地计算出控制操作时间并灵活地实施控制,及高效开发必须掌握指令系统和汇编语言。 在实际开发应用中,由于指令系统与汇编语言开发的繁琐和开发效率低则应用C语言开发或者直接应用固件集成库开发提高开发效率和时间。但是对于单片机及其他硬件开发过程,开发过程的调试和资源应用都应对于汇编和指令系统的熟悉才能真正的高效开发完成调试达到目的。 常用单位和术语 位(
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved