电工学习网

 找回密码
 立即注册

8086指令系统

2015-3-22 09:24| 编辑:电工学习网| 查看: 32401| 评论: 0



    四、串操作类指令

    串操作类指令可以用来实现内存区域的数据串操作。这些数据串可以是字节串,也可以是字串。

    1.重复指令前缀

    串操作类指令可以与重复指令前缀配合使用。从而可以使操作得以重复进行,及时停止。重复指令前缀的几种形式见表2所示。

表2重复前缀

汇编格式

执行过程

影响指令

REP

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

MOVS,STOS,LODS

REPE/
REPZ

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

CMPS,SCAS

REPNE/
REPNZ

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

CMPS,SCAS

    2.串指令

    串指令共有五种,具体见表3。

    对串指令要注意以下几个问题:

    (1) 各指令所使用的默认寄存器

    SI(源串地址),DI(目的地址),CX(字串长度),AL(存取或搜索的默认值)。

    (2) 源串在数据段,目的串在附加段。

表3  串操作指令

功能

指令格式

执行操作

串传送

MOVS  DST,SRC
MOVSB
MOVSW

由操作数说明是字节或字操作;其余同MOVSB或MOVSW
[(ES:DI)]←[(DS:SI)];SI=SI±1,DI=DI±1;REP控制重复前两步
[(ES:DI)]←[(DS:SI)];SI=SI±2,DI=DI±2;REP控制重复前两步

串比较

CMPS  DST,SRC
CMPSB
CMPSW

由操作数说明是字节或字操作;其余同CMPSB或CMPSW
[(ES:DI)]-[(DS:SI)];SI=SI±1,DI=DI±1;重复前缀控制前两步
[(ES:DI)]-[(DS:SI)];SI=SI±2,DI=DI±2;重复前缀控制前两步

串搜索

SCAS  DST
SCASB
SCASW

由操作数说明是字节或字操作;其余同SCASB或SCASW
AL-[(ES:DI)]];DI=DI±1;重复前缀控制前两步
AX-[(ES:DI)];DI=DI±2;重复前缀控制前两步

存串

STOS  DST
STOSB
STOSW

由操作数说明是字节或字操作;其余同STOSB或STOSW
AL→[(ES:DI)]];DI=DI±1;重复前缀控制前两步
AX→[(ES:DI)];DI=DI±2;重复前缀控制前两步

取串

LODS  SRC
LODSB
LODSW

由操作数说明是字节或字操作;其余同LODSB或LODSW
[(DS:SI)]]→AL;SI=SI±1;重复前缀控制前两步
[(DS:SI)]→AX;SI=SI±2;重复前缀控制前两步

    (3) 方向标志与地址指针的修改。

    DF=1,则修改地址指针时用减法;DF=0时,则修改地址指针时用加法,MOVS、STOS、LODS指令不影响标志位。

    MOVS指令的功能

    把数据段中由SI间接寻址的一个字节(或一个字)传送到附加段中由DI间接寻址的一个字节单元(或一个字单元)中去,然后,根据方向标志DF及所传送数据的类型(字节或字)对SI及DI进行修改,在指令重复前缀REP的控制下,可将数据段中的整串数据传送到附加段中去。

    【例2】 在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;MESS2为附加段中用以存放字符串区域的首地址。

    实现上述功能的程序段如下:

    LEA   SI,MESS1    ;置源串偏移地址

    LEA   DI,MESS2    ;置目的串偏移地址

    MOV  CX,17        ;置串长度

    CLD                 ;方向标志复位

    REP   MOVSB       ;字符串传送

    其中,最后一条指令也可写成

    REP  MOVS  ES:BYTE PTR[DI],DS:[SI]

    或  REP  MOVS  MESS2,MESS1

    CMPS指令的功能

    把数据段中由SI间接寻址的一个字节(或一个字)与附加段中由DI间接寻址的一个字节(或一个字)进行比较操作,使比较的结果影响标志位,然后根据方向标志DF及所进行比较的操作数类型(字节或字)对SI及DI进行修改,在指令重复前缀REPE/REPZ或者REPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节(或字),或者第一个相等的字节(或字)。

    【例3】在数据段中有一字符串,其长度为17,存放在数据段中从符号地址MESS1开始的区域中;同样在附加段中有一长度相等的字符串,存放在附加段中从符号地址MESS2开始的区域中,现要求找出它们之间不相匹配的位置。  实现上述功能的程序段如下;

    LEA   SI,MESS1    ;装入源串偏移地址

    LEA   DI,MESS2    ;装入目的串偏移地址

    MOV  CX,17        ;装入字符串长度

    CLD                 ;方向标志复位

    REPE  CMPSB

    上述程序段执行之后,SI或DI的内容即为两字符串中第一个不匹配字符的下一个字符的位置。若两字符串中没有不匹配的字符.则当比较完毕后,CX=0,退出重复操作状态。

    ·SCAS指令的功能

    用由指令指定的关键字节或关键字(分别存放在AL及AX  寄存器中),与附加段中由DI间接寻址的字节串(或字串)中的一个字节(或字)进行比较操  作,使比较的结果影响标志位,然后根据方向标志DF及所进行操作的数据类型(字节或字)  对DI进行修改,在指令重复前缀REPE/REPZ或REPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字)匹配的字节(或字),或者搜索第一个与关键字节(或字)不匹配的字节(或字)。

    【例4】在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H)。    

    实现上述功能的程序段如下:

    LEA   DI,MESS2    ;装入目的串偏移地址

    MOV  AL,20H       ;装入关键字节

    MOV  CX,17        ;装入字符串长度

    REPNE  SCASB

    上述程序段执行之后,DI的内容即为相匹配字符的下一个字符的地址,CX中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节(或字),则当查完之后(CX)=0退出重复操作状态。

    STOS指令的功能

    把指令中指定的一个字节或一个字(分别存放在AL及AX寄存器中),传送到附加段中由DI间接寻址的字节内存单元(或字内存单元)中去,然后,根据方向标志DF及所进行操作的数据类型(字节或字)对DI进行修改操作。在指令重复前缀的控制下,可连续将AL(AX)的内容存入到附加段中的一段内存区域中去,该指令不影标志位。

    【例5】要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可用下列程序段实现:    

    LEA   DI,MESS2    ;装入目的区域偏移地址

    MOV  AL,00H      ;为清零操作准备

    MOV  CX,5        ;设置区域长度

    REP  STOSB

    LODS指令的功能

    从串中取指令实现从指定的字节串(或字串)中读出信息的操作。

    【例6】比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。

    CLD

    LEA    DI,ES:DEST

    LEA    SI,SOURCE

    MOV    CX,500

    REPE   CMPSB

    JCXZ   NEXT

    MATCH:DEC    SI

    MOV  AL,BYTE PTR[SI]

    NEXT:


看过《8086指令系统》的人还看了以下文章:

发表评论

最新评论

电工学习网 ( )

GMT+8, 2023-6-7 02:31

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

返回顶部