关于dex字节码

没办法,自己没有看下去,又被说了“好弱”,自嘲下,在这个实验室,习惯了

dalvik-bytecode.html中描述了字节码的顺序,其中,OP & Format

op指示执行何种操作,Format描述了该种操作所对应的数据流格式。

这是师兄的一个case,记录下:

      1 class add {
      2     public static void main (String[] args)
      3     {
      4         int i = 2;                                                                                         
      5         int k = 0;
      6         for (i = 1; i < 100; i++)
      7             k += i;
      8         System.out.println("k = " + k);
      9
     10     }
     11 }

makefile:

      1 add.dex: add.jar                                                                                           
      2     dx --dex --verbose --dump-to=$@ --verbose-dump $^
      3 add.jar: add.class
      4     jar cf $@ $^
      5 add.class: add.java
      6     javac $^
      7
      8 clean:
      9     rm add.jar add.class

看看dex字节码:

    219 0001c0: 1200              |  0000: const/4 v0, #int 0 // #0
    220 0001c2: 1211              |  0001: const/4 v1, #int 1 // #1
    221                                |  0002: code-address
    222                                     |  0002: code-address
    223                                     |  0002: local-snapshot
    224 0001c4: 1302 6400     |  0002: const/16 v2, #int 100 // #0064
    225 0001c8: 3521 0600     |  0004: if-ge v1, v2, 000a // +0006
    226                                    |  0006: code-address
    227                                    |  0006: code-address
    228                                    |  0006: local-snapshot
    229 0001cc: b010              |  0006: add-int/2addr v0, v1
    230 0001ce: d801 0101     |  0007: add-int/lit8 v1, v1, #int 1 // #01
    231                                     |  0009: code-address
    232 0001d2: 28f9              |  0009: goto 0002 // -0007
    233                                    |  000a: code-address
    234                                    |  000a: local-snapshot
    235                                    |  000a: code-address
    236 0001d4: 6201 0000    |  000a: sget-object v1, java.lang.System.out:Ljava/io/Pr
    237                                    |        intStream; // field@0000

只看一个:13026400

主机x86,dalvik一次读取16bits,故先读取0213,根据dalvik-bytecode.html,获取 13 操作码的数据流格式为 21s,

查看instruction-formats.html,可以得知完整指令格式为  AA|op BBBB -------op vAA, #+BBBB

故对于13026400所对应的是02 13 0064 ,对应const/16 v2, #int 100 // #0064

原文地址:https://www.cnblogs.com/openix/p/2812035.html