关于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