1. 比较指令
作用是比较栈顶两个元素的大小,并将比较结果入栈。
比较指令有:dcmpg,dcmpl、fcmpg、fcmpl、lcmp
首字符d表示double类型,f表示loat,l表示long.
指令fcmpg和fcmpl 都从栈中弹出两个操作数,并将它们做比较,设栈顶的元素为v2,栈顶顺位第2位的元素为v1,
若v1=v2,则压入0;若v1>v2则压入1:若v1<v2则压入-1。
2.条件跳转指令
条件跳转指令通常和比较指令结合使用。
在条件跳转指令执行前,一般可以先用比较指令进行栈顶元素的准备,然后进行条件跳转。
条件件跳转指令有:ifeq,iflt,ifle,ifne, ifgt, ifge, ifnull,ifnonnull, if_icmpne, if_icmpeq .这些指令都接收两个字节的操作数
用于计算跳转的位置(16位符号整数作为当前位置的offset)。
它们的统一含义为:弹出栈顶元素,测试试它是否满足某一条件,如果满足条件,则跳转到给定位置
例子1:
//1.条件跳转指令
public void compare1() {
int a = 0;
if (a == 0) {
a = 10;
} else {
a = 20;
}
}
对应的字节码为:
0 iconst_0
1 istore_1
2 iload_1
3 ifne 12 (+9)
6 bipush 10
8 istore_1
9 goto 15 (+6)
12 bipush 20
14 istore_1
15 return
例子2(把判断条件改为 a!=0)
public void compare2() {
int a = 0;
if (a != 0) {
a = 10;
} else {
a = 20;
}
}
则对应的字节码指令为:
0 iconst_0
1 istore_1
2 iload_1
3 ifeq 12 (+9)
6 bipush 10
8 istore_1
9 goto 15 (+6)
12 bipush 20
14 istore_1
15 return
由此可以看出,条件跳转指令使用的反向思维:
(1)如果判断条件为 ==, 则使用类似 ifne (不等于)然后跳转到 else 中
(2) 如果判断条件为 !=, 则使用类似 ifeq (不等于)然后跳转到 else 中