dalvik执行流程

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寄存器中的内容返回



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值