8086指令系统---控制转移指令(二)

发布者:码字先生最新更新时间:2015-09-23 来源: eefocus关键字:指令系统  控制转移指令 手机看文章 扫描二维码
随时随地手机看文章
  3 循环指令


  这一组指令在循环结构的程序中用来控制一段程序(称为循环体)的重复执行,在汇编指令中循环的转向地址用标号来表示,而在机器指令中给出的是位移量,所以执行循环指令时,若满足循环条件,CPU就计算转向地址:(IP)当前+8位位移量→(IP),即实现循环。

  若不满足循环条件,即退出循环,程序继续顺序执行。
  循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。

  对条件循环指令LOOPZ(LOOPE)和LOOPNZ(LOOPNE),除测试CX中的循环次数外,还将ZF的值作为循环的必要条件,因此,要注意将条件循环指令紧接在形成ZF的指令之后。

  在多重循环的程序结构中,如果各层循环都使用循环指令来控制,则应注意对CX中循环计数值的保存与恢复。
循环指令均不影响条件码。

  LOOP  label    循环(loop)
  执行操作:① (CX)←(CX)-1
       ② 若(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束

  LOOPZ/LOOPE label 为零/相等时循环(loop while zero,or equal)
  执行操作:① (CX)←(CX)-1
       ② 若ZF=1且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束

  LOOPNZ/LOOPNE label 不为零/不等时循环(loop while nonzero,or not equal)
  执行操作:① (CX)←(CX)-1
       ② 若ZF=0且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束

    例 编写程序,实现两个数据块BLOCK1和BLOCK2相加,结果存入BLOCK2。
       DATA   SEGMENT
       BLOCK1   DW   100 DUP(?)
       BLOCK2   DW   100 DUP(?)
       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   CX,100        ; load the counter
       MOV   SI,OFFSET BLOCK1  ; address of block1
       MOV   DI,OFFSET BLOCK2  ; address of block2
    NEXT: LODSW            ; load the data of block1 into AX
       ADD   AX,ES:[DI]     ; add the data of block2 to AX
       STOSW            ; store the sum to block2
       LOOP   NEXT        ; repeat 100 times
       MOV   AX,4C00H      ; return to DOS
       INT   21H
    CODE  ENDS
       END   START

   4 子程序调用与返回指令

  子程序是一种非常重要的计算机编程结构,它存储在存储器中,可供一个或多个调用程序(主程序)反复调用。主程序调用子程序时使用CALL指令,由子程序返回主程序时使用RET指令。由于调用程序和子程序可以在同一个代码段中,也可以在不同的代码段中,因此,CALL指令和RET指令也有近调用、近返回及远调用、远返回两类格式。

 ⑴ CALL NEAR PTR SUBPROUT 近调用(near call)
  近调用是CALL指令的缺省格式,可以写为"CALL subrotine"。它调用同一个代码段内的子程序(子过程),因此,在调用过程中不用改变CS的值,只需将子程序的地址存入IP寄存器。CALL指令中的调用地址可以用直接和间接两种寻址方式表示。

 ⑵ CALL FAR PTR SUBPROUT 远调用(far call)
  远调用适用于调用程序(也称为主程序)和子程序不在同一段中的情况,所以也叫做段间调用。和近调用指令一样,远调用指令中的寻址方式也可用直接方式和间接方式。

 ⑶ RET 返回指令(return)
  RET指令执行的操作是把保存在堆栈中的返回地址出栈,以完成从子程序返回到调用程序的功能。

  ● CALL SUBROUT 段内直接调用
  执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前
       ② (IP) ← (IP)当前+16位位移量(在指令的第2、3个字节中)
  
  ● CALL DESTIN 段内间接调用
  执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前
       ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址

  ● CALL FAR PTR SUBROUT 段间直接调用
  执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前
         (SP) ← (SP)-2,((SP)) ← (IP)当前
       ② (IP) ← 偏移地址(在指令的第2、3个字节中)
         (CS) ← 段地址(在指令的第4、5个字节中)

  ● CALL WORD PTR DESTIN 段间间接调用
  执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前
         (SP) ← (SP)-2,((SP)) ← (IP)当前
       ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址
         (CS) ← (EA+2)

  从CALL指令执行的操作可以看出,第一步是把子程序返回调用程序的地址保存在堆栈中。对段内调用,只需将IP的当前值,即CALL指令的下一条指令的地址存入SP所指示的堆栈字单元中。对段间调用,保存返回地址则意味着要将CS和IP的当前值分别存入堆栈的两个字单元中。

  CALL指令的第二步操作是转子程序,即把子程序的入口地址交给IP(段内调用)或CS:IP(段间调用)。对段内直接方式,调转的位移量,即子程序的入口地址和返回地址之间的差值就在机器指令的2、3字节中。对段间直接方式,子程序的偏移地址和段地址就在操作码之后的两个字中。对间接方式,子程序的入口地址就从寻址方式所确定的有效地址中获得。

  ● RET 段内返回(近返回)
  执行操作:(IP) ← ((SP)),(SP) ← (SP)+2

  ● RET 段间返回(远返回)
  执行操作:(IP) ← ((SP)),(SP) ← (SP)+2
       (CS) ←((SP)),(SP) ← (SP)+2

  ● RET N 带立即数返回
  执行操作:① 返回地址出栈(操作同段内或段间返回)
       ② 修改堆栈指针:(SP) ← (SP)+N

  子程序的最后一条指令必须是RET指令,以返回到主程序。如果是段内返回,只需把保存在堆栈中的偏移地址出栈存入IP即可,如果是段间返回,则要把偏移地址和段地址都从堆栈中取出送到IP和CS寄存器中。

  带立即数返回指令,除完成偏移地址出栈或偏移地址和段地址出栈的操作外,还要再使SP的内容加上一个立即数N,使堆栈指针SP移动到新的位置。指令中的N可以是一个常数,也可以是一个表达式。带立即数返回指令适用于C或PASCAL的调用规则,这些规则在调用过程(子程序)前先把参数压入堆栈,子程序使用这些参数后,如果在返回时丢弃这些已无用的参数,就在RET指令中包含一个数字,它表示压入到堆栈中参数的字节数,这样堆栈指针就恢复到参数入栈前的值。

  CALL指令和RET指令都不影响条件码。

   例 根据下面调用程序和子程序的程序清单,画出RET指令执行前和执行后的堆栈情况。假设初始的SS:SP=A000:1000。
 
    0000  B8 001E   MOV  AX,30
    0003  BB 0028   MOV  BX,40
    0006  50      PUSH AX     ; push data1 into stack
    0007  53      PUSH BX     ; push data2 into stack
    0008  E8 0066   CALL ADDM    ; call subroutine
    000B  B4 02    MOV  AH,2
    …   …      …
    0071  ADDM     PROC NEAR  ; entry point (IP)←0071=000b+0066
    0071  55      PUSH BP     ; save BP
    0072  8B E4    MOV  BP,SP    ; addressing the stack with BP
    0074  8B 46 04  MOV  AX,[BP+4] ; get data2 from stack
    0077  03 46 06   ADD  AX,[BP+6] ; add data1
    007A  CD      POP  BP     ; get back BP
    007B  C2      0004 RET 4   ; return and revert SP
    007E  ADDM     ENDP

 图 CALL指令和RET指令对堆栈的影响

 

[转载][汇编]8086指令系统---控制转移指令(二)

  如图3.12所示,主程序中的两条PUSH指令将数据30和40压入堆栈,CALL指令执行后,返回地址000B又压入堆栈,紧接着程序控制转移到子程序ADDM。子程序中的PUSH指令又使BP的值进栈,此时SP指向栈顶0FFA。MOV指令将0FFA传送给BP,使BP作为寻址堆栈数据的指针。(BP+4)指向的是40,(BP+6)指向的是30,取出数据后用POP指令恢复了BP原先的值,此时,(SP)=0FFC,这是RET 4指令执行前的堆栈状态。[page]

  执行RET 4指令时,先使返回地址出栈:(IP)←000B,(SP)←0FFC+2=0FFD,然后,(SP)+4=0FFD+4=1000,结果使SP跳过了堆栈数据而回到了原始位置。

  5 中断及中断返回指令

 INT n 中断指令(interrupt),n为中断类型号

 IRET 中断返回指令(return from interrupt)

 INTO 溢出则中断(中断类型为4)

  INT n 中断指令(interrupt),n为中断类型号
  执行操作:① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
       ② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
                  (SP) ← (SP)-2,((SP)) ← (IP)
       ③ 转中断处理程序:(IP) ← (n×4)
                 (CS) ← (n×4+2)

  IRET 中断返回指令(return from interrupt)
  执行操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2
                (CS) ← ((SP)),(SP) ← (SP)+2
       ② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2

  INTO 溢出则中断(中断类型为4)
  执行操作:若OF=1(有溢出),则:
       ① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)
       ② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)
                  (SP) ← (SP)-2,((SP)) ← (IP)
       ③ 转中断处理程序:(IP) ← (4×4)= (10H)
                 (CS) ← (4×4+2)= (12H)

  中断指令用于调用中断例行程序(又称中断服务程序),这是一种远调用。完成各种功能的中断例行程序都有一个编号,称为中断类型号。各种中断例行程序的入口地址按中断类型号的顺序存储在一个表中,这个表称为中断向量表。每个中断例行程序的入口地址占用4个字节,因此,它在中断向量表中的地址可用中断类型号乘4来求得。执行中断指令时,首先要入栈保存调用程序执行的现场,即当时的标志寄存器的值和断点的地址,然后,根据中断类型号(n×4)到中断向量表中取得中断例行程序的入口地址,分别送给IP和CS,以实现调用中断例行程序的功能。

  中断返回指令IRET的操作和INT指令相反,即从堆栈中取出返回地址和标志位,然后返回到被中断的程序。
INTO指令隐含的中断类型号为4,因此保存断点地址和标志位后,从中断向量表的10H和12H两个字中取出中断例行程序的入口地址,从而转去运行中断例行程序。

  INT指令(包括INTO)执行后,把IF和TF置0,但不影响其它标志位。

 

  6 处理机控制指令

  处理机控制指令包括一组置0或置1标志位的指令,还有一些控制处理机状态的指令。

   6.1 标志位处理指令

  这一组指令分别对标志位CF、DF、IF执行置0、置1或求反的操作,如,CLD指令执行的操作是:DF←0;STD执行的操作是:DF←1。

  标志位处理指令只影响本指令指定的标志,而不影响其它标志位。

    ⑴ 标志位处理指令      ⑵ 处理机控制指令
      CLC CF置0          NOP 无操作
      STC CF置1          HLT 停机
      CMC CF求反          WAIT 等待
      CLD DF置0          ESC 转义
      STD DF置1          LOCK 封锁
      CLI IF置0
      STI IF置1

 

  6.2 处理机控制指令

  NOP 无操作指令(no operation)

  HLT 停机指令(halt)

  WAIT 等待指令(wait)

  ESC mem 转义指令(escape)

  LOCK前缀封锁(lock)

  NOP 无操作指令(no operation)
  执行操作:不执行任何操作,其机器码占用1个字节单元,执行时间为3个时钟周期,因此,该指令的作用表现在时间和空间上。时间上它可使上下两条指令的执行有一点间隔,这使某些指令的执行,特别是控制硬件接口的指令因为有一点延时而增加可靠性。空间上它的位置可在调试指令时用其它指令来代替。

  HLT 停机指令(halt)
  执行操作:使处理机停止软件的执行并等待一次外部中断的到来,中断结束后处理机继续执行下面的程序。使用该指令的目的通常是为了保持外部硬件中断与软件系统的同步。

  WAIT 等待指令(wait)
  执行操作:测试微处理器的BUSY/TEST管脚,如果执行WAIT指令时,BUSY/TEST=1(指示不忙),则继续执行下一条指令。如果执行WAIT指令时,BUSY/TEST=0(指示忙),则微处理器等待直到BUSY/TEST管脚变为1。
  
  ESC mem 转义指令(escape)
  执行操作:mem指定存储单元,执行ESC指令时,从存储器取得指令或操作数通过总线送给8087~80387数值协处理器。协处理器能处理算术运算、函数运算、对数运算等数值运算,其运算速度比使用常规指令写的软件快的多。

  LOCK前缀 封锁(lock)
  执行操作:指令前加LOCK,使得在锁定指令期间保持锁存信号LOCK=0,以禁止外部总线上的主控制器或系统其它部件。例如,LOCK MOV AL,[SI]执行时,总线封锁直至MOV指令执行完毕。

 

  【小结】

   1、8086寻址方式

  寻址方式
    操作数地址(PA)
   指令格式举例
  立即寻址
操作数在指令中给出
MOV DX,100H ; (DX)←100H
  寄存器寻址
操作数在寄存器中
ADD AX,BX ; (AX)←(AX)+(BX)
  直接寻址
操作数的有效地址由指令直接给出
MOV AX,[100] ; (AX)←(100)
MOV AX,VAR ; (AX)←(VAR)
  寄存器
  间接寻址
PA=(DS)×16+(BX)或(SI)或(DI)
PA=(SS) ×16+(BP)
MOV AX,[BX] ;
(AX)←((DS)×16+(BX))
  寄存器
  相对寻址
PA=(DS)×16+(BX)或(SI)或(DI)+位移量
PA=(SS) ×16+(BP)+位移量
MOV AL,MESS[SI];
(AL)←((DS)×16+(SI)+OFFSET MESS)
  基址变址
  寻址
PA=(DS)×16+(BX)+(SI)或(DI)
PA=(SS) ×16+(BP) +(SI)或(DI)
MOV AX,[BX+DI];
(AX)←((DS)×16+(BX)+(DI))
  相对基址
  变址寻址
PA=(DS)×16+(BX)+(SI)或(DI)+位移量
PA=(SS) ×16+(BP) +(SI)或(DI)+位移量
MOV AX,BUFF(BX+DI);
(AX)←((DS)×16+(BX)+(DI)+OFFSET BUFF)

  2、8086指令系统
   学习一条指令时,要注意以下几个方面:
   (1) 指令功能--该指令能实现何种操作,通常指令助记符就是指令功能的英文缩写词。
   (2) 指令支持的寻址方式--指令中的源操作数和目的操作数字段允许采用的寻址方式。
   (3) 指令对标志位的影响--该指令执行后对各个标志位的影响。
   (4) 指令的特殊要求--该指令隐含使用或限定使用的寄存器以及需要预置的参数。
关键字:指令系统  控制转移指令 引用地址:8086指令系统---控制转移指令(二)

上一篇:8086指令系统---逻辑指令
下一篇:8086寻址方式

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

8课:单片机寻址方式与指令系统
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051单片机的指令部份。 一、概述 1、指令的格式 我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。 2、汇编 我们写指令使用汇
[单片机]
MCS-51指令系统的寻址方式与实例介绍
寻 址 方 式 寻 址 范 围 操作数形式 举 例 寄存器 寻址 R0-R7 ,DPTR Acc,B,C(Cy 位) 寄存器名 MOV R3,A INC DPTR 直接 寻址 内部RAM 00H-7FH 特殊功能寄存器 80H-FFH 8位地址 SFR名 MOV 79H,SP PUSH P1 直接 位寻址 内部RAM位寻址区 (20H-2FH): 位地址00H-7FH 可寻址的特殊功能寄存器: 位地址 80H-F7H 8位地址 位名 SFR名.位序 MOV C,78H CL
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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