SMAIL 語法大全(Dalvik 虛擬機操作碼)

表中的 vx、vy、vz 表示某個 Dalvik 寄存器。根據不同指令可以訪問 16、256 或 64K 寄存器。  表中 lit4、lit8、lit16、lit32、lit64 表示字面值(直接賦值),數字是值所佔用位的長度。

long 和 double 型的值佔用兩個寄存器,例:一個在 v0 寄存器的 double 值實際佔用 v0,v1 兩個寄存器。

boolean 值的存儲實際是 1 和 0,1 爲真、0 爲假;boolean 型的值實際是轉成 int 型的值進行操作。所有例子的字節序都採用高位存儲格式,例:0F00  0A00 的編譯爲 0F,  00,  0A,  00  存儲。

有一些指令沒有說明和例子,因爲我沒有在正常使用中看到過這些指令,它們的存在是從這裏知道的:Android  o pcode  constant  list 。

Opcode

操作碼(hex)

Opcode name

操作碼名稱

Explanation

說明

Example

示例

00

nop

無操作

0000 - nop

 

01

 

move vx, vy

移動 vy 的內容到 vx。兩個寄存器都必須在最初的 256 寄存器範圍以內。

 

0110  -  move  v0,  v1

移動 v1 寄存器中的內容到 v0。

 

02

 

move/from16  v x, vy

移動 vy 的內容到 vx。vy 可能在 6 4K 寄存器範圍以內,而 vx 則是在最初的 256 寄存器範圍以內。

 

0200  1900  -  move/from16  v0,  v25

移動 v25 寄存器中的內容到 v0。

03

move/16

未知注 4

 

04

move-wide

未知注 4

 

 

05

 

move-wide/from 16 vx, vy

移動一個 long/double 值,從 v y 到 vx。vy 可能在 64K 寄存器範圍以內,而 vx 則是在最初的 256 寄存器範圍以內。

 

0516  0000  -  move-wide/from16  v22,  v0

移動 v0,v1 寄存器中的內容到  v22,v23。

06

move-wide/16

未知注 4

 

 

07

move-object  v

x, vy

移動對象引用,從 vy 到 vx。

0781  -  move-object  v1,  v8

移動 v8 寄存器中的對象引用到 v1。

 

08

 

move-object/fr om16 vx, vy

移動對象引用,從 vy 到 vx。vy 可以處理 64K 寄存器地址,vx 可以處理 256 寄存器地址。

 

0801  1500  -  move-object/from16  v1,  v21

移動 v21 寄存器中的對象引用到 v1。

09

move-object/16

未知注 4

 

 

0A

 

move-result  vx

移動上一次方法調用的返回值到

vx。

0A00  -  move-result  v0

移動上一次方法調用的返回值到 v0。

 

0B

 

move-result-wi de vx

移動上一次方法調用的long/dou ble 型返回值到 vx,vx+1。

0B02  -  move-result-wide  v2

移動上一次方法調用的 long/double 型返回值到 v2,v3。

 

0C

move-result-ob

ject  vx

移動上一次方法調用的對象引用返回值到 vx。

0C00  -  move-result-object  v0

移動上一次方法調用的對象引用返回值到 v0。

 

0D

 

move-exception vx

當方法調用拋出異常時移動異常對象引用到 vx。

0D19  -  move-exception  v25

當方法調用拋出異常時移動異常對象引用到 v2 5。

 

0E

 

return-void

返回空值。

0E00  -  return-void

返回值爲 void,即無返回值,並非返回 null。

 

0F

 

return  vx

返回在 vx 寄存器的值。

0F00  -  return  v0

返回 v0 寄存器中的值。

 

10

 

return-wide  vx

返回在 vx,vx+1 寄存器的 doubl e/long 值。

1000  -  return-wide  v0

返回 v0,v1 寄存器中的 double/long 值。

 

11

return-object vx

返回在 vx 寄存器的對象引用。

1100  -  return-object  v0

返回 v0 寄存器中的對象引用。

 

12

 

const/4  vx,  li t4

 

存入 4 位常量到 vx。

1221  -  const/4  v1,  #int  2

存入 int 型常量 2 到 v1。目的寄存器在第二個字節的低 4 位,常量 2 在更高的 4 位。

 

13

const/16  vx,  l it16

存入 16 位常量到 vx。

1300  0A00  -  const/16  v0,  #int  10

存入 int 型常量 10 到 v0。

 

14

 

const  vx,  lit3 2

 

存入 int  型常量到 vx。

1400  4E61  BC00  -  const  v0,  #12345678  /

/ #00BC614E

存入常量 12345678 到 v0。

 

15

 

const/high16  v 0,  lit16

 

存入 16 位常量到最高位寄存器, 用於初始化 float 值。

1500  2041  -  const/high16  v0,  #float  1

0.0  //  #41200000

存入 float 常量 10.0 到 v0。該指令最高支持 1 6 位浮點數。

 

16

const-wide/16 vx,  lit16

存入int 常量到vx,vx+1 寄存器,擴展 int 型常量爲 long 常量。

1600  0A00  -  const-wide/16  v0,  #long  10

存入 long 常量 10 到 v0,v1 寄存器。

 

17

 

const-wide/32 vx,  lit32

存入 32 位常量到 vx,vx+1 寄存器,擴展 int 型常量到long 常量。

1702  4e61  bc00  -  const-wide/32  v2,  #lo ng 12345678 // #00bc614e

存入 long 常量 12345678 到 v2,v3 寄存器。

 

 

18

 

const-wide  vx, lit64

 

存入 64 位常量到 vx,vx+1 寄存器。

1802  874b  6b5d  54dc  2b00-  const-wide  v 2,  #long  12345678901234567  //  #002bdc5

45d6b4b87

存入 long 常量 12345678901234567 到 v2,v3

寄存器。

 

19

 

const-wide/hig h16  vx,  lit16

存入16 位常量到最高16 位的vx, vx+1 寄存器,用於初始化 doubl e 值 。

1900  2440  -  const-wide/high16  v0,  #dou

ble  10.0  //  #402400000

存入 double 常量 10.0 到 v0,v1。

 

1A

 

const-string  v x, 字符串ID

 

存入字符串常量引用到 vx,通過

字符串ID 或字符串。

1A08  0000  -  const-string  v8,  ""  //  str ing@0000

存入 string@0000(字符串表#0 條目)的引用

到 v8。

 

1B

const-string-j umbo

未知注 4

 

 

1C

 

const-class  v x, 類型ID

 

存入類對象常量到 vx,通過類型

ID 或類型(如 Object.class)。

1C00  0100  -  const-class  v0,  Test3  //  t ype@0001

存入 Test3.class(類型 ID 表#1 條目)的引用

到 v0。

 

1D

monitor-enter vx

獲得vx 寄存器中的對象引用的監視器。

1D03  -  monitor-enter  v3

獲得 v3 寄存器中的對象引用的監視器。

 

1E

 

monitor-exit

釋放vx 寄存器中的對象引用的監視器。

1E03  -  monitor-exit  v3

釋放 v3 寄存器中的對象引用的監視器。

 

 

1F

 

check-cast  vx,

類型ID

檢查vx 寄存器中的對象引用是否可以轉換成類型ID 對應類型的實例。如不可轉換,拋出 ClassCas tException  異常,否則繼續執

行。

 

1F04  0100  -  check-cast  v4,  Test3  //  ty pe@0001

檢查v4 寄存器中的對象引用是否可以轉換成Te

st3(類型 ID 表#1 條目)的實例。

 

 

20

 

instance-of  v x,  vy, 類型ID

 

檢查vy 寄存器中的對象引用是否是類型ID 對應類型的實例,如果是,vx 存入非 0 值,否則 vx 存入0。

2040  0100  -  instance-of  v0,  v4,  Test3

//  type@0001

檢查 v4 寄存器中的對象引用是否是 Test3(類型 ID 表#1 條目)的實例。如果是,v0 存入非 0值,否則 v0 存入 0。

 

21

 

array-length  v x, vy

計算vy 寄存器中數組引用的元素長度並將長度存入 vx。

2111  -  array-length  v0,  v1

計算 v1 寄存器中數組引用的元素長度並將長度存入 v0。

 

22

 

new-instance  v x, 類型ID

根據類型ID 或類型新建一個對象   實例,並將新建的對象的引用存入vx。

2200  1500  -  new-instance  v0,  java.io.F ileInputStream  //  type@0015

實例化 java.io.FileInputStream(類型 ID

表#15H 條目)類型,並將其對象引用存入 v0。

 

23

 

new-array  vx, vy, 類型ID

 

根據類型ID 或類型新建一個數   組,vy 存入數組的長度,vx 存入數組的引用。

2312  2500  -  new-array  v2,  v1,  char[]  /

/  type@0025

新建一個 char(類型 ID 表#25H 條目)數組,v 1 存入數組的長度,v2 存入數組的引用。

 

 

24

 

filled-new-arr ay {參數}, 類型ID

根據類型ID 或類型新建一個數組   並通過參數填充注 5。新的數組引用可以得到一個 move-result-obj ect 指令,前提是執行過 filled

  • new-array  指令。

 

2420  530D  0000  -  filled-new-array  {v0, v0},[I  //  type@0D53

新建一個 int(類型 ID 表#D53H 條目)數組,

長度將爲 2 並且 2 個元素將填充到 v0 寄存器。

 

 

25

 

filled-new-arr ay-range {vx..

vy}, 類型ID

根據類型ID 或類型新建一個數組   並以寄存器範圍爲參數填充。新的數組引用可以得到一個move-res ult-object 指令,前提是執行過 filled-new-array  指令。

2503  0600  1300  -  filled-new-array/rang e  {v19..v21},  [B  //  type@0006

新建一個 byte(類型 ID 表#6 條目)數組,長

度將爲 3 並且 3 個元素將填充到 v19,v20,v21

寄存器注 4。

 

 

 

 

 

26

 

 

 

 

fill-array-dat a vx, 偏 移量

 

 

 

 

用 vx 的靜態數據填充數組引用。靜態數據的位址是當前指令位置加偏移量的和。

2606  2500  0000  -  fill-array-data  v6,  0

0e6 // +0025

用當前指令位置+25H 的靜態數據填充v6 寄存器的數組引用。偏移量是 32 位的數字,靜態數據的存儲格式如下:

0003 // 表類型:靜態數組數據

0400 // 每個元素的字節數(這個例子是 4 字節的 int 型)

0300 0000 // 元素個數

0100  0000  //  元素  #0:int  1

0200  0000  //  元素  #1:int  2

0300  0000  //  元素  #2:int  3

 

27

 

throw  vx

拋出異常對象,異常對象的引用在

vx 寄存器。

2700  -  throw  v0

拋出異常對象,異常對象的引用在 v0 寄存器。

 

28

goto 目標

通過短偏移量注 2 無條件跳轉到目

標。

28F0  -  goto  0005  //  -0010

跳轉到當前位置-16(hex 10)的位置,0005

 

 

 

是目標指令標籤。

 

29

 

goto/16 目標

通過 16 位偏移量注2 無條件跳轉到

目標。

2900  0FFE  -  goto/16  002f  //  -01f1

跳轉到當前位置-1F1H 的位置,002f 是目標指令標籤。

 

2A

goto/32 目標

通過 32 位偏移量注2 無條件跳轉到

目標。

 

 

 

 

 

 

2B

 

 

 

 

packed-switch vx,  索 引 表 偏 移量

 

 

實現一個 switch  語句,case 常量是連續的。這個指令使用索引表,vx 是在表中找到具體 case 的指令偏移量的索引,如果無法在表中找到vx 對應的索引將繼續執行下一個指令(即 default  cas e)。

2B02  0C00  0000  -  packed-switch  v2,  000 c // +000c

根據 v2 寄存器中的值執行 packed  switch,索

引表的位置是當前指令位置+0CH,表如下所示:

0001  //  表類型:packed  switch 表

0300 // 元素個數

0000 0000 // 基礎元素

0500  0000  0:  00000005  //  case  0:  +0000

0005

0700  0000  1:  00000007  //  case  1:  +0000

0007

0900  0000  2:  00000009  //  case  2:  +0000

0009

 

 

 

 

 

2C

 

 

 

 

sparse-switch vx,  查 詢 表 偏 移量

 

 

 

實現一個 switch  語句,case 常量是非連續的。這個指令使用查詢表,用於表示 case 常量和每個 c ase 常量的偏移量。如果 vx 無法在表中匹配將繼續執行下一個指令(即 default  case)。

2C02  0c00  0000  -  sparse-switch  v2,  000 c // +000c

根據 v2 寄存器中的值執行 sparse  switch  ,

查詢表的位置是當前指令位置+0CH,表如下所示:

0002  //  表類型:sparse  switch 表

0300 // 元素個數

9cff  ffff  //  第一個 case 常量:  -100 fa00  0000  //  第二個 case 常量:  250 e803 0000 // 第三個 case 常量: 1000

0500 0000 // 第一個case 常量的偏移量: +5

0700 0000 // 第二個case 常量的偏移量: +7

0900 0000 // 第三個case 常量的偏移量: +9

 

2D

 

cmpl-float  vx, vy, vz

 

比較vy 和vz 的float 值並在vx

存入 int 型返回值注 3。

2D00  0607  -  cmpl-float  v0,  v6,  v7

比較v6 和v7 的float 值並在v0 存入int 型返回值。非數值默認爲小於。如果參數爲非數值將返回-1。

 

2E

 

cmpg-float  vx, vy, vz

 

比較vy 和vz 的float 值並在vx

存入 int 型返回值注 3。

2E00  0607  -  cmpg-float  v0,  v6,  v7

比較v6 和v7 的float 值並在v0 存入int 型返回值。非數值默認爲大於。如果參數爲非數值將返回 1。

 

2F

 

cmpl-double  v x, vy, vz

 

比較 vy 和 vz 注 2 的 double 值並在 vx 存入 int 型返回值注 3。

2F19  0608  -  cmpl-double  v25,  v6,  v8

比較 v6,v7 和 v8,v9 的 double 值並在 v25 存入 int 型返回值。非數值默認爲小於。如果參數爲非數值將返回-1。

 

30

 

cmpg-double  v x, vy, vz

比較 vy 和 vz 注 2 的 double 值並在 vx 存入 int 型返回值注 3。

3000  080A  -  cmpg-double  v0,  v8,  v10

比較v8,v9 和v10,v11 的double 值並在v0 存入 int 型返回值。非數值默認爲大於。如果參數

 

 

 

爲非數值將返回 1。

 

31

 

cmp-long  vx,  v y, vz

比較 vy 和 vz 的 long 值並在 vx

存入 int 型返回值注 3。

3100  0204  -  cmp-long  v0,  v2,  v4

比較 v2 和 v4 的 long 值並在 v0 存入 int 型返回值。

 

32

 

if-eq  vx,vy,

目標

 

如果 vx == vy 注 2,跳轉到目標。

vx 和 vy 是 int 型值。

32b3  6600  -  if-eq  v3,  v11,  0080  //  +00

66

如果 v3 == v11,跳轉到當前位置+66H。0080

是目標指令標籤。

 

33

 

if-ne  vx,vy,

目標

 

如果 vx  !=  vy 注 2,跳轉到目標。

vx 和 vy 是 int 型值。

33A3  1000  -  if-ne  v3,  v10,  002c  //  +00

10

如果 v3  !=  v10,跳轉到當前位置+10H。002c

是目標指令標籤。

 

34

 

if-lt vx,vy,

目標

 

如果 vx < vy 注 2,跳轉到目標。v x 和 vy 是 int 型值。

3432  CBFF  -  if-lt  v2,  v3,  0023  //  -003

5

如果 v2  <  v3,跳轉到當前位置-35H。0023 是目標指令標籤。

 

35

 

if-ge  vx,  vy,

目標

 

如果 vx >= vy 注 2,跳轉到目標。

vx 和 vy 是 int 型值。

3510  1B00  -  if-ge  v0,  v1,  002b  //  +001 b

如果 v0 >= v1,跳轉到當前位置+1BH。002b

是目標指令標籤。

 

36

 

if-gt  vx,vy,

目標

 

如果 vx > vy 注 2,跳轉到目標。v x 和 vy 是 int 型值。

3610  1B00  -  if-ge  v0,  v1,  002b  //  +001 b

如果 v0 > v1,跳轉到當前位置+1BH。002b 是

目標指令標籤。

 

37

 

if-le  vx,vy,

目標

 

如果 vx <= vy 注 2,跳轉到目標。

vx 和 vy 是 int 型值。

3756  0B00  -  if-le  v6,  v5,  0144  //  +000

b

如果 v6 <= v5,跳轉到當前位置+0BH。0144

是目標指令標籤。

 

38

 

if-eqz  vx,  目標

如果 vx == 0 注 2,跳轉到目標。v x 是 int 型值。

3802  1900  -  if-eqz  v2,  0038  //  +0019

如果 v2 == 0,跳轉到當前位置+19H。0038 是目標指令標籤。

 

39

 

if-nez  vx,  目標

 

如果 vx  !=  0 注 2,跳轉到目標。

3902  1200  -  if-nez  v2,  0014  //  +0012

如果 v2  !=  0,跳轉到當前位置+18(hex  12)。 0014 是目標指令標籤。

 

3A

 

if-ltz  vx,  目標

 

如果 vx < 0 注 2,跳轉到目標。

3A00  1600  -  if-ltz  v0,  002d  //  +0016

如果 v0 < 0,跳轉到當前位置+16H。002d 是目標指令標籤。

 

3B

 

if-gez  vx,  目標

 

如果 vx >= 0 注 2,跳轉到目標。

3B00  1600  -  if-gez  v0,  002d  //  +0016

如果 v0 >= 0,跳轉到當前位置+16H。002d 是目標指令標籤。

 

3C

 

if-gtz  vx,  目標

 

如果 vx > 0 注 2,跳轉到目標。

3C00  1D00  -  if-gtz  v0,  004a  //  +001d

如果 v0 > 0,跳轉到當前位置+1DH。004a 是目標指令標籤。

 

3D

 

if-lez  vx,  目標

 

如果 vx <= 0 注 2,跳轉到目標。

3D00  1D00  -  if-lez  v0,  004a  //  +001d

如果 v0 <= 0,跳轉到當前位置+1DH。004a 是目標指令標籤。

3E

unused_3E

未使用

 

3F

unused_3F

未使用

 

40

unused_40

未使用

 

41

unused_41

未使用

 

42

unused_42

未使用

 

43

unused_43

未使用

 

 

44

 

aget  vx,  vy,  v z

從int 數組獲取一個int 型值到v x,對象數組的引用位於 vy,需獲取的元素的索引位於 vz。

4407  0306  -  aget  v7,  v3,  v6

從數組獲取一個 int 型值到 v7,對象數組的引用位於 v3,需獲取的元素的索引位於 v6。

 

45

 

aget-wide  vx, vy, vz

從 long/double 數組獲取一個 l ong/double 值到 vx,vx+1,數組的引用位於 vy,需獲取的元素的索引位於 vz。

4505  0104  -  aget-wide  v5,  v1,  v4

從long/double 數組獲取一個long/double 值到 v5,vx6,數組的引用位於 v1,需獲取的元素的索引位於 v4。

 

46

 

aget-object  v x, vy, vz

從對象引用數組獲取一個對象引用到vx,對象數組的引用位於 vy,需獲取的元素的索引位於 vz。

4602  0200  -  aget-object  v2,  v2,  v0

從對象引用數組獲取一個對象引用到 v2,對象數組的引用位於 v2,需獲取的元素的索引位於 v 0。

 

47

 

aget-boolean  v x, vy, vz

從 boolean 數組獲取一個 boole an 值到 vx,數組的引用位於 vy, 需獲取的元素的索引位於 vz。

4700  0001  -  aget-boolean  v0,  v0,  v1

從 boolean 數組獲取一個 boolean 值到 v0,數組的引用位於 v0,需獲取的元素的索引位於 v1。

 

48

 

aget-byte  vx, vy, vz

從 byte 數組獲取一個 byte 值到 vx,數組的引用位於 vy,需獲取的元素的索引位於 vz。

4800  0001  -  aget-byte  v0,  v0,  v1

從 byte 數組獲取一個 byte 值到 v0,數組的引用位於 v0,需獲取的元素的索引位於 v1。

 

49

 

aget-char  vx, vy, vz

從 char 數組獲取一個 char 值到vx,數組的引用位於 vy,需獲取的元素的索引位於 vz。

4905  0003  -  aget-char  v5,  v0,  v3

從 char 數組獲取一個 char 值到 v5,數組的引用位於 v0,需獲取的元素的索引位於 v3。

 

4A

 

aget-short  vx, vy, vz

從 short 數組獲取一個 short 值到 vx,數組的引用位於 vy,需獲取的元素的索引位於 vz。

4A00  0001  -  aget-short  v0,  v0,  v1

從 short 數組獲取一個 short 值到 v0,數組的引用位於 v0,需獲取的元素的索引位於 v1。

 

4B

 

aput  vx,  vy,  v z

將vx 的int 值作爲元素存入int數組,數組的引用位於 vy,元素的索引位於 vz。

4B00  0305  -  aput  v0,  v3,  v5

將 v0 的 int 值作爲元素存入 int 數組,數組的引用位於 v3,元素的索引位於 v5。

 

4C

 

aput-wide  vx, vy, vz

將vx,vx+1 的double/long 值作爲元素存入 double/long 數組,數組的引用位於 vy,元素的索引位於 vz。

4C05  0104  -  aput-wide  v5,  v1,  v4

將 v5,v6 的 double/long 值作爲元素存入 dou ble/long 數組,數組的引用位於 v1,元素的索引位於 v4。

 

4D

 

aput-object  v x, vy, vz

將 vx 的對象引用作爲元素存入對象引用數組,數組的引用位於 vy, 元素的索引位於 vz。

4D02  0100  -  aput-object  v2,  v1,  v0

將 v2 的對象引用作爲元素存入對象引用數組, 數組的引用位於 v1,元素的索引位於 v0。

 

4E

 

aput-boolean  v x, vy, vz

將vx 的boolean 值作爲元素存入 boolean 數組,數組的引用位於 v y,元素的索引位於 vz。

4E01  0002  -  aput-boolean  v1,  v0,  v2

將 v1 的 boolean 值作爲元素存入 boolean 數組,數組的引用位於 v0,元素的索引位於 v2。

 

4F

aput-byte  vx, vy, vz

將vx 的byte 值作爲元素存入 by te 數組,數組的引用位於 vy,元

4F02  0001  -  aput-byte  v2,  v0,  v1

將 v2 的 byte 值作爲元素存入 byte 數組,數組

 

 

素的索引位於 vz。

的引用位於 v0,元素的索引位於 v1。

 

50

 

aput-char  vx, vy, vz

將vx 的char 值作爲元素存入 ch ar 數組,數組的引用位於 vy,元素的索引位於 vz。

5003  0001  -  aput-char  v3,  v0,  v1

將 v3 的 char 值作爲元素存入 char 數組,數組的引用位於 v0,元素的索引位於 v1。

 

51

 

aput-short  vx, vy, vz

將vx 的short 值作爲元素存入s hort 數組,數組的引用位於 vy,元素的索引位於 vz。

5102  0001  -  aput-short  v2,  v0,  v1

將 v2 的 short 值作爲元素存入 short 數組,數組的引用位於 v0,元素的索引位於 v1。

 

52

 

iget  vx,  vy,

字段ID

 

根據字段ID 讀取實例的int 型字段到 vx,vy 寄存器中是該實例的引用。

5210  0300  -  iget  v0,  v1,  Test2.i6:I  // field@0003

讀取 int 型字段 i6(字段表#3 條目)到 v0,v

1 寄存器中是 Test2 實例的引用。

 

53

 

iget-wide  vx, vy, 字段ID

 

根據字段ID 讀取實例的double/ long 型字段到 vx,vx+1 注 1,vy寄存器中是該實例的引用。

5320  0400  -  iget-wide  v0,  v2,  Test2.l 0:J  //  field@0004

讀取 long 型字段 l0(字段表#4 條目)到 v0,v

1,v2 寄存器中是 Test2 實例的引用。

 

 

54

 

iget-object  v x,  vy, 字段ID

 

根據字段ID 讀取一個實例的對象引用字段到 vx,vy 寄存器中是該實例的引用。

iget-object  v1,  v2,  LineReader.fis:Lja va/io/FileInputStream;  //  field@0002

讀取 FileInputStream 對象引用字段 fis(字

段表#2 條目)到 v1,v2 寄存器中是 LineRead

er 實例的引用。

 

55

 

iget-boolean  v x,  vy, 字段ID

 

根據字段ID 讀取實例的boolean型字段到 vx,vy 寄存器中是該實例的引用。

55FC  0000  -  iget-boolean  v12,  v15,  Tes t2.b0:Z  //  field@0000

讀取 boolean 型字段 b0(字段表#0 條目)到 v

12,v15 寄存器中是 Test2 實例的引用。

 

56

 

iget-byte  vx, vy, 字段ID

 

根據字段ID 讀取實例的 byte 型字段到 vx,vy 寄存器中是該實例的引用。

5632  0100  -  iget-byte  v2,  v3,  Test3.bi 1:B  //  field@0001

讀取 byte 型字段 bi1(字段表#1 條目)到 v2,

v3 寄存器中是 Test2 實例的引用。

 

57

 

iget-char  vx, vy, 字段ID

 

根據字段ID 讀取實例的 char 型字段到 vx,vy 寄存器中是該實例的引用。

5720  0300  -  iget-char  v0,  v2,  Test3.ci 1:C  //  field@0003

讀取 char 型字段 bi1(字段表#3 條目)到 v0,

v2 寄存器中是 Test2 實例的引用。

 

58

 

iget-short  vx, vy, 字段ID

 

根據字段ID 讀取實例的short 型字段到 vx,vy 寄存器中是該實例的引用。

5830  0800  -  iget-short  v0,  v3,  Test3.s i1:S  //  field@0008

讀取 short 型字段 si1(字段表#8 條目)到 v0,

v3 寄存器中是 Test2 實例的引用。

 

 

59

 

iput  vx,  vy,

字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的 int 型字段,vy 寄存器中是該實例的引用。

5920  0200  -  iput  v0,  v2,  Test2.i6:I  // field@0002

將 v0 寄存器的值存入實例的 int 型字段 i6(字

段表#2 條目),v2 寄存器中是 Test2 實例的引

用。

 

 

5A

 

iput-wide  vx, vy, 字段ID

 

根據字段ID 將vx,vx+1 寄存器的 值存入實例的 double/long 型字段,vy 寄存器中是該實例的引用。

5A20  0000  -  iput-wide  v0,  v2,  Test2.d 0:D  //  field@0000

將v0,v1 寄存器的值存入實例的double 型字段

d0(字段表#0 條目),v2 寄存器中是 Test2 實

例的引用。

 

 

5B

 

 

iput-object  v x,  vy, 字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的對象引用字段,vy 寄存器中是該實例的引用。

5B20  0000  -  iput-object  v0,  v2,  LineRe ader.bis:Ljava/io/BufferedInputStrea m;  //  field@0000

將 v0 寄存器的值存入實例的對象引用字段 bis

(字段表#0 條目),v2 寄存器中是 BufferedI

nputStream 實例的引用。

 

 

5C

 

iput-boolean  v x,  vy, 字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的 boolean 型字段,vy 寄存器中是該實例的引用。

5C30  0000  -  iput-boolean  v0,  v3,  Test 2.b0:Z  //  field@0000

將 v0 寄存器的值存入實例的 boolean 型字段 b

0(字段表#0 條目),v3 寄存器中是 Test2 實

例的引用。

 

 

5D

 

iput-byte  vx, vy, 字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的 byte 型字段,vy 寄存器中是該實例的引用。

5D20  0100  -  iput-byte  v0,  v2,  Test3.bi 1:B  //  field@0001

將 v0 寄存器的值存入實例的 byte 型字段 bi1

(字段表#1 條目),v2 寄存器中是 Test2 實例

的引用。

 

 

5E

 

iput-char  vx, vy, 字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的 char 型字段,vy 寄存器中是該實例的引用。

5E20  0300  -  iput-char  v0,  v2,  Test3.ci 1:C  //  field@0003

將 v0 寄存器的值存入實例的 char 型字段 ci1

(字段表#3 條目),v2 寄存器中是 Test2 實例

的引用。

 

 

5F

 

iput-short  vx, vy, 字段ID

 

根據字段ID 將 vx 寄存器的值存入實例的 short 型字段,vy 寄存器中是該實例的引用。

5F21  0800  -  iput-short  v1,  v2,  Test3.s i1:S  //  field@0008

將 v0 寄存器的值存入實例的 short 型字段 si1

(字段表#8 條目),v2 寄存器中是 Test2 實例

的引用。

 

60

 

sget  vx,  字段I D

 

根據字段ID 讀取靜態int 型字段到 vx。

6000  0700  -  sget  v0,  Test3.is1:I  //  fi eld@0007

讀取 Test3 的靜態 int 型字段 is1(字段表#7

條目)到 v0。

 

61

 

sget-wide  vx,

字段ID

 

根據字段ID 讀取靜態double/lo ng 型字段到 vx,vx+1。

6100  0500  -  sget-wide  v0,  Test2.l1:J  /

/  field@0005

讀取 Test2 的靜態 long 型字段 l1(字段表#5

條目)到 v0,v1。

 

62

 

sget-object  v x, 字段ID

 

根據字段ID 讀取靜態對象引用字段到 vx。

6201  0C00  -  sget-object  v1,  Test3.os1:

Ljava/lang/Object;  //  field@000c

讀取 Object 的靜態對象引用字段 os1(字段表# CH 條目)到 v1。

 

63

 

sget-boolean  v x, 字段ID

 

根據字段ID 讀取靜態boolean 型字段到 vx。

6300  0C00  -  sget-boolean  v0,  Test2.sb:

Z  //  field@000c

讀取 Test2 的靜態 boolean 型字段 sb(字段表 #CH 條目)到 v0。

 

64

 

sget-byte  vx,

字段ID

 

根據字段ID 讀取靜態 byte 型字段到 vx。

6400  0200  -  sget-byte  v0,  Test3.bs1:B

//  field@0002

讀取 Test3 的靜態 byte 型字段 bs1(字段表#2

條目)到 v0。

65

sget-char  vx,

根據字段ID 讀取靜態 char 型字

6500  0700  -  sget-char  v0,  Test3.cs1:C

 

字段ID

段到 vx。

//  field@0007

讀取 Test3 的靜態 char 型字段 cs1(字段表#7

條目)到 v0。

 

66

 

sget-short  vx,

字段ID

 

根據字段ID 讀取靜態short 型字段到 vx。

6600  0B00  -  sget-short  v0,  Test3.ss1:S

//  field@000b

讀取 Test3 的靜態 short 型字段 ss1(字段表# CH 條目)到 v0。

 

67

 

sput  vx,  字段I D

 

根據字段ID 將 vx 寄存器中的值賦值到 int 型靜態字段。

6700  0100  -  sput  v0,  Test2.i5:I  //  fie ld@0001

將v0 寄存器中的值賦值到Test2 的int 型靜態

字段 i5(字段表#1 條目)。

 

68

 

sput-wide  vx,

字段ID

 

根據字段ID 將vx,vx+1 寄存器中的值賦值到 double/long 型靜態字段。

6800  0500  -  sput-wide  v0,  Test2.l1:J  /

/  field@0005

將 v0,v1 寄存器中的值賦值到 Test2 的 long

型靜態字段 l1(字段表#5 條目)。

 

69

 

sput-object  v x, 字段ID

 

根據字段ID 將 vx 寄存器中的對 象引用賦值到對象引用靜態字段。

6900  0c00  -  sput-object  v0,  Test3.os1:

Ljava/lang/Object;  //  field@000c

將v0 寄存器中的對象引用賦值到 Test3 的對象引用靜態字段 os1(字段表#CH 條目)。

 

6A

 

sput-boolean  v x, 字段ID

 

根據字段ID 將 vx 寄存器中的值賦值到 boolean 型靜態字段。

6A00  0300  -  sput-boolean  v0,  Test3.bls 1:Z  //  field@0003

將 v0 寄存器中的值賦值到 Test3 的 boolean

型靜態字段 bls1(字段表#3 條目)。

 

6B

 

sput-byte  vx,

字段ID

 

根據字段ID 將 vx 寄存器中的值賦值到 byte 型靜態字段。

6B00  0200  -  sput-byte  v0,  Test3.bs1:B

//  field@0002

將 v0 寄存器中的值賦值到 Test3 的 byte 型靜態字段 bs1(字段表#2 條目)。

 

6C

 

sput-char  vx,

字段ID

 

根據字段ID 將 vx 寄存器中的值賦值到 char 型靜態字段。

6C01  0700  -  sput-char  v1,  Test3.cs1:C

//  field@0007

將 v1 寄存器中的值賦值到 Test3 的 char 型靜態字段 cs1(字段表#7 條目)。

 

6D

 

sput-short  vx,

字段ID

 

根據字段ID 將 vx 寄存器中的值賦值到 short 型靜態字段。

6D00  0B00  -  sput-short  v0,  Test3.ss1:S

//  field@000b

將v0 寄存器中的值賦值到Test3 的short 型靜態字段 ss1(字段表#BH 條目)。

 

 

 

 

6E

 

 

 

invoke-virtual

{參數}, 方法名

 

 

 

調用帶參數的虛擬方法。

6E53  0600  0421  -  invoke-virtual  {  v4, v0,  v1,  v2,  v3},  Test2.method5:(IIII)V

//  method@0006

調用 Test2 的 method5(方法表#6 條目)方法,該指令共有 5 個參數(操作碼第二個字節的 4 個最高有效位 5)注 5。參數 v4 是"this"實例,v0, v1,  v2,  v3 是 method5 方法的參數,(IIII)

V 的 4 個 I 分表表示 4 個 int 型參數,V 表示返

回值爲 void。

 

6F

 

invoke-super

{參數}, 方法名

 

調用帶參數的直接父類的虛擬方法。

6F10  A601  0100  invoke-super  {v1},java. io.FilterOutputStream.close:()V  //  me thod@01a6

 

 

 

調用 java.io.FilterOutputStream 的 close

(方法表#1A6 條目)方法,參數 v1 是"this"實例。()V 表示 close 方法沒有參數,V 表示返

回值爲 void。

 

 

70

 

 

invoke-direct

{參數}, 方法名

 

 

不解析直接調用帶參數的方法。

7010  0800  0100  -  invoke-direct  {v1},  j ava.lang.Object.<init>:()V  //  method@ 0008

調用 java.lang.Object  的<init>(方法表#8

條目)方法,參數 v1 是"this"實例注 5。()V 表

示<init>方法沒有參數,V 表示返回值爲 void。

 

 

 

71

 

 

 

invoke-static

{參數}, 方法名

 

 

 

調用帶參數的靜態方法。

7110  3400  0400  -  invoke-static  {v4},  j ava.lang.Integer.parseInt:(  Ljava/lan g/String;)I  //  method@0034

調用 java.lang.Integer  的 parseInt(方法

表#34 條目)靜態方法,該指令只有 1 個參數 v

注 5

4 ,(Ljava/lang/String;)I 中的 Ljava/l

ang/String;表示 parseInt 方法需要 String

類型的參數,I 表示返回值爲 int 型。

 

 

 

 

 

 

72

 

 

 

 

 

invoke-interfa ce { 參數 }, 方法 名

 

 

 

 

 

調用帶參數的接口方法。

7240  2102  3154  invoke-interface  {v1,  v 3,  v4,  v5},  mwfw.IReceivingProtocolAda pter.receivePackage:(ILjava/lang/Stri ng;Ljava/io/InputStream;)Z  //  method@ 0221

調用 mwfw.IReceivingProtocolAdapter  接

口的receivePackage 方法(方法表#221 條目),該指令共有 4 個參數注 5,參數 v1 是"this"實例, v3,v4,v5 是 receivePackage 方法的參數,(I

Ljava/lang/String;Ljava/io/InputStrea m;)Z 中的 I 表示 int 型參數,Ljava/lang/St ring;表示 String 類型參數,Ljava/io/Inpu

tStream;表示 InputStream 類型參數,Z 表示

返回值爲 boolean 型。

73

unused_73

未使用

 

 

 

 

74

 

 

invoke-virtual

/range  {vx..v y}, 方    法名

 

 

調用以寄存器範圍爲參數的虛擬方法。該指令第一個寄存器和寄存器的數量將傳遞給方法。

7403  0600  1300  -  invoke-virtual  {v19.. v21},  Test2.method5:(IIII)V  //  method@ 0006

調用 Test2 的 method5(方法表#6 條目)方法,

該指令共有 3 個參數。參數 v19 是"this"實例, v20,v21 是 method5 方法的參數,(IIII)V 的  4 個 I 分表表示 4 個 int 型參數,V 表示返回值

爲 void。

 

 

75

 

invoke-super/r ange {vx..vy},

方法名

 

調用以寄存器範圍爲參數的直接父類的虛擬方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。

7501  A601  0100  invoke-super  {v1},java. io.FilterOutputStream.close:()V  //  me thod@01a6

調用 java.io.FilterOutputStream 的 close

(方法表#1A6 條目)方法,參數 v1 是"this"

實例。()V 表示 close 方法沒有參數,V 表示返

 

 

 

回值爲 void。

 

 

 

76

 

 

invoke-direct/ ran g e { vx.. v

y}, 方     法名

 

 

不解析直接調用以寄存器範圍爲參數的方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。

7603  3A00  1300  -  invoke-direct/range

{v19..21},java.lang.Object.<init>:()V

//  method@003a

調用 java.lang.Object  的<init>(方法表#3 A 條目)方法,參數 v19 是"this"實例(操作碼第五、第六字節表示範圍從 v19 開始,第二個字節爲 03 表示傳入了 3 個參數),()V 表示<ini t>方法沒有參數,V 表示返回值爲 void。

 

 

 

 

77

 

 

 

invoke-static/ ran g e { vx.. v

y}, 方     法名

 

 

 

調用以寄存器範圍爲參數的靜態方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。

7703  3A00  1300  -  invoke-static/range

{v19..21},java.lang.Integer.parseInt: (Ljava/lang/String;)I  //  method@0034

調用 java.lang.Integer  的 parseInt(方法

表#34 條目)靜態方法,參數 v19 是"this"實例(操作碼第五、第六字節表示範圍從 v19 開始, 第二個字節爲 03 表示傳入了 3 個參數),(Lja va/lang/String;)I 中的 Ljava/lang/Strin g;表示 parseInt 方法需要 String 類型的參

數,I 表示返回值爲 int 型。

 

 

 

 

 

78

 

 

 

 

invoke-interfa ce-range {vx..

vy}, 方法名

 

 

 

 

調用以寄存器範圍爲參數的接口方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。

7840  2102  0100  invoke-interface  {v1..v

4},  mwfw.IReceivingProtocolAdapter.re ceivePackage:(ILjava/lang/String;Ljav a/io/InputStream;)Z  //  method@0221

調用 mwfw.IReceivingProtocolAdapter  接

口的receivePackage 方法(方法表#221 條目),該指令共有 4 個參數注 5,參數 v1 是"this"實例, v2,v3,v4 是 receivePackage 方法的參數,(I

Ljava/lang/String;Ljava/io/InputStrea m;)Z 中的 I 表示 int 型參數,Ljava/lang/St ring;表示 String 類型參數,Ljava/io/Inpu

tStream;表示 InputStream 類型參數,Z 表示

返回值爲 boolean 型。

79

unused_79

未使用

 

7A

unused_7A

未使用

 

 

7B

 

neg-int  vx,  vy

計算vx = -vy 並將結果存入vx。

7B01  -  neg-int  v1,v0

計算-v0 並將結果存入 v1。

7C

not-int  vx,  vy

未知注 4

 

 

7D

neg-long  vx,  v y

計算vx,vx+1  =  -(vy,vy+1)  並將結果存入 vx,vx+1。

7D02  -  neg-long  v2,v0

計算-(v0,v1)  並將結果存入(v2,v3)。

 

7E

not-long  vx,  v y

未知注 4

 

 

7F

neg-float  vx, vy

計算vx = -vy 並將結果存入vx。

7F01  -  neg-float  v1,v0

計算-v0 並將結果存入 v1。

 

80

neg-double  vx, vy

計算vx,vx+1=-(vy,vy+1)  並將結果存入 vx,vx+1。

8002  -  neg-double  v2,v0

計算-(v0,v1)  並將結果存入(v2,v3)。

81

int-to-long  v

轉換 vy 寄存器中的 int 型值爲 l

8106  -  int-to-long  v6,  v0

 

x, vy

ong 型值存入 vx,vx+1。

轉換v0 寄存器中的int 型值爲long 型值存入v 6,v7。

 

82

 

int-to-float  v x, vy

轉換 vy 寄存器中的 int 型值爲 f loat 型值存入 vx。

8206  -  int-to-float  v6,  v0

轉換v0 寄存器中的int 型值爲float 型值存入 v6。

 

83

 

int-to-double vx, vy

轉換 vy 寄存器中的 int 型值爲 d ouble 型值存入 vx,vx+1。

8306  -  int-to-double  v6,  v0

轉換 v0 寄存器中的 int 型值爲 double 型值存入 v6,v7。

 

84

 

long-to-int  v x, vy

轉換 vy,vy+1 寄存器中的 long

型值爲 int 型值存入 vx。

8424  -  long-to-int  v4,  v2

轉換v2,v3 寄存器中的long 型值爲int 型值存入 v4。

 

85

 

long-to-float vx, vy

轉換 vy,vy+1 寄存器中的 long

型值爲 float 型值存入 vx。

8510  -  long-to-float  v0,  v1

轉換v1,v2 寄存器中的long 型值爲float 型值存入 v0。

 

86

 

long-to-double vx, vy

轉換 vy,vy+1 寄存器中的 long型值爲 double 型值存入 vx,vx+ 1。

8610  -  long-to-double  v0,  v1

轉換 v1,vy2 寄存器中的 long 型值爲 double

型值存入 v0,v1。

 

87

 

float-to-int  v x, vy

轉換vy 寄存器中的float 型值爲 int 型值存入 vx。

8730  -  float-to-int  v0,  v3

轉換v3 寄存器中的float 型值爲int 型值存入 v0。

 

88

 

float-to-long vx, vy

轉換vy 寄存器中的float 型值爲 long 型值存入 vx,vx+1。

8830  -  float-to-long  v0,  v3

轉換 v3 寄存器中的 float 型值爲 long 型值存入 v0,v1。

 

89

 

float-to-doubl e vx, vy

轉換vy 寄存器中的float 型值爲 double 型值存入 vx,vx+1。

8930  -  float-to-double  v0,  v3

轉換 v3 寄存器中的 float 型值爲 double 型值存入 v0,v1。

 

8A

 

double-to-int vx, vy

轉換 vy,vy+1 寄存器中的 doubl e 型值爲 int 型值存入 vx。

8A40  -  double-to-int  v0,  v4

轉換v4,v5 寄存器中的double 型值爲int 型值存入 v0。

 

8B

 

double-to-long vx, vy

轉換 vy,vy+1 寄存器中的 doubl e 型值爲 long 型值存入 vx,vx+ 1。

8B40  -  double-to-long  v0,  v4

轉換 v4,v5 寄存器中的 double 型值爲 long 型值存入 v0,v1。

 

8C

 

double-to-floa t vx, vy

轉換 vy,vy+1 寄存器中的 doubl e 型值爲 float 型值存入 vx。

8C40  -  double-to-float  v0,  v4

轉換 v4,v5 寄存器中的 double 型值爲 float

型值存入 v0。

 

8D

 

int-to-byte  v x, vy

轉換 vy 寄存器中的 int 型值爲 b yte 型值存入 vx。

8D00  -  int-to-byte  v0,  v0

轉換v0 寄存器中的int 型值爲byte 型值存入v 0。

 

8E

 

int-to-char  v x, vy

轉換 vy 寄存器中的 int 型值爲 c har 型值存入 vx。

8E33  -  int-to-char  v3,  v3

轉換v3 寄存器中的int 型值爲char 型值存入v 3。

 

8F

 

int-to-short  v x, vy

轉換 vy 寄存器中的 int 型值爲 s hort 型值存入 vx。

8F00  -  int-to-short  v3,  v0

轉換v0 寄存器中的int 型值爲short 型值存入 v0。

 

90

add-int  vx,  v y, vz

計算 vy + vz 並將結果存入 vx。

9000  0203  -  add-int  v0,  v2,  v3

計算 v2 + v3 並將結果存入 v0 注 4。

 

91

sub-int  vx,  v y, vz

計算 vy - vz 並將結果存入 vx。

9100  0203  -  sub-int  v0,  v2,  v3

計算 v2 – v3 並將結果存入 v0。

 

92

mul-int  vx,  v y, vz

計算 vy * vz 並將結果存入 vx。

9200  0203  -  mul-int  v0,v2,v3

計算 v2 * w3 並將結果存入 v0。

 

93

div-int  vx,  v y, vz

計算 vy / vz 並將結果存入 vx。

9303  0001  -  div-int  v3,  v0,  v1

計算 v0 / v1 並將結果存入 v3。

 

94

rem-int  vx,  v y, vz

計算 vy % vz 並將結果存入 vx。

9400  0203  -  rem-int  v0,  v2,  v3

計算 v3 % v2 並將結果存入 v0。

 

95

and-int  vx,  v y, vz

計算 vy 與 vz 並將結果存入 vx。

9503  0001  -  and-int  v3,  v0,  v1

計算 v0 與 v1 並將結果存入 v3。

 

96

or-int  vx,  vy, vz

計算 vy 或 vz 並將結果存入 vx。

9603  0001  -  or-int  v3,  v0,  v1

計算 v0 或 v1 並將結果存入 v3。

 

97

xor-int  vx,  v y, vz

計算 vy 異或 vz 並將結果存入 v x。

9703  0001  -  xor-int  v3,  v0,  v1

計算 v0 異或  v1 並將結果存入 v3。

 

98

shl-int  vx,  v y, vz

左移 vy,vz 指定移動的位置,結果存入 vx。

9802  0001  -  shl-int  v2,  v0,  v1

以 v1 指定的位置左移 v0,結果存入 v2。

 

99

shr-int  vx,  v y, vz

右移 vy,vz 指定移動的位置,結果存入 vx。

9902  0001  -  shr-int  v2,  v0,  v1

以 v1 指定的位置右移 v0,結果存入 v2。

 

9A

ushr-int  vx,  v y, vz

無符號右移 vy,vz 指定移動的位置,結果存入 vx。

9A02  0001  -  ushr-int  v2,  v0,  v1

以 v1 指定的位置無符號右移 v0,結果存入 v2。

 

9B

add-long  vx,  v y, vz

計算vy,vy+1  +  vz,vz+1 並將結果存入 vx,vx+1 注 1。

9B00  0305  -  add-long  v0,  v3,  v5

計算 v3,v4  +  v5,v6 並將結果存入 v0,v1。

 

9C

sub-long  vx,  v y, vz

計算vy,vy+1  -  vz,vz+1 並將結果存入 vx,vx+1 注 1。

9C00  0305  -  sub-long  v0,  v3,  v5

計算 v3,v4  -  v5,v6 並將結果存入 v0,v1。

 

9D

mul-long  vx,  v y, vz

計算vy,vy+1  *  vz,vz+1 並將結果存入 vx,vx+1 注 1。

9D00  0305  -  mul-long  v0,  v3,  v5

計算 v3,v4  *  v5,v6 並將結果存入 v0,v1。

 

9E

div-long  vx,  v y, vz

計算vy,vy+1  /  vz,vz+1 並將結果存入 vx,vx+1 注 1。

9E06  0002  -  div-long  v6,  v0,  v2

計算 v0,v1  /  v2,v3 並將結果存入 v6,v7。

 

9F

rem-long  vx,  v y, vz

計算vy,vy+1  %  vz,vz+1 並將結果存入 vx,vx+1 注 1。

9F06  0002  -  rem-long  v6,  v0,  v2

計算 v0,v1  %  v2,v3 並將結果存入 v6,v7。

 

A0

and-long  vx,  v y, vz

計算 vy,vy+1  與  vz,vz+1 並將結果存入 vx,vx+1 注 1。

A006  0002  -  and-long  v6,  v0,  v2

計算 v0,v1  與  v2,v3 並將結果存入 v6,v7。

 

A1

or-long  vx,  v y, vz

計算 vy,vy+1  或  vz,vz+1 並將結果存入 vx,vx+1 注 1。

A106  0002  -  or-long  v6,  v0,  v2

計算 v0,v1  或  v2,v3 並將結果存入 v6,v7。

 

A2

xor-long  vx,  v y, vz

計算 vy,vy+1  異或  vz,vz+1 並將結果存入 vx,vx+1 注 1。

A206  0002  -  xor-long  v6,  v0,  v2

計算 v0,v1  異或  v2,v3 並將結果存入 v6,v7。

 

A3

shl-long  vx,  v y, vz

左移 vy,vy+1,vz 指定移動的位置,結果存入 vx,vx+1 注 1。

A302  0004  -  shl-long  v2,  v0,  v4

以 v4 指定的位置左移 v0,v1,結果存入 v2,v3。

 

A4

shr-long  vx,  v y, vz

右移 vy,vy+1,vz 指定移動的位置,結果存入 vx,vx+1 注 1。

A402  0004  -  shr-long  v2,  v0,  v4

以 v4 指定的位置右移 v0,v1,結果存入 v2,v3。

 

A5

 

ushr-long  vx, vy, vz

無符號右移 vy,vy+1,vz 指定移動的位置,結果存入 vx,vx+1 注 1。

A502  0004  -  ushr-long  v2,  v0,  v4

以 v4 指定的位置無符號右移 v0,v1,結果存入 v2,v3。

A6

add-float  vx,

計算 vy + vz 並將結果存入 vx。

A600  0203  -  add-float  v0,  v2,  v3

 

vy, vz

 

計算 v2 + v3 並將結果存入 v0。

 

A7

sub-float  vx, vy, vz

計算 vy - vz 並將結果存入 vx。

A700  0203  -  sub-float  v0,  v2,  v3

計算 v2 - v3 並將結果存入 v0。

 

A8

mul-float  vx, vy, vz

計算 vy * vz 並將結果存入 vx。

A803  0001  -  mul-float  v3,  v0,  v1

計算 v0 * v1 並將結果存入 v3。

 

A9

div-float  vx, vy, vz

計算 vy / vz 並將結果存入 vx。

A903  0001  -  div-float  v3,  v0,  v1

計算 v0 / v1 並將結果存入 v3。

 

AA

rem-float  vx, vy, vz

計算 vy % vz 並將結果存入 vx。

AA03  0001  -  rem-float  v3,  v0,  v1

計算 v0 % v1 並將結果存入 v3。

 

AB

add-double  vx, vy, vz

計算vy,vy+1  +  vz,vz+1 並將結果存入 vx,vx+1 注 1。

AB00  0305  -  add-double  v0,  v3,  v5

計算 v3,v4  +  v5,v6 並將結果存入 v0,v1。

 

AC

sub-double  vx, vy, vz

計算vy,vy+1  -  vz,vz+1 並將結果存入 vx,vx+1 注 1。

AC00  0305  -  sub-double  v0,  v3,  v5

計算 v3,v4  -  v5,v6 並將結果存入 v0,v1。

 

AD

mul-double  vx, vy, vz

計算vy,vy+1  *  vz,vz+1 並將結果存入 vx,vx+1 注 1。

AD06  0002  -  mul-double  v6,  v0,  v2

計算 v0,v1  *  v2,v3 並將結果存入 v6,v7。

 

AE

div-double  vx, vy, vz

計算vy,vy+1  /  vz,vz+1 並將結果存入 vx,vx+1 注 1。

AE06  0002  -  div-double  v6,  v0,  v2

計算 v0,v1  /  v2,v3 並將結果存入 v6,v7。

 

AF

rem-double  vx, vy, vz

計算vy,vy+1  %  vz,vz+1 並將結果存入 vx,vx+1 注 1。

AF06  0002  -  rem-double  v6,  v0,  v2

計算 v0,v1  %  v2,v3 並將結果存入 v6,v7。

 

B0

add-int/2addr vx, vy

計算 vx + vy 並將結果存入 vx。

B010  -  add-int/2addr  v0,v1

計算 v0 + v1 並將結果存入 v0。

 

B1

sub-int/2addr vx, vy

計算 vx - vy 並將結果存入 vx。

B140  -  sub-int/2addr  v0,  v4

計算 v0 – v4 並將結果存入 v0。

 

B2

mul-int/2addr vx, vy

計算 vx * vy 並將結果存入 vx。

B210  -  mul-int/2addr  v0,  v1

計算 v0 * v1 並將結果存入 v0。

 

B3

div-int/2addr vx, vy

計算 vx / vy 並將結果存入 vx。

B310  -  div-int/2addr  v0,  v1

計算 v0 / v1 並將結果存入 v0。

 

B4

rem-int/2addr vx, vy

計算 vx % vy 並將結果存入 vx。

B410  -  rem-int/2addr  v0,  v1

計算 v0 % v1 並將結果存入 v0。

 

B5

and-int/2addr vx, vy

計算 vx 與 vy 並將結果存入 vx。

B510  -  and-int/2addr  v0,  v1

計算 v0 與 v1 並將結果存入 v0。

 

B6

or-int/2addr  v x, vy

計算 vx 或 vy 並將結果存入 vx。

B610  -  or-int/2addr  v0,  v1

計算 v0 或 v1 並將結果存入 v0。

 

B7

xor-int/2addr vx, vy

計算 vx 異或 vy 並將結果存入 v x。

B710  -  xor-int/2addr  v0,  v1

計算 v0 異或 v1 並將結果存入 v0。

 

B8

shl-int/2addr vx, vy

左移 vx,vy 指定移動的位置,並將結果存入 vx。

B810  -  shl-int/2addr  v0,  v1

以 v1 指定的位置左移 v0,結果存入 v0。

 

B9

shr-int/2addr vx, vy

右移 vx,vy 指定移動的位置,並將結果存入 vx。

B910  -  shr-int/2addr  v0,  v1

以 v1 指定的位置右移 v0,結果存入 v0。

 

BA

ushr-int/2addr vx, vy

無符號右移 vx,vy 指定移動的位置,並將結果存入 vx。

BA10  -  ushr-int/2addr  v0,  v1

以 v1 指定的位置無符號右移 v0,結果存入 v0。

 

BB

add-long/2addr vx, vy

計算vx,vx+1  +  vy,vy+1 並將結果存入 vx,vx+1 注 1。

BB20  -  add-long/2addr  v0,  v2

計算 v0,v1  +  v2,v3 並將結果存入 v0,v1。

BC

sub-long/2addr

計算vx,vx+1  -  vy,vy+1 並將結

BC70  -  sub-long/2addr  v0,  v7

 

vx, vy

果存入 vx,vx+1 注 1。

計算 v0,v1  -  v7,v8 並將結果存入 v0,v1。

 

BD

mul-long/2addr vx, vy

計算vx,vx+1  *  vy,vy+1 並將結果存入 vx,vx+1 注 1。

BD70  -  mul-long/2addr  v0,  v7

計算 v0,v1  *  v7,v8 並將結果存入 v0,v1。

 

BE

div-long/2addr vx, vy

計算vx,vx+1  /  vy,vy+1 並將結果存入 vx,vx+1 注 1。

BE20  -  div-long/2addr  v0,  v2

計算 v0,v1  /  v2,v3 並將結果存入 v0,v1。

 

BF

rem-long/2addr vx, vy

計算vx,vx+1  %  vy,vy+1 並將結果存入 vx,vx+1 注 1。

BF20  -  rem-long/2addr  v0,  v2

計算 v0,v1  %  v2,v3 並將結果存入 v0,v1。

 

C0

and-long/2addr vx, vy

計算 vx,vx+1  與  vy,vy+1 並將結果存入 vx,vx+1 注 1。

C020  -  and-long/2addr  v0,  v2

計算 v0,v1  與  v2,v3 並將結果存入 v0,v1。

 

C1

or-long/2addr vx, vy

計算 vx,vx+1  或  vy,vy+1 並將結果存入 vx,vx+1 注 1。

C120  -  or-long/2addr  v0,  v2

計算 v0,v1  或  v2,v3 並將結果存入 v0,v1。

 

C2

xor-long/2addr vx, vy

計算 vx,vx+1  異或  vy,vy+1 並將結果存入 vx,vx+1 注 1。

C220  -  xor-long/2addr  v0,  v2

計算 v0,v1  異或  v2,v3 並將結果存入 v0,v1。

 

C3

shl-long/2addr vx, vy

左移 vx,vx+1,vy 指定移動的位置,並將結果存入 vx,vx+1。

C320  -  shl-long/2addr  v0,  v2

以 v2 指定的位置左移 v0,v1,結果存入 v0,v1。

 

C4

shr-long/2addr vx, vy

右移 vx,vx+1,vy 指定移動的位置,並將結果存入 vx,vx+1。

C420  -  shr-long/2addr  v0,  v2

以 v2 指定的位置右移 v0,v1,結果存入 v0,v1。

 

C5

 

ushr-long/2add r vx, vy

無符號右移 vx,vx+1,vy 指定移動的位置,並將結果存入 vx,vx+ 1。

C520  -  ushr-long/2addr  v0,  v2

以 v2 指定的位置無符號右移 v0,v1,結果存入 v0,v1。

 

C6

add-float/2add r vx, vy

計算 vx + vy 並將結果存入 vx。

C640  -  add-float/2addr  v0,v4

計算 v0 + v4 並將結果存入 v0。

 

C7

sub-float/2add r vx, vy

計算 vx - vy 並將結果存入 vx。

C740  -  sub-float/2addr  v0,v4

計算 v0 - v4 並將結果存入 v0。

 

C8

mul-float/2add r vx, vy

計算 vx * vy 並將結果存入 vx。

C810  -  mul-float/2addr  v0,  v1

計算 v0 * v1 並將結果存入 v0。

 

C9

div-float/2add r vx, vy

計算 vx / vy 並將結果存入 vx。

C910  -  div-float/2addr  v0,  v1

計算 v0 / v1 並將結果存入 v0。

 

CA

rem-float/2add r vx, vy

計算 vx % vy 並將結果存入 vx。

CA10  -  rem-float/2addr  v0,  v1

計算 v0 % v1 並將結果存入 v0。

 

CB

add-double/2ad dr vx, vy

計算vx,vx+1  +  vy,vy+1 並將結果存入 vx,vx+1 注 1。

CB70  -  add-double/2addr  v0,  v7

計算 v0,v1  +  v7,v8 並將結果存入 v0,v1。

 

CC

sub-double/2ad dr vx, vy

計算vx,vx+1  -  vy,vy+1 並將結果存入 vx,vx+1 注 1。

CC70  -  sub-double/2addr  v0,  v7

計算 v0,v1  -  v7,v8 並將結果存入 v0,v1。

 

CD

mul-double/2ad dr vx, vy

計算vx,vx+1  *  vy,vy+1 並將結果存入 vx,vx+1 注 1。

CD20  -  mul-double/2addr  v0,  v2

計算 v0,v1  *  v2,v3 並將結果存入 v0,v1。

 

CE

div-double/2ad dr vx, vy

計算vx,vx+1  /  vy,vy+1 並將結果存入 vx,vx+1 注 1。

CE20  -  div-double/2addr  v0,  v2

計算 v0,v1  /  v2,v3 並將結果存入 v0,v1。

 

CF

rem-double/2ad dr vx, vy

計算vx,vx+1  %  vy,vy+1 並將結果存入 vx,vx+1 注 1。

CF20  -  rem-double/2addr  v0,  v2

計算 v0,v1  %  v2,v3 並將結果存入 v0,v1。

 

D0

 

add-int/lit16 vx,  vy,  lit16

計算vy  +  lit16 並將結果存入v x。

D001  D204  -  add-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 + 1234 並將結果存入 v1。

D1

sub-int/lit16

計算vy  -  lit16 並將結果存入v

D101  D204  -  sub-int/lit16  v1,  v0,  #int

 

vx,  vy,  lit16

x。

1234 // #04d2

計算 v0 - 1234 並將結果存入 v1。

 

D2

 

mul-int/lit16 vx,  vy,  lit16

計算vy  *  lit16 並將結果存入v x。

D201  D204  -  mul-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 * 1234 並將結果存入 v1。

 

D3

 

div-int/lit16 vx,  vy,  lit16

計算vy  /  lit16 並將結果存入v x。

D301  D204  -  div-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 / 1234 並將結果存入 v1。

 

D4

 

rem-int/lit16 vx,  vy,  lit16

計算vy  %  lit16 並將結果存入v x。

D401  D204  -  rem-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 % 1234 並將結果存入 v1。

 

D5

 

and-int/lit16 vx,  vy,  lit16

計算 vy  與  lit16 並將結果存入

vx。

D501  D204  -  and-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 與 1234 並將結果存入 v1。

 

D6

 

or-int/lit16  v x,  vy,  lit16

計算 vy  或  lit16 並將結果存入

vx。

D601  D204  -  or-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 或 1234 並將結果存入 v1。

 

D7

 

xor-int/lit16 vx,  vy,  lit16

計算 vy  異或  lit16 並將結果存入 vx。

D701  D204  -  xor-int/lit16  v1,  v0,  #int 1234 // #04d2

計算 v0 異或 1234 並將結果存入 v1。

 

D8

add-int/lit8  v x,  vy,  lit8

計算 vy  +  lit8 並將結果存入 v x。

D800  0201  -  add-int/lit8  v0,v2,  #int1

計算 v2 + 1 並將結果存入 v0。

 

D9

sub-int/lit8  v x,  vy,  lit8

計算 vy  -  lit8 並將結果存入 v x。

D900  0201  -  sub-int/lit8  v0,v2,  #int1

計算 v2 - 1 並將結果存入 v0。

 

DA

mul-int/lit8  v x,  vy,  lit8

計算 vy  *  lit8 並將結果存入 v x。

DA00  0002  -  mul-int/lit8  v0,v0,  #int2

計算 v0 * 2 並將結果存入 v0。

 

DB

div-int/lit8  v x,  vy,  lit8

計算 vy  /  lit8 並將結果存入 v x。

DB00  0203  -  mul-int/lit8  v0,v2,  #int3

計算 v2 / 3 並將結果存入 v0。

 

DC

rem-int/lit8  v x,  vy,  lit8

計算 vy  %  lit8 並將結果存入 v x。

DC00  0203  -  rem-int/lit8  v0,v2,  #int3

計算 v2 % 3 並將結果存入 v0。

 

DD

and-int/lit8  v x,  vy,  lit8

計算 vy  與  lit8 並將結果存入v x。

DD00  0203  -  and-int/lit8  v0,v2,  #int3

計算 v2 與 3 並將結果存入 v0。

 

DE

or-int/lit8  v x,  vy,  lit8

計算 vy  或  lit8 並將結果存入v x。

DE00  0203  -  or-int/lit8  v0,  v2,  #int  3

計算 v2 或 3 並將結果存入 v0。

 

DF

 

xor-int/lit8  v x,  vy,  lit8

計算vy 異或lit8 並將結果存入v x。

DF00  0203  |  0008:  xor-int/lit8  v0,  v2, #int  3

計算 v2 異或 3 並將結果存入 v0。

 

E0

 

shl-int/lit8  v x,  vy,  lit8

左移 vy,lit8 指定移動的位置,並將結果存入 vx。

E001  0001  -  shl-int/lit8  v1,  v0,  #int 1

將 v0 左移 1 位,結果存入 v1。

 

E1

 

shr-int/lit8  v x,  vy,  lit8

右移 vy,lit8 指定移動的位置,並將結果存入 vx。

E101  0001  -  shr-int/lit8  v1,  v0,  #int 1

將 v0 右移 1 位,結果存入 v1。

 

E2

ushr-int/lit8 vx,  vy,  lit8

無符號右移 vy,lit8 指定移動的位置,並將結果存入 vx。

E201  0001  -  ushr-int/lit8  v1,  v0,  #int 1

 

 

 

將 v0 無符號右移 1 位,結果存入 v1。

E3

unused_E3

未使用

 

E4

unused_E4

未使用

 

E5

unused_E5

未使用

 

E6

unused_E6

未使用

 

E7

unused_E7

未使用

 

E8

unused_E8

未使用

 

E9

unused_E9

未使用

 

EA

unused_EA

未使用

 

EB

unused_EB

未使用

 

EC

unused_EC

未使用

 

ED

unused_ED

未使用

 

 

EE

 

execute-inline

{ 參數 }, 內聯 I D

 

根據內聯ID 注 6 執行內聯方法。

EE20  0300  0100  -  execute-inline  {v1,  v 0},  inline  #0003

執行內聯方法#3,參數 v1,v0,其中參數 v1 爲"

this"的實例,v0 是方法的參數。

EF

unused_EF

未使用

 

 

F0

 

invoke-direct- empty

用於空方法的佔位符,如 Object.

<init>。這相當於正常執行了 no p 指令注 6。

F010  F608  0000  -  invoke-direct-empty

{v0},  Ljava/lang/Object;.<init>:()V  /

/  method@08f6

替代空方法 java/lang/Object;<init>。

F1

unused_F1

未使用

 

 

F2

 

iget-quick  vx, vy, 偏 移量

 

獲取 vy 寄存器中實例指向+偏移位置的數據區的值,存入 vx 注 6。

F221  1000  -  iget-quick  v1,  v2,  [obj+00 10]

獲取v2 寄存器中的實例指向+10H 位置的數據區

的值,存入 v1。

 

F3

 

iget-wide-quic k  vx, vy, 偏 移量

獲取 vy 寄存器中實例指向+偏移位置的數據區的值,存入 vx,vx+

注 6

1 。

F364  3001  -  iget-wide-quick  v4,  v6,  [o bj+0130]

獲取 v6 寄存器中的實例指向+130H 位置的數據

區的值,存入 v4,v5。

 

F4

 

iget-object-qu ick  vx,  vy,  偏移量

獲取 vy 寄存器中實例指向+偏移位置的數據區的對象引用,存入 v

注 6

x 。

F431  0C00  -  iget-object-quick  v1,  v3, [obj+000c]

獲取v3 寄存器中的實例指向+0CH 位置的數據區

的對象引用,存入 v1。

 

F5

 

iput-quick  vx, vy, 偏 移量

 

將 vx 寄存器中的值存入 vy 寄存器中的實例指向+偏移位置的數據  區注 6。

F521  1000  -  iput-quick  v1,  v2,  [obj+00 10]

將v1 寄存器中的值存入v2 寄存器中的實例指向

+10H 位置的數據區。

 

F6

 

iput-wide-quic k  vx, vy, 偏 移量

將vx,vx+1 寄存器中的值存入vy寄存器中的實例指向+偏移位置的  數據區注 6。

F652  7001  -  iput-wide-quick  v2,  v5,  [o bj+0170]

將v2,v3 寄存器中的值存入v5 寄存器中的實例

指向+170H 位置的數據區。

 

F7

iput-object-qu

ick  vx,  vy,  偏

將 vx 寄存器中的對象引用存入 v

y 寄存器中的實例指向+偏移位置

F701  4C00  -  iput-object-quick  v1,  v0, [obj+004c]

 

移量

的數據區注 6。

將v1 寄存器中的對象引用存入v0 寄存器中的實例指向+4CH 位置的數據區。

 

 

F8

 

invoke-virtual

  • quick  {參數},

虛擬表偏移量

 

調用虛擬方法,使用目標對象虛擬表注 6。

F820  B800  CF00  -  invoke-virtual-quick

{v15,  v12},  vtable  #00b8

調用虛擬方法,目標對象的實例指向位於 v15 寄存器,方法位於虛擬表#B8 條目,方法所需的參數位於 v12。

 

 

F9

 

invoke-virtual

  • quick/range

{參數範圍}, 虛擬表偏移量

 

調用虛擬方法,使用目標對象虛擬表注 6。

F906  1800  0000  -  invoke-virtual-quick/

range  {v0..v5},vtable  #0018

調用虛擬方法,目標對象的實例指向位於 v0 寄存器,方法位於虛擬表#18H 條目,方法所需的參數位於 v1..v5。

 

 

FA

 

invoke-super-q uick   {參數},虛擬表偏移量

 

調用父類虛擬方法,使用目標對象的直接父類的虛擬表注 6。

FA40  8100  3254  -  invoke-super-quick  {v

2,  v3,  v4,  v5},  vtable  #0081

調用父類虛擬方法,目標對象的實例指向位於 v 2 寄存器,方法位於虛擬表#81H 條目,方法所需的參數位於 v3,v4,v5。

 

 

FB

 

invoke-super-q uick/range  {參數範圍 }, 虛擬表

偏移量

 

調用父類虛擬方法,使用目標對象的直接父類的虛擬表注 6。

F906  1B00  0000  -  invoke-super-quick/ra nge  {v0..v5},  vtable  #001b

調用父類虛擬方法,目標對象的實例指向位於 v

0 寄存器,方法位於虛擬表#1B 條目,方法所需

的參數位於 v1..v5。

FC

unused_FC

未使用

 

FD

unused_FD

未使用

 

FE

unused_FE

未使用

 

FF

unused_FF

未使用

 

注 1:   Double 和 long 值佔用兩個寄存器。(例:在 vy 地址上的值位於 vy,vy+1 寄存器)

注 2: 偏移量可以是正或負,從指令起始字節起計算偏移量。偏移量在(2 字節每 1 偏移量遞增/遞減)時解釋執行。負偏移量用二進制補碼格式存儲。偏移量當前位置是指令起始字節。

注 3: 比較操作,如果第一個操作數大於第二個操作數返回正值;如果兩者相等,返回 0;如果第一個操作數小於第二個操作數,返回負值。

注 4:   正常使用沒見到過的,從 Android  opcode  constant  list 引入。

注 5: 調用參數表的編譯比較詭異。如果參數的數量大於 4 並且%4=1,第 5(第 9 或其他%4=1 的)個參數將編譯在指令字節的下一個字節的 4 個最低位。奇怪的是,有一種情況不使用這種編譯:方法有 4 個參數但用於

編譯單一參數,指令字節的下一個字節的 4 個最低位空置,將會編譯爲 40 而不是 04。注 6: 這是一個不安全的指令,僅適用於 ODEX 文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章