java 字節碼 指令集 彙編(轉)

https://blog.csdn.net/github_35983163/article/details/52945845html

網上找的沒有指令碼這列  本身把它加上 更方便查閱 java

指令從0x00-0xc9 沒有0xbagit

常量入棧指令github

指令碼數組

操做碼(助記符)ide

操做數函數

描述(棧指操做數棧)spa

0x01

aconst_null.net

 

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

 

釋放並退出對象監視器。

原地址:http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html

相關文章
相關標籤/搜索