【轉】smali語法中文參考文檔

轉載鏈接:http://0nly3nd.sinaapp.com/?p=319

Dalvik虛擬機操作碼

作者:Gabor Paller    翻譯:YULIANGMAX

v1.0

表中的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 opcode 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 vx, vy 移動vy的內容到vx。vy可能在64K寄存器範圍以內,而vx則是在最初的256寄存器範圍以內。 0200 1900 – move/from16 v0, v25

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

03

move/16 未知4  

04

move-wide 未知4  

05

move-wide/from16 vx, vy 移動一個long/double值,從vy到vx。vy可能在64K寄存器範圍以內,而vx則是在最初的256寄存器範圍以內。 0516 0000 – move-wide/from16 v22, v0

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

06

move-wide/16 未知4  

07

move-object vx, vy 移動對象引用,從vy到vx。 0781 – move-object v1, v8

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

08

move-object/from16 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-wide vx 移動上一次方法調用的long/double型返回值到vx,vx+1。 0B02 – move-result-wide v2

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

0C

move-result-object vx 移動上一次方法調用的對象引用返回值到vx。 0C00 – move-result-object v0

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

0D

move-exception vx 當方法調用拋出異常時移動異常對象引用到vx。 0D19 – move-exception v25

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

0E

return-void 返回空值。 0E00 – return-void

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

0F

return vx 返回在vx寄存器的值。 0F00 – return v0

返回v0寄存器中的值。

10

return-wide vx 返回在vx,vx+1寄存器的double/long值。 1000 – return-wide v0

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

11

return-object vx 返回在vx寄存器的對象引用。 1100 – return-object v0

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

12

const/4 vx, lit4 存入4位常量到vx。 1221 – const/4 v1, #int 2

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

13

const/16 vx, lit16 存入16位常量到vx。 1300 0A00 – const/16 v0, #int 10

存入int型常量10到v0。

14

const vx, lit32 存入int 型常量到vx。 1400 4E61 BC00 – const v0, #12345678 // #00BC614E

存入常量12345678到v0。

15

const/high16 v0, lit16 存入16位常量到最高位寄存器,用於初始化float值。 1500 2041 – const/high16 v0, #float 10.0 // #41200000

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

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, #long 12345678 // #00bc614e

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

18

const-wide vx, lit64 存入64位常量到vx,vx+1寄存器。 1802 874b 6b5d 54dc 2b00- const-wide v2, #long 12345678901234567 // #002bdc545d6b4b87

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

19

const-wide/high16 vx, lit16 存入16位常量到最高16位的vx,vx+1寄存器,用於初始化double 值。 1900 2440 – const-wide/high16 v0, #double 10.0 // #402400000

存入double常量10.0到v0,v1。

1A

const-string vx, 字符串ID 存入字符串常量引用到vx,通過字符串ID或字符串。 1A08 0000 – const-string v8, “” // string@0000

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

1B

const-string-jumbo 未知4  

1C

const-class vx, 類型ID 存入類對象常量到vx,通過類型ID或類型(如Object.class)。 1C00 0100 – const-class v0, Test3 // type@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對應類型的實例。如不可轉換,拋出ClassCastException異常,否則繼續執行。 1F04 0100 – check-cast v4, Test3 // type@0001

檢查v4寄存器中的對象引用是否可以轉換成Test3(類型ID表#1條目)的實例。

20

instance-of vx, 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 vx, vy 計算vy寄存器中數組引用的元素長度並將長度存入vx。 2111 – array-length v0, v1

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

22

new-instance vx, 類型ID 根據類型ID或類型新建一個對象實例,並將新建的對象的引用存入vx。 2200 1500 – new-instance v0, java.io.FileInputStream // 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條目)數組,v1存入數組的長度,v2存入數組的引用。

24

filled-new-array {參數}, 類型ID 根據類型ID或類型新建一個數組並通過參數填充5。新的數組引用可以得到一個move-result-object指令,前提是執行過filled-new-array 指令。 2420 530D 0000 – filled-new-array {v0,v0},[I // type@0D53

新建一個int(類型ID表#D53H條目)數組,長度將爲2並且2個元素將填充到v0寄存器。

25

filled-new-array-range {vx..vy}, 類型ID 根據類型ID或類型新建一個數組並以寄存器範圍爲參數填充。新的數組引用可以得到一個move-result-object指令,前提是執行過filled-new-array 指令。 2503 0600 1300 - filled-new-array/range {v19..v21}, [B // type@0006

新建一個byte(類型ID表#6條目)數組,長度將爲3並且3個元素將填充到v19,v20,v21寄存器4

26

fill-array-data vx, 偏移量 用vx的靜態數據填充數組引用。靜態數據的位址是當前指令位置加偏移量的和。 2606 2500 0000 - fill-array-data v6, 00e6 // +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 case)。 2B02 0C00 0000 - packed-switch v2, 000c // +000c

根據v2寄存器中的值執行packed switch,索引表的位置是當前指令位置+0CH,表如下所示:

0001 // 表類型:packed switch表

0300 // 元素個數

0000 0000 // 基礎元素

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

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

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

2C

sparse-switch vx, 查詢表偏移量 實現一個switch 語句,case常量是非連續的。這個指令使用查詢表,用於表示case常量和每個case常量的偏移量。如果vx無法在表中匹配將繼續執行下一個指令(即default case)。 2C02 0c00 0000 - sparse-switch v2, 000c // +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 vx, vy, vz 比較vy和vz2的double值並在vx存入int型返回值3 2F19 0608 - cmpl-double v25, v6, v8

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

30

cmpg-double vx, vy, vz 比較vy和vz2的double值並在vx存入int型返回值3 3000 080A - cmpg-double v0, v8, v10

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

31

cmp-long vx, vy, 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 == vy2,跳轉到目標。vx和vy是int型值。 32b3 6600 - if-eq v3, v11, 0080 // +0066

如果v3 == v11,跳轉到當前位置+66H。0080是目標指令標籤。

33

if-ne vx,vy, 目標 如果vx != vy2,跳轉到目標。vx和vy是int型值。 33A3 1000 - if-ne v3, v10, 002c // +0010

如果v3 != v10,跳轉到當前位置+10H。002c是目標指令標籤。

34

if-lt vx,vy, 目標 如果vx < vy2,跳轉到目標。vx和vy是int型值。 3432 CBFF - if-lt v2, v3, 0023 // -0035

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

35

if-ge vx, vy, 目標 如果vx >= vy2,跳轉到目標。vx和vy是int型值。 3510 1B00 - if-ge v0, v1, 002b // +001b

如果v0 >= v1,跳轉到當前位置+1BH。002b是目標指令標籤。

36

if-gt vx,vy, 目標 如果vx > vy2,跳轉到目標。vx和vy是int型值。 3610 1B00 - if-ge v0, v1, 002b // +001b

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

37

if-le vx,vy, 目標 如果vx <= vy2,跳轉到目標。vx和vy是int型值。 3756 0B00 - if-le v6, v5, 0144 // +000b

如果v6 <= v5,跳轉到當前位置+0BH。0144是目標指令標籤。

38

if-eqz vx, 目標 如果vx == 02,跳轉到目標。vx是int型值。 3802 1900 - if-eqz v2, 0038 // +0019

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

39

if-nez vx, 目標 如果vx != 02,跳轉到目標。 3902 1200 - if-nez v2, 0014 // +0012

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

3A

if-ltz vx, 目標 如果vx < 02,跳轉到目標。 3A00 1600 - if-ltz v0, 002d // +0016

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

3B

if-gez vx, 目標 如果vx >= 02,跳轉到目標。 3B00 1600 - if-gez v0, 002d // +0016

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

3C

if-gtz vx, 目標 如果vx > 02,跳轉到目標。 3C00 1D00 - if-gtz v0, 004a // +001d

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

3D

if-lez vx, 目標 如果vx <= 02,跳轉到目標。 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, vz 從int數組獲取一個int型值到vx,對象數組的引用位於vy,需獲取的元素的索引位於vz。 4407 0306 - aget v7, v3, v6

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

45

aget-wide vx, vy, vz 從long/double數組獲取一個long/double值到vx,vx+1,數組的引用位於vy,需獲取的元素的索引位於vz。 4505 0104 - aget-wide v5, v1, v4

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

46

aget-object vx, vy, vz 從對象引用數組獲取一個對象引用到vx,對象數組的引用位於vy,需獲取的元素的索引位於vz。 4602 0200 - aget-object v2, v2, v0

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

47

aget-boolean vx, vy, vz 從boolean數組獲取一個boolean值到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, vz 將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值作爲元素存入double/long數組,數組的引用位於v1,元素的索引位於v4。

4D

aput-object vx, vy, vz 將vx的對象引用作爲元素存入對象引用數組,數組的引用位於vy,元素的索引位於vz。 4D02 0100 - aput-object v2, v1, v0

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

4E

aput-boolean vx, vy, vz 將vx的boolean值作爲元素存入boolean數組,數組的引用位於vy,元素的索引位於vz。 4E01 0002 - aput-boolean v1, v0, v2

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

4F

aput-byte vx, vy, vz 將vx的byte值作爲元素存入byte數組,數組的引用位於vy,元素的索引位於vz。 4F02 0001 - aput-byte v2, v0, v1

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

50

aput-char vx, vy, vz 將vx的char值作爲元素存入char數組,數組的引用位於vy,元素的索引位於vz。 5003 0001 - aput-char v3, v0, v1

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

51

aput-short vx, vy, vz 將vx的short值作爲元素存入short數組,數組的引用位於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,v1寄存器中是Test2實例的引用。

53

iget-wide vx, vy, 字段ID 根據字段ID讀取實例的double/long型字段到vx,vx+11,vy寄存器中是該實例的引用。 5320 0400 - iget-wide v0, v2, Test2.l0:J // field@0004

讀取long型字段l0(字段表#4條目)到v0,v1,v2寄存器中是Test2實例的引用。

54

iget-object vx, vy, 字段ID 根據字段ID讀取一個實例的對象引用字段到vx,vy寄存器中是該實例的引用。 iget-object v1, v2, LineReader.fis:Ljava/io/FileInputStream; // field@0002

讀取FileInputStream對象引用字段fis(字段表#2條目)到v1,v2寄存器中是LineReader實例的引用。

55

iget-boolean vx, vy, 字段ID 根據字段ID讀取實例的boolean型字段到vx,vy寄存器中是該實例的引用。 55FC 0000 - iget-boolean v12, v15, Test2.b0:Z // field@0000

讀取boolean型字段b0(字段表#0條目)到v12,v15寄存器中是Test2實例的引用。

56

iget-byte vx, vy, 字段ID 根據字段ID讀取實例的byte型字段到vx,vy寄存器中是該實例的引用。 5632 0100 - iget-byte v2, v3, Test3.bi1: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.ci1: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.si1: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.d0:D // field@0000

將v0,v1寄存器的值存入實例的double型字段d0(字段表#0條目),v2寄存器中是Test2實例的引用。

5B

iput-object vx, vy, 字段ID 根據字段ID將vx寄存器的值存入實例的對象引用字段,vy寄存器中是該實例的引用。 5B20 0000 - iput-object v0, v2, LineReader.bis:Ljava/io/BufferedInputStream; // field@0000

將v0寄存器的值存入實例的對象引用字段bis(字段表#0條目),v2寄存器中是BufferedInputStream實例的引用。

5C

iput-boolean vx, vy, 字段ID 根據字段ID將vx寄存器的值存入實例的boolean型字段,vy寄存器中是該實例的引用。 5C30 0000 - iput-boolean v0, v3, Test2.b0:Z // field@0000

將v0寄存器的值存入實例的boolean型字段b0(字段表#0條目),v3寄存器中是Test2實例的引用。

5D

iput-byte vx, vy, 字段ID 根據字段ID將vx寄存器的值存入實例的byte型字段,vy寄存器中是該實例的引用。 5D20 0100 - iput-byte v0, v2, Test3.bi1: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.ci1: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.si1:S // field@0008

將v0寄存器的值存入實例的short型字段si1(字段表#8條目),v2寄存器中是Test2實例的引用。

60

sget vx, 字段ID 根據字段ID讀取靜態int型字段到vx。 6000 0700 - sget v0, Test3.is1:I // field@0007

讀取Test3的靜態int型字段is1(字段表#7條目)到v0。

61

sget-wide vx, 字段ID 根據字段ID讀取靜態double/long型字段到vx,vx+1。 6100 0500 - sget-wide v0, Test2.l1:J // field@0005

讀取Test2的靜態long型字段l1(字段表#5條目)到v0,v1。

62

sget-object vx, 字段ID 根據字段ID讀取靜態對象引用字段到vx。 6201 0C00 - sget-object v1, Test3.os1:Ljava/lang/Object; // field@000c

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

63

sget-boolean vx, 字段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 根據字段ID讀取靜態char型字段到vx。 6500 0700 - sget-char v0, Test3.cs1:C // 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, 字段ID 根據字段ID將vx寄存器中的值賦值到int型靜態字段。 6700 0100 - sput v0, Test2.i5:I // field@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 vx, 字段ID 根據字段ID將vx寄存器中的對象引用賦值到對象引用靜態字段。 6900 0c00 - sput-object v0, Test3.os1:Ljava/lang/Object; // field@000c

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

6A

sput-boolean vx, 字段ID 根據字段ID將vx寄存器中的值賦值到boolean型靜態字段。 6A00 0300 - sput-boolean v0, Test3.bls1: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 // method@01a6

調用java.io.FilterOutputStream的close(方法表#1A6條目)方法,參數v1是"this"實例。()V表示close方法沒有參數,V表示返回值爲void。

70

invoke-direct {參數}, 方法名 不解析直接調用帶參數的方法。 7010 0800 0100 - invoke-direct {v1}, java.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}, java.lang.Integer.parseInt:( Ljava/lang/String;)I // method@0034

調用java.lang.Integer 的parseInt(方法表#34條目)靜態方法,該指令只有1個參數v45,(Ljava/lang/String;)I中的Ljava/lang/String;表示parseInt方法需要String類型的參數,I表示返回值爲int型。

72

invoke-interface {參數}, 方法名 調用帶參數的接口方法。 7240 2102 3154 invoke-interface {v1, v3, v4, v5}, mwfw.IReceivingProtocolAdapter.receivePackage:(ILjava/lang/String;Ljava/io/InputStream;)Z // method@0221

調用mwfw.IReceivingProtocolAdapter 接口的receivePackage方法(方法表#221條目),該指令共有4個參數5,參數v1是"this"實例,v3,v4,v5是receivePackage方法的參數,(ILjava/lang/String;Ljava/io/InputStream;)Z中的I表示int型參數,Ljava/lang/String;表示String類型參數,Ljava/io/InputStream;表示InputStream類型參數,Z表示返回值爲boolean型。

73

unused_73 未使用  

74

invoke-virtual/range {vx..vy}, 方法名 調用以寄存器範圍爲參數的虛擬方法。該指令第一個寄存器和寄存器的數量將傳遞給方法。 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/range {vx..vy}, 方法名 調用以寄存器範圍爲參數的直接父類的虛擬方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。 7501 A601 0100 invoke-super {v1},java.io.FilterOutputStream.close:()V // method@01a6

調用java.io.FilterOutputStream的close(方法表#1A6條目)方法,參數v1是"this"實例。()V表示close方法沒有參數,V表示返回值爲void。

76

invoke-direct/range {vx..vy}, 方法名 不解析直接調用以寄存器範圍爲參數的方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。 7603 3A00 1300 - invoke-direct/range {v19..21},java.lang.Object.<init>:()V // method@003a

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

77

invoke-static/range {vx..vy}, 方法名 調用以寄存器範圍爲參數的靜態方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。 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個參數),(Ljava/lang/String;)I中的Ljava/lang/String;表示parseInt方法需要String類型的參數,I表示返回值爲int型。

78

invoke-interface-range {vx..vy}, 方法名 調用以寄存器範圍爲參數的接口方法。該指令第一個寄存器和寄存器的數量將會傳遞給方法。 7840 2102 0100 invoke-interface {v1..v4}, mwfw.IReceivingProtocolAdapter.receivePackage:(ILjava/lang/String;Ljava/io/InputStream;)Z // method@0221

調用mwfw.IReceivingProtocolAdapter 接口的receivePackage方法(方法表#221條目),該指令共有4個參數5,參數v1是"this"實例,v2,v3,v4是receivePackage方法的參數,(ILjava/lang/String;Ljava/io/InputStream;)Z中的I表示int型參數,Ljava/lang/String;表示String類型參數,Ljava/io/InputStream;表示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, vy 計算vx,vx+1 = -(vy,vy+1) 並將結果存入vx,vx+1。 7D02 - neg-long v2,v0

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

7E

not-long vx, vy 未知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 vx, vy 轉換vy寄存器中的int型值爲long型值存入vx,vx+1。 8106 - int-to-long v6, v0

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

82

int-to-float vx, vy 轉換vy寄存器中的int型值爲float型值存入vx。 8206 - int-to-float v6, v0

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

83

int-to-double vx, vy 轉換vy寄存器中的int型值爲double型值存入vx,vx+1。 8306 - int-to-double v6, v0

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

84

long-to-int vx, 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 vx, 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-double 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寄存器中的double型值爲int型值存入vx。 8A40 - double-to-int v0, v4

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

8B

double-to-long vx, vy 轉換vy,vy+1寄存器中的double型值爲long型值存入vx,vx+1。 8B40 - double-to-long v0, v4

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

8C

double-to-float vx, vy 轉換vy,vy+1寄存器中的double型值爲float型值存入vx。 8C40 - double-to-float v0, v4

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

8D

int-to-byte vx, vy 轉換vy寄存器中的int型值爲byte型值存入vx。 8D00 - int-to-byte v0, v0

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

8E

int-to-char vx, vy 轉換vy寄存器中的int型值爲char型值存入vx。 8E33 - int-to-char v3, v3

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

8F

int-to-short vx, vy 轉換vy寄存器中的int型值爲short型值存入vx。 8F00 - int-to-short v3, v0

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

90

add-int vx, vy, vz 計算vy + vz並將結果存入vx。 9000 0203 - add-int v0, v2, v3

計算v2 + v3並將結果存入v04

91

sub-int vx, vy, vz 計算vy - vz並將結果存入vx。 9100 0203 - sub-int v0, v2, v3

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

92

mul-int vx, vy, vz 計算vy * vz並將結果存入vx。 9200 0203 - mul-int v0,v2,v3

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

93

div-int vx, vy, vz 計算vy / vz並將結果存入vx。 9303 0001 - div-int v3, v0, v1

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

94

rem-int vx, vy, vz 計算vy % vz並將結果存入vx。 9400 0203 - rem-int v0, v2, v3

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

95

and-int vx, vy, 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, vy, vz 計算vy 異或 vz並將結果存入vx。 9703 0001 - xor-int v3, v0, v1

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

98

shl-int vx, vy, vz 左移vy,vz指定移動的位置,結果存入vx。 9802 0001 - shl-int v2, v0, v1

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

99

shr-int vx, vy, vz 右移vy,vz指定移動的位置,結果存入vx。 9902 0001 - shr-int v2, v0, v1

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

9A

ushr-int vx, vy, vz 無符號右移vy,vz指定移動的位置,結果存入vx。 9A02 0001 - ushr-int v2, v0, v1

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

9B

add-long vx, vy, vz 計算vy,vy+1 + vz,vz+1並將結果存入vx,vx+11 9B00 0305 - add-long v0, v3, v5

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

9C

sub-long vx, vy, vz 計算vy,vy+1 - vz,vz+1並將結果存入vx,vx+11 9C00 0305 - sub-long v0, v3, v5

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

9D

mul-long vx, vy, vz 計算vy,vy+1 * vz,vz+1並將結果存入vx,vx+11 9D00 0305 - mul-long v0, v3, v5

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

9E

div-long vx, vy, vz 計算vy,vy+1 / vz,vz+1並將結果存入vx,vx+11 9E06 0002 - div-long v6, v0, v2

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

9F

rem-long vx, vy, vz 計算vy,vy+1 % vz,vz+1並將結果存入vx,vx+11 9F06 0002 - rem-long v6, v0, v2

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

A0

and-long vx, vy, vz 計算vy,vy+1 與 vz,vz+1並將結果存入vx,vx+11 A006 0002 - and-long v6, v0, v2

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

A1

or-long vx, vy, vz 計算vy,vy+1 或 vz,vz+1並將結果存入vx,vx+11 A106 0002 - or-long v6, v0, v2

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

A2

xor-long vx, vy, vz 計算vy,vy+1 異或 vz,vz+1並將結果存入vx,vx+11 A206 0002 - xor-long v6, v0, v2

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

A3

shl-long vx, vy, vz 左移vy,vy+1,vz指定移動的位置,結果存入vx,vx+11 A302 0004 - shl-long v2, v0, v4

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

A4

shr-long vx, vy, vz 右移vy,vy+1,vz指定移動的位置,結果存入vx,vx+11 A402 0004 - shr-long v2, v0, v4

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

A5

ushr-long vx, vy, vz 無符號右移vy,vy+1,vz指定移動的位置,結果存入vx,vx+11 A502 0004 - ushr-long v2, v0, v4

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

A6

add-float vx, vy, vz 計算vy + vz並將結果存入vx。 A600 0203 - add-float v0, v2, v3

計算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+11 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+11 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+11 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+11 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+11 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 vx, vy 計算vx 或 vy並將結果存入vx。 B610 - or-int/2addr v0, v1

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

B7

xor-int/2addr vx, vy 計算vx 異或 vy並將結果存入vx。 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+11 BB20 - add-long/2addr v0, v2

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

BC

sub-long/2addr vx, vy 計算vx,vx+1 - vy,vy+1並將結果存入vx,vx+11 BC70 - sub-long/2addr v0, v7

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

BD

mul-long/2addr vx, vy 計算vx,vx+1 * vy,vy+1並將結果存入vx,vx+11 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+11 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+11 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+11 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+11 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+11 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/2addr vx, vy 無符號右移vx,vx+1,vy指定移動的位置,並將結果存入vx,vx+1。 C520 - ushr-long/2addr v0, v2

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

C6

add-float/2addr vx, vy 計算vx + vy並將結果存入vx。 C640 - add-float/2addr v0,v4

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

C7

sub-float/2addr vx, vy 計算vx - vy並將結果存入vx。 C740 - sub-float/2addr v0,v4

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

C8

mul-float/2addr vx, vy 計算vx * vy並將結果存入vx。 C810 - mul-float/2addr v0, v1

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

C9

div-float/2addr vx, vy 計算vx / vy並將結果存入vx。 C910 - div-float/2addr v0, v1

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

CA

rem-float/2addr vx, vy 計算vx % vy並將結果存入vx。 CA10 - rem-float/2addr v0, v1

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

CB

add-double/2addr vx, vy 計算vx,vx+1 + vy,vy+1並將結果存入vx,vx+11 CB70 - add-double/2addr v0, v7

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

CC

sub-double/2addr vx, vy 計算vx,vx+1 - vy,vy+1並將結果存入vx,vx+11 CC70 - sub-double/2addr v0, v7

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

CD

mul-double/2addr vx, vy 計算vx,vx+1 * vy,vy+1並將結果存入vx,vx+11 CD20 - mul-double/2addr v0, v2

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

CE

div-double/2addr vx, vy 計算vx,vx+1 / vy,vy+1並將結果存入vx,vx+11 CE20 - div-double/2addr v0, v2

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

CF

rem-double/2addr vx, vy 計算vx,vx+1 % vy,vy+1並將結果存入vx,vx+11 CF20 - rem-double/2addr v0, v2

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

D0

add-int/lit16 vx, vy, lit16 計算vy + lit16並將結果存入vx。 D001 D204 - add-int/lit16 v1, v0, #int 1234 // #04d2

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

D1

sub-int/lit16 vx, vy, lit16 計算vy - lit16並將結果存入vx。 D101 D204 - sub-int/lit16 v1, v0, #int 1234 // #04d2

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

D2

mul-int/lit16 vx, vy, lit16 計算vy * lit16並將結果存入vx。 D201 D204 - mul-int/lit16 v1, v0, #int 1234 // #04d2

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

D3

div-int/lit16 vx, vy, lit16 計算vy / lit16並將結果存入vx。 D301 D204 - div-int/lit16 v1, v0, #int 1234 // #04d2

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

D4

rem-int/lit16 vx, vy, lit16 計算vy % lit16並將結果存入vx。 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 vx, 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 vx, vy, lit8 計算vy + lit8並將結果存入vx。 D800 0201 - add-int/lit8 v0,v2, #int1

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

D9

sub-int/lit8 vx, vy, lit8 計算vy - lit8並將結果存入vx。 D900 0201 - sub-int/lit8 v0,v2, #int1

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

DA

mul-int/lit8 vx, vy, lit8 計算vy * lit8並將結果存入vx。 DA00 0002 - mul-int/lit8 v0,v0, #int2

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

DB

div-int/lit8 vx, vy, lit8 計算vy / lit8並將結果存入vx。 DB00 0203 - mul-int/lit8 v0,v2, #int3

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

DC

rem-int/lit8 vx, vy, lit8 計算vy % lit8並將結果存入vx。 DC00 0203 - rem-int/lit8 v0,v2, #int3

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

DD

and-int/lit8 vx, vy, lit8 計算vy 與 lit8並將結果存入vx。 DD00 0203 - and-int/lit8 v0,v2, #int3

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

DE

or-int/lit8 vx, vy, lit8 計算vy 或 lit8並將結果存入vx。 DE00 0203 - or-int/lit8 v0, v2, #int 3

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

DF

xor-int/lit8 vx, vy, lit8 計算vy異或lit8並將結果存入vx。 DF00 0203 | 0008: xor-int/lit8 v0, v2, #int 3

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

E0

shl-int/lit8 vx, vy, lit8 左移vy,lit8指定移動的位置,並將結果存入vx。 E001 0001 - shl-int/lit8 v1, v0, #int 1

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

E1

shr-int/lit8 vx, 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 {參數}, 內聯ID 根據內聯ID6執行內聯方法。 EE20 0300 0100 - execute-inline {v1, v0}, inline #0003

執行內聯方法#3,參數v1,v0,其中參數v1爲"this"的實例,v0是方法的參數。

EF

unused_EF 未使用  

F0

invoke-direct-empty 用於空方法的佔位符,如Object.<init>。這相當於正常執行了nop指令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寄存器中實例指向+偏移位置的數據區的值,存入vx6 F221 1000 - iget-quick v1, v2, [obj+0010]

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

F3

iget-wide-quick vx, vy, 偏移量 獲取vy寄存器中實例指向+偏移位置的數據區的值,存入vx,vx+16 F364 3001 – iget-wide-quick v4, v6, [obj+0130]

獲取v6寄存器中的實例指向+130H位置的數據區的值,存入v4,v5。

F4

iget-object-quick vx, vy, 偏移量 獲取vy寄存器中實例指向+偏移位置的數據區的對象引用,存入vx6 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+0010]

將v1寄存器中的值存入v2寄存器中的實例指向+10H位置的數據區。

F6

iput-wide-quick vx, vy, 偏移量 將vx,vx+1寄存器中的值存入vy寄存器中的實例指向+偏移位置的數據區6 F652 7001 – iput-wide-quick v2, v5, [obj+0170]

將v2,v3寄存器中的值存入v5寄存器中的實例指向+170H位置的數據區。

F7

iput-object-quick vx, vy, 偏移量 將vx寄存器中的對象引用存入vy寄存器中的實例指向+偏移位置的數據區6 F701 4C00 – iput-object-quick v1, v0, [obj+004c]

將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-quick {參數}, 虛擬表偏移量 調用父類虛擬方法,使用目標對象的直接父類的虛擬表6 FA40 8100 3254 – invoke-super-quick {v2, v3, v4, v5}, vtable #0081

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

FB

invoke-super-quick/range {參數範圍}, 虛擬表偏移量 調用父類虛擬方法,使用目標對象的直接父類的虛擬表6 F906 1B00 0000 – invoke-super-quick/range {v0..v5}, vtable #001b

調用父類虛擬方法,目標對象的實例指向位於v0寄存器,方法位於虛擬表#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文件。

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