JVM_字节码指令3_比较指令&条件指令

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 中

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值