不明真相的Dalvik

  • 这感觉就像是最初看汇编的感觉一样一样的
  • 1.Dalvik使用的寄存器是32位的,64位类型用两个<相邻>寄存器表示
    2.Dalvik由65535个虚拟寄存器
    3.这取消了栈结构使用,采用寄存器来存放值的设定特别奇怪
  • 假设这个函数由M个寄存器,N个参数,根据Dalvik规定,参数使用后面N个寄存器,局部变量从v0开始取M-N个寄存器
    比如一个函数使用了5个寄存器,2个显式的整形,3个参数,局部变量使用前2个,参数用后面3个
  • 关于Java类,Dalvik字节码用L表示,这些类在Java代码中用packname.name.ObjectName 方式引用.
    其中packname/name表示对象所在的包,ObjectName表示对象的名称
    举个小例子
    method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
    I表示int ,这句话翻译成Java代码就是,II就是二维int数组
    String method(int int[][] String, Object[])
  • 检测到一大堆汇编语句
    move VA VB VA=VB,都是四位
    move-wide VA,VB 为4位的寄存器!对 !赋值 都是四位
    有一堆关于寄存器位数的就不累述了。
    move-object 为对象赋值
    move-result VA 将上一个invoke类型操作指令的非对象结果赋值
    invoke 是返回一个**类型的对象。
    这就必须要再来看看方法调用指令,
    invoke-viretual 调用实例的虚方法
    invoke-super 调用实例的父方法
    invoke-direct 直接调用实例的直接方法(构造方法?)
    invoke-static 调用实例的静态方法。
    invoke-interface 调用实例的接口方法

  • 这其实省略了跳转还有定义数据,总觉得要搬运到博客上量太大,于是就自己看咯~

文章目录