blog
Smali

Smali

https://developer.android.com/reference/dalvik/bytecode/Opcodes.html (opens in a new tab)

http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html (opens in a new tab)

https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html (opens in a new tab)

https://github.com/AbhiTheModder/understand-smali/wiki/DAY-03 (opens in a new tab)

.java -> .class -> jvm

.java -> .class -> .dex -> dalvik VM

java

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!"); 
    }
}

smali

    .class public LHelloWorld;
    .super Ljava/lang/Object;

.method public static main([Ljava/lang/String;)V
.registers 2

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

const-string	v1, "Hello World!"

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

return-void
 .end method

Cheat Sheet

boolean=>
const/4 v0, 0x0     #true
const/4 v0, 0x1     #false

byte=>
const/16 v0, -0x80     #-128
cons/16 v0, -0x9       #-9
const/4 v0, 0x0        #0
cons/16 v0, 0x8       #8
cons/16 v0, 0x7f      #127

short=>
const/16 v0, -0x8000   #-32768
cons/16 v0, -0x9       #-9
const/4 v0, 0x0        #0
cons/16 v0, 0x8       #8
cons/16 v0, 0x7fff     #32767

int=>
const v0, 0x230       #230
[fixed format]

long=>
const-wide/32 v0, -0x8001            #-32769
const-wide/16 v0, 0x0                #0
const-wide/32 v0, 0x8000            #32768

float=>
const/4 v1, 0x0                   #0
const v1, 0x3dcccccd             # 0.1f
const v1, 0x496a9650            # 960869.0f
const/high16 v1, 0x42480000    # 50.0f

double=>
const-wide/16 v1, 0x0                         #0
const-wide v1, 0x3fb999999999999aL         #0.1
const-wide v1, 0x412d52ca00000000L         # 960869.0
const-wide/high16 v1, 0x4049000000000000L # 50.0

java:

public class Main {
  public static void main(String[] args) {

    float value = 601.3f;

    System.out.println("value"+value);
  }
}

smali:

.method public static main([Ljava/lang/String;)V
    .registers 3

    sget-object p0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "value"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    const v1, 0x44165333    # 601.3f
    #The value we want.

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(F)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {p0, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    return-void
.end method

from above "const v1, 0x44165333" # 601.3f

java opcodes

|     |     |     |     |
| --- | --- | --- | --- |
| Opcode (hex) | Opcode name | Explanation | Example |
| 00  | nop | No operation | 0000 - nop |
| 01  | move vx,vy | Moves the content of vy into vx. Both registers must be  in the first 256 register range. | 0110 - move v0, v1 <br><br>Moves v1 into v0. |
| 02  | move/from16 vx,vy | Moves the content of vy into vx. vy may be in the 64k  register range while vx is one of the first 256 registers. | 0200 1900 - move/from16 v0, v25 <br><br>Moves v25 into v0. |
| 03  | move/16 |
| 04  | move-wide |
| 05  | move-wide/from16 vx,vy | Moves a long/double value from vy to vx. vy may be in  the 64k register range while wx is one of the first 256  registers. | 0516 0000 - move-wide/from16 v22, v0 <br><br>Moves v0 into v22. |
| 06  | move-wide/16 |
| 07  | move-object vx,vy | Moves the object reference from vy to vx. | 0781 - move-object v1, v8 <br><br>Moves the object reference in v8 to v1. |
| 08  | move-object/from16 vx,vy | Moves the object reference from vy to vx, vy can  address 64k registers and vx can address 256 registers. | 0801 1500 - move-object/from16 v1, v21 <br><br>Move the object reference in v21 to v1. |
| 09  | move-object/16 |
| 0A  | move-result vx | Move the result value of the previous method invocation into vx. | 0A00 - move-result v0 <br><br>Move the return value of a previous method invocation into v0. |
| 0B  | move-result-wide vx | Move the long/double result value of the previous  method invocation into vx,vx+1. | 0B02 - move-result-wide v2 <br><br>Move the long/double result value of the previous  method invocation into v2,v3. |
| 0C  | move-result-object vx | Move the result object reference of the previous method  invocation into vx. | 0C00 - move-result-object v0 |
| 0D  | move-exception vx | Move the exception object reference thrown during a  method invocation into vx. | 0D19 - move-exception v25 |
| 0E  | return-void | Return without a return value | 0E00 - return-void |
| 0F  | return vx | Return with vx return value | 0F00 - return v0 <br><br>Returns with return value in v0. |
| 10  | return-wide vx | Return with double/long result in vx,vx+1. | 1000 - return-wide v0 <br><br>Returns with a double/long value in v0,v1. |
| 11  | return-object vx | Return with vx object reference value. | 1100 - return-object v0 <br><br>Returns with object reference value in v0 |
| 12  | const/4 vx,lit4 | Puts the 4 bit constant into vx | 1221 - const/4 v1, #int2 <br><br>Moves literal 2 into v1. The destination register is in  the lower 4 bit in the second byte, the literal 2 is in the  higher 4 bit. |
| 13  | const/16 vx,lit16 | Puts the 16 bit constant into vx | 1300 0A00 - const/16 v0, #int 10 <br><br>Puts the literal constant of 10 into v0. |
| 14  | const vx, lit32 | Puts the integer constant into vx | 1400 4E61 BC00 - const v0, #12345678 // #00BC614E Moves literal 12345678 into v0. |
| 15  | const/high16 v0, lit16 | Puts the 16 bit constant into the topmost bits of the  register. Used to initialize float values. | 1500 2041 - const/high16 v0, #float 10.0 // #41200000 Moves the floating literal of 10.0 into v0. The 16 bit  literal in the instruction carries the top 16 bits of the  floating point number. |
| 16  | const-wide/16 vx, lit16 | Puts the integer constant into vx and vx+1 registers,  expanding the integer constant into a long constant.. | 1600 0A00 - const-wide/16 v0, #long 10 <br><br>Moves literal 10 into v0 and v1 registers. |
| 17  | const-wide/32 vx, lit32 | Puts the 32 bit constant into vx and vx+1 registers,  expanding the integer constant into a long constant. | 1702 4e61 bc00 - const-wide/32 v2, #long 12345678 //  #00bc614e <br><br>Puts #12345678 into v2 and v3 registers. |
| 18  | const-wide vx, lit64 | Puts the 64 bit constant into vx and vx+1 registers. | 1802 874b 6b5d 54dc 2b00- const-wide v2, #long  12345678901234567 // #002bdc545d6b4b87 Puts #12345678901234567 into v2 and v3 registers. |
| 19  | const-wide/high16 vx,lit16 | Puts the 16 bit constant into the highest 16 bit of vx and  vx+1 registers. Used to initialize double values. | 1900 2440 - const-wide/high16 v0, #double 10.0 //  #402400000 <br><br>Puts the double constant of 10.0 into v0 register. |
| 1A  | const-string vx,string_id | Puts reference to a string constant identified by  string_id into vx. | 1A08 0000 - const-string v8, "" // string@0000 Puts reference to string@0000 (entry #0 in the string  table) into v8. |
| 1B  | const-string-jumbo |
| 1C  | const-class vx,type_id | Moves the class object of a class identified by type_id  (e.g. Object.class) into vx. | 1C00 0100 - const-class v0, Test3 // type@0001 Moves reference to Test3.class (entry#1 in the type id  table) into |
| 1D  | monitor-enter vx | Obtains the monitor of the object referenced by vx. | 1D03 - monitor-enter v3 <br><br>Obtains the monitor of the object referenced by v3. |
| 1E  | monitor-exit | Releases the monitor of the object referenced by vx. | 1E03 - monitor-exit v3 <br><br>Releases the monitor of the object referenced by v3. |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| 1F  | check-cast vx, type_id | Checks whether the object reference in vx can be cast  to an instance of a class referenced by type_id. Throws  ClassCastException if the cast is not possible,  continues execution otherwise. | 1F04 0100 - check-cast v4, Test3 // type@0001 Checks whether the object reference in v4 can be cast  to type@0001 (entry #1 in the type id table) |
| 20  | instance-of vx,vy,type_id | Checks whether vy is instance of a class identified by  type_id. Sets vx non-zero if it is, 0 otherwise. | 2040 0100 - instance-of v0, v4, Test3 // type@0001 Checks whether the object reference in v4 is an  instance of type@0001 (entry #1 in the type id table).  Sets v0 to non-zero if v4 is instance of Test3, 0  otherwise. |
| 21  | array-length vx,vy | Calculates the number of elements of the array  referenced by vy and puts the length value into vx. | 2111 - array-length v1, v1 <br><br>Calculates the number of elements of the array  referenced by v1 and puts the result into v1. |
| 22  | new-instance vx,type | Instantiates an object type and puts the reference of the  newly created instance into vx. | 2200 1500 - new-instance v0, java.io.FileInputStream //  type@0015 <br><br>Instantiates type@0015 (entry #15H in the type table)  and puts its reference into v0. |
| 23  | new-array vx,vy,type_id | Generates a new array of type_id type and vy element  size and puts the reference to the array into vx. | 2312 2500 - new-array v2, v1, char\[\] // type@0025 Generates a new array of type@0025 type and v1 size  and puts the reference to the new array into v2. |
| 24  | filled-new-array <br><br>{parameters},type_id | Generates a new array of type_id and fills it with the  parameters5. Reference to the newly generated array can be obtained by a move-result-object instruction,  immediately following the filled-new-array instruction. | 2420 530D 0000 - filled-new-array {v0,v0},\[I //  type@0D53 <br><br>Generates a new array of type@0D53. The array's size  will be 2 and both elements will be filled with the  contents of v0 register. |
| 25  | filled-new-array-range  {vx..vy},type_id | Generates a new array of type_id and fills it with a range of parameters. Reference to the newly generated array  can be obtained by a move-result-object instruction,  immediately following the filled-new-array instruction. | 2503 0600 1300 - filled-new-array/range {v19..v21}, \[B // type@0006 <br><br>Generates a new array of type@0D53. The array's size  will be 3 and the elements will be filled using the  v19,v20 and v21 registers4. |
| 26  | fill-array-data <br><br>vx,array\_data\_offset | Fills the array referenced by vx with the static data. The  location of the static data is the sum of the position of  the current instruction and the offset | 2606 2500 0000 - fill-array-data v6, 00e6 // +0025 Fills the array referenced by v0 with the static data at  current instruction+25H words location. The offset is  expressed as a 32-bit number. The static data is stored in the following format: <br><br>0003 // Table type: static array data <br><br>0400 // Byte per array element (in this case, 4 byte  integers) <br><br>0300 0000 // Number of elements in the table 0100 0000 // Element #0: integer 1 <br><br>0200 0000 // Element #1: integer 2 <br><br>0300 0000 // Element #2: integer3 |
| 27  | throw vx | Throws an exception object. The reference of the  exception object is in vx. | 2700 - throw v0 <br><br>Throws an exception. The exception object reference  is in v0. |
| 28  | goto target | Unconditional jump by short offset2. | 28F0 - goto 0005 // -0010 <br><br>Jumps to current position-16 words (hex 10). 0005 is  the label of the target instruction. |
| 29  | goto/16 target | Unconditional jump by 16 bit offset2. | 2900 0FFE - goto/16 002f // -01f1 <br><br>Jumps to the current position-1F1H words. 002F is the label of the target instruction. |
| 2A  | goto/32 target |
| 2B  | packed-switch vx,table | Implements a switch statement where the case  constants are close to each other. The instruction uses  an index table. vx indexes into this table to find the  offset of the instruction for a particular case. If vx falls  out of the index table, the execution continues on the  next instruction (default case). | 2B02 0C00 0000 - packed-switch v2, 000c // +000c Execute a packed switch according to the switch  argument in v2. The position of the index table is at  current instruction+0CH words. The table looks like  the following: <br><br>0001 // Table type: packed switch table <br><br>0300 // number of elements <br><br>0000 0000 // element base <br><br>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,table | Implements a switch statement with sparse case table.  The instruction uses a lookup table with case constants  and offsets for each case constant. If there is no match  in the table, execution continues on the next instruction  (default case). | 2C02 0c00 0000 - sparse-switch v2, 000c // +000c Execute a sparse switch according to the switch  argument in v2. The position of the lookup table is at  current instruction+0CH words. The table looks like  the following. <br><br>0002 // Table type: sparse switch table <br><br>0300 // number of elements <br><br>9cff ffff // first case: -100 <br><br>fa00 0000 // second case constant: 250 <br><br>e803 0000 // third case constant: 1000 <br><br>0500 0000 // offset for the first case constant: +5 0700 0000 // offset for the second case constant: +7 0900 0000 // offset for the third case constant: +9 |
| 2D  | cmpl-float | Compares the float values in vy and vz and sets the  integer value in vx accordingly3 | 2D00 0607 - cmpl-float v0, v6, v7 <br><br>Compares the float values in v6 and v7 then sets v0  accordingly. NaN bias is less-than, the instruction will  return -1 if any of the parameters is NaN. |
| 2E  | cmpg-float vx, vy, vz | Compares the float values in vy and vz and sets the  integer value in vx accordingly3. | 2E00 0607 - cmpg-float v0, v6, v7 <br><br>Compares the float values in v6 and v7 then sets v0  accordingly. NaN bias is greater-than, the instruction |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| will return 1 if any of the parameters is NaN. |
| 2F  | cmpl-double vx,vy,vz | Compares the double values in vy and vz2 and sets the  integer value in vx accordingly3. | 2F19 0608 - cmpl-double v25, v6, v8 <br><br>Compares the double values in v6,v7 and v8,v9 and  sets v25 accordingly. NaN bias is less-than, the  instruction will return -1 if any of the parameters is  NaN. |
| 30  | cmpg-double vx, vy, vz | Compares the double values in vy and vz2 and sets the  integer value in vx accordingly3. | 3000 080A - cmpg-double v0, v8, v10 <br><br>Compares the double values in v8,v9 and v10,v11 then sets v0 accordingly. NaN bias is greater-than, the  instruction will return 1 if any of the parameters is  NaN. |
| 31  | cmp-long vx, vy, vz | Compares the long values in vy and vz and sets the  integer value in vx accordingly3. | 3100 0204 - cmp-long v0, v2, v4 <br><br>Compares the long values in v2 and v4 then sets v0  accordingly. |
| 32  | if-eq vx,vy,target | Jumps to target if vx==vy2. vx and vy are integer values. | 32b3 6600 - if-eq v3, v11, 0080 // +0066 <br><br>Jumps to the current position+66H words if v3==v11.  0080 is the label of the target instruction. |
| 33  | if-ne vx,vy,target | Jumps to target if vx!=vy2. vx and vy are integer values. | 33A3 1000 - if-ne v3, v10, 002c // +0010 <br><br>Jumps to the current position+10H words if v3!=v10.  002c is the label of the target instruction. |
| 34  | if-lt vx,vy,target | Jumps to target is vx<vy2. vx and vy are integer values. | 3432 CBFF - if-lt v2, v3, 0023 // -0035 <br><br>Jumps to the current position-35H words if v2<v3.  0023 is the label of the target instruction. |
| 35  | if-ge vx, vy,target | Jumps to target if vx>=vy2. vx and vy are integer values. | 3510 1B00 - if-ge v0, v1, 002b // +001b <br><br>Jumps to the current position+1BH words if v0>=v1.  002b is the label of the target instruction. |
| 36  | if-gt vx,vy,target | Jumps to target if vx>vy2. vx and vy are integer values. | 3610 1B00 - if-ge v0, v1, 002b // +001b <br><br>Jumps to the current position+1BH words if v0>v1.  002b is the label of the target instruction. |
| 37  | if-le vx,vy,target | Jumps to target if vx<=vy2. vx and vy are integer values. | 3756 0B00 - if-le v6, v5, 0144 // +000b <br><br>Jumps to the current position+0BH words if v6<=v5.  0144 is the label of the target instruction. |
| 38  | if-eqz vx,target | Jumps to target if vx==02. vx is an integer value. | 3802 1900 - if-eqz v2, 0038 // +0019 <br><br>Jumps to the current position+19H words if v2==0.  0038 is the label of the target instruction. |
| 39  | if-nez vx,target | Checks vx and jumps if vx is nonzero2. | 3902 1200 - if-nez v2, 0014 // +0012 <br><br>Jumps to current position+18 words (hex 12) if v2 is  nonzero. 0014 is the label of the target instruction. |
| 3A  | if-ltz vx,target | Checks vx and jumps if vx<02. | 3A00 1600 - if-ltz v0, 002d // +0016 <br><br>Jumps to the current position+16H words if v0<0. 002d is the label of the target instruction. |
| 3B  | if-gez vx,target | Checks vx and jumps if vx>=02. | 3B00 1600 - if-gez v0, 002d // +0016 <br><br>Jumps to the current position+16H words if v0 >=0.  002d is the label of the target instruction. |
| 3C  | if-gtz vx,target | Checks vx and jumps if vx>02. | 3C00 1D00 - if-gtz v0, 004a // +001d <br><br>Jumps to the current position+1DH words if v0>0.  004A is the label of the target instruction. |
| 3D  | if-lez vx,target | Checks vx and jumps if vx<=02. | 3D00 1D00 - if-lez v0, 004a // +001d <br><br>Jumps to the current position+1DH words if v0<=0.  004A is the label of the target instruction. |
| 44  | aget vx,vy,vz | Gets an integer value of an object reference array into  vx. The array is referenced by vy and is indexed by vz. | 4407 0306 - aget v7, v3, v6 <br><br>Gets an integer array element. The array is referenced  by v3 and the element is indexed by v6. The element  will be put into v7. |
| 45  | aget-wide vx,vy,vz | Gets a long/double value of long/double array into  vx,vx+1. The array is referenced by vy and is indexed by vz. | 4505 0104 - aget-wide v5, v1, v4 <br><br>Gets a long/double array element. The array is  referenced by v1 and the element is indexed by v4.  The element will be put into v5,v6. |
| 46  | aget-object vx,vy,vz | Gets an object reference value of an object reference  array into vx. The array is referenced by vy and is  indexed by vz. | 4602 0200 - aget-object v2, v2, v0 <br><br>Gets an object reference array element. The array is  referenced by v2 and the element is indexed by v0.  The element will be put into v2. |
| 47  | aget-boolean vx,vy,vz | Gets a boolean value of a boolean array into vx. The  array is referenced by vy and is indexed by vz. | 4700 0001 - aget-boolean v0, v0, v1 <br><br>Gets a boolean array element. The array is referenced  by v0 and the element is indexed by v1. The element  will be put into v0. |
| 48  | aget-byte vx,vy,vz | Gets a byte value of a byte array into vx. The array is  referenced by vy and is indexed by vz. | 4800 0001 - aget-byte v0, v0, v1 <br><br>Gets a byte array element. The array is referenced by  v0 and the element is indexed by v1. The element will  be put into v0. |
| 49  | aget-char vx, vy,vz | Gets a char value of a character array into vx. The  element is indexed by vz, the array object is referenced  by vy | 4905 0003 - aget-char v5, v0, v3 <br><br>Gets a character array element. The array is  referenced by v0 and the element is indexed by v3.  The element will be put into v5. |
| 4A  | aget-short vx,vy,vz | Gets a short value of a short array into vx. The element  is indexed by vz, the array object is referenced by vy. | 4A00 0001 - aget-short v0, v0, v1 <br><br>Gets a short array element. The array is referenced by  v0 and the element is indexed by v1. The element will  be put into v0. |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| 4B  | aput vx,vy,vz | Puts the integer value in vx into an element of an integer array. The element is indexed by vz, the array object is  referenced by vy. | 4B00 0305 - aput v0, v3, v5 <br><br>Puts the integer value in v2 into an integer array  referenced by v0. The target array element is indexed  by v1. |
| 4C  | aput-wide vx,vy,vz | Puts the double/long value in vx,vx+1 into a double/long array. The array is referenced by vy, the element is  indexed by vz. | 4C05 0104 - aput-wide v5, v1, v4 <br><br>Puts the double/long value in v5,v6 into a double/long  array referenced by v1. The target array element is  indexed by v4. |
| 4D  | aput-object vx,vy,vz | Puts the object reference value in vx into an element of  an object reference array. The element is indexed by vz,  the array object is referenced by vy. | 4D02 0100 - aput-object v2, v1, v0 <br><br>Puts the object reference value in v2 into an object  reference array referenced by v0. The target array  element is indexed by v1. |
| 4E  | aput-boolean vx,vy,vz | Puts the boolean value in vx into an element of a  boolean array. The element is indexed by vz, the array  object is referenced by vy. | 4E01 0002 - aput-boolean v1, v0, v2 <br><br>Puts the boolean value in v1 into an object reference  array referenced by v0. The target array element is  indexed by v2. |
| 4F  | aput-byte vx,vy,vz | Puts the byte value in vx into an element of a byte array.  The element is indexed by vz, the array object is  referenced by vy. | 4F02 0001 - aput-byte v2, v0, v1 <br><br>Puts the boolean value in v2 into a byte array  referenced by v0. The target array element is indexed  by v1. |
| 50  | aput-char vx,vy,vz | Puts the char value in vx into an element of a character  array. The element is indexed by vz, the array object is  referenced by vy. | 5003 0001 - aput-char v3, v0, v1 <br><br>Puts the character value in v3 into a character array  referenced by v0. The target array element is indexed  by v1. |
| 51  | aput-short vx,vy,vz | Puts the short value in vx into an element of a short  array. The element is indexed by vz, the array object is  referenced by vy. | 5102 0001 - aput-short v2, v0, v1 <br><br>Puts the short value in v2 into a character array  referenced by v0. The target array element is indexed  by v1. |
| 52  | iget vx, vy, field_id | Reads an instance field into vx. The instance is  referenced by vy. | 5210 0300 - iget v0, v1, Test2.i6:I // field@0003 Reads field@0003 into v0 (entry #3 in the field id  table). The instance is referenced by v1. |
| 53  | iget-wide vx,vy,field_id | Reads an instance field into vx1. The instance is  referenced by vy. | 5320 0400 - iget-wide v0, v2, Test2.l0:J // field@0004 Reads field@0004 into v0 and v1 registers (entry #4 in  the field id table). The instance is referenced by v2. |
| 54  | iget-object vx,vy,field_id | Reads an object reference instance field into vx. The  instance is referenced by vy. | iget-object v1, v2, <br><br>LineReader.fis:Ljava/io/FileInputStream; // field@0002 Reads field@0002 into v1 (entry #2 in the field id  table). The instance is referenced by v2. |
| 55  | iget-boolean vx,vy,field_id | Reads a boolean instance field into vx. The instance is  referenced by vy. | 55FC 0000 - iget-boolean v12, v15, Test2.b0:Z //  field@0000 <br><br>Reads the boolean field@0000 into v12 register (entry  #0 in the field id table). The instance is referenced by  v15. |
| 56  | iget-byte vx,vy,field_id | Reads a byte instance field into vx. The instance is  referenced by vy. | 5632 0100 - iget-byte v2, v3, Test3.bi1:B // field@0001 Reads the char field@0001 into v2 register (entry #1 in  the field id table). The instance is referenced by v3. |
| 57  | iget-char vx,vy,field_id | Reads a char instance field into vx. The instance is  referenced by vy. | 5720 0300 - iget-char v0, v2, Test3.ci1:C // field@0003 Reads the char field@0003 into v0 register (entry #3 in  the field id table). The instance is referenced by v2. |
| 58  | iget-short vx,vy,field_id | Reads a short instance field into vx. The instance is  referenced by vy. | 5830 0800 - iget-short v0, v3, Test3.si1:S // field@0008 Reads the short field@0008 into v0 register (entry #8  in the field id table). The instance is referenced by v3. |
| 59  | iput vx,vy, field_id | Puts vx into an instance field. The instance is  referenced by vy. | 5920 0200 - iput v0,v2, Test2.i6:I // field@0002 Stores v0 into field@0002 (entry #2 in the field id  table). The instance is referenced by v2. |
| 5A  | iput-wide vx,vy, field_id | Puts the wide value located in vx and vx+1 registers into an instance field. The instance is referenced by vy. | 5A20 0000 - iput-wide v0,v2, Test2.d0:D // field@0000 Stores the wide value in v0, v1 registers into  field@0000 (entry #0 in the field id table). The instance  is referenced by v2. |
| 5B  | iput-object vx,vy,field_id | Puts the object reference in vx into an instance field.  The instance is referenced by vy. | 5B20 0000 - iput-object v0, v2, <br><br>LineReader.bis:Ljava/io/BufferedInputStream; //  field@0000 <br><br>Stores the object reference in v0 into field@0000  (entry #0 in the field table). The instance is referenced  by v2. |
| 5C  | iput-boolean vx,vy, field_id Puts the boolean value located in vx into an instance  field. The instance is referenced by vy. | 5C30 0000 - iput-boolean v0, v3, Test2.b0:Z //  field@0000 <br><br>Puts the boolean value in v0 into field@0000 (entry #0  in the field id table). The instance is referenced by v3. |
| 5D  | iput-byte vx,vy,field_id | Puts the byte value located in vx into an instance field.  The instance is referenced by vy. | 5D20 0100 - iput-byte v0, v2, Test3.bi1:B // field@0001 Puts the boolean value in v0 into field@0001 (entry #1  in the field id table). The instance is referenced by v2. |
| 5E  | iput-char vx,vy,field_id | Puts the char value located in vx into an instance field.  The instance is referenced by vy. | 5E20 0300 - iput-char v0, v2, Test3.ci1:C // field@0003 Puts the char value in v0 into field@0003 (entry #3 in  the field id table). The instance is referenced by v2. |
| 5F  | iput-short vx,vy,field_id | Puts the short value located in vx into an instance field.  The instance is referenced by vy. | 5F21 0800 - iput-short v1, v2, Test3.si1:S // field@0008 Puts the short value in v1 into field@0008 (entry #8 in  the field id table). The instance is referenced by v2. |
| 60  | sget vx,field_id | Reads the integer field identified by the field_id into vx. | 6000 0700 - sget v0, Test3.is1:I // field@0007 |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| Reads field@0007 (entry #7 in the field id table) into  v0. |
| 61  | sget-wide vx, field_id | Reads the static field identified by the field_id into vx  and vx+1 registers. | 6100 0500 - sget-wide v0, Test2.l1:J // field@0005 Reads field@0005 (entry #5 in the field id table) into v0 and v1 registers. |
| 62  | sget-object vx,field_id | Reads the object reference field identified by the field_id into vx. | 6201 0C00 - sget-object v1, <br><br>Test3.os1:Ljava/lang/Object; // field@000c <br><br>Reads field@000c (entry #CH in the field id table) into  v1. |
| 63  | sget-boolean vx,field_id | Reads the boolean static field identified by the field_id  into vx. | 6300 0C00 - sget-boolean v0, Test2.sb:Z // field@000c Reads boolean field@000c (entry #12 in the field id  table) into v0. |
| 64  | sget-byte vx,field_id | Reads the byte static field identified by the field_id into  vx. | 6400 0200 - sget-byte v0, Test3.bs1:B // field@0002 Reads byte field@0002 (entry #2 in the field id table)  into v0. |
| 65  | sget-char vx,field_id | Reads the char static field identified by the field_id into  vx. | 6500 0700 - sget-char v0, Test3.cs1:C // field@0007 Reads byte field@0007 (entry #7 in the field id table)  into v0. |
| 66  | sget-short vx,field_id | Reads the short static field identified by the field_id into  vx. | 6600 0B00 - sget-short v0, Test3.ss1:S // field@000b Reads short field@000b (entry #BH in the field id  table) into v0. |
| 67  | sput vx, field_id | Puts vx into a static field. | 6700 0100 - sput v0, Test2.i5:I // field@0001 Stores v0 into field@0001 (entry #1 in the field id  table). |
| 68  | sput-wide vx, field_id | Puts vx and vx+1 into a static field. | 6800 0500 - sput-wide v0, Test2.l1:J // field@0005 Puts the long value in v0 and v1 into the field@0005  static field (entry #5 in the field id table). |
| 69  | sput-object vx,field_id | Puts object reference in vx into a static field. | 6900 0c00 - sput-object v0, <br><br>Test3.os1:Ljava/lang/Object; // field@000c <br><br>Puts the object reference value in v0 into the  field@000c static field (entry #CH in the field id table). |
| 6A  | sput-boolean vx,field_id | Puts boolean value in vx into a static field. | 6A00 0300 - sput-boolean v0, Test3.bls1:Z //  field@0003 <br><br>Puts the byte value in v0 into the field@0003 static  field (entry #3 in the field id table). |
| 6B  | sput-byte vx,field_id | Puts byte value in vx into a static field. | 6B00 0200 - sput-byte v0, Test3.bs1:B // field@0002 Puts the byte value in v0 into the field@0002 static  field (entry #2 in the field id table). |
| 6C  | sput-char vx,field_id | Puts char value in vx into a static field. | 6C01 0700 - sput-char v1, Test3.cs1:C // field@0007 Puts the char value in v1 into the field@0007 static  field (entry #7 in the field id table). |
| 6D  | sput-short vx,field_id | Puts short value in vx into a static field. | 6D00 0B00 - sput-short v0, Test3.ss1:S // field@000b Puts the short value in v0 into the field@000b static  field (entry #BH in the field id table). |
| 6E  | invoke-virtual { parameters }, methodtocall | Invokes a virtual method with parameters. | 6E53 0600 0421 - invoke-virtual { v4, v0, v1, v2, v3},  Test2.method5:(IIII)V // method@0006 <br><br>Invokes the 6th method in the method table with the  following arguments: v4 is the "this" instance, v0, v1,  v2, and v3 are the method parameters. The method  has 5 arguments (4 MSB bits of the second byte)5. |
| 6F  | invoke-super <br><br>{parameter},methodtocall | Invokes the virtual method of the immediate parent  class. | 6F10 A601 0100 invoke-super <br><br>{v1},java.io.FilterOutputStream.close:()V //  method@01a6 <br><br>Invokes method@01a6 with one parameter, v1. |
| 70  | invoke-direct <br><br>{ parameters }, <br><br>methodtocall | Invokes a method with parameters without the virtual  method resolution. | 7010 0800 0100 - invoke-direct {v1}, <br><br>java.lang.Object.&lt;init&gt;:()V // method@0008 Invokes the 8th method in the method table with just  one parameter, v1 is the "this" instance5. |
| 71  | invoke-static {parameters}, methodtocall | Invokes a static method with parameters. | 7110 3400 0400 - invoke-static {v4}, <br><br>java.lang.Integer.parseInt:( Ljava/lang/String;)I //  method@0034 <br><br>Invokes method@34 static method. The method is  called with one parameter, v45. |
| 72  | invoke-interface <br><br>{parameters},methodtocall | Invokes an interface method. | 7240 2102 3154 invoke-interface {v1, v3, v4, v5},  mwfw.IReceivingProtocolAdapter.receivePackage:( ILjava/lang/String;Ljava/io/InputStream;)Z //  method@0221 <br><br>Invokes method@221 interface method using  parameters in v1,v3,v4 and v55. |
| 73  | unused_73 |
| 74  | invoke-virtual/range <br><br>{vx..vy},methodtocall | Invokes virtual method with a range of registers. The  instruction specifies the first register and the number of  registers to be passed to the method. | 7403 0600 1300 - invoke-virtual {v19..v21},  Test2.method5:(IIII)V // method@0006 <br><br>Invokes the 6th method in the method table with the  following arguments: v19 is the "this" instance, v20  and v21 are the method parameters. |
| 75  | invoke-super/range | Invokes the virtual method of the immediate parent  class. The instruction specifies the first register and the  number of registers to be passed to the method. | 7501 A601 0100 invoke-super <br><br>{v1},java.io.FilterOutputStream.close:()V //  method@01a6 <br><br>Invokes method@01a6 with one parameter, v1. |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| 76  | invoke-direct/range <br><br>{vx..vy},methodtocall | Invokes direct method with a range of registers. The  instruction specifies the first register and the number of  registers to be passed to the method. | 7603 3A00 1300 - invoke-direct/range <br><br>{v19..21},java.lang.Object.&lt;init&gt;:()V // method@003a Invokes method@3A with 1 parameters (second byte  of the instruction=03). The parameter is stored in v19  (5th,6th bytes of the instruction). |
| 77  | invoke-static/range <br><br>{vx..vy},methodtocall | Invokes static method with a range of registers. The  instruction specifies the first register and the number of  registers to be passed to the method. | 7703 3A00 1300 - invoke-static/range <br><br>{v19..21},java.lang.Integer.parseInt: <br><br>( Ljava/lang/String;)I // method@0034 <br><br>Invokes method@3A with 1 parameters (second byte  of the instruction=03). The parameter is stored in v19  (5th,6th bytes of the instruction). |
| 78  | invoke-interface-range | Invokes an interface method with a range of registers.  The instruction specifies the first register and the  number of registers to be passed to the method. | 7840 2102 0100 invoke-interface {v1..v4}, <br><br>mwfw.IReceivingProtocolAdapter.receivePackage:( ILjava/lang/String;Ljava/io/InputStream;)Z //  method@0221 <br><br>Invokes method@221 interface method using  parameters in v1..v4. |
| 79  | unused_79 |
| 7A  | unused_7A |
| 7B  | neg-int vx,vy | Calculates vx=-vy. | 7B01 - neg-int v1,v0 <br><br>Calculates -v0 and stores the result in v1. |
| 7C  | not-int vx,vy |
| 7D  | neg-long vx,vy | Calculates vx,vx+1=-(vy,vy+1) | 7D02 - neg-long v2,v0 <br><br>Calculates -(v0,v1) and stores the result into (v2,v3) |
| 7E  | not-long vx,vy |
| 7F  | neg-float vx,vy | Calculates vx=-vy | 7F01 - neg-float v1,v0 <br><br>Calculates -v0 and stores the result into v1. |
| 80  | neg-double vx,vy | Calculates vx,vx+1=-(vy,vy+1) | 8002 - neg-double v2,v0 <br><br>Calculates -(v0,v1) and stores the result into (v2,v3) |
| 81  | int-to-long vx, vy | Converts the integer in vy into a long in vx,vx+1. | 8106 - int-to-long v6, v0 <br><br>Converts an integer in v0 into a long in v6,v7. |
| 82  | int-to-float vx, vy | Converts the integer in vx into a float in vx. | 8206 - int-to-float v6, v0 <br><br>Converts the integer in v0 into a float in v6. |
| 83  | int-to-double vx, vy | Converts the integer in vy into the double in vx,vx+1. | 8306 - int-to-double v6, v0 <br><br>Converts the integer in v0 into a double in v6,v7 |
| 84  | long-to-int vx,vy | Converts the long value in vy,vy+1 into an integer in vx. | 8424 - long-to-int v4, v2 <br><br>Converts the long value in v2,v3 into an integer value  in v4. |
| 85  | long-to-float vx, vy | Converts the long value in vy,vy+1 into a float in vx. | 8510 - long-to-float v0, v1 <br><br>Convcerts the long value in v1,v2 into a float value in  v0. |
| 86  | long-to-double vx, vy | Converts the long value in vy,vy+1 into a double value in vx,vx+1. | 8610 - long-to-double v0, v1 <br><br>Converts the long value in v1,v2 into a double value in v0,v1. |
| 87  | float-to-int vx, vy | Converts the float value in vy into an integer value in vx. 8730 - float-to-int v0, v3 | Converts the float value in v3 into an integer value in  v0. |
| 88  | float-to-long vx,vy | Converts the float value in vy into a long value in vx. | 8830 - float-to-long v0, v3 <br><br>Converts the float value in v3 into a long value in  v0,v1. |
| 89  | float-to-double vx, vy | Converts the float value in vy into a double value in  vx,vx+1. | 8930 - float-to-double v0, v3 <br><br>Converts the float value in v3 into a double value in  v0,v1. |
| 8A  | double-to-int vx, vy | Converts the double value in vy,vy+1 into an integer  value in vx. | 8A40 - double-to-int v0, v4 <br><br>Converts the double value in v4,v5 into an integer  value in v0. |
| 8B  | double-to-long vx, vy | Converts the double value in vy,vy+1 into a long value in vx,vx+1. | 8B40 - double-to-long v0, v4 <br><br>Converts the double value in v4,v5 into a long value in v0,v1. |
| 8C  | double-to-float vx, vy | Converts the double value in vy,vy+1 into a float value in vx. | 8C40 - double-to-float v0, v4 <br><br>Converts the double value in v4,v5 into a float value in v0,v1. |
| 8D  | int-to-byte vx,vy | Converts the int value in vy to a byte value and stores it  in vx. | 8D00 - int-to-byte v0, v0 <br><br>Converts the integer in v0 into a byte and puts the  byte value into v0. |
| 8E  | int-to-char vx,vy | Converts the int value in vy to a char value and stores it  in vx. | 8E33 - int-to-char v3, v3 <br><br>Converts the integer in v3 into a char and puts the  char value into v3. |
| 8F  | int-to-short vx,vy | Converts the int value in vy to a short value and stores it in vx. | 8F00 - int-to-short v0, v0 <br><br>Converts the integer in v0 into a short and puts the  short value into v3. |
| 90  | add-int vx,vy,vz | Calculates vy+vz and puts the result into vx. | 9000 0203 - add-int v0, v2, v3 <br><br>Adds v3 to v2 and puts the result into v04. |
| 91  | sub-int vx,vy,vz | Calculates vy-vz and puts the result into vx. | 9100 0203 - sub-int v0, v2, v3 <br><br>Subtracts v3 from v2 and puts the result into v0. |
| 92  | mul-int vx, vy, vz | Multiplies vz with wy and puts the result int vx. | 9200 0203 - mul-int v0,v2,v3 |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| Multiplies v2 with w3 and puts the result into v0 |
| 93  | div-int vx,vy,vz | Divides vy with vz and puts the result into vx. | 9303 0001 - div-int v3, v0, v1 <br><br>Divides v0 with v1 and puts the result into v3. |
| 94  | rem-int vx,vy,vz | Calculates vy % vz and puts the result into vx. | 9400 0203 - rem-int v0, v2, v3 <br><br>Calculates v3 % v2 and puts the result into v0. |
| 95  | and-int vx, vy, vz | Calculates vy AND vz and puts the result into vx. | 9503 0001 - and-int v3, v0, v1 <br><br>Calculates v0 AND v1 and puts the result into v3. |
| 96  | or-int vx, vy, vz | Calculates vy OR vz and puts the result into vx. | 9603 0001 - or-int v3, v0, v1 <br><br>Calculates v0 OR v1 and puts the result into v3. |
| 97  | xor-int vx, vy, vz | Calculates vy XOR vz and puts the result into vx. | 9703 0001 - xor-int v3, v0, v1 <br><br>Calculates v0 XOR v1 and puts the result into v3. |
| 98  | shl-int vx, vy, vz | Shift vy left by the positions specified by vz and store  the result into vx. | 9802 0001 - shl-int v2, v0, v1 <br><br>Shift v0 left by the positions specified by v1 and store  the result in v2. |
| 99  | shr-int vx, vy, vz | Shift vy right by the positions specified by vz and store  the result into vx. | 9902 0001 - shr-int v2, v0, v1 <br><br>Shift v0 right by the positions specified by v1 and  store the result in v2. |
| 9A  | ushr-int vx, vy, vz | Unsigned shift right (>>>) vy by the positions specified  by vz and store the result into vx. | 9A02 0001 - ushr-int v2, v0, v1 <br><br>Unsigned shift v0 right by the positions specified by  v1 and store the result in v2. |
| 9B  | add-long vx, vy, vz | Adds vy to vz and puts the result into vx1. | 9B00 0305 - add-long v0, v3, v5 <br><br>The long value in v3,v4 is added to the value in v5,v6  and the result is stored in v0,v1. |
| 9C  | sub-long vx,vy,vz | Calculates vy-vz and puts the result into vx1. | 9C00 0305 - sub-long v0, v3, v5 <br><br>Subtracts the long value in v5,v6 from the long value  in v3,v4 and puts the result into v0,v1. |
| 9D  | mul-long vx,vy,vz | Calculates vy*vz and puts the result into vx1. | 9D00 0305 - mul-long v0, v3, v5 <br><br>Multiplies the long value in v5,v6 with the long value in v3,v4 and puts the result into v0,v1. |
| 9E  | div-long vx, vy, vz | Calculates vy/vz and puts the result into vx1. | 9E06 0002 - div-long v6, v0, v2 <br><br>Divides the long value in v0,v1 with the long value in  v2,v3 and pust the result into v6,v7. |
| 9F  | rem-long vx,vy,vz | Calculates vy % vz and puts the result into vx1. | 9F06 0002 - rem-long v6, v0, v2 <br><br>Calculates v0,v1 % v2,v3 and puts the result into  v6,v7. |
| A0  | and-long vx, vy, vz | Calculates the vy AND vz and puts the result into vx1. | A006 0002 - and-long v6, v0, v2 <br><br>Calculates v0,v1 AND v2,v3 and puts the result into  v6,v7. |
| A1  | or-long vx, vy, vz | Calculates the vy OR vz and puts the result into vx1. | A106 0002 - or-long v6, v0, v2 <br><br>Calculates v0,v1 OR v2,v3 and puts the result into  v6,v7. |
| A2  | xor-long vx, vy, vz | Calculates the vy XOR vz and puts the result into vx1. | A206 0002 - xor-long v6, v0, v2 <br><br>Calculates v0,v1 XOR v2,v3 and puts the result into  v6,v7. |
| A3  | shl-long vx, vy, vz | Shifts left vy by vz positions and stores the result in vx1. | A302 0004 - shl-long v2, v0, v4 <br><br>Shift v0,v1 by postions specified by v4 and puts the  result into v2,v3. |
| A4  | shr-long vx,vy,vz | Shifts right vy by vz positions and stores the result in  vx1. | A402 0004 - shr-long v2, v0, v4 <br><br>Shift v0,v1 by postions specified by v4 and puts the  result into v2,v3. |
| A5  | ushr-long vx, vy, vz | Unsigned shifts right vy by vz positions and stores the  result in vx1. | A502 0004 - ushr-long v2, v0, v4 <br><br>Unsigned shift v0,v1 by postions specified by v4 and  puts the result into v2,v3. |
| A6  | add-float vx,vy,vz | Adds vy to vz and puts the result into vx. | A600 0203 - add-float v0, v2, v3 <br><br>Adds the floating point numbers in v2 and v3 and puts the result into v0. |
| A7  | sub-float vx,vy,vz | Calculates vy-vz and puts the result into vx. | A700 0203 - sub-float v0, v2, v3 <br><br>Calculates v2-v3 and puts the result into v0. |
| A8  | mul-float vx, vy, vz | Multiplies vy with vz and puts the result into vx. | A803 0001 - mul-float v3, v0, v1 <br><br>Multiplies v0 with v1 and puts the result into v3. |
| A9  | div-float vx, vy, vz | Calculates vy/vz and puts the result into vx. | A903 0001 - div-float v3, v0, v1 <br><br>Divides v0 with v1 and puts the result into v3. |
| AA  | rem-float vx,vy,vz | Calculates vy % vz and puts the result into vx. | AA03 0001 - rem-float v3, v0, v1 <br><br>Calculates v0 % v1 and puts the result into v3. |
| AB  | add-double vx,vy,vz | Adds vy to vz and puts the result into vx1. | AB00 0305 - add-double v0, v3, v5 <br><br>Adds the double value in v5,v6 registers to the double  value in v3,v4 registers and places the result in v0,v1  registers. |
| AC  | sub-double vx,vy,vz | Calculates vy-vz and puts the result into vx1. | AC00 0305 - sub-double v0, v3, v5 <br><br>Subtracts the value in v5,v6 from the value in v3,v4  and puts the result into v0,v1. |
| AD  | mul-double vx, vy, vz | Multiplies vy with vz and puts the result into vx1. | AD06 0002 - mul-double v6, v0, v2 <br><br>Multiplies the double value in v0,v1 with the double  value in v2,v3 and puts the result into v6,v7. |
| AE  | div-double vx, vy, vz | Calculates vy/vz and puts the result into vx1. | AE06 0002 - div-double v6, v0, v2 <br><br>Divides the double value in v0,v1 with the double |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| value in v2,v3 and puts the result into v6,v7. |
| AF  | rem-double vx,vy,vz | Calculates vy % vz and puts the result into vx1. | AF06 0002 - rem-double v6, v0, v2 <br><br>Calculates v0,v1 % v2,v3 and puts the result into  v6,v7. |
| B0  | add-int/2addr vx,vy | Adds vy to vx. | B010 - add-int/2addr v0,v1 <br><br>Adds v1 to v0. |
| B1  | sub-int/2addr vx,vy | Calculates vx-vy and puts the result into vx. | B140 - sub-int/2addr v0, v4 <br><br>Subtracts v4 from v0 and puts the result into v0. |
| B2  | mul-int/2addr vx,vy | Multiplies vx with vy. | B210 - mul-int/2addr v0, v1 <br><br>Multiples v0 with v1 and puts the result into v0. |
| B3  | div-int/2addr vx,vy | Divides vx with vy and puts the result into vx. | B310 - div-int/2addr v0, v1 <br><br>Divides v0 with v1 and puts the result into v0. |
| B4  | rem-int/2addr vx,vy | Calculates vx % vy and puts the result into vx | B410 - rem-int/2addr v0, v1 <br><br>Calculates v0 % v1 and puts the result into v0. |
| B5  | and-int/2addr vx, vy | Calculates vx AND vy and puts the result into vx. | B510 - and-int/2addr v0, v1 <br><br>Calculates v0 AND v1 and puts the result into v0. |
| B6  | or-int/2addr vx, vy | Calculates vx OR vy and puts the result into vx. | B610 - or-int/2addr v0, v1 <br><br>Calculates v0 OR v1 and puts the result into v0. |
| B7  | xor-int/2addr vx, vy | Calculates vx XOR vy and puts the result into vx. | B710 - xor-int/2addr v0, v1 <br><br>Calculates v0 XOR v1 and puts the result into v0. |
| B8  | shl-int/2addr vx, vy | Shifts vx left by vy positions. | B810 - shl-int/2addr v0, v1 <br><br>Shift v0 left by v1 positions. |
| B9  | shr-int/2addr vx, vy | Shifts vx right by vy positions. | B910 - shr-int/2addr v0, v1 <br><br>Shift v0 right by v1 positions. |
| BA  | ushr-int/2addr vx, vy | Unsigned shift right (>>>) vx by the positions specified  by vy. | BA10 - ushr-int/2addr v0, v1 <br><br>Unsigned shift v0 by the positions specified by v1. |
| BB  | add-long/2addr vx,vy | Adds vy to vx1. | BB20 - add-long/2addr v0, v2 <br><br>Adds the long value in v2,v3 registers to the long  value in v0,v1 registers. |
| BC  | sub-long/2addr vx,vy | Calculates vx-vy and puts the result into vx1. | BC70 - sub-long/2addr v0, v7 <br><br>Subtracts the long value in v7,v8 from the long value  in v0,v1 and puts the result into v0,v1. |
| BD  | mul-long/2addr vx,vy | Calculates vx*vy and puts the result into vx1. | BD70 - mul-long/2addr v0, v7 <br><br>Multiplies the long value in v7,v8 with the long value in v0,v1 and puts the result into v0,v1. |
| BE  | div-long/2addr vx, vy | Calculates vx/vy and puts the result into vx1. | BE20 - div-long/2addr v0, v2 <br><br>Divides the long value in v0,v1 with the long value in  v2,v3 and puts the result into v0,v1 |
| BF  | rem-long/2addr vx,vy | Calculates vx % vy and puts the result into vx1. | BF20 - rem-long/2addr v0, v2 <br><br>Calculates v0,v1 % v2,v3 and puts the result into v0,v1 |
| C0  | and-long/2addr vx, vy | Calculates vx AND vy and puts the result into vx1. | C020 - and-long/2addr v0, v2 <br><br>Calculates v0,v1 OR v2,v3 and puts the result into  v0,v1. |
| C1  | or-long/2addr vx, vy | Calculates vx OR vy and puts the result into vx1. | C120 - or-long/2addr v0, v2 <br><br>Calculates v0,v1 OR v2,v3 and puts the result into  v0,v1. |
| C2  | xor-long/2addr vx, vy | Calculates vx XOR vy and puts the result into vx1. | C220 - xor-long/2addr v0, v2 <br><br>Calculates v0,v1 XOR v2,v3 and puts the result into  v0,v1. |
| C3  | shl-long/2addr vx, vy | Shifts left the value in vx,vx+1 by the positions specified by vy and stores the result in vx,vx+1. | C320 - shl-long/2addr v0, v2 <br><br>Shifts left v0,v1 by the positions specified by v2. |
| C4  | shr-long/2addr vx, vy | Shifts right the value in vx,vx+1 by the positions  specified by vy and stores the result in vx,vx+1. | C420 - shr-long/2addr v0, v2 <br><br>Shifts right v0,v1 by the positions specified by v2. |
| C5  | ushr-long/2addr vx, vy | Unsigned shifts right the value in vx,vx+1 by the  positions specified by vy and stores the result in  vx,vx+1. | C520 - ushr-long/2addr v0, v2 <br><br>Unsigned shifts right v0,v1 by the positions specified  by v2. |
| C6  | add-float/2addr vx,vy | Adds vy to vx. | C640 - add-float/2addr v0,v4 <br><br>Adds v4 to v0. |
| C7  | sub-float/2addr vx,vy | Calculates vx-vy and stores the result in vx. | C740 - sub-float/2addr v0,v4 <br><br>Adds v4 to v0. |
| C8  | mul-float/2addr vx, vy | Multiplies vx with vy. | C810 - mul-float/2addr v0, v1 <br><br>Multiplies v0 with v1. |
| C9  | div-float/2addr vx, vy | Calculates vx/vy and puts the result into vx. | C910 - div-float/2addr v0, v1 <br><br>Divides v0 with v1 and puts the result into v0. |
| CA  | rem-float/2addr vx,vy | Calculates vx/vy and puts the result into vx. | CA10 - rem-float/2addr v0, v1 <br><br>Calculates v0 % v1 and puts the result into v0. |
| CB  | add-double/2addr vx, vy | Adds vy to vx1. | CB70 - add-double/2addr v0, v7 <br><br>Adds v7 to v0. |
| CC  | sub-double/2addr vx, vy | Calculates vx-vy and puts the result into vx1. | CC70 - sub-double/2addr v0, v7 <br><br>Subtracts the value in v7,v8 from the value in v0,v1  and puts the result into v0,v1. |
| CD  | mul-double/2addr vx, vy | Multiplies vx with vy1. | CD20 - mul-double/2addr v0, v2 <br><br>Multiplies the double value in v0,v1 with the double  value in v2,v3 and puts the result into v0,v1. |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| CE  | div-double/2addr vx, vy | Calculates vx/vy and puts the result into vx1. | CE20 - div-double/2addr v0, v2 <br><br>Divides the double value in v0,v1 with the double  value in v2,v3 and puts the value into v0,v1. |
| CF  | rem-double/2addr vx,vy | Calculates vx % vy and puts the result into vx1. | CF20 - rem-double/2addr v0, v2 <br><br>Calculates v0,v1 % v2,v3 and puts the value into  v0,v1. |
| D0  | add-int/lit16 vx,vy,lit16 | Adds vy to lit16 and stores the result into vx. | D001 D204 - add-int/lit16 v1, v0, #int 1234 // #04d2 Adds v0 to literal 1234 and stores the result into v1. |
| D1  | sub-int/lit16 vx,vy,lit16 | Calculates vy - lit16 and stores the result into vx. | D101 D204 - sub-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 - literal 1234 and stores the result into  v1. |
| D2  | mul-int/lit16 vx,vy,lit16 | Calculates vy * lit16 and stores the result into vx. | D201 D204 - mul-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 * literal 1234 and stores the result into  v1. |
| D3  | div-int/lit16 vx,vy,lit16 | Calculates vy / lit16 and stores the result into vx. | D301 D204 - div-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 / literal 1234 and stores the result into  v1. |
| D4  | rem-int/lit16 vx,vy,lit16 | Calculates vy % lit16 and stores the result into vx. | D401 D204 - rem-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 % literal 1234 and stores the result into  v1. |
| D5  | and-int/lit16 vx,vy,lit16 | Calculates vy AND lit16 and stores the result into vx. | D501 D204 - and-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 AND literal 1234 and stores the result  into v1. |
| D6  | or-int/lit16 vx,vy,lit16 | Calculates vy OR lit16 and stores the result into vx. | D601 D204 - or-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 OR literal 1234 and stores the result into v1. |
| D7  | xor-int/lit16 vx,vy,lit16 | Calculates vy XOR lit16 and stores the result into vx. | D701 D204 - xor-int/lit16 v1, v0, #int 1234 // #04d2 Calculates v0 XOR literal 1234 and stores the result  into v1. |
| D8  | add-int/lit8 vx,vy,lit8 | Adds vy to lit8 and stores the result into vx. | D800 0201 - add-int/lit8 v0,v2, #int1 <br><br>Adds literal 1 to v2 and stores the result into v0. |
| D9  | sub-int/lit8 vx,vy,lit8 | Calculates vy-lit8 and stores the result into vx. | D900 0201 - sub-int/lit8 v0,v2, #int1 <br><br>Calculates v2-1 and stores the result into v0. |
| DA  | mul-int/lit8 vx,vy,lit8 | Multiplies vy with lit8 8-bit literal constant and puts the  result into vx. | DA00 0002 - mul-int/lit8 v0,v0, #int2 <br><br>Multiplies v0 with literal 2 and puts the result into v0. |
| DB  | div-int/lit8 vx,vy,lit8 | Calculates vy/lit8 and stores the result into vx. | DB00 0203 - mul-int/lit8 v0,v2, #int3 <br><br>Calculates v2/3 and stores the result into v0. |
| DC  | rem-int/lit8 vx,vy,lit8 | Calculates vy % lit8 and stores the result into vx. | DC00 0203 - rem-int/lit8 v0,v2, #int3 <br><br>Calculates v2 % 3 and stores the result into v0. |
| DD  | and-int/lit8 vx,vy,lit8 | Calculates vy AND lit8 and stores the result into vx. | DD00 0203 - and-int/lit8 v0,v2, #int3 <br><br>Calculates v2 AND 3 and stores the result into v0. |
| DE  | or-int/lit8 vx, vy, lit8 | Calculates vy OR lit8 and puts the result into vx. | DE00 0203 - or-int/lit8 v0, v2, #int 3 <br><br>Calculates v2 OR literal 3 and puts the result into v0. |
| DF  | xor-int/lit8 vx, vy, lit8 | Calculates vy XOR lit8 and puts the result into vx. | DF00 0203 \| 0008: xor-int/lit8 v0, v2, #int 3 Calculates v2 XOR literal 3 and puts the result into v0. |
| E0  | shl-int/lit8 vx, vy, lit8 | Shift v0 left by the bit positions specified by the literal  constant and put the result into vx. | E001 0001 - shl-int/lit8 v1, v0, #int 1 <br><br>Shift v0 left by 1 position and put the result into v1. |
| E1  | shr-int/lit8 vx, vy, lit8 | Shift v0 right by the bit positions specified by the literal  constant and put the result into vx. | E101 0001 - shr-int/lit8 v1, v0, #int 1 <br><br>Shift v0 right by 1 position and put the result into v1. |
| E2  | ushr-int/lit8 vx, vy, lit8 | Unsigned right shift of v0 (>>>) by the bit positions  specified by the literal constant and put the result into  vx. | E201 0001 - ushr-int/lit8 v1, v0, #int 1 <br><br>Unsigned shift v0 right by 1 position and put the result into 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 <br><br>{parameters},inline ID | Executes the inline method identified by inline ID6. | EE20 0300 0100 - execute-inline {v1, v0}, inline #0003 Executes inline method #3 using v1 as "this" and  passing one parameter in v0. |
| EF  | unused_EF |
| F0  | invoke-direct-empty | Stands as a placeholder for pruned empty methods like  Object.&lt;init&gt;. This acts as nop during normal  execution6. | F010 F608 0000 - invoke-direct-empty {v0},  Ljava/lang/Object;.&lt;init&gt;:()V // method@08f6 Replacement for the empty method <br><br>java/lang/Object;&lt;init&gt;. |
| F1  | unused_F1 |

  
  

|     |     |     |     |
| --- | --- | --- | --- |
| F2  | iget-quick vx,vy,offset | Gets the value stored at offset in vy instance's data area to vx6. | F221 1000 - iget-quick v1, v2, \[obj+0010\] <br><br>Gets the value at offset 0CH of the instance pointed by v2 and stores the object reference in v1. |
| F3  | iget-wide-quick <br><br>vx,vy,offset | Gets the object reference value stored at offset in vy  instance's data area to vx,vx+16. | F364 3001 - iget-wide-quick v4, v6, \[obj+0130\] Gets the value at offset 130H of the instance pointed  by v6 and stores the object reference in v4,v5. |
| F4  | iget-object-quick <br><br>vx,vy,offset | Gets the object reference value stored at offset in vy  instance's data area to vx6. | F431 0C00 - iget-object-quick v1, v3, \[obj+000c\] Gets the object reference value at offset 0CH of the  instance pointed by v3 and stores the object reference in v1. |
| F5  | iput-quick vx,vy,offset | Puts the value stored in vx to offset in vy instance's data area6. | F521 1000 - iput-quick v1, v2, \[obj+0010\] <br><br>Puts the object reference value in v1 to offset 10H of  the instance pointed by v2. |
| F6  | iput-wide-quick <br><br>vx,vy,offset | Puts the value stored in vx,vx+1 to offset in vy  instance's data area6. | F652 7001 - iput-wide-quick v2, v5, \[obj+0170\] Puts the value in v2,v3 to offset 170H of the instance  pointed by v5. |
| F7  | iput-object-quick <br><br>vx,vy,offset | Puts the object reference value stored in vx to offset in  vy instance's data area to vx6. | F701 4C00 - iput-object-quick v1, v0, \[obj+004c\] Puts the object reference value in v1 to offset 0CH of  the instance pointed by v3. |
| F8  | invoke-virtual-quick <br><br>{parameters},vtable offset | Invokes a virtual method using the vtable of the target  object6. | F820 B800 CF00 - invoke-virtual-quick {v15, v12},  vtable #00b8 <br><br>Invokes a virtual method. The target object instance is pointed by v15 and vtable entry #B8 points to the  method to be called. v12 is a parameter to the method  call. |
| F9  | invoke-virtual-quick/range  {parameter range},vtable  offset | Invokes a virtual method using the vtable of the target  object6 | F906 1800 0000 - invoke-virtual-quick/range  {v0..v5},vtable #0018 <br><br>Invokes a method using the vtable of the instance  pointed by v0. v1..v5 registers are parameters to the  method call. |
| FA  | invoke-super-quick <br><br>{parameters},vtable offset | Invokes a virtual method in the target object's  immediate parent class using the vtable of that parent  class6. | FA40 8100 3254 - invoke-super-quick {v2, v3, v4, v5},  vtable #0081 <br><br>Invokes a method using the vtable of the immediate  parent class of instance pointed by v2. v3, v4 and v5  registers are parameters to the method call. |
| FB  | invoke-super-quick/range  {register range},vtable  offset | Invokes a virtual method in the target object's  immediate parent class using the vtable of that parent  class6. | F906 1B00 0000 - invoke-super-quick/range {v0..v5},  vtable #001b <br><br>Invokes a method using the vtable of the immediate  parent class of instance pointed by v0. v1..v5 registers are parameters to the method call. |
| FC  | unused_FC |
| FD  | unused_FD |
| FE  | unused_FE |
| FF  | unused_FF |