1. 程式人生 > >Java位元組碼指令收集大全

Java位元組碼指令收集大全

Java位元組碼指令大全

常量入棧指令

指令碼

操作碼(助記符)

運算元

描述(棧指運算元棧)

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