天天看點

javap -c 指令大全

轉載自知乎使用者

zhisheng

的回答

棧和局部變量操作
将常量壓入棧的指令
aconst_null         将null對象引用壓入棧
iconst_m1         将int類型常量-壓入棧
iconst_0         将int類型常量壓入棧
iconst_1         将int類型常量壓入棧
iconst_2         将int類型常量壓入棧
iconst_3         将int類型常量壓入棧
iconst_4         将int類型常量壓入棧
iconst_5         将int類型常量壓入棧
lconst_0         将long類型常量壓入棧
lconst_1         将long類型常量壓入棧
fconst_0         将float類型常量壓入棧
fconst_1         将float類型常量壓入棧
dconst_0         将double類型常量壓入棧
dconst_1         将double類型常量壓入棧
bipush             将一個位帶符号整數壓入棧
sipush             将位帶符号整數壓入棧
ldc             把常量池中的項壓入棧
ldc_w             把常量池中的項壓入棧(使用寬索引)
ldc2_w             把常量池中long類型或者double類型的項壓入棧(使用寬索引)
從棧中的局部變量中裝載值的指令
iload             從局部變量中裝載int類型值
lload             從局部變量中裝載long類型值
fload             從局部變量中裝載float類型值
dload             從局部變量中裝載double類型值
aload             從局部變量中裝載引用類型值(refernce)
iload_0             從局部變量中裝載int類型值
iload_1             從局部變量中裝載int類型值
iload_2             從局部變量中裝載int類型值
iload_3             從局部變量中裝載int類型值
lload_0             從局部變量中裝載long類型值
lload_1             從局部變量中裝載long類型值
lload_2             從局部變量中裝載long類型值

lload_3             從局部變量中裝載long類型值
fload_0             從局部變量中裝載float類型值
fload_1             從局部變量中裝載float類型值
fload_2             從局部變量中裝載float類型值
fload_3             從局部變量中裝載float類型值
dload_0             從局部變量中裝載double類型值
dload_1             從局部變量中裝載double類型值
dload_2             從局部變量中裝載double類型值
dload_3             從局部變量中裝載double類型值
aload_0             從局部變量中裝載引用類型值
aload_1             從局部變量中裝載引用類型值
aload_2             從局部變量中裝載引用類型值
aload_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類型值存入局部變量
istore_1         将int類型值存入局部變量
istore_2         将int類型值存入局部變量

istore_3         将int類型值存入局部變量
lstore_0         将long類型值存入局部變量
lstore_1         将long類型值存入局部變量
lstore_2         将long類型值存入局部變量
lstore_3         将long類型值存入局部變量
fstore_0         将float類型值存入局部變量
fstore_1         将float類型值存入局部變量
fstore_2         将float類型值存入局部變量
fstore_3         将float類型值存入局部變量
dstore_0         将double類型值存入局部變量
dstore_1         将double類型值存入局部變量
dstore_2         将double類型值存入局部變量
dstore_3         将double類型值存入局部變量
astore_0         将引用類型或returnAddress類型值存入局部變量
astore_1         将引用類型或returnAddress類型值存入局部變量
astore_2         将引用類型或returnAddress類型值存入局部變量
astore_3         将引用類型或returnAddress類型值存入局部變量
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         判斷對象是否為給定的類型
數組操作指令
newarray         配置設定資料成員類型為基本上資料類型的新數組
anewarray         配置設定資料成員類型為引用類型的新數組
arraylength         擷取數組長度
multianewarray         配置設定新的多元數組
控制流
條件分支指令
ifeq             如果等于,則跳轉
ifne             如果不等于,則跳轉
iflt             如果小于,則跳轉
ifge             如果大于等于,則跳轉
ifgt             如果大于,則跳轉
ifle             如果小于等于,則跳轉
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時,傳回-)
fcmpg             比較float類型值(當遇到NaN時,傳回)
dcmpl             比較double類型值(當遇到NaN時,傳回-)
dcmpg             比較double類型值(當遇到NaN時,傳回)

無條件轉移指令
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_<n>,lload,lload_<n>,fload,fload_<n>,dload,dload_<n>,aload,aload_<n>
操作數棧到變量:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstor_<n>,astore,astore_<n>
常數到操作數棧:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_<i>,lconst_<l>,fconst_<f>,dconst_<d>
加: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