Dalvik虚拟机运行时,同样为每个线层维护一个PC计数器和调用栈,与Java虚拟机不同的是,这个调用栈维护一份寄存器列表,寄存器的数量在方法结构体的register字段中给出,Dalvik虚拟机会根据这个值来创建一份虚拟的寄存器列表
由此可见,给予寄存器架构的Dalvik虚拟机与基于栈架构的Java虚拟机相比,由于生成的代码指令少了,程序执行速度会更快一些
对于前面文章中的demo,我们先生成dex文件
dx --dex --output Hello.dex .\Test2222.class
然后,通过dexdump查看反编译后的代码
这里我们还是从main函数看
从这我们可以看到main函数使用了4个寄存器,这里main函数有一个参数,占用最后一个v3寄存器,其他的v0,v1,v2由局部变量使用
开始时
这里我认为dalvik虚拟机跟java虚拟机有点类似,为每个方法保存一个调用栈,但调用栈里面存在的是一个个虚拟的寄存器,寄存器里面存在的是相应的值的一个索引,如如果是一个字符串,则可能存放的是在string_ids中的索引
相对于java虚拟机,dalvik没有局部变量区了,因为所有的操作都基于寄存器,同时也可以看到,执行同样的功能,dalvik少了很多指令,并且有些没用的代码直接剔除掉了,而jvm里面则没有,这点在后面分析dextojar时我们会看到
然后我们一步步看指令的执行,前面两个指令
|0000: const/16 v0, #int 11 // #b
|0002: const/16 v1, #int 20 // #14
const/16把一个16的常量赋值到寄存器,这里执行完后
new-instance实例化一个对象类型,并把对象的引用放到指定的寄存器
invoke-direct {v2}, LTest2222;.<init>:()V
这里调用对象的构造函数,初始化,传递的参数是对象
invoke-virtual {v2, v0, v1}, LTest2222;.add:(II)I
初始化完成之后,调用对象的add方法,参数有对象本身,和前面设置的v0 v1
这时,到add方法里面
add函数里面
add-int v0, v2, v3
把v2 v3的值相加保存到v0
然后return v0 将v0寄存器中的内容返回