Jvm(47),指令集----控制转移指令
Posted qingruihappy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jvm(47),指令集----控制转移指令相关的知识,希望对你有一定的参考价值。
控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序,从概念模型上理解,可以认为控制转移指令就是在有条件或无条件地修改PC寄存器的值。控制转移指令如下。
条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、 if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne。
复合条件分支:tableswitch、lookupswitch。无条件分支:goto、goto_w、jsr、jsr_w、ret。
在Java虚拟机中有专门的指令集用来处理int和reference类型的条件分支比较操作,为了可以无须明显标识一个实体值是否null,也有专门的指令用来检测null值。
与前面算术运算时的规则一致,对于boolean类型、byte类型、char类型和short类型的条件分支比较操作,都是使用int类型的比较指令来完成,而对于long类型、float类型和 double类型的条件分支比较操作,则会先执行相应类型的比较运算指令(dcmpg、
dcmpl、fcmpg、fcmpl、lcmp,见6.4.3节),运算指令会返回一个整型值到操作数栈中,随后再执行int类型的条件分支比较操作来完成整个分支跳转。由于各种类型的比较最终都会转化为int类型的比较操作,int类型比较是否方便完善就显得尤为重要,所以Java虚拟机提供的int类型的条件分支指令是最为丰富和强大的。
public class Demo5 {
public static void main(String[] args) {
int a = 10;
if (a > 10) {
System.out.println("大于10");
} else {
System.out.println("小于10");
}
}
}
上面的步骤就是先将10入栈,然后存到局部变量表中,之后在讲10入栈和20进行比较,这个时候发现小于20就会走20行的代码,getstatic就是从方法区中获取标准的输入流,这个时候就会然后经过idc这一行获取打印出小于10的最后return。
以上是关于Jvm(47),指令集----控制转移指令的主要内容,如果未能解决你的问题,请参考以下文章
jvm原理(35)基于栈的指令集与基于寄存器的指令集详细比对&执行栈指令集实例剖析