为了更好的了解反编译代码有必要了解一下其中的细节部分,比如v0、v1、p1都是什么等等
编译过程不写了,直接看dexdump的反编译代码:这里我们还是只分析foo()函数
从代码中我們可以看到foo一共使用了5个寄存器,上个章节中我们也说了add-int v0, v3, v4中v3和v4分别代表第一个参数和第二个参数。那么为什么是这样呢
根据Dalvik虚拟机参數传递的规则,如果一个函数使用了M个寄存器、拥有N个参数:则参数使用最后N个寄存器局部变量从v0开始一直递增到前M-N个。
那我们来分析丅foo()函数,一共是5个registers寄存器有两个int的参数。由于foo函数是Hello类的非静态方法因此函数被调用时会传入一个“隐藏”的Hello对象引用(this),所以实际傳参是3个也就是局部变量使用v0和v1寄存器,参数使用v2、v3、v4这三个后面的寄存器其中v2表示被传入的“隐藏”的对象引用(this)、v3表示第一个参数、v4表示第二个参数。
p命名方法对函数的局部变量寄存器命名没有影响他的命名规则是:函数引用的参数从p0开始命名,依次递增
使用ddx.jar反彙编Hello.dex文件,这样会在目录下生成一个ddxout文件夹用文件编辑器打开里面的Hello.ddx文件。
来看一下foo()函数依然是使用5个寄存器:
v0和v1表示局部变量的寄存器,p0、p1、p2表示函数引用参数的寄存器其中p0表示被传入的Hello对象的引用(this)、p1表示第一个int参数、p2表示第二个int参数。
v命名相比较p命名大体结构楿同,有一些细微的地方
2、v命名以v2作为this的引用,p命名以p0作为this的引用
3、v命名以M-N命名N个参数的寄存器p命名则用p命名法。