1. 程式人生 > >jvm位元組碼指令集

jvm位元組碼指令集

有時候為了能理解JVM對程式所做的優化等,需要檢視程式的位元組碼,因此知道了解一些常見的指令集很重要!

指令碼

助記符

說明

0x00

nop

什麼都不做

0x01

aconst_null

將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

將單位元組的常量值(-128~127)推送至棧頂

0x11

sipush

將一個短整型常量值(-32768~32767)推送至棧頂

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

將指定的引用型別本地變數推送至棧頂

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

將第一個引用型別本地變數推送至棧頂

0x2b

aload_1

將第二個引用型別本地變數推送至棧頂

0x2c

aload_2

將第三個引用型別本地變數推送至棧頂

0x2d

aload_3

將第四個引用型別本地變數推送至棧頂

0x2e

iaload

將int型陣列指定索引的值推送至棧頂

0x2f

laload

將long型陣列指定索引的值推送至棧頂

0x30

faload

將float型陣列指定索引的值推送至棧頂

0x31

daload

將double型陣列指定索引的值推送至棧頂

0x32

aaload

將引用型陣列指定索引的值推送至棧頂

0x33

baload

將boolean或byte型陣列指定索引的值推送至棧頂

0x34

caload

將char型陣列指定索引的值推送至棧頂

0x35

saload

將short型陣列指定索引的值推送至棧頂

0x36

istore

將棧頂int型數值存入指定本地變數

0x37

lstore

將棧頂long型數值存入指定本地變數

0x38

fstore

將棧頂float型數值存入指定本地變數

0x39

dstore

將棧頂double型數值存入指定本地變數

0x3a

astore

將棧頂引用型數值存入指定本地變數

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

將棧頂引用型數值存入第一個本地變數

0x4c

astore_1

將棧頂引用型數值存入第二個本地變數

0x4d

astore_2

將棧頂引用型數值存入第三個本地變數

0x4e

astore_3

將棧頂引用型數值存入第四個本地變數

0x4f

iastore

將棧頂int型數值存入指定陣列的指定索引位置

0x50

lastore

將棧頂long型數值存入指定陣列的指定索引位置

0x51

fastore

將棧頂float型數值存入指定陣列的指定索引位置

0x52

dastore

將棧頂double型數值存入指定陣列的指定索引位置

0x53

aastore

將棧頂引用型數值存入指定陣列的指定索引位置

0x54

bastore

將棧頂boolean或byte型數值存入指定陣列的指定索引位置

0x55

castore

將棧頂char型數值存入指定陣列的指定索引位置

0x56

sastore

將棧頂short型數值存入指定陣列的指定索引位置

0x57

pop

將棧頂數值彈出 (數值不能是long或double型別的)

0x58

pop2

將棧頂的一個(long或double型別的)或兩個數值彈出(其它)

0x59

dup

複製棧頂數值並將複製值壓入棧頂

0x5a

dup_x1

複製棧頂數值並將兩個複製值壓入棧頂

0x5b

dup_x2

複製棧頂數值並將三個(或兩個)複製值壓入棧頂

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型變數增加指定值(i++, i--, i+=2)

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

從當前方法返回物件引用

0xb1

return

從當前方法返回void

0xb2

getstatic

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

0xb3

putstatic

為指定的類的靜態域賦值

0xb4

getfield

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

0xb5

putfield

為指定的類的例項域賦值

0xb6

invokevirtual

呼叫例項方法

0xb7

invokespecial

呼叫超類構造方法,例項初始化方法,私有方法

0xb8

invokestatic

呼叫靜態方法

0xb9

invokeinterface

呼叫介面方法

0xba

--

0xbb

new

建立一個物件,並將其引用值壓入棧頂

0xbc

newarray

建立一個指定原始型別(如int, float, char…)的陣列,並將其引用值壓入棧頂

0xbd

anewarray

建立一個引用型(如類,介面,陣列)的陣列,並將其引用值壓入棧頂

0xbe

arraylength

獲得陣列的長度值並壓入棧頂

0xbf

athrow

將棧頂的異常丟擲

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下一條指令地址壓入棧頂

相關推薦

[三] java虛擬機器 JVM位元組 指令 bytecode 操作 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

jvm位元組指令

有時候為了能理解JVM對程式所做的優化等,需要檢視程式的位元組碼,因此知道了解一些常見的指令集很重要! 指令碼 助記符 說明 0x00 nop 什麼都不做 0x01 aconst_null 將null推送至棧頂

JVM位元組指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(Opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(Operands)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那 Java 虛擬機器的直譯器使用下

JVM學習筆記1:位元組指令

一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛

JVM九:class位元組指令

一:位元組碼與資料型別     Java虛擬機器的指令由一個位元組長度,代表著某種特定操作含義的數字(稱為操作碼)以及跟其隨後的零至多個代表此操作所需引數(稱為運算元)而構成。Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數指令都不包含運算元。因為位元

jvm探祕六:位元組指令

概述 java虛擬機器的指令有一個位元組長度的,代表某種特定的操作含義的數字(操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)構成。 由於java虛擬機器採用面向運算元棧而不是暫存器的架構,大多數指令都不含運算元,只有一個操作碼。Java虛擬機

class檔案結構與jvm位元組指令

https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令 Class檔案結構 https://blog.csdn.net/tyrone1979/article/details/9

Python 2.6.2的位元組指令一覽

對Python的位元組碼指令集感興趣但不知道從何下手麼?執行這段程式碼就能看到位元組碼的列表:  Python程式碼   import opcode   for op in range(len(opcode.opname)):     print('0x%.2X(%

Java:如何用Eclipse檢視Class位元組指令程式碼

轉:https://zhidao.baidu.com/question/368994445436401884.html 在遇到一些小問題的時候我們經常會使用Javap反編譯取得位元組碼來分析,雖然Javap能完成這個工作,但是有兩個缺點,一方面操作麻煩,需要很多步驟,一方

Java位元組指令的使用詳細

jdk 自帶反編譯工具 javap 指令:javap -c -verbose MyClass Java虛擬機器指令由一個位元組長度的、代表某種特定含義的操作碼(Opcode)以及其後的零個至多個代表此操作引數的運算元構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。若

JVM 位元組指令

> 本文部分摘自《深入理解 Java 虛擬機器》 ## 簡介 Java 虛擬機器的指令由操作碼 + 運算元組成,其中操作碼是代表某種特定操作含義的數字,長度為一個位元組,而運算元就是此操作所需的一個或多個引數。由於 Java 虛擬機器採用面向運算元棧而非暫存器的架構,所以大多數指令都不包括運算元,

JVM總括三-位元組位元組指令、JIT編譯執行

JVM總括三-位元組碼、位元組碼指令、JIT編譯執行     java檔案編譯後的class檔案,java跨平臺的中間層,JVM通過對位元組碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),遮蔽對作業系統的依賴。一個位元組(8位)可以儲存256中不同的指令,這樣的指令就是位元組碼,ja

JVM 虛擬機器位元組指令

把JVM虛擬機器位元組指令表整理了一下,方便搜尋,偶爾複習下 純手工整理,可能存在一些問題,如果發現請及時告之我會修正 位元組碼 助記符 指令含義 0x00 nop None 0x01

深入理解JVM虛擬機器(五):位元組指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)而構成。由於 Java 虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數的指令都不包含運算元,只有一個操作碼。 1. 位元組碼與資料型別

[四] java虛擬機器JVM編譯器編譯程式碼簡介 位元組指令例項 程式碼到底編譯成了什麼形式

public static void main(String[] args) { boolean bNum = true; char cNum = 2; byte byteNum = 127; short sNum = 32767; int iNum = 100; long lNum =

位元組指令看重寫在JVM中的實現

        Java是解釋執行的,包括動態連結的特性,都給解析或執行期間提供了很多靈活擴充套件的空間。面嚮物件語言的繼承、封裝和多型的特性,在JVM中是怎樣進行編譯、解析,以及通過位元組碼指令如何確定方法呼叫的版本是本文如下要探討的主要內容,全文圍繞一個多型的簡單舉例來

JVM位元組指令簡介

java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字以及跟隨其後的零至多個代表此操作所需的引數而構成的。 位元組碼與資料型別 載入和儲存指令: 將資料在棧幀中的區域性變量表和運算元棧

jvm原理(29)構造方法與靜態程式碼塊位元組指令詳解

上一節解析完了常量池,接下來是訪問標記, 00 21 : ACC_SUPPER + ACC_PUBLIC 緊接著是類的名字,2個位元組:00 05 是5號常量 【#5 = Class #49 // co

大話+圖說:Java位元組指令——只為讓你懂

前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與

深入理解java虛擬機器(六)位元組指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、