JVM学习-字节码指令集(三)

代码下载

操作数栈管理指令
  • 如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作数栈的指令
  • 将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2
  • 复制栈顶一个或两个数值并将复制值成双份的复制值重新压入栈顶:dup,dup2,dup_x1,dup_x1,dup_x2,dup_x2
  • 将栈最顶端的两个Slot数值位置交换,swap,Java虚拟机没有提供交换两个64位数据类型(long,double)数值的指令
  • 指令nop,是一个非常特殊指令,它的字节码为0x00。和汇编语言中的nop一样,表示什么都不做,这条指令一般可用于调试,占位等
  • 上述指令属于通用型,对栈的压入或弹出无需指明数据类型
  • 说明
  • 不带_x指令是复制栈顶数据并压入栈顶,包括两个指令,dup和dup2,dup的系数代表要复制的Slot个数
  • dup开头的指令用于复制1个Slot的数据,例如1个int可1个reference类型数据
  • dup2开头的指令用于复制2个Slot的数据,如1个long,2个int或1个int+1个float类型数据
  • 带_x的指令是复制栈顶数据并插入栈顶以下的某个位置,共有4个指令,dup_x1,dup_x1,dup_x2,dup_x2,对于带_x的复制插入指令,只要将指令的dup和x的系数相加,结果即为需要插入的位置,因此
  • dup_x1插入位置:1 + 1 = 2,即栈顶2个Slot下面
  • dup_x2插入位置:1 + 2 = 3,即栈顶3个Slot下面
  • dup2_x1插入位置:2 + 1 = 3,即栈顶3个Slot下面
  • dup2_x2插入位置:2 + 2 = 4,即栈顶4个Slot下面
  • pop:将栈顶的1个Slot数值出栈,如1个short类型数值
  • pop2:将栈顶的2个Slot数值出栈,如1个double类型数值,或2个int类型数值
//可以编译后,通过IDEA的jclasslib插件查看字节码
public class StackOperateTest {
   
    public void print() {
   
        Object obj = new Object();
        //String info = obj.toString();
        obj.toString();
    }
    public void foo() {
   
        bar();
    }
    public long bar() {
   
        return 0;
    }
    public long nextIndex() {
   
        return index ++;
    }
    private long index = 0;
}

控制转移指令
比较指令
  • 比较指令的作用是比较栈顶两个元素的大小,并将比较结果入栈
  • 比较指令有dcmpg,dcmpl,fcmpg,fcmpl,lcmp
  • 对于double和float类型的数字,由于NaN的存在,各有两个版本的比较指令,以float为例,fcmpg和fcmpl两个指令,它们的区别在于在数字比较时,若遇到NaN值,处理结果不同
  • 指令dcmpl和dcmpg也是类似的,根据其命名可以推测其含义
  • 指令lcmp针对long型整数,由于long整数没有NaN值,无需准备两套指令
  • 举例:指令fcmpg和fcmpl都从栈中弹出两个操作数,并将它们做比较,设栈顶的元素为v2,栈顶顺位第2位的元素为v1,若v1=v2,则压入0,若v1>v2则压入1,若v1<v2则压入-1,两个指令不同之处在于,如遇到NaN值,fcmpg会压入1而fcmpl会压入-1
条件跳转指令
  • 条件跳转指令通常和比较指令结合使用,在条件跳转执行前,一般可以先用比较指令进行栈顶元素的准备,然后进行条件跳转

  • 条件跳转指令:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,这些指令都接收两个字节的操作数&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值