常量入棧指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x01
aconst_null
null值入棧。
0x02
iconst_m1
-1(int)值入棧。
0x03
iconst_0
0(int)值入棧。
0x04
iconst_1
1(int)值入棧。
0x05
iconst_2
2(int)值入棧。
0x06
iconst_3
3(int)值入棧。
0x07
iconst_4
4(int)值入棧。
0x08
iconst_5
5(int)值入棧。
0x09
lconst_0
0(long)值入棧。
0x0a
lconst_1
1(long)值入棧。
0x0b
fconst_0
0(float)值入棧。
0x0c
fconst_1
1(float)值入棧。
0x0d
fconst_2
2(float)值入棧。
0x0e
dconst_0
0(double)值入棧。
0x0f
dconst_1
1(double)值入棧。
0x10
bipush
valuebyte
valuebyte值帶符號擴展成int值入棧。
0x11
sipush
valuebyte1
valuebyte2
(valuebyte1 << 8) | valuebyte2 值帶符號擴展成int值入棧。
0x12
ldc
indexbyte1
常量池中的常量值(int, float, string reference, object reference)入棧。
0x13
ldc_w
indexbyte1
indexbyte2
常量池中常量(int, float, string reference, object reference)入棧。
0x14
ldc2_w
indexbyte1
indexbyte2
常量池中常量(long, double)入棧。
局部變量值轉載到棧中指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x19
(wide)aload
indexbyte
從局部變量indexbyte中裝載引用類型值入棧。
0x2a
aload_0
從局部變量0中裝載引用類型值入棧。
0x2b
aload_1
從局部變量1中裝載引用類型值入棧。
0x2c
aload_2
從局部變量2中裝載引用類型值入棧。
0x2d
aload_3
從局部變量3中裝載引用類型值入棧。
0x15
(wide)iload
indexbyte
從局部變量indexbyte中裝載int類型值入棧。
0x1a
iload_0
從局部變量0中裝載int類型值入棧。
0x1b
iload_1
從局部變量1中裝載int類型值入棧。
0x1c
iload_2
從局部變量2中裝載int類型值入棧。
0x1d
iload_3
從局部變量3中裝載int類型值入棧。
0x16
(wide)lload
indexbyte
從局部變量indexbyte中裝載long類型值入棧。
0x1e
lload_0
從局部變量0中裝載int類型值入棧。
0x1f
lload_1
從局部變量1中裝載int類型值入棧。
0x20
lload_2
從局部變量2中裝載int類型值入棧。
0x21
lload_3
從局部變量3中裝載int類型值入棧。
0x17
(wide)fload
indexbyte
從局部變量indexbyte中裝載float類型值入棧。
0x22
fload_0
從局部變量0中裝載float類型值入棧。
0x23
fload_1
從局部變量1中裝載float類型值入棧。
0x24
fload_2
從局部變量2中裝載float類型值入棧。
0x25
fload_3
從局部變量3中裝載float類型值入棧。
0x18
(wide)dload
indexbyte
從局部變量indexbyte中裝載double類型值入棧。
0x26
dload_0
從局部變量0中裝載double類型值入棧。
0x27
dload_1
從局部變量1中裝載double類型值入棧。
0x28
dload_2
從局部變量2中裝載double類型值入棧。
0x29
dload_3
從局部變量3中裝載double類型值入棧。
0x32
aaload
從引用類型數組中裝載指定項的值。
0x2e
iaload
從int類型數組中裝載指定項的值。
0x2f
laload
從long類型數組中裝載指定項的值。
0x30
faload
從float類型數組中裝載指定項的值。
0x31
daload
從double類型數組中裝載指定項的值。
0x33
baload
從boolean類型數組或byte類型數組中裝載指定項的值(先轉換為int類型值,后壓棧)。
0x34
caload
從char類型數組中裝載指定項的值(先轉換為int類型值,后壓棧)。
0x35
saload
從short類型數組中裝載指定項的值(先轉換為int類型值,后壓棧)。
將棧頂值保存到局部變量中指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x3a
(wide)astore
indexbyte
將棧頂引用類型值保存到局部變量indexbyte中。
0x4b
astroe_0
將棧頂引用類型值保存到局部變量0中。
0x4c
astore_1
將棧頂引用類型值保存到局部變量1中。
0x4d
astore_2
將棧頂引用類型值保存到局部變量2中。
0x4e
astore_3
將棧頂引用類型值保存到局部變量3中。
0x36
(wide)istore
indexbyte
將棧頂int類型值保存到局部變量indexbyte中。
0x3b
istore_0
將棧頂int類型值保存到局部變量0中。
0x3c
istore_1
將棧頂int類型值保存到局部變量1中。
0x3d
istore_2
將棧頂int類型值保存到局部變量2中。
0x3e
istore_3
將棧頂int類型值保存到局部變量3中。
0x37
(wide)lstore
indexbyte
將棧頂long類型值保存到局部變量indexbyte中。
0x3f
lstore_0
將棧頂long類型值保存到局部變量0中。
0x40
lstore_1
將棧頂long類型值保存到局部變量1中。
0x41
lstore_2
將棧頂long類型值保存到局部變量2中。
0x42
lstroe_3
將棧頂long類型值保存到局部變量3中。
0x38
(wide)fstore
indexbyte
將棧頂float類型值保存到局部變量indexbyte中。
0x43
fstore_0
將棧頂float類型值保存到局部變量0中。
0x44
fstore_1
將棧頂float類型值保存到局部變量1中。
0x45
fstore_2
將棧頂float類型值保存到局部變量2中。
0x46
fstore_3
將棧頂float類型值保存到局部變量3中。
0x39
(wide)dstore
indexbyte
將棧頂double類型值保存到局部變量indexbyte中。
0x47
dstore_0
將棧頂double類型值保存到局部變量0中。
0x48
dstore_1
將棧頂double類型值保存到局部變量1中。
0x49
dstore_2
將棧頂double類型值保存到局部變量2中。
0x4a
dstore_3
將棧頂double類型值保存到局部變量3中。
0x53
aastore
將棧頂引用類型值保存到指定引用類型數組的指定項。
0x4f
iastore
將棧頂int類型值保存到指定int類型數組的指定項。
0x50
lastore
將棧頂long類型值保存到指定long類型數組的指定項。
0x51
fastore
將棧頂float類型值保存到指定float類型數組的指定項。
0x52
dastore
將棧頂double類型值保存到指定double類型數組的指定項。
0x54
bastroe
將棧頂boolean類型值或byte類型值保存到指定boolean類型數組或byte類型數組的指定項。
0x55
castore
將棧頂char類型值保存到指定char類型數組的指定項。
0x56
sastore
將棧頂short類型值保存到指定short類型數組的指定項。
wide指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xc4
wide
使用附加字節擴展局部變量索引(iinc指令特殊)。
通用(無類型)棧操作指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x00
nop
空操作。
0x57
pop
從棧頂彈出一個字長的數據。
0x58
pop2
從棧頂彈出兩個字長的數據。
0x59
dup
復制棧頂一個字長的數據,將復制后的數據壓棧。
0x5a
dup_x1
復制棧頂一個字長的數據,彈出棧頂兩個字長數據,先將復制后的數據壓棧,再將彈出的兩個字長數據壓棧。
0x5b
dup_x2
復制棧頂一個字長的數據,彈出棧頂三個字長的數據,將復制后的數據壓棧,再將彈出的三個字長的數據壓棧。
0x5c
dup2
復制棧頂兩個字長的數據,將復制后的兩個字長的數據壓棧。
0x5d
dup2_x1
復制棧頂兩個字長的數據,彈出棧頂三個字長的數據,將復制后的兩個字長的數據壓棧,再將彈出的三個字長的數據壓棧。
0x5e
dup2_x2
復制棧頂兩個字長的數據,彈出棧頂四個字長的數據,將復制后的兩個字長的數據壓棧,再將彈出的四個字長的數據壓棧。
0x5f
swap
交換棧頂兩個字長的數據的位置。Java指令中沒有提供以兩個字長為單位的交換指令。
類型轉換指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x86
i2f
將棧頂int類型值轉換為float類型值。
0x85
i2l
將棧頂int類型值轉換為long類型值。
0x87
i2d
將棧頂int類型值轉換為double類型值。
0x8b
f2i
將棧頂float類型值轉換為int類型值。
0x8c
f2l
將棧頂float類型值轉換為long類型值。
0x8d
f2d
將棧頂float類型值轉換為double類型值。
0x88
l2i
將棧頂long類型值轉換為int類型值。
0x89
l2f
將棧頂long類型值轉換為float類型值。
0x8a
l2d
將棧頂long類型值轉換double類型值。
0x8e
d2i
將棧頂double類型值轉換為int類型值。
0x90
d2f
將棧頂double類型值轉換為float類型值。
0x8f
d2l
將棧頂double類型值轉換為long類型值。
0x91
i2b
將棧頂int類型值截斷成byte類型,后帶符號擴展成int類型值入棧。
0x92
i2c
將棧頂int類型值截斷成char類型值,后帶符號擴展成int類型值入棧。
0x93
i2s
將棧頂int類型值截斷成short類型值,后帶符號擴展成int類型值入棧。
整數運算
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x60
iadd
將棧頂兩int類型數相加,結果入棧。
0x64
isub
將棧頂兩int類型數相減,結果入棧。
0x68
imul
將棧頂兩int類型數相乘,結果入棧。
0x6c
idiv
將棧頂兩int類型數相除,結果入棧。
0x70
irem
將棧頂兩int類型數取模,結果入棧。
0x74
ineg
將棧頂int類型值取負,結果入棧。
0x61
ladd
將棧頂兩long類型數相加,結果入棧。
0x65
lsub
將棧頂兩long類型數相減,結果入棧。
0x69
lmul
將棧頂兩long類型數相乘,結果入棧。
0x6d
ldiv
將棧頂兩long類型數相除,結果入棧。
0x71
lrem
將棧頂兩long類型數取模,結果入棧。
0x75
lneg
將棧頂long類型值取負,結果入棧。
0x84
(wide)iinc
indexbyte
constbyte
將整數值constbyte加到indexbyte指定的int類型的局部變量中。
浮點運算
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x62
fadd
將棧頂兩float類型數相加,結果入棧。
0x66
fsub
將棧頂兩float類型數相減,結果入棧。
0x6a
fmul
將棧頂兩float類型數相乘,結果入棧。
0x6e
fdiv
將棧頂兩float類型數相除,結果入棧。
0x72
frem
將棧頂兩float類型數取模,結果入棧。
0x76
fneg
將棧頂float類型值取反,結果入棧。
0x63
dadd
將棧頂兩double類型數相加,結果入棧。
0x67
dsub
將棧頂兩double類型數相減,結果入棧。
0x6b
dmul
將棧頂兩double類型數相乘,結果入棧。
0x6f
ddiv
將棧頂兩double類型數相除,結果入棧。
0x73
drem
將棧頂兩double類型數取模,結果入棧。
0x77
dneg
將棧頂double類型值取負,結果入棧。
邏輯運算——移位運算
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x78
ishl
左移int類型值。
0x79
lshl
左移long類型值。
0x7a
ishr
算術右移int類型值。
0x7b
lshr
算術右移long類型值。
0x7c
iushr
邏輯右移int類型值。
0x7d
lushr
邏輯右移long類型值。
邏輯運算——按位布爾運算
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x73
iand
對int類型按位與運算。
0x7f
land
對long類型的按位與運算。
0x80
ior
對int類型的按位或運算。
0x81
lor
對long類型的按位或運算。
0x82
ixor
對int類型的按位異或運算。
0x83
lxor
對long類型的按位異或運算。
控制流指令——條件跳轉指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x99
ifeq
branchbyte1
branchbyte2
若棧頂int類型值為0則跳轉。
0x9a
ifne
branchbyte1
branchbyte2
若棧頂int類型值不為0則跳轉。
0x9b
iflt
branchbyte1
branchbyte2
若棧頂int類型值小於0則跳轉。
0x9e
ifle
branchbyte1
branchbyte2
若棧頂int類型值小於等於0則跳轉。
0x9d
ifgt
branchbyte1
branchbyte2
若棧頂int類型值大於0則跳轉。
0x9c
ifge
branchbyte1
branchbyte2
若棧頂int類型值大於等於0則跳轉。
0x9f
if_icmpeq
branchbyte1
branchbyte2
若棧頂兩int類型值相等則跳轉。
0xa0
if_icmpne
branchbyte1
branchbyte2
若棧頂兩int類型值不相等則跳轉。
0xa1
if_icmplt
branchbyte1
branchbyte2
若棧頂兩int類型值前小於后則跳轉。
0xa4
if_icmple
branchbyte1
branchbyte2
若棧頂兩int類型值前小於等於后則跳轉。
0xa3
if_icmpgt
branchbyte1
branchbyte2
若棧頂兩int類型值前大於后則跳轉。
0xa2
if_icmpge
branchbyte1
branchbyte2
若棧頂兩int類型值前大於等於后則跳轉。
0xc6
ifnull
branchbyte1
branchbyte2
若棧頂引用值為null則跳轉。
0xc7
ifnonnull
branchbyte1
branchbyte2
若棧頂引用值不為null則跳轉。
0xa5
if_acmpeq
branchbyte1
branchbyte2
若棧頂兩引用類型值相等則跳轉。
0xa6
if_acmpne
branchbyte1
branchbyte2
若棧頂兩引用類型值不相等則跳轉。
控制流指令——比較指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0x94
lcmp
比較棧頂兩long類型值,前者大,1入棧;相等,0入棧;后者大,-1入棧。
0x95
fcmpl
比較棧頂兩float類型值,前者大,1入棧;相等,0入棧;后者大,-1入棧;有NaN存在,-1入棧。
0x96
fcmpg
比較棧頂兩float類型值,前者大,1入棧;相等,0入棧;后者大,-1入棧;有NaN存在,-1入棧。
0x97
dcmpl
比較棧頂兩double類型值,前者大,1入棧;相等,0入棧;后者大,-1入棧;有NaN存在,-1入棧。
0x98
dcmpg
比較棧頂兩double類型值,前者大,1入棧;相等,0入棧;后者大,-1入棧;有NaN存在,-1入棧。
控制流指令——無條件跳轉指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xa7
goto
branchbyte1
branchbyte2
無條件跳轉到指定位置。
0xc8
goto_w
branchbyte1
branchbyte2
branchbyte3
branchbyte4
無條件跳轉到指定位置(寬索引)。
控制流指令——表跳轉指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xaa
tableswitch
<0-3bytepad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
通過索引訪問跳轉表,並跳轉。
0xab
lookupswitch
<0-3bytepad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match offsets
通過鍵值訪問跳轉表,並跳轉。
控制流指令——異常和finally
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xbf
athrow
拋出異常。
0xa8
jsr
branchbyte1
branchbyte2
跳轉到子例程序。
0xc9
jsr_w
branchbyte1
branchbyte2
branchbyte3
branchbyte4
跳轉到子例程序(寬索引)。
0xa9
(wide)ret
indexbyte
返回子例程序。
對象操作指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xbb
new
indexbyte1
indexbyte2
創建新的對象實例。
0xc0
checkcast
indexbyte1
indexbyte
類型強轉。
0xc1
instanceof
indexbyte1
indexbyte2
判斷類型。
0xb4
getfield
indexbyte1
indexbyte2
獲取對象字段的值。
0xb5
putfield
indexbyte1
indexbyte2
給對象字段賦值。
0xb2
getstatic
indexbyte1
indexbyte2
獲取靜態字段的值。
0xb3
putstatic
indexbyte1
indexbyte2
給靜態字段賦值。
數組操作指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xbc
newarray
atype
創建type類型的數組。
0xbd
anewarray
indexbyte1
indexbyte2
創建引用類型的數組。
0xbe
arraylength
獲取一維數組的長度。
0xc5
multianewarray
indexbyte1
indexbyte2
dimension
創建dimension維度的數組。
方法調用指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xb7
invokespecial
indexbyte1
indexbyte2
編譯時方法綁定調用方法。
0xb6
invokevirtual
indexbyte1
indexbyte2
運行時方法綁定調用方法。
0xb8
invokestatic
indexbyte1
indexbyte2
調用靜態方法。
0xb9
invokeinterface
indexbyte1
indexbyte2
count
0
調用接口方法。
方法返回指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xac
ireturn
返回int類型值。
0xad
lreturn
返回long類型值。
0xae
freturn
返回float類型值。
0xaf
dreturn
返回double類型值。
0xb0
areturn
返回引用類型值。
0xb1
return
void函數返回。
線程同步指令
指令碼
操作碼(助記符)
操作數
描述(棧指操作數棧)
0xc2
monitorenter
進入並獲得對象監視器。
0xc3
monitorexit
釋放並退出對象監視器。