JVM 之 (11)字節碼指令

加載和內存指令
記載和內存指令是用於將數據在棧幀中的局部變量表和操做數棧之間來回傳輸
將局部變量表加載到操做數棧:iload lload fload dload aload
將一個數值從操做數佔存儲到局部變量表: istore lfda
將一個常量加載到操做數棧: bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst_m1
擴充局部變量表的訪問索引的指令: wide

運算指令
運算或算術指令用於對兩個操做數棧上的值進行某種特定的運算,並把結果存儲到操做數棧頂
加法指令: add
減法指令: sub
乘法指令: mul
除法指令: div
取餘指令: rem
取反指令: neg


類型轉化指令
類型轉化指令能夠將兩種不一樣的數值類型進行相互轉換,這些轉換操做通常用戶實現用戶代碼中的顯示類型轉換操做以及用來處理字節碼指令集中數據類型相關指令沒法與數據類型一一對應的問題
寬化類型處理和窄化類型處理
l2b i2c i2s l2i ....


對象建立與訪問指令
建立類實例指令: new
建立數組的指令: newarray anewarray multianewarray
把數組元素加載到操做數棧的指令: baload c s I l f d a
將操做數棧的值存儲到數組元素: astore
取數組長度指令: arraylength
檢查實例類型的指令: instanceof checkcast


操做樹棧管理指令
操做數棧指令用於直接操做操做數棧
將操做數棧的一個或兩個元素出棧: pop pop2
複製棧頂一個或兩個數值並將複製或雙份複製值從新壓入棧頂: dup dup2 dup_x1 dup_x2
將棧頂的兩個數值替換: swap


控制轉移指令
控制轉移指令可讓Java虛擬機有條件或無條件的從指定的位置指令而不是控制轉移指令的下一條指令繼續執行程序。能夠認爲控制轉移指令就是在修改pc寄存器的值。
條件分支: ifeq iflt ifle ifne ifgt ifnull ifcmple
複合條件分支: tableswitch lookupswitch 
無條件分支Lgoto goto_w jsr jsr_w ret


方法調用指令
invokevitual指令用於調用對象的實例方法,根據對象的實際類型進行分派(虛方法分派),這也是Java語言中最多見的方法分派方式
invokeinterface指令用於調用接口方法,它會在運行時搜索一個實現了這個接口方法的對象,找出適合的方法進行調用
invokespecial指令用於調用一些須要特殊處理的實例方法,包括實例初始化方法、私有方法和父類方法
invokestatic指令用於調用類方法(static方法)


異常處理指令
在程序中顯示拋出異常的操做會由athrow指令實現,除了這種狀況,還有別的異常會在其餘的Java虛擬機指令檢測到異常情況時由虛擬機自動拋出


同步指令
Java虛擬機能夠支持方法級的同步和方法內部一段指令序列的同步,這兩種同步結構都是使用管程(Monitor)來支持的。
方法級的同步是隱式,即無需經過字節碼指令來控制的,它實如今方法調用和返回操做之中。虛擬機能夠從方法常量池中的方法表結構(method info Structure)中的ACC_SYNCHRONIZED訪問標誌區分一個方法是不是同步方法。當方法調用時,調用指令將會檢查方法的SCC_SYNCHRONIZED訪問標誌是否被設置,若是設置了,執行線程將先持有管程,而後再執行方法,最後再方法完成(不管是正常完成仍是非正常完成)時釋放管程。在方法執行期間,執行線程持有了管程,其餘任何線程都沒法再得到同一個管程。若是一個同步方法執行期間拋出了異常,而且在方法內部沒法處理此異常,那這個同步方法所持有的管程將在異常跑到同步方法以外時自動釋放。
同步一段指令集序列一般是由Java語言中的synchronized塊來表示的,Java虛擬機的指令集中有monitorenter和monitorexit兩條指令來支持synchronized關鍵字語義,爭取實現synchronized關鍵字須要編譯器與Java虛擬機兩者寫做支持




 JVM指令集(指令碼、助記符、功能描述)數組

指令碼ide

助記符spa

功能描述線程

0x00code

nop對象

無操做索引

 

0x01接口

aconst_nullip

 

指令格式:  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

 






 JVM指令集(指令碼、助記符、功能描述)

指令碼

助記符

功能描述

0x00

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

相關文章
相關標籤/搜索