zoukankan      html  css  js  c++  java
  • Dalvik 虚拟机操作码

    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 存储。

    Opcod e 操作

    (he

    x)

    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寄存器范围以内,而v x则是在 初的256寄存器范围以内。

    0200 1900 ‐ move/from16 v0, v25

    移动v25寄存器中的内容到v0。

    03

    move/16

    未知注4

     

    04

    move‐wide 

    未知注4

     

    05

    move‐wide/from16 v x, 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型返回值到v

    2,v3。

    0C

    move‐result‐object vx

    移动上一次方法调用的对象引用返回值到vx。

    0C00 ‐ move‐result‐object v0

    移动上一次方法调用的对象引用返回值到v0。

    0D

    move‐exception vx

    当方法调用抛出异常时移动

    0D19 ‐ move‐exception v25

     

     

     

    异常对象引用到vx。

    当方法调用抛出异常时移动异常对象引用到v25。

    0E

    return‐void

    返回空值。

    0E00 ‐ return‐void

    返回值为void,即无返回值,并非返回null。

    0F

    return vx

    返回在vx寄存器的值。

    0F00 ‐ return v0

    返回v0寄存器中的值。

    10

    return‐wide vx

    返回在vx,vx+1寄存器的do uble/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, li t16

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

    1500 2041 ‐ const/high16 v0, #float 10.0

    // #41200000

    存入 float 常量 10.0 到 v0。该指令 高支持 16 位浮点数。

    16

    const‐wide/16 vx, l it16

    存入int常量到vx,vx+1寄存器,扩展int型常量为lon g常量。

    1600 0A00 ‐ const‐wide/16 v0, #long 10 存入long常量10到v0,v1寄存器。

    17

    const‐wide/32 vx, l it32

    存入32位常量到vx,vx+1寄存器,扩展int型常量到lon g常量。

    1702 4e61 bc00 ‐ const‐wide/32 v2, #long

    12345678 // #00bc614e

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

    18

    const‐wide vx, lit6

    4

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

    1802 874b 6b5d 54dc 2b00‐ const‐wide v2, #long 12345678901234567 // #002bdc545d6b4 b87

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

    器。

    19

    const‐wide/high16 v x, 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条目)的引用到v

    8。

    1B

    const‐string‐jumbo

    未知注4

     

    1C

    const‐class vx, 类型

    ID

    存入类对象常量到vx,通过类型ID或类型(如Object.cl ass)。

    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(类型I D表#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.File InputStream // type@0015 实例化java.io.FileInputStream(类型ID表#1

    5H条目)类型,并将其对象引用存入v0。

    23

    new‐array vx, vy,类型ID

    根据类型ID 或类型新建一个数组,vy存入数组的长度,v x存入数组的引用。

    2312 2500 ‐ new‐array v2, v1, char[] // t ype@0025

    新建一个char(类型ID表#25H条目)数组,v1存入数组的长度,v2存入数组的引用。

    24

    filled‐new‐array

    {参数}, 类型ID

    根据类型ID 或类型新建一个数组并通过参数填充5。新的数组引用可以得到一个moveresult‐object 指令,前提是执行过 filled‐new‐arra y 指令。

    2420 530D 0000 ‐ filled‐new‐array {v0,v

    0},[I // type@0D53

    新建一个int(类型ID表#D53H条目)数组,长度将为2并且2个元素将填充到v0寄存器。

    25

    filled‐new‐array‐ra nge {vx..vy}, 类型I

    D

    根据类型ID 或类型新建一个数组并以寄存器范围为参数填充。新的数组引用可以得到一个 move‐result‐object 指令,前提是执行过fillednew‐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 语句,cas e常量是连续的。这个指令使用索引表,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: +0000000 5

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

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

    9

    2C

    sparse‐switch vx,

    查询表偏移量

    实现一个 switch 语句,cas e常量是非连续的。这个指令使用查询表,用于表示 case 常量和每个case常量的偏移量。如果 vx 无法在表中匹配将继续执行下一个指令(即d efault 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存入i nt 型返回值。非数值默认为小于。如果参数为非数

    值将返回‐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存入i nt 型返回值。非数值默认为大于。如果参数为非数值将返回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 < vy 2,跳转到目标。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 > vy 2,跳转到目标。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 == 0 2,跳转到目标。vx是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)。001

    4是目标指令标签。

    3A

    if‐ltz vx, 目标

    如果vx < 02,跳转到目标。

    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 > 02,跳转到目标。

    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, vz

    从int数组获取一个int型值到vx,对象数组的引用位于v y,需获取的元素的索引位于v z。

    4407 0306 ‐ aget v7, v3, v6

    从数组获取一个int型值到v7,对象数组的引用位于v3,需获取的元素的索引位于v6。

    45

    aget‐wide vx, vy, v z

    从 long/double 数组获取一个long/double值到vx,vx+

    1,数组的引用位于vy,需获取的元素的索引位于vz。

    4505 0104 ‐ aget‐wide v5, v1, v4

    从long/double数组获取一个long/double值到v 5,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, v y, vz

    从boolean数组获取一个bo olean值到vx,数组的引用位于vy,需获取的元素的索引位于vz。

    4700 0001 ‐ aget‐boolean v0, v0, v1

    从boolean数组获取一个boolean值到v0,数组的引用位于v0,需获取的元素的索引位于v1。 

    48

    aget‐byte vx, vy, v z

    从 byte 数组获取一个 byte 值到vx,数组的引用位于vy,需获取的元素的索引位于vz。

    4800 0001 ‐ aget‐byte v0, v0, v1

    从byte数组获取一个byte值到v0,数组的引用位于v0,需获取的元素的索引位于v1。

    49

    aget‐char vx, vy, v z

    从 char 数组获取一个 char 值到vx,数组的引用位于vy,需获取的元素的索引位于vz。

    4905 0003 ‐ aget‐char v5, v0, v3

    从char数组获取一个char值到v5,数组的引用位于v0,需获取的元素的索引位于v3。

    4A

    aget‐short vx, vy, vz

    从short数组获取一个shor t值到vx,数组的引用位于v y,需获取的元素的索引位于v z。

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

    从short数组获取一个short值到v0,数组的引用位于v0,需获取的元素的索引位于v1。

    4B

    aput vx, vy, vz

    将vx的int值作为元素存入 int数组,数组的引用位于v y,元素的索引位于vz。

    4B00 0305 ‐ aput v0, v3, v5

    将v0的int值作为元素存入int数组,数组的引用位于v3,元素的索引位于v5。

    4C

    aput‐wide vx, vy, v z

    将vx,vx+1的double/long 值作为元素存入 double/lon g数组,数组的引用位于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, v y, vz

    将vx的boolean值作为元素存入boolean数组,数组的引用位于vy,元素的索引位于v z。

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

    将v1的boolean值作为元素存入boolean数组,数组的引用位于v0,元素的索引位于v2。

    4F

    aput‐byte vx, vy, v z

    将vx的byte值作为元素存入 byte数组,数组的引用位于v y,元素的索引位于vz。

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

    将v2的byte值作为元素存入byte数组,数组的引用位于v0,元素的索引位于v1。

    50

    aput‐char vx, vy, v z

    将vx的char值作为元素存入 char数组,数组的引用位于v y,元素的索引位于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 // fi eld@0003

    读取int型字段i6(字段表#3条目)到v0,v1寄存器中是Test2实例的引用。

    53

    iget‐wide vx, vy, 字段ID

    根据字段ID读取实例的doub le/long型字段到vx,vx+11,vy 寄存器中是该实例的引用。

    5320 0400 ‐ iget‐wide v0, v2, Test2.l0:J

    // field@0004

    读取long型字段l0(字段表#4条目)到v0,v1,v

    2寄存器中是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, v y, 字段ID

    根据字段ID读取实例的bool ean型字段到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读取实例的shor t 型字段到 vx,vy 寄存器中是该实例的引用。

    5830 0800 ‐ iget‐short v0, v3, Test3.si1: S // field@0008

    读取short型字段si1(字段表#8条目)到v0,v

    3寄存器中是Test2实例的引用。

    59

    iput vx, vy, 字段ID

    根据字段ID将vx寄存器的值存入实例的 int 型字段,vy 寄存器中是该实例的引用。

    5920 0200 ‐ iput v0, v2, Test2.i6:I // fi eld@0002

    将v0寄存器的值存入实例的int型字段i6(字段表#2条目),v2寄存器中是Test2实例的引用。

    5A

    iput‐wide vx, vy, 字段ID

    根据字段ID将vx,vx+1寄存器的值存入实例的 double/l ong型字段,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, LineReade r.bis:Ljava/io/BufferedInputStream; // fi

     

     

    寄存器中是该实例的引用。

    eld@0000

    将v0寄存器的值存入实例的对象引用字段bis(字段表#0条目),v2寄存器中是BufferedInputStr eam实例的引用。

    5C

    iput‐boolean vx, v y, 字段ID

    根据字段ID将vx寄存器的值存入实例的boolean型字段, vy寄存器中是该实例的引用。

    5C30 0000 ‐ iput‐boolean v0, v3, Test2.b

    0: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型字段,v y寄存器中是该实例的引用。

    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, 字段I

    D

    根据字段ID读取静态double

    /long型字段到vx,vx+1。

    6100 0500 ‐ sget‐wide v0, Test2.l1:J // f ield@0005

    读取Test2的静态long型字段l1(字段表#5条目)到v0,v1。

    62

    sget‐object vx, 字段

    ID

    根据字段ID 读取静态对象引用字段到vx。

    6201 0C00 ‐ sget‐object v1, Test3.os1:Lja va/lang/Object; // field@000c

    读取Object的静态对象引用字段os1(字段表#CH 条目)到v1。

    63

    sget‐boolean vx, 字段ID

    根据字段ID读取静态boolea n型字段到vx。

    6300 0C00 ‐ sget‐boolean v0, Test2.sb:Z /

    / field@000c

    读取Test2的静态boolean型字段sb(字段表#CH 条目)到v0。

    64

    sget‐byte vx, 字段I

    D

    根据字段ID 读取静态 byte 型字段到vx。

    6400 0200 ‐ sget‐byte v0, Test3.bs1:B // field@0002

    读取Test3的静态byte型字段bs1(字段表#2条目)到v0。

    65

    sget‐char vx, 字段I

    D

    根据字段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, 字段I

    D

    根据字段ID将vx,vx+1寄存器中的值赋值到 double/lon g型静态字段。

    6800 0500 ‐ sput‐wide v0, Test2.l1:J // f ield@0005

    将v0,v1寄存器中的值赋值到Test2的long型静

    态字段l1(字段表#5条目)。

    69

    sput‐object vx, 字段

    ID

    根据字段ID将vx寄存器中的对象引用赋值到对象引用静态字段。

    6900 0c00 ‐ sput‐object v0, Test3.os1:Lja va/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, 字段I

    D

    根据字段ID将vx寄存器中的值赋值到byte型静态字段。

    6B00 0200 ‐ sput‐byte v0, Test3.bs1:B // field@0002

    将v0寄存器中的值赋值到Test3的byte型静态字段bs1(字段表#2条目)。

    6C

    sput‐char vx, 字段I

    D

    根据字段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 // me thod@0006

    调用Test2的method5(方法表#6条目)方法,该指令共有5个参数(操作码第二个字节的4个 高有效位5)5。参数v4是"this"实例,v0, v1, v 2, 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@01 a6

    调用java.io.FilterOutputStream的close(方法表#1A6条目)方法,参数v1是"this"实例。() V表示close方法没有参数,V表示返回值为void

    70

    invoke‐direct {参数}, 方法名

    不解析直接调用带参数的方法。

    7010 0800 0100 ‐ invoke‐direct {v1}, jav a.lang.Object.<init>:()V // method@0008 调用 java.lang.Object 的<init>(方法表#8 条

     

     

     

    目)方法,参数v1是"this"实例5。()V表示<in it>方法没有参数,V表示返回值为void。

    71

    invoke‐static {参数}, 方法名

    调用带参数的静态方法。

    7110 3400 0400 ‐ invoke‐static {v4}, jav a.lang.Integer.parseInt:( Ljava/lang/Str ing;)I // method@0034 调用java.lang.Integer 的parseInt(方法表# 34条目)静态方法,该指令只有1个参数v45,(L java/lang/String;)I 中的 Ljava/lang/Strin g;表示parseInt方法需要String类型的参数,I 表示返回值为int型。

    72

    invoke‐interface

    {参数}, 方法名

    调用带参数的接口方法。

    7240 2102 3154 invoke‐interface {v1, v3, v4, v5}, mwfw.IReceivingProtocolAdapter.r eceivePackage:(ILjava/lang/String;Ljava/ io/InputStream;)Z // method@0221 调用 mwfw.IReceivingProtocolAdapter 接口的 receivePackage方法(方法表#221条目),该指令共有4个参数5,参数v1是"this"实例,v3,v4, v5是receivePackage方法的参数,(ILjava/lan g/String;Ljava/io/InputStream;)Z 中的 I 表示int型参数,Ljava/lang/String;表示String 类型参数,Ljava/io/InputStream;表示InputSt ream类型参数,Z表示返回值为boolean型。

    73

    unused_73

    未使用

     

    74

    invoke‐virtual/rang e {vx..vy}, 方法名

    调用以寄存器范围为参数的虚拟方法。该指令第一个寄存器和寄存器的数量将传递给方法。

    7403 0600 1300 ‐ invoke‐virtual {v19..v2

    1}, 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@01 a6

    调用java.io.FilterOutputStream的close(方法表#1A6条目)方法,参数v1是"this"实例。() V表示close方法没有参数,V表示返回值为void

    76

    invoke‐direct/range

     {vx..vy}, 方法名

    不解析直接调用以寄存器范围为参数的方法。该指令第一个寄存器和寄存器的数量将会传递给方法。

    7603 3A00 1300 ‐ invoke‐direct/range {v1 9..21},java.lang.Object.<init>:()V // met hod@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 {v1 9..21},java.lang.Integer.parseInt:(Ljava /lang/String;)I // method@0034 调用java.lang.Integer 的parseInt(方法表#

     

     

     

    34条目)静态方法,参数v19是"this"实例(操作码第五、第六字节表示范围从 v19 开始,第二个字节为03表示传入了3个参数),(Ljava/lang/St ring;)I中的Ljava/lang/String;表示parseIn t方法需要String类型的参数,I表示返回值为in t型。

    78

    invoke‐interface‐ra nge {vx..vy}, 方法名

    调用以寄存器范围为参数的接口方法。该指令第一个寄存器和寄存器的数量将会传递给方法。

    7840 2102 0100 invoke‐interface {v1..v4},  mwfw.IReceivingProtocolAdapter.receiveP ackage:(ILjava/lang/String;Ljava/io/Inpu tStream;)Z // method@0221

    调用 mwfw.IReceivingProtocolAdapter 接口的 receivePackage方法(方法表#221条目),该指令共有4个参数5,参数v1是"this"实例,v2,v3, v4是receivePackage方法的参数,(ILjava/lan g/String;Ljava/io/InputStream;)Z 中的 I 表示int型参数,Ljava/lang/String;表示String 类型参数,Ljava/io/InputStream;表示InputSt ream类型参数,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, v y

    转换vy寄存器中的int型值为 double 型值存入 vx,vx+

    1。

    8306 ‐ int‐to‐double v6, v0

    转换v0寄存器中的int型值为double型值存入v

    6,v7。

    84

    long‐to‐int vx, vy

    转换vy,vy+1寄存器中的lo ng型值为int型值存入vx。

    8424 ‐ long‐to‐int v4, v2

    转换v2,v3寄存器中的long型值为int型值存入v

    4。

    85

    long‐to‐float vx, v y

    转换vy,vy+1寄存器中的lo ng 型值为 float 型值存入 v x。

    8510 ‐ long‐to‐float v0, v1

    转换v1,v2寄存器中的long型值为float型值存入v0。

    86

    long‐to‐double vx, vy

    转换vy,vy+1寄存器中的lo ng型值为double型值存入v

    8610 ‐ long‐to‐double v0, v1

    转换v1,vy2寄存器中的long型值为double型值

     

     

    x,vx+1。

    存入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, v y

    转换vy寄存器中的float型值为 long 型值存入 vx,vx+

    1。

    8830 ‐ float‐to‐long v0, v3

    转换v3寄存器中的float型值为long型值存入v

    0,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, v y

    转换vy,vy+1寄存器中的do uble 型值为 int 型值存入 v x。

    8A40 ‐ double‐to‐int v0, v4

    转换v4,v5寄存器中的double型值为int型值存入v0。

    8B

    double‐to‐long vx, vy

    转换vy,vy+1寄存器中的do uble型值为long型值存入v x,vx+1。

    8B40 ‐ double‐to‐long v0, v4

    转换v4,v5寄存器中的double型值为long型值存入v0,v1。

    8C

    double‐to‐float vx,

     vy

    转换vy,vy+1寄存器中的do uble型值为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并将结果存入v x。

    9000 0203 ‐ add‐int v0, v2, v3

    计算v2 + v3并将结果存入v04

    91

    sub‐int vx, vy, vz

    计算vy ‐ vz并将结果存入v x。

    9100 0203 ‐ sub‐int v0, v2, v3

    计算v2 – v3并将结果存入v0。

    92

    mul‐int vx, vy, vz

    计算vy * vz并将结果存入v x。

    9200 0203 ‐ mul‐int v0,v2,v3 计算v2 * w3并将结果存入v0。

    93

    div‐int vx, vy, vz

    计算vy / vz并将结果存入v x。

    9303 0001 ‐ div‐int v3, v0, v1

    计算v0 / v1并将结果存入v3。

    94

    rem‐int vx, vy, vz

    计算vy % vz并将结果存入v x。

    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+1

    1。

    A302 0004 ‐ shl‐long v2, v0, v4

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

    A4

    shr‐long vx, vy, 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, v z

    无符号右移 vy,vy+1,vz 指定移动的位置,结果存入vx, vx+11

    A502 0004 ‐ ushr‐long v2, v0, v4

    以v4指定的位置无符号右移v0,v1,结果存入v2, v3。

    A6

    add‐float vx, vy, v z

    计算vy + vz并将结果存入v x。

    A600 0203 ‐ add‐float v0, v2, v3 计算v2 + v3并将结果存入v0。

    A7

    sub‐float vx, vy, v z

    计算vy ‐ vz并将结果存入v x。 

    A700 0203 ‐ sub‐float v0, v2, v3

    计算v2 ‐ v3并将结果存入v0。

    A8

    mul‐float vx, vy, v z

    计算vy * vz并将结果存入v x。

    A803 0001 ‐ mul‐float v3, v0, v1 计算v0 * v1并将结果存入v3。

    A9

    div‐float vx, vy, v z

    计算vy / vz并将结果存入v x。

    A903 0001 ‐ div‐float v3, v0, v1 计算v0 / v1并将结果存入v3。

    AA

    rem‐float vx, vy, v z

    计算vy % vz并将结果存入v x。

    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,

    计算vy,vy+1 / vz,vz+1并

    AE06 0002 ‐ div‐double v6, v0, v2

     

     

    vz

    将结果存入vx,vx+11

    计算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, v y

    计算vx + vy并将结果存入v x。

    B010 ‐ add‐int/2addr v0,v1

    计算v0 + v1并将结果存入v0。

    B1

    sub‐int/2addr vx, v y

    计算vx ‐ vy并将结果存入v x。

    B140 ‐ sub‐int/2addr v0, v4

    计算v0 – v4并将结果存入v0。

    B2

    mul‐int/2addr vx, v y

    计算vx * vy并将结果存入v x。

    B210 ‐ mul‐int/2addr v0, v1

    计算v0 * v1并将结果存入v0。

    B3

    div‐int/2addr vx, v y

    计算vx / vy并将结果存入v x。

    B310 ‐ div‐int/2addr v0, v1

    计算v0 / v1并将结果存入v0。

    B4

    rem‐int/2addr vx, v y

    计算vx % vy并将结果存入v x。

    B410 ‐ rem‐int/2addr v0, v1

    计算v0 % v1并将结果存入v0。

    B5

    and‐int/2addr vx, v y

    计算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, v y

    计算vx 异或 vy并将结果存入vx。

    B710 ‐ xor‐int/2addr v0, v1

    计算v0 异或 v1并将结果存入v0。

    B8

    shl‐int/2addr vx, v y

    左移vx,vy指定移动的位置,并将结果存入vx。

    B810 ‐ shl‐int/2addr v0, v1

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

    B9

    shr‐int/2addr vx, v y

    右移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, v y

    计算 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并将结果存入v x。

    C640 ‐ add‐float/2addr v0,v4 计算v0 + v4并将结果存入v0。

    C7

    sub‐float/2addr vx,

     vy

    计算vx ‐ vy并将结果存入v x。

    C740 ‐ sub‐float/2addr v0,v4 计算v0 ‐ v4并将结果存入v0。

    C8

    mul‐float/2addr vx,

     vy

    计算vx * vy并将结果存入v x。

    C810 ‐ mul‐float/2addr v0, v1

    计算v0 * v1并将结果存入v0。

    C9

    div‐float/2addr vx,

     vy

    计算vx / vy并将结果存入v x。

    C910 ‐ div‐float/2addr v0, v1

    计算v0 / v1并将结果存入v0。

    CA

    rem‐float/2addr vx,

     vy

    计算vx % vy并将结果存入v x。

    CA10 ‐ rem‐float/2addr v0, v1

    计算v0 % v1并将结果存入v0。

    CB

    add‐double/2addr v x, 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 v x, 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 v x, 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 v x, 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 v x, 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, v y, lit16

    计算vy + lit16并将结果存入vx。

    D001 D204 ‐ add‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 + 1234并将结果存入v1。

    D1

    sub‐int/lit16 vx, v y, lit16

    计算vy ‐ lit16并将结果存入vx。

    D101 D204 ‐ sub‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 ‐ 1234并将结果存入v1。

    D2

    mul‐int/lit16 vx, v y, lit16

    计算vy * lit16并将结果存入vx。

    D201 D204 ‐ mul‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 * 1234并将结果存入v1。

    D3

    div‐int/lit16 vx, v y, lit16

    计算vy / lit16并将结果存入vx。

    D301 D204 ‐ div‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 / 1234并将结果存入v1。

    D4

    rem‐int/lit16 vx, v y, lit16

    计算vy % lit16并将结果存入vx。

    D401 D204 ‐ rem‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 % 1234并将结果存入v1。

    D5

    and‐int/lit16 vx, v y, lit16

    计算 vy 与 lit16 并将结果存入vx。

    D501 D204 ‐ and‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 与 1234并将结果存入v1。

    D6

    or‐int/lit16 vx, v

    计算 vy 或 lit16 并将结果

    D601 D204 ‐ or‐int/lit16 v1, v0, #int 123

     

     

    y, lit16

    存入vx。

    4 // #04d2

    计算v0 或 1234并将结果存入v1。

    D7

    xor‐int/lit16 vx, v y, lit16

    计算 vy 异或 li 果存入vx。

    t16 并将结

    D701 D204 ‐ xor‐int/lit16 v1, v0, #int 12

    34 // #04d2

    计算v0 异或 1234并将结果存入v1。

    D8

    add‐int/lit8 vx, v y, lit8

    计算 vy + lit8 入vx。

    并将结果存

    D800 0201 ‐ add‐int/lit8 v0,v2, #int1 计算v2 + 1并将结果存入v0。

    D9

    sub‐int/lit8 vx, v y, lit8

    计算 vy ‐ lit8 入vx。

    并将结果存

    D900 0201 ‐ sub‐int/lit8 v0,v2, #int1 计算v2 ‐ 1并将结果存入v0。

    DA

    mul‐int/lit8 vx, v y, lit8

    计算 vy * lit8 入vx。

    并将结果存

    DA00 0002 ‐ mul‐int/lit8 v0,v0, #int2 计算v0 * 2并将结果存入v0。

    DB

    div‐int/lit8 vx, v y, lit8

    计算 vy / lit8 入vx。

    并将结果存

    DB00 0203 ‐ mul‐int/lit8 v0,v2, #int3 计算v2 / 3并将结果存入v0。

    DC

    rem‐int/lit8 vx, v y, lit8

    计算 vy % lit8 入vx。

    并将结果存

    DC00 0203 ‐ rem‐int/lit8 v0,v2, #int3 计算v2 % 3并将结果存入v0。

    DD

    and‐int/lit8 vx, v y, 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, v y, lit8

    计算vy异或lit8并将结果存入vx。

    DF00 0203 | 0008: xor‐int/lit8 v0, v2, #i nt 3

    计算v2 异或 3并将结果存入v0。

    E0

    shl‐int/lit8 vx, v y, lit8

    左移vy,lit8指定移动的位置,并将结果存入vx。

    E001 0001 ‐ shl‐int/lit8 v1, v0, #int 1 将v0左移1位,结果存入v1。

    E1

    shr‐int/lit8 vx, v y, lit8

    右移vy,lit8指定移动的位置,并将结果存入vx。

    E101 0001 ‐ shr‐int/lit8 v1, v0, #int 1 将v0右移1位,结果存入v1。

    E2

    ushr‐int/lit8 vx, v y, 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

    根据内联ID 法。

    6 执行内联方

    EE20 0300 0100 ‐ execute‐inline {v1, v0},

     inline #0003

    执行内联方法#3,参数v1,v0,其中参数v1为"th is"的实例,v0是方法的参数。

               

     

    EF

    unused_EF

    未使用

     

    F0

    invoke‐direct‐empty

    用于空方法的占位符,如Obj ect.<init>。这相当于正常执行了nop指令6

    F010 F608 0000 ‐ invoke‐direct‐empty {v 0}, Ljava/lang/Object;.<init>:()V // meth od@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 v x, vy, 偏移量

    获取 vy 寄存器中实例指向+ 偏移位置的数据区的对象引用,存入vx6

    F431 0C00 ‐ iget‐object‐quick v1, v3, [ob j+000c]

    获取 v3 寄存器中的实例指向+0CH 位置的数据区的对象引用,存入v1。

    F5

    iput‐quick vx, vy,

    偏移量

    将vx寄存器中的值存入vy寄存器中的实例指向+偏移位置的数据区6

    F521 1000 ‐ iput‐quick v1, v2, [obj+0010] 将v1寄存器中的值存入v2寄存器中的实例指向+1

    0H位置的数据区。

    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 v x, vy, 偏移量

    将 vx 寄存器中的对象引用存入 vy 寄存器中的实例指向+ 偏移位置的数据区6

    F701 4C00 ‐ iput‐object‐quick v1, v0, [ob j+004c]

    将v1寄存器中的对象引用存入v0寄存器中的实例指向+4CH位置的数据区。

    F8

    invoke‐virtual‐quic

    k {参数}, 虚拟表偏移量

    调用虚拟方法,使用目标对象虚拟表6

    F820 B800 CF00 ‐ invoke‐virtual‐quick {v1

    5, v12}, vtable #00b8

    调用虚拟方法,目标对象的实例指向位于 v15 寄存器,方法位于虚拟表#B8条目,方法所需的参数位于 v12。

    F9

    invoke‐virtual‐quic k/range {参数范围},

    虚拟表偏移量

    调用虚拟方法,使用目标对象虚拟表6

    F906 1800 0000 ‐ invoke‐virtual‐quick/ran ge {v0..v5},vtable #0018

    调用虚拟方法,目标对象的实例指向位于v0寄存器,方法位于虚拟表#18H 条目,方法所需的参数位于 v

    1..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文件。

  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/qftm/p/10399449.html
Copyright © 2011-2022 走看看