电工学习网

 找回密码
 立即注册

8086指令系统

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

程序控制指令


    五、程序控制指令

    转移类指令可改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。

    1.无条件转移、调用和返回指令

    (1) 无条件转移指令JMP     分直接转移和间接转移两种。

    一般格式:  JMP OPRD    ;OPRD是转移的目的地址

    直接转移的3种形式为:

    短程转移  JMP  SHORT OPRD   ;IP=IP+8位位移量

    目的地址与JMP指令所处地址的距离应在-128~127范围之内。

    近程转移  JMP  NEAR PTR  OPRD   ;IP=IP+16位位移量

    或  JMP  OPRD    ;NEAR可省略

    目的地址与JMP指令应处于同一地址段范围之内。

    远程转移  JMP  FAR  PTR  OPRD ;IP=OPRD的段内位移量,CS=OPRD所在段地址。

    远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。

    间接转移指令的目的地址可以由存储器或寄存器给出。

    段内间接转移  JMP  WORD  PTR OPRD  ;IP=[EA] (由OPRD的寻址方式确定)。

    JMP  WORD  PTR[BX]   IP=((DS)*16+(BX))

    JMP  WORD  PTR BX    IP=(BX)

    段间间接转移 JMP  DOWRD  PTR  OPRD;IP=[EA],CS=[EA+2]

    该指令指定的双字节指针的第一个字单元内容送IP,第二个字单元内容送CS。

    JMP   DWORD PTR [BX+SI]

    (2) 调用和返回指令  

    CALL指令用来调用一个过程或子程序。由于过程或子程序有段间(即远程FAR)和段内调用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。因此RET分段间与段内返回两种。

    调用指令一般格式为:

    段内调用   CALL  NEAR PTR OPRD ; 

    操  作   SP=SP-2,((SP)+1),(SP))=IP,IP=IP+16位位移量 

    CALL指令首先将当前IP内容压入堆栈。当执行RET指令而返回时,从堆栈中取出一个字放入IP中。

    段间调用  CALL  FAR  PTR OPRD  ; 

    操  作  SP=SP-2,((SP)+1),(SP))=CS;SP=SP-2,((SP)+1),(SP))=IP;IP=[EA];CS=[EA+2]

    CALL指令先把CS压入堆栈,再把IP压入堆栈。当执行RET指令而返回时,从堆栈中取出一个字放入IP中,然后从堆栈中再取出第二个字放入CS中,作为段间返回地址。

    返回指令格式有:

    RET     ;SP=((SP+1),SP),SP=SP+2   

    RET  n  ;SP=((SP+1),SP),SP=SP+2  SP=SP+n

    RET n指令要求n为偶数,当RET正常返回后,再做SP=SP+n操作。

    2.条件转移指令

    8086有18条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(CS)内,并且以当前指针寄存器IP内容为基准,其位移必须在十127~—128的范围之内。如表4所示。

表4  条件转移指令表

汇编格式  

操    作   

标志位转移指令

 

JZ/JE/JNZ/JNE   OPRD

结果为零/结果不为零转移

JS/JNS   OPRD

结果为负数/结果为正数转移

JP/JPE/JNP/JPO   OPRD

结果奇偶校验为偶/结果奇偶校验为奇转移

JO/JNO    OPRD

结果溢出/结果不溢出转移

JC/JNC    OPRD

结果有进位(借位)/结果无进位(借位)转移

不带符号数比较转移指令

 

JA/JNBE   OPRD

高于或不低于等于转移

JAE/JNA   OPRD

高于等于或不低于转移

JB/JNAE   OPRD

小于或不大于等于转移

JBE/JNA   OPRD

小于等于或不大于转移

带符号数比较转移指令

 

JG/JNLE   OPRD

高于或不低于等于转移

JGE/JNL   OPRD

高于等于或不低于转移

JL/JNGE   OPRD

小于或不大于等于转移

JLE/JNG   OPRD

小于等于或不大于转移

测试转移指令

 

JCXZ      OPRD  

CX=0 时转移

    从该表可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。这些指令通常对溢出标志位OF和符号标志位SF进行测试。对无符号数而言,这类指令通常测试标志位CF。对于带符号数分大于、等于、小于3种情况;对于无符号数分高于、等于、低于3种情况。在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。

    3.循环控制指令

    对于需要重复进行的操作,微机系统可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX或标志位ZF进行测试,确定是否循环,如表5所示。

表5 循环指令表

指令格式

执行操作

LOOP  OPRD

CX=CX-1;若CX<>0,则循环

LOOPNZ/LOOPNE  OPRD

CX=CX-1,若CX<>0 且ZF=0,则循环

LOOPZ/LOOPE   OPRD

CX=CX-1,若CX<>0 且ZF=1,则循环

    【例7】 有一首地址为ARRAY的M个字数组,试编写一段程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL中,程序段如下:

    MOV   CX,M             ;设计数器初值

    MOV   AX,0              ;累加器初值为0

    MOV   SI,AX             ;地址指针初值为0

    START:ADD   AX,ARRAY[SI]

    ADD   SI,2               ;修改指针值(字操作,因此加2)

    LOOP  START              ;重复

    MOV   TOTAL,AX        ;存结果

    【例8】 有一字符串,存放在ASCIISTR的内存区域中,字符串的长度为L。要求在字符串中查找空格(ASCII码为20H),找到则继续运行,否则转到NOTFOUND去执行。实现上述功能的程序段如下:

    MOV   CX,L                  ;设计数器初值

    MOV   SI,-1                  ;设地址指针初值

    MOV   AL,20H               ;空格的ASCII码送AL

    NEXT: INC    SI

    CMP   AL,ASCIISTR[SI]       ;比较是否空格?

    LOOPNZ  NEXT

    JNZ  NOTFOUND

    ……

    ……

    NOTFOUND:

    ……

    ……


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

发表评论

最新评论

电工学习网 ( )

GMT+8, 2021-12-6 20:45

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

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

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

返回顶部