表中的 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
|
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
虛擬表偏移量 |
調用虛擬方法,使用目標對象虛擬表注 6。 |
F820 B800 CF00 - invoke-virtual-quick {v15, v12}, vtable #00b8 調用虛擬方法,目標對象的實例指向位於 v15 寄存器,方法位於虛擬表#B8 條目,方法所需的參數位於 v12。 |
F9 |
invoke-virtual
{參數範圍}, 虛擬表偏移量 |
調用虛擬方法,使用目標對象虛擬表注 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 文件。