1、Smali语言基础语法-数据类型与描述符

smali中有两类数据类型:基本类型和引用类型。引用类型是指数组和对象,其它都是基础类型。

基本类型以及每种类型的描述符:

Java类型 类型描述符 说明
boolean 布尔型
byte 字节型
short S 短整型
char 字符型
int I 整型
long 长整型
float F 双精度型
void V 返回类型

引用类型分两种,对象类型与数组类型:

对象类型表示形式为L包名/对象类型,即Lpackagename/ObjectName;(注意分号
(1) 开始的L表明这是一个对象类型         (2) packagename  使用"/"代替”.“
(3) ObjectName是对象的名称                 (4) 分号表明对象名的结束
例:smali代码中String类型的表示:Ljava/lang/String;
数组类型以 ‘[’ 数据类型加上类型描述符的形式表示:
例:[I 表示一维整型数组,[[I表示二维数组,    [Ljava/lang/String; 表示String数组

字段的描述

Davilk中对字段的描述分为两种,对基本类型字段的描述和对引用类型的描述,但是两者的描述格式一样:
对象类型描述符->字段名:类型描述符;
例:com.baidu.Test类中存在String类型的name字段及int类型的age字段,那么其描述为:
Lcom/baidu/Test;->name:Ljava/lang/String;         Lcom/baidu/Test;->age:I

方法的描述

java中方法的签名包括方法名,参数及返回值,在Davilk相应的描述规则为:
对象类型描述符->方法名(参数类型描述符)返回值类型描述符
以java.lang.String举例:
java方法:public char charAt(int index){......}
Davilk描述:Ljava/lang/String;->charAt(I)C java方法:public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin){......}
Davilk描述:Ljava/lang/String;->getChars(II[CI)V java方法:public boolean equals(Object anObject){......}
Davilk描述:Ljava/lang/String;->equals(Ljava/lang/Object;)Z

2、Smali语言基础语法-寄存器与传参以及局部变量

在smali汇编语言中,同样也有寄存器,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用两个寄存器表示。
有两种方式指定一个方法中有多少寄存器是可用的。

.registers指令指定了方法中寄存器的总数        .locals指令表明了方法中非参寄存器的数量

在方法中使用寄存器传递参数的默认规则如下:
(1)当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器--v3和v4中。          (2)非静态方法中的第一个参数总是调用该方法的对象。
:非静态方法LMyobject;->callMe(II)V 有2个整型参数,另外还有一个隐含的LMyobject;参数,所有总共有三个参数。假如在该方法中指定了5个寄存器(v0-v4),以.registers指定5个或者以.locals方式指定2个(即2个local寄存器+3个参数寄存器),当该方法被调用的时候,调用该方法的对象(即this指针引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。
对于静态方法除了没有隐含的this参数外其它都是一样的。
寄存器的命名方式有两种:
在下表中我们用两种方式表示上一个例子中有5个寄存器和3个参数的方法:
V命名方式 P命名方式 说明
v0 v0 局部变量
v1 v1 局部变量
v2 p0 参数0,this指针
v3 p1 参数1
v4 p2 参数2
可以使用任何一种方式来引用参数寄存器----他们没有任何区别。  注意:Baksmali默认对参数寄存器使用P命名方式。
使用P命名方式是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
看一个成员方法的例子:
public void callMe0(int a, int b)
{
System.out.println(a + b);
}

反编译之后的smali汇编代码    smali 代码中#后面是注释

# virtual methods
.method public callMe0(II)V
.locals 2 # 定义局部变量寄存器
.param p1, "a" # I 声明参数
.param p2, "b" # I .line 16 # 源码所在行数
# 获取out对象
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
# 将参数累加
add-int v1, p1, p2
# 输出信息
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V .line 17
return-void
.end method
关于Long/Double值:
Long和double类型是64位的,需要两个寄存器。
例:对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。所有该方法至少需要5个寄存器来存储参数。
寄存器 说明
p0 this
p1 I
p2,p3 J
p4 Z
 

Smali语言基础语法的更多相关文章

  1. C语言基础语法

    #include <stdio.h> int main() { int age; printf("input your age"); scanf("%d&qu ...

  2. 黑马程序员——OC语言基础语法 面向对象的思想

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...

  3. 黑马程序员——C语言基础语法 关键字 标识符 注释 数据及数据类型

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)C语言简单介绍 (1)C语言程序是由函数组成的任何C语言程序都是由一 ...

  4. php语言基础语法与编程工具推荐

    php脚本语言,需要在服务器端执行,用浏览器返回HTML结果.在PHP中所有的语法都是如此,用户端是无法修改的,只有浏览权限. 一.php基础语法之输出方法 1.PHP中所有的脚本,可以放在文件中的任 ...

  5. C语言基础语法之指向函数的指针

    指针是C语言的精髓,对于初学者来讲,指针是C语言语法学习中比较难的知识点,而这里面指向函数的指针更是不太容易理解. 下面给大家讲下怎样学习理解C语言中指向函数的指针及编程方法和使用例子. 注意:这是一 ...

  6. Python语言基础-语法特点、保留字与标识符、变量、基本数据类型、运算符、基本输入输出、Python2.X与Python3.X区别

    Python语言基础 1.Python语法特点 注释: 单行注释:# #注释单行注释分为两种情况,例:第一种#用于计算bim数值bim=weight/(height*height)第二种:bim=we ...

  7. NDK以及C语言基础语法(一)

    一.什么是NDK? Native Development Kit (本地开发工具包): NDK中提供了一系列的工具,帮助我们快速开发C/C++的动态库,并能自动将so文件和java文件一起打包成apk ...

  8. Go语言--基础语法笔记

    ### 换了工作,好久没有添加新文章了,本来是想更新到github上的,想想还是在博客里放着,感觉以前的文章都没有很仔细,都只是问题处理的记录, 以后想新加一些整理的笔记也好 ### 主要内容 2.1 ...

  9. GO_03:GO语言基础语法

    1. Go项目的目录结构 一般的,一个Go项目在GOPATH下,会有如下三个目录: project   --- bin   --- pkg   --- src 其中,bin 存放编译后的可执行文件:p ...

随机推荐

  1. iOS 开发中一些 tips

    tableView 的 tableHeaderView 高度不正确的问题: func forceRefreshHeader() { let size = headerView.systemLayout ...

  2. hadoop集群zookeeper迁移

    1. zookeeper作用 ZooKeepr在Hadoop中的应用主要有: 1.1 HDFS中NameNode的HA和YARN中ResourceManager的HA. 1.2 存储RMStateSt ...

  3. Docker运行mysql,redis,oracle容器和SpringBoot项目

    dokcer运行SpringBoot项目 from frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/demo-0.0.1-SNAPSHOT ...

  4. hadoop之mapreduce详解(进阶篇)

    上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述. 一.mapreduce ...

  5. CSS3 box-shadow阴影

    box-shadow: color x-offset v-offset blur spred color: 阴影的颜色 x-offset: 阴影水平距离; 0: 左右阴影平分:正值:阴影在对象的右侧: ...

  6. Docker系列(五):.Net Core实现k8s健康探测机制

    k8s通过liveness来探测微服务的存活性,判断什么时候该重启容器实现自愈.比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可能是资源死锁,此时 httpd 进程并没有异常退出 ...

  7. JAVA的List接口的remove重载方法调用原理

    前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引inde ...

  8. Kafka0.11之RoundRobinPartitioner/HashPartitioner(Scala):

    RoundRobinPartitioner/HashPartitioner: import java.util import java.util.concurrent.atomic.AtomicLon ...

  9. MongoDB 学习笔记之 Aggregation Pipeline

    Aggregation Pipeline: 常用操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip: ...

  10. MySQL 复制已存在的表生成新表

    从已有的表创建一个新的空表 CREATE TABLE new_table LIKE old_table; 注意: create table ... like 创建的表会保留原有表的字段.索引的定义,但 ...