zoukankan      html  css  js  c++  java
  • Smali语法简单介绍

    Smali语言其实就是Davlik的寄存器语言;

    Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示语言。

    Smali语法简单介绍如下

           Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示;

           Dalvik字节码有两种类型:原始类型;引用类型(包括对象和数组)

                  原始类型:v   void  只能用于返回值类型

                                    Z   boolean

                                    B   byte

                                    S   short

                                    C   char

                                     I    int

                                    J    long(64位)

                                    F   float

                                    D   double(64位)

                  对象类型:Lpackage/name/ObjectName;  相当于java中的package.name.ObjectName;解释如下:

                                     L:表示这是一个对象类型

                                     package/name:该对象所在的包

                                     ;:表示对象名称的结束

                  数组的表示形式:

                                      [I  :表示一个整形的一维数组,相当于java的int[];

                                      对于多维数组,只要增加就行了,[[I = int[][];注:每一维最多255个; 

                   对象数组的表示形式:

                                       [Ljava/lang/String    表示一个String的对象数组;

      

                   方法的表示形式:

                                       Lpackage/name/ObjectName;——>methodName(III)Z  详解如下:

                                       Lpackage/name/ObjectName  表示类型

                                       methodName   表示方法名

                                       III   表示参数(这里表示为3个整型参数)

                                       说明:方法的参数是一个接一个的,中间没有隔开;

                    

                     字段的表示形式:

                                        Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;

                                        即表示: 包名,字段名和各字段类型

                      有两种方式指定一个方法中有多少寄存器是可用的:

                                         .registers  指令指定了方法中寄存器的总数

                                         .locals        指令表明了方法中非参寄存器的总数,出现在方法中的第一行

            方法的传参:

                    当一个方法被调用的时候,方法的参数被置于最后N个寄存器中;

                              例如,一个方法有2个参数,5个寄存器(v0~v4)

                                          那么,参数将置于最后2个寄存器(v3和v4)

                     非静态方法中的第一个参数总是调用该方法的对象;

                     说明:对于静态方法除了没有隐含的this参数外,其他都一样

              寄存器的命名方式:

                      V命名

                      P命名  第一个寄存器就是方法中的第一个参数寄存器

                      比较:使用P命名是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点

                      特别说明一下:Long和Double类型是64位的,需要2个寄存器

                               例如:对于非静态方法

                                           LMyObject——>myMethod(IJZ)V;

                                           有4个参数:LMyObject,int,long,bool;   需要5个寄存器来存储参数;

                                                                P0    this

                                                                P1    I (int)

                                                                P2,P3  J (long)

                                                                P4    Z(bool)

  • 相关阅读:
    C的联合体和结构体区别
    1_大端模式和小端模式
    1_2017年中兴机试题
    树1---基础
    栈的应用2---后缀表达式
    2 链式存储栈
    2- 栈和队列----之栈
    2) 线性链表
    kaike的FLAGs
    QAQ来自弱鸡的嘲笑
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4464400.html
Copyright © 2011-2022 走看看