jvm指令

1.反編譯指令:java

javap -c xxx.class數組

2.jvm指令集:jvm

 

指令碼ide

助記符spa

功能描述線程

0x00code

nop對象

無操做索引

 

0x01接口

aconst_null

 

指令格式:  aconst_null

 

功能描述:  null進棧。

 

指令執行前

指令執行後

棧底

...

...

 

null

棧頂

 

注意:JVM並無爲null指派一個具體的值。

 

 

0x02

iconst_m1

int型常量值-1進棧

0x03

iconst_0

int型常量值0進棧

0x04

iconst_1

int型常量值1進棧

0x05

iconst_2

int型常量值2進棧

0x06

iconst_3

int型常量值3進棧

0x07

iconst_4

int型常量值4進棧

0x08

iconst_5

int型常量值5進棧

 

0x09

lconst_0

long型常量值0進棧

0x0A

lconst_1

long型常量值1進棧

 

0x0B

fconst_0

float型常量值0進棧

0x0C

fconst_1

float型常量值1進棧

0x0D

fconst_2

float型常量值2進棧

 

0x0E

dconst_0

double型常量值0進棧

0x0F

dconst_1

double型常量值1進棧

 

0x10

bipush

將一個byte型常量值推送至棧頂

0x11

sipush

將一個short型常量值推送至棧頂

 

0x12

ldc

將int、float或String型常量值從常量池中推送至棧頂

0x13

ldc_w

將int、float或String型常量值從常量池中推送至棧頂(寬索引)

0x14

ldc2_w

將long或double型常量值從常量池中推送至棧頂(寬索引)

 

0x15

iload

指定的int型局部變量進棧

0x16

lload

指定的long型局部變量進棧

0x17

fload

指定的float型局部變量進棧

0x18

dload

指定的double型局部變量進棧

0x19

aload

 

指令格式:  aload index

 

功能描述:  當前frame的局部變量數組中下標爲

           index的引用型局部變量進棧

 

指令執行前

指令執行後

棧底

...

...

 

objectref

棧頂

 

index  :  無符號一byte整型。和wide指令聯用,

           可使index爲兩byte。

 

 

0x1A

iload_0

第一個int型局部變量進棧

0x1B

iload_1

第二個int型局部變量進棧

0x1C

iload_2

第三個int型局部變量進棧

0x1D

iload_3

第四個int型局部變量進棧

 

0x1E

lload_0

第一個long型局部變量進棧

0x1F

lload_1

第二個long型局部變量進棧

0x20

lload_2

第三個long型局部變量進棧

0x21

lload_3

第四個long型局部變量進棧

 

0x22

fload_0

第一個float型局部變量進棧

0x23

fload_1

第二個float型局部變量進棧

0x24

fload_2

第三個float型局部變量進棧

0x25

fload_3

第四個float型局部變量進棧

 

0x26

dload_0

第一個double型局部變量進棧

0x27

dload_1

第二個double型局部變量進棧

0x28

dload_2

第三個double型局部變量進棧

0x29

dload_3

第四個double型局部變量進棧

 

0x2A

aload_0

 

指令格式:aload_0

 

該指令的行爲相似於aload指令index爲0的狀況。

 

0x2B

aload_1

 

同上

 

0x2C

aload_2

 

同上

 

0x2D

aload_3

 

同上

 

 

0x2E

iaload

指定的int型數組的指定下標處的值進棧

0x2F

laload

指定的long型數組的指定下標處的值進棧

0x30

faload

指定的float型數組的指定下標處的值進棧

0x31

daload

指定的double型數組的指定下標處的值進棧

0x32

aaload

 

指令格式:  aaload

 

功能描述:  棧頂的數組下標(index)、數組引用

           (arrayref)出棧,並根據這兩個數值

           取出對應的數組元素值(value)進棧。

 

拋出異常:  若是arrayref的值爲null,會拋出

           NullPointerException。

           若是index形成數組越界,會拋出

           ArrayIndexOutOfBoundsException。

 

指令執行前

指令執行後

棧底

...

...

arrayref

value

index

 

棧頂

 

index      :  int類型

arrayref   :  數組的引用

 

0x33

baload

指定的boolean或byte型數組的指定下標處的值進棧

0x34

caload

指定的char型數組的指定下標處的值進棧

0x35

saload

指定的short型數組的指定下標處的值進棧

 

0x36

istore

將棧頂int型數值存入指定的局部變量

0x37

lstore

將棧頂long型數值存入指定的局部變量

0x38

fstore

將棧頂float型數值存入指定的局部變量

0x39

dstore

將棧頂double型數值存入指定的局部變量

0x3A

astore

 

指令格式:  astore index

 

功能描述:  將棧頂數值(objectref)存入當前

           frame的局部變量數組中指定下標

           (index)處的變量中,棧頂數值出棧。

 

指令執行前

指令執行後

棧底

...

...

objectref

 

棧頂

 

index  :  無符號一byte整數。該指令和wide聯

           用,index能夠爲無符號兩byte整數。

 

 

0x3B

istore_0

將棧頂int型數值存入第一個局部變量

0x3C

istore_1

將棧頂int型數值存入第二個局部變量

0x3D

istore_2

將棧頂int型數值存入第三個局部變量

0x3E

istore_3

將棧頂int型數值存入第四個局部變量

 

0x3F

lstore_0

將棧頂long型數值存入第一個局部變量

0x40

lstore_1

將棧頂long型數值存入第二個局部變量

0x41

lstore_2

將棧頂long型數值存入第三個局部變量

0x42

lstore_3

將棧頂long型數值存入第四個局部變量

 

0x43

fstore_0

將棧頂float型數值存入第一個局部變量

0x44

fstore_1

將棧頂float型數值存入第二個局部變量

0x45

fstore_2

將棧頂float型數值存入第三個局部變量

0x46

fstore_3

將棧頂float型數值存入第四個局部變量

 

0x47

dstore_0

將棧頂double型數值存入第一個局部變量

0x48

dstore_1

將棧頂double型數值存入第二個局部變量

0x49

dstore_2

將棧頂double型數值存入第三個局部變量

0x4A

dstore_3

將棧頂double型數值存入第四個局部變量

 

0x4B

astore_0

 

指令格式:  astore_0

 

功能描述:  該指令的行爲相似於astore指令index

           爲0的狀況。

 

0x4C

astore_1

 

同上

 

0x4D

astore_2

 

同上

 

0x4E

astore_3

 

同上

 

 

0x4F

iastore 

將棧頂int型數值存入指定數組的指定下標處

0x50

lastore

將棧頂long型數值存入指定數組的指定下標處

0x51

fastore

將棧頂float型數值存入指定數組的指定下標處

0x52

dastore

將棧頂double型數值存入指定數組的指定下標處

0x53

aastore

 

指令格式:  aastore

 

功能描述:  根據棧頂的引用型數值(value)、數組下

           標(index)、數組引用(arrayref)出

           棧,將數值存入對應的數組元素中。

 

拋出異常:  若是value的類型和arrayref所引用

           的數組的元素類型不兼容,會拋出拋出

           ArrayStoreException。

           若是index形成數組越界,會拋出

           ArrayIndexOutOfBoundsException。

           若是arrayref值爲null,會拋出

           NullPointerException。

 

指令執行前

指令執行後

棧底

...

...

arrayref

 

index

 

value

 

棧頂

 

arrayref   :  必須是對數組的引用

index      :  int類型

value      :  引用類型

 

0x54

bastore

將棧頂boolean或byte型數值存入指定數組的指定下標處

0x55

castore

將棧頂char型數值存入指定數組的指定下標處

0x56

sastore

將棧頂short型數值存入指定數組的指定下標處

 

0x57

pop

棧頂數值出棧 (該棧頂數值不能是long或double型)

0x58

pop2

棧頂的一個(若是是long、double型的)或兩個(其它類型的)數值出棧

 

0x59

dup

複製棧頂數值,而且複製值進棧

0x5A

dup_x1

複製棧頂數值,而且複製值進棧2次

0x5B

dup_x2

複製棧頂數值,而且複製值進棧2次或3次

0x5C

dup2

複製棧頂一個(long、double型的)或兩個(其它類型的)數值,而且複製值進棧

0x5D

dup2_x1

 

0x5E

dup2_x2

 

 

0x5F

swap

棧頂的兩個數值互換(要求棧頂的兩個數值不能是long或double型的)

 

0x60

iadd

棧頂兩int型數值相加,而且結果進棧

0x61

ladd

棧頂兩long型數值相加,而且結果進棧

0x62

fadd

棧頂兩float型數值相加,而且結果進棧

0x63

dadd

棧頂兩double型數值相加,而且結果進棧

 

0x64

isub

棧頂兩int型數值相減,而且結果進棧

0x65

lsub

棧頂兩long型數值相減,而且結果進棧

0x66

fsub

棧頂兩float型數值相減,而且結果進棧

0x67

dsub

棧頂兩double型數值相減,而且結果進棧

 

0x68

imul

棧頂兩int型數值相乘,而且結果進棧

0x69

lmul

棧頂兩long型數值相乘,而且結果進棧

0x6A

fmul

棧頂兩float型數值相乘,而且結果進棧

0x6B

dmul

棧頂兩double型數值相乘,而且結果進棧

 

0x6C

idiv

棧頂兩int型數值相除,而且結果進棧

0x6D

ldiv

棧頂兩long型數值相除,而且結果進棧

0x6E

fdiv

棧頂兩float型數值相除,而且結果進棧

0x6F

ddiv

棧頂兩double型數值相除,而且結果進棧

 

0x70

irem

棧頂兩int型數值做取模運算,而且結果進棧

0x71

lrem

棧頂兩long型數值做取模運算,而且結果進棧

0x72

frem

棧頂兩float型數值做取模運算,而且結果進棧

0x73

drem

棧頂兩double型數值做取模運算,而且結果進棧

 

0x74

ineg

棧頂int型數值取負,而且結果進棧

0x75

lneg

棧頂long型數值取負,而且結果進棧

0x76

fneg

棧頂float型數值取負,而且結果進棧

0x77

dneg

棧頂double型數值取負,而且結果進棧

 

0x78

ishl

int型數值左移指定位數,而且結果進棧

0x79

lshl

long型數值左移指定位數,而且結果進棧

 

0x7A

ishr

int型數值帶符號右移指定位數,而且結果進棧

0x7B

lshr

long型數值帶符號右移指定位數,而且結果進棧

0x7C

iushr

int型數值無符號右移指定位數,而且結果進棧

0x7D

lushr

long型數值無符號右移指定位數,而且結果進棧

 

0x7E

iand

棧頂兩int型數值按位與,而且結果進棧

0x7F

land

棧頂兩long型數值按位與,而且結果進棧

 

0x80

ior

棧頂兩int型數值按位或,而且結果進棧

0x81

lor

棧頂兩long型數值按位或,而且結果進棧

 

0x82

ixor

棧頂兩int型數值按位異或,而且結果進棧

0x83

lxor

棧頂兩long型數值按位異或,而且結果進棧

 

0x84

iinc

指定int型變量增長指定值

 

0x85

i2l

棧頂int值強轉long值,而且結果進棧

0x86

i2f

棧頂int值強轉float值,而且結果進棧

0x87

i2d

棧頂int值強轉double值,而且結果進棧

0x88

l2i

棧頂long值強轉int值,而且結果進棧

0x89

l2f

棧頂long值強轉float值,而且結果進棧

0x8A

l2d

棧頂long值強轉double值,而且結果進棧

0x8B

f2i

棧頂float值強轉int值,而且結果進棧

0x8C

f2l

棧頂float值強轉long值,而且結果進棧

0x8D

f2d

棧頂float值強轉double值,而且結果進棧

0x8E

d2i

棧頂double值強轉int值,而且結果進棧

0x8F

d2l

棧頂double值強轉long值,而且結果進棧

0x90

d2f

棧頂double值強轉float值,而且結果進棧

0x91

i2b

棧頂int值強轉byte值,而且結果進棧

0x92

i2c

棧頂int值強轉char值,而且結果進棧

0x93

i2s

棧頂int值強轉short值,而且結果進棧

 

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進棧

 

0x99

ifeq

當棧頂int型數值等於0時跳轉

0x9A

ifne

當棧頂int型數值不等於0時跳轉

0x9B

iflt

當棧頂int型數值小於0時跳轉

0x9C

ifge

當棧頂int型數值大於等於0時跳轉

0x9D

ifgt

當棧頂int型數值大於0時跳轉

0x9E

ifle

當棧頂int型數值小於等於0時跳轉

0x9F

if_icmpeq

比較棧頂兩int型數值大小,當結果等於0時跳轉

0xA0

if_icmpne

比較棧頂兩int型數值大小,當結果不等於0時跳轉

0xA1

if_icmplt

比較棧頂兩int型數值大小,當結果小於0時跳轉

0xA2

if_icmpge

比較棧頂兩int型數值大小,當結果大於等於0時跳轉

0xA3

if_icmpgt

比較棧頂兩int型數值大小,當結果大於0時跳轉

0xA4

if_icmple

比較棧頂兩int型數值大小,當結果小於等於0時跳轉

0xA5

if_acmpeq

比較棧頂兩引用型數值,當結果相等時跳轉

0xA6

if_acmpne

比較棧頂兩引用型數值,當結果不相等時跳轉

 

0xA7

goto

無條件跳轉

 

0xA8

jsr

跳轉至指定16位offset位置,並將jsr下一條指令地址壓入棧頂

0xA9

ret

返回至局部變量指定的index的指令位置(一般與jsr、jsr_w聯合使用)

0xAA

tableswitch

用於switch條件跳轉,case值連續(可變長度指令)

0xAB

lookupswitch

用於switch條件跳轉,case值不連續(可變長度指令)

 

0xAC

ireturn

當前方法返回int

0xAD

lreturn

當前方法返回long

0xAE

freturn

當前方法返回float

0xAF

dreturn

當前方法返回double

0xB0

areturn

 

指令格式:  areturn

 

功能描述:  從方法中返回一個對象的引用。

 

拋出異常:  若是當前方法是synchronized方法,

           而且當前線程不是改方法的鎖的擁有者,

           會拋出

           IllegalMonitorStateException。

          

指令執行前

指令執行後

棧底

...

 

objectref

 

棧頂

 

objectref  :  被返回的對象引用。

 

0xB1

return

當前方法返回void

 

0xB2

getstatic

獲取指定類的靜態域,並將其值壓入棧頂

0xB3

putstatic

爲指定的類的靜態域賦值

0xB4

getfield

獲取指定類的實例域,並將其值壓入棧頂

0xB5

putfield

爲指定的類的實例域賦值

 

0xB6

invokevirtual

調用實例方法

0xB7

invokespecial

調用超類構造方法、實例初始化方法、私有方法

0xB8

invokestatic

調用靜態方法

0xb9

invokeinterface

調用接口方法

 

0xBA

---

由於歷史緣由,該碼點爲未使用的保留碼點

 

0xBB

new

建立一個對象,而且其引用進棧

0xBC

newarray

建立一個基本類型數組,而且其引用進棧

0xBD

anewarray

 

指令格式:  anewarray index1 index2

 

功能描述:  棧頂數值(count)做爲數組長度,建立

           一個引用 型數組。棧頂數值出棧,數組引

           用進棧。

 

拋出異常:  若是count小於0,會拋出

           NegativeArraySizeException

 

指令執行前

指令執行後

棧底

...

...

count

arrayref

棧頂

 

count      :  int類型。

arrayref   :  對所建立的數組的引用。

 

0xBE

arraylength

 

指令格式:  arraylength

 

功能描述:  棧頂的數組引用(arrayref)出棧,該

           數組的長度進棧。

 

拋出異常:  若是arrayref的值爲null,會拋出

           NullPointerException。

 

指令執行前

指令執行後

棧底

...

...

arrayref

length

棧頂

 

arrayref   :  數組引用

length     :  數組長度

 

 

0xBF

athrow

 

指令格式:  athrow

 

功能描述:  將棧頂的數值做爲異常或錯誤拋出

 

拋出異常:  若是棧頂數值爲null,則使用

           NullPointerException代替棧頂數

           值拋出。

           若是方法是的,則有可能拋出

           IllegalMonitorStateException。

 

指令執行前

指令執行後

棧底

...

objectref

objectref

 

棧頂

 

objectref  :  Throwable或其子類的實例的引用。

 

0xC0

checkcast

類型轉換檢查,若是該檢查未經過將會拋出ClassCastException異常

0xc1

instanceof

檢查對象是不是指定的類的實例。若是是,1進棧;不然,0進棧

 

0xC2

monitorenter

得到對象鎖

0xC3

monitorexit

釋放對象鎖

 

0xC4

wide

用於修改其餘指令的行爲

 

0xC5

multianewarray

建立指定類型和維度的多維數組(執行該指令時,棧中必須包含各維度的長度值),而且其引用值進棧

 

0xC6

ifnull

爲null時跳轉

0xC7

ifnonnull

不爲null時跳轉

0xC8

goto_w

無條件跳轉(寬索引)

0xC9

jsr_w

跳轉至指定32位offset位置,而且jsr_w下一條指令地址進棧

 

0xCA

breakpoint

 

 

0xFE

impdep1

 

0xFF

impdep2

相關文章
相關標籤/搜索