18.7 字节码指令集与解析举例 - 操作数栈管理指令

本文介绍JVM中操作数栈的管理指令,包括弹出、复制、交换等操作的具体实现方式。这些指令用于直接操作操作数栈,是理解JVM工作原理的重要组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作数栈管理指令

如同操作一个普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令,可以用于直接操作操作数栈的指令。

这类指令包括如下内容:

  • 将一个或两个元素从栈顶弹出,并且直接废弃:pop,pop2;

  • 复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup, dup2,dup_x1,dup2_x1,dup_x2, dup2_×2;

  • 将栈最顶端的两个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, dup2_x1,dup_x2,dup2_×2。对于带_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类型数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值