8086指令系统之控制转移指令

前置问题

  1. 程序实现跳转的本质是什么?
  2. JMP和CALL、RET之间有什么共通之处?
  3. 条件转移指令转移的依据是什么?为何要分有符号数和无符号数的转移指令?
  4. CMP指令和条件跳转指令有何关系?
  5. 段内跳转和段间跳转有何区别?
  6. 跳转有直接跳转和间接跳转,寻址方式有直接寻址和间接寻址,它们有相通之处吗?
  7. 子程序调用和返回(CALL,RET)与中断响应和中断返回(INT,IRET)的异同之处在哪里?

无条件转移和过程调用指令

JMP 无条件转移指令

指令格式: JMP 目的

指令功能:无条件转移到目的地址去执行

这类指令又分为两种类型:

  1. 段内转移或者近(NEAR)转移。转移指令的目的地址,和JMP指令在同一代码段中,转移时仅改变IP的内容,段地址的CS值不变
  2. 段间转移,又叫远(FAR)转移。转移指令的目的地址和JMP指令不在同一段中,转移时,CS和IP地址都要改变,程序转移到另一个代码段去执行

就转移地址提供的方式而言,又可以分为两种方式:

  1. 直接转移。在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示。它又可分为段内直接转移段间之间转移
  2. 间接转移。目的地址包含在某个16位寄存器或存储单元中,CPU必须根据寄存器或存储器寻址方式间接求转移地址。同样,这种转移类型又可以分为段间间接转移段内间接转移

综上,有四种不同转移方式:

段内直接转移指令

指令格式:

JMP SHORT 标号

JMP NEAR PTR 标号(或JMP 标号)

段内相对转移指令,目的操作数均用标号表示

转移的有效地址=IP+8/16位位移量(DISP)

若转移范围在-128~127字节内,则位短转移,指令中只需要用8位位移量,在标号前加说明符SHORT

若位移量是16位,称为近转移,目的地址与当前IP的距离在-32768~32767之间。可加说明符NEAR PTR,也可以省略。这类指令用的最多

段内间接转移指令

转向的地址存放在一个16位寄存器或字存储器单元中

用寄存器间接寻址的段内转移指令,转向的地址存放在寄存器中,执行操作:IP寄存器内容

段间直接(远)转移指令

指令中用标号直接给出转向的CS:IP,程序从一个代码段转到另一个代码段

eg:

JMP FAR PTR PROG_F

指令执行的操作:IPPROG_F的段内偏移量 CSPROG_F所在的段的段地址

段间间接转移指令

操作数位存储器,要转移的目的地址CS:IP存放在存储器中。须加说明符DWORD PTR,表示转向地址需要取双字

过程调用指令

过程调用和返回指令

Call and Return

把某些能完成特定功能又常用的程序段独立编写成模块,称为过程(Procedure)

在主程序中使用CALL语句调用这些过程,格式:CALL 格式

过程以PROC开头,ENDP结束。过程中要安排一条返回指令RET,过程执行后能正确返回主程序,如:

1
2
3
4
MySub PROC
......
RET
MySub ENDP