8086指令系统之控制转移指令
前置问题
- 程序实现跳转的本质是什么?
- JMP和CALL、RET之间有什么共通之处?
- 条件转移指令转移的依据是什么?为何要分有符号数和无符号数的转移指令?
- CMP指令和条件跳转指令有何关系?
- 段内跳转和段间跳转有何区别?
- 跳转有直接跳转和间接跳转,寻址方式有直接寻址和间接寻址,它们有相通之处吗?
- 子程序调用和返回(CALL,RET)与中断响应和中断返回(INT,IRET)的异同之处在哪里?
无条件转移和过程调用指令
JMP 无条件转移指令
指令格式: JMP 目的
指令功能:无条件转移到目的地址去执行
这类指令又分为两种类型:
- 段内转移或者近(NEAR)转移。转移指令的目的地址,和JMP指令在同一代码段中,转移时仅改变IP的内容,段地址的CS值不变
- 段间转移,又叫远(FAR)转移。转移指令的目的地址和JMP指令不在同一段中,转移时,CS和IP地址都要改变,程序转移到另一个代码段去执行
就转移地址提供的方式而言,又可以分为两种方式:
- 直接转移。在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示。它又可分为段内直接转移和段间之间转移
- 间接转移。目的地址包含在某个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
指令执行的操作:IP
段间间接转移指令
操作数位存储器,要转移的目的地址CS:IP存放在存储器中。须加说明符DWORD PTR,表示转向地址需要取双字
过程调用指令
过程调用和返回指令
Call and Return
把某些能完成特定功能又常用的程序段独立编写成模块,称为过程(Procedure)
在主程序中使用CALL语句调用这些过程,格式:CALL 格式
过程以PROC开头,ENDP结束。过程中要安排一条返回指令RET,过程执行后能正确返回主程序,如:
1 | MySub PROC |