第26篇-虚拟机字节码指令之操作数栈管理指令

操作数栈管理相关的字节码指令如下表所示。

0x57

pop

将栈顶数值弹出 (数值不能是long或double类型的)

0x58

pop2

将栈顶的一个(long或double类型的)或两个数值弹出(其它)

0x59

dup

复制栈顶数值并将复制值压入栈顶

0x5a

dup_x1

复制栈顶数值并将两个复制值压入栈顶

0x5b

dup_x2

复制栈顶数值并将三个(或两个)复制值压入栈顶

0x5c

dup2

复制栈顶一个(long或double类型的)或两个(其它)数值并将复制值压入栈顶

0x5d

dup2_x1

dup_x1 指令的双倍版本

0x5e

dup2_x2

dup_x2 指令的双倍版本

0x5f

swap

将栈最顶端的两个数值互换(数值不能是long或double类型的)

字节码指令对应的模板定义如下:

def(Bytecodes::_pop         , ____|____|____|____, vtos, vtos, pop         ,  _           );
def(Bytecodes::_pop2        , ____|____|____|____, vtos, vtos, pop2        ,  _           );
def(Bytecodes::_dup         , ____|____|____|____, vtos, vtos, dup         ,  _           );
def(Bytecodes::_dup_x1      , ____|____|____|____, vtos, vtos, dup_x1      ,  _           );
def(Bytecodes::_dup_x2      , ____|____|____|____, vtos, vtos, dup_x2      ,  _           );
def(Bytecodes::_dup2        , ____|____|____|____, vtos, vtos, dup2        ,  _           );
def(Bytecodes::_dup2_x1     , ____|____|____|____, vtos, vtos, dup2_x1     ,  _           );
def(Bytecodes::_dup2_x2     , ____|____|____|____, vtos, vtos, dup2_x2     ,  _           );
def(Bytecodes::_swap        , ____|____|____|____, vtos, vtos, swap        ,  _           );

pop指令将栈顶数值弹出。对应的汇编代码如下:

add    $0x8,%rsp   

pop2指令将栈顶数值弹出。对应的汇编代码如下:

add    $0x10,%rsp  

dup指令复制栈顶数值并将复制值压入栈顶。对应的汇编代码如下:

mov    (%rsp),%rax
push   %rax

swap指令将栈最顶端的两个数值互换(数值不能是long或double类型的)。对应的汇编代码如下:

mov    0x8(%rsp),%rcx
mov    (%rsp),%rax
mov    %rcx,(%rsp)
mov    %rax,0x8(%rsp)

指令的执行逻辑比较简单,这里不再过多介绍。

推荐阅读:

第1篇-关于JVM运行时,开篇说的简单些

第2篇-JVM虚拟机这样来调用Java主类的main()方法

第3篇-CallStub新栈帧的创建

第4篇-JVM终于开始调用Java主类的main()方法啦

第5篇-调用Java方法后弹出栈帧及处理返回结果

第6篇-Java方法新栈帧的创建

第7篇-为Java方法创建栈帧

第8篇-dispatch_next()函数分派字节码

第9篇-字节码指令的定义

第10篇-初始化模板表

第11篇-认识Stub与StubQueue

第12篇-认识CodeletMark

第13篇-通过InterpreterCodelet存储机器指令片段

第14篇-生成重要的例程

第15章-解释器及解释器生成器

第16章-虚拟机中的汇编器

第17章-x86-64寄存器

第18章-x86指令集之常用指令

第19篇-加载与存储指令(1)

第20篇-加载与存储指令之ldc与_fast_aldc指令(2)

第21篇-虚拟机字节码之运算指令

第22篇-虚拟机字节码指令之类型转换

第23篇-虚拟机对象操作指令之getstatic

第24篇-虚拟机对象操作指令之getfield

第25篇-虚拟机对象操作指令之putstatic

如果有问题可直接评论留言或加作者微信mazhimazh

关注公众号,有HotSpot VM源码剖析系列文章!

第26篇-虚拟机字节码指令之操作数栈管理指令

  

 

上一篇:python 练习题 10.05


下一篇:第24篇-虚拟机对象操作指令之getfield