zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    203. Remove Linked List Elements
    86. Partition List
    143. Reorder List
    876. Middle of the Linked List
    246. Strobogrammatic Number
    202. Happy Number
    数据类型转换
    表达式
    面向对象
    对齐
  • 原文地址:https://www.cnblogs.com/openix/p/2812035.html
Copyright © 2011-2022 走看看