JVM指令手冊

来源:https://www.cnblogs.com/wandaren/archive/2022/11/19/16905908.html
-Advertisement-
Play Games

一、棧和局部變數操作 將常量壓入棧的指令 aconst_null 將null對象引用壓入棧 iconst_m1 將int類型常量-1壓入棧 iconst_0 將int類型常量0壓入棧 iconst_1 將int類型常量1壓入棧 iconst_2 將int類型常量2壓入棧 iconst_3 將int類 ...


一、棧和局部變數操作

將常量壓入棧的指令

aconst_null 將null對象引用壓入棧
iconst_m1 將int類型常量-1壓入棧
iconst_0 將int類型常量0壓入棧
iconst_1 將int類型常量1壓入棧
iconst_2 將int類型常量2壓入棧
iconst_3 將int類型常量3壓入棧
iconst_4 將int類型常量4壓入棧
iconst_5 將int類型常量5壓入棧
lconst_0 將long類型常量0壓入棧
lconst_1 將long類型常量1壓入棧
fconst_0 將float類型常量0壓入棧
fconst_1 將float類型常量1壓入棧
dconst_0 將double類型常量0壓入棧
dconst_1 將double類型常量1壓入棧
bipush 將一個8位帶符號整數壓入棧
sipush 將16位帶符號整數壓入棧
ldc 把常量池中的項壓入棧
ldc_w 把常量池中的項壓入棧(使用寬索引)
ldc2_w 把常量池中long類型或者double類型的項壓入棧(使用寬索引)

從棧中的局部變數中裝載值的指令

iload 從局部變數中裝載int類型值
lload 從局部變數中裝載long類型值
fload 從局部變數中裝載float類型值
dload 從局部變數中裝載double類型值
aload 從局部變數中裝載引用類型值(refernce)
iload_0 從局部變數0中裝載int類型值
iload_1 從局部變數1中裝載int類型值
iload_2 從局部變數2中裝載int類型值
iload_3 從局部變數3中裝載int類型值
lload_0 從局部變數0中裝載long類型值
lload_1 從局部變數1中裝載long類型值
lload_2 從局部變數2中裝載long類型值
lload_3 從局部變數3中裝載long類型值
fload_0 從局部變數0中裝載float類型值
fload_1 從局部變數1中裝載float類型值
fload_2 從局部變數2中裝載float類型值
fload_3 從局部變數3中裝載float類型值
dload_0 從局部變數0中裝載double類型值
dload_1 從局部變數1中裝載double類型值
dload_2 從局部變數2中裝載double類型值
dload_3 從局部變數3中裝載double類型值
aload_0 從局部變數0中裝載引用類型值
aload_1 從局部變數1中裝載引用類型值
aload_2 從局部變數2中裝載引用類型值
aload_3 從局部變數3中裝載引用類型值
iaload 從數組中裝載int類型值
laload 從數組中裝載long類型值
faload 從數組中裝載float類型值
daload 從數組中裝載double類型值
aaload 從數組中裝載引用類型值
baload 從數組中裝載byte類型或boolean類型值
caload 從數組中裝載char類型值
saload 從數組中裝載short類型值

將棧中的值存入局部變數的指令

istore 將int類型值存入局部變數
lstore 將long類型值存入局部變數
fstore 將float類型值存入局部變數
dstore 將double類型值存入局部變數
astore 將將引用類型或returnAddress類型值存入局部變數
istore_0 將int類型值存入局部變數0
istore_1 將int類型值存入局部變數1
istore_2 將int類型值存入局部變數2
istore_3 將int類型值存入局部變數3
lstore_0 將long類型值存入局部變數0
lstore_1 將long類型值存入局部變數1
lstore_2 將long類型值存入局部變數2
lstore_3 將long類型值存入局部變數3
fstore_0 將float類型值存入局部變數0
fstore_1 將float類型值存入局部變數1
fstore_2 將float類型值存入局部變數2
fstore_3 將float類型值存入局部變數3
dstore_0 將double類型值存入局部變數0
dstore_1 將double類型值存入局部變數1
dstore_2 將double類型值存入局部變數2
dstore_3 將double類型值存入局部變數3
astore_0 將引用類型或returnAddress類型值存入局部變數0
astore_1 將引用類型或returnAddress類型值存入局部變數1
astore_2 將引用類型或returnAddress類型值存入局部變數2
astore_3 將引用類型或returnAddress類型值存入局部變數3
iastore 將int類型值存入數組中
lastore 將long類型值存入數組中
fastore 將float類型值存入數組中
dastore 將double類型值存入數組中
aastore 將引用類型值存入數組中
bastore 將byte類型或者boolean類型值存入數組中
castore 將char類型值存入數組中
sastore 將short類型值存入數組中
wide指令
wide 使用附加位元組擴展局部變數索引

通用(無類型)棧操作

nop 不做任何操作
pop 彈出棧頂端一個字長的內容
pop2 彈出棧頂端兩個字長的內容
dup 複製棧頂部一個字長內容
dup_x1 複製棧頂部一個字長的內容,然後將複製內容及原來彈出的兩個字長的內容壓入棧
dup_x2 複製棧頂部一個字長的內容,然後將複製內容及原來彈出的三個字長的內容壓入棧
dup2 複製棧頂部兩個字長內容
dup2_x1 複製棧頂部兩個字長的內容,然後將複製內容及原來彈出的三個字長的內容壓入棧
dup2_x2 複製棧頂部兩個字長的內容,然後將複製內容及原來彈出的四個字長的內容壓入棧
swap 交換棧頂部兩個字長內容

二、類型轉換

i2l 把int類型的數據轉化為long類型
i2f 把int類型的數據轉化為float類型
i2d 把int類型的數據轉化為double類型
l2i 把long類型的數據轉化為int類型
l2f 把long類型的數據轉化為float類型
l2d 把long類型的數據轉化為double類型
f2i 把float類型的數據轉化為int類型
f2l 把float類型的數據轉化為long類型
f2d 把float類型的數據轉化為double類型
d2i 把double類型的數據轉化為int類型
d2l 把double類型的數據轉化為long類型
d2f 把double類型的數據轉化為float類型
i2b 把int類型的數據轉化為byte類型
i2c 把int類型的數據轉化為char類型
i2s 把int類型的數據轉化為short類型

三、整數運算

iadd 執行int類型的加法
ladd 執行long類型的加法
isub 執行int類型的減法
lsub 執行long類型的減法
imul 執行int類型的乘法
lmul 執行long類型的乘法
idiv 執行int類型的除法
ldiv 執行long類型的除法
irem 計算int類型除法的餘數
lrem 計算long類型除法的餘數
ineg 對一個int類型值進行取反操作
lneg 對一個long類型值進行取反操作
iinc 把一個常量值加到一個int類型的局部變數上

四、邏輯運算

移位操作

ishl 執行int類型的向左移位操作
lshl 執行long類型的向左移位操作
ishr 執行int類型的向右移位操作
lshr 執行long類型的向右移位操作
iushr 執行int類型的向右邏輯移位操作
lushr 執行long類型的向右邏輯移位操作

按位布爾運算

iand 對int類型值進行“邏輯與”操作
land 對long類型值進行“邏輯與”操作
ior 對int類型值進行“邏輯或”操作
lor 對long類型值進行“邏輯或”操作
ixor 對int類型值進行“邏輯異或”操作
lxor 對long類型值進行“邏輯異或”操作

浮點運算

fadd 執行float類型的加法
dadd 執行double類型的加法
fsub 執行float類型的減法
dsub 執行double類型的減法
fmul 執行float類型的乘法
dmul 執行double類型的乘法
fdiv 執行float類型的除法
ddiv 執行double類型的除法
frem 計算float類型除法的餘數
drem 計算double類型除法的餘數
fneg 將一個float類型的數值取反
dneg 將一個double類型的數值取反

五、對象和數組

對象操作指令

new 創建一個新對象
checkcast 確定對象為所給定的類型。後跟目標類,判斷棧頂元素是否為目標類 / 介面的實例。如果不是便拋出異常
getfield 從對象中獲取欄位
putfield 設置對象中欄位的值
getstatic 從類中獲取靜態欄位
putstatic 設置類中靜態欄位的值
instanceof 判斷對象是否為給定的類型。後跟目標類,判斷棧頂元素是否為目標類 / 介面的實例。是則壓入 1,否則壓入 0

數組操作指令

newarray 分配數據成員類型為基本上數據類型的新數組
anewarray 分配數據成員類型為引用類型的新數組
arraylength 獲取數組長度
multianewarray 分配新的多維數組

六、控制流

條件分支指令

ifeq 如果等於0,則跳轉
ifne 如果不等於0,則跳轉
iflt 如果小於0,則跳轉
ifge 如果大於等於0,則跳轉
ifgt 如果大於0,則跳轉
ifle 如果小於等於0,則跳轉
if_icmpcq 如果兩個int值相等,則跳轉
if_icmpne 如果兩個int類型值不相等,則跳轉
if_icmplt 如果一個int類型值小於另外一個int類型值,則跳轉
if_icmpge 如果一個int類型值大於或者等於另外一個int類型值,則跳轉
if_icmpgt 如果一個int類型值大於另外一個int類型值,則跳轉
if_icmple 如果一個int類型值小於或者等於另外一個int類型值,則跳轉
ifnull 如果等於null,則跳轉
ifnonnull 如果不等於null,則跳轉
if_acmpeq 如果兩個對象引用相等,則跳轉
if_acmpnc 如果兩個對象引用不相等,則跳轉

比較指令

lcmp 比較long類型值
fcmpl 比較float類型值(當遇到NaN時,返回-1)
fcmpg 比較float類型值(當遇到NaN時,返回1)
dcmpl 比較double類型值(當遇到NaN時,返回-1)
dcmpg 比較double類型值(當遇到NaN時,返回1)

無條件轉移指令

goto 無條件跳轉
goto_w 無條件跳轉(寬索引)

表跳轉指令

tableswitch 通過索引訪問跳轉表,並跳轉
lookupswitch 通過鍵值匹配訪問跳轉表,並執行跳轉操作

異常

athrow 拋出異常或錯誤。將棧頂異常拋出
finally子句
jsr 跳轉到子常式
jsr_w 跳轉到子常式(寬索引)
rct 從子常式返回

七、方法調用與返回

方法調用指令

invokcvirtual 運行時按照對象的類來調用實例方法
invokespecial 根據編譯時類型來調用實例方法
invokestatic 調用類(靜態)方法
invokcinterface 調用介面方法

方法返回指令

ireturn 從方法中返回int類型的數據
lreturn 從方法中返回long類型的數據
freturn 從方法中返回float類型的數據
dreturn 從方法中返回double類型的數據
areturn 從方法中返回引用類型的數據
return 從方法中返回,返回值為void

線程同步

montiorenter 進入並獲取對象監視器。即:為棧頂對象加鎖
monitorexit 釋放並退出對象監視器。即:為棧頂對象解鎖

八、JVM指令助記符

變數到操作數棧:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_
操作數棧到變數:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_
常數到操作數棧:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_
加:iadd,ladd,fadd,dadd
減:isub,lsub,fsub,dsub
乘:imul,lmul,fmul,dmul
除:idiv,ldiv,fdiv,ddiv
餘數:irem,lrem,frem,drem
取負:ineg,lneg,fneg,dneg
移位:ishl,lshr,iushr,lshl,lshr,lushr
按位或:ior,lor
按位與:iand,land
按位異或:ixor,lxor
類型轉換:i2l,i2f,i2d,l2f,l2d,f2d(放寬數值轉換)
i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(縮窄數值轉換)
創建類實便:new
創建新數組:newarray,anewarray,multianwarray
訪問類的域和類實例域:getfield,putfield,getstatic,putstatic
把數據裝載到操作數棧:baload,caload,saload,iaload,laload,faload,daload,aaload
從操作數棧存存儲到數組:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore
獲取數組長度:arraylength
檢相類實例或數組屬性:instanceof,checkcast
操作數棧管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap
有條件轉移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,
if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl
fcmpg,dcmpl,dcmpg
複合條件轉移:tableswitch,lookupswitch
無條件轉移:goto,goto_w,jsr,jsr_w,ret
調度對象的實便方法:invokevirtual
調用由介面實現的方法:invokeinterface
調用需要特殊處理的實例方法:invokespecial
調用命名類中的靜態方法:invokestatic
方法返回:ireturn,lreturn,freturn,dreturn,areturn,return
異常:athrow
finally關鍵字的實現使用:jsr,jsr_w,ret


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用類模板實現STL Vector,點擊查看代碼 #include <iostream> using namespace std; template<typename T> class MyVector { public: //構造函數 MyVector<T>(int size = 10) { T ...
  • 1、Erlnag安裝 1.1、 安裝Erlang版本要求 Erlang安裝需要對應各自的版本 http://www.rabbitmq.com/which-erlang.html 1.2、 Erlang安裝 1、目錄準備 cd /usr/local/src/ mkdir rabbitmq cd rab ...
  • 1、依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2、rabbitmq鏈接配置 spring: r ...
  • class位元組碼文件結構 | 類型 | 名稱 | 說明 | 長度 | 數量 | | | | | | | | u4 | magic | 魔數,識別Class文件格式 | 4個位元組 | 1 | | u2 | minor_version | 副版本號(小版本) | 2個位元組 | 1 | | u2 | ma ...
  • JZ73翻轉單詞序列 描述 牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“nowcoder. a am I”。後來才意識到,這家伙原來把句子單詞的順序翻轉了,正確的句子應 ...
  • 1.面向對象&面向過程 面向過程思想 步驟清晰簡單,第一步做什麼,第二步做什麼.... 面向過程適合處理一些簡單的問題。 面向對象思想 物以類聚,在思考問題解決方案時會先將問題進行分類,然後對這些分類的問題進行深入思考。最後才是對問題的實現細節進行面向過程的思考。 面向對象適合對大型項目的構建,對復 ...
  • 在SLAM十四講的代碼編譯過程中direct_method.cpp和optical_flow.cpp有CV_GRAY2BGR語句的報錯 這是因為CV_GRAY2BGR是opencv2的用法,而slambook2的的cmakelist.txt中opencv的庫用的是opencv4, 因此要將CV_GR ...
  • 🏵️前言 👉以下我要講解的是Python中最後剩餘的重要內置函數,其中比較重要的會詳細講解,比較簡單的會直接結合代碼進行剖析 ​編輯 🍁一、reversed內置函數 描述 reversed 函數返回一個反轉的迭代器。 語法 reversed(seq) 參數 seq -- 要轉換的序列,可以是 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...