第27篇-虛擬機字節碼指令之操作數棧管理指令


操作數棧管理相關的字節碼指令如下表所示。

0x57

pop

將棧頂數值彈出 (數值不能是longdouble類型的)

0x58

pop2

將棧頂的一個(longdouble類型的)或兩個數值彈出(其它)

0x59

dup

復制棧頂數值並將復制值壓入棧頂

0x5a

dup_x1

復制棧頂數值並將兩個復制值壓入棧頂

0x5b

dup_x2

復制棧頂數值並將三個(或兩個)復制值壓入棧頂

0x5c

dup2

復制棧頂一個(longdouble類型的)或兩個(其它)數值並將復制值壓入棧頂

0x5d

dup2_x1

dup_x1 指令的雙倍版本

0x5e

dup2_x2

dup_x2 指令的雙倍版本

0x5f

swap

將棧最頂端的兩個數值互換(數值不能是longdouble類型的)

字節碼指令對應的模板定義如下:

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指令將棧最頂端的兩個數值互換(數值不能是longdouble類型的)。對應的匯編代碼如下:

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篇-加載與存儲指令之iload、_fast_iload等(3)

第22篇-虛擬機字節碼之運算指令

第23篇-虛擬機字節碼指令之類型轉換

第24篇-虛擬機對象操作指令之getstatic

第25篇-虛擬機對象操作指令之getfield

第26篇-虛擬機對象操作指令之putstatic

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM