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. linux mint 17编译android 2.3.1错误记录

    有转载这里的也有添加的. ################# Fix 1 ########################## Error: frameworks/base/include/utils ...

  2. python简单爬虫(爬取pornhub特定关键词的items图片集)

    请提前搭好梯子,如果没有梯子的话直接403. 1.所用到的包 requests: 和服务器建立连接,请求和接收数据(当然也可以用其他的包,socket之类的,不过requests是最简单好用的) Be ...

  3. 基于vue-cli、elementUI的Vue超简单入门小例子

    - 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. - 开始写例子之前,先对环境的部署做点简单的介绍,其实和Vue官方的差不多. #如若没有安装过vu ...

  4. $(document).height 与$(window).height的区别

    $(document).scrollTop() 获取垂直滚动的距离 (即当前滚动的地方的窗口顶端到整个页面顶端的距离)$(document).scrollLeft() 这是获取水平滚动条的距离 要获取 ...

  5. 关于CSS的书写规范和顺序

    关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...

  6. PHP的bcmath编译安装

    问题描述:zabbix编译安装时PHP条件检查失败,如下图: 解决办法: 1.PHP自带bcmath扩展模块,可直接进行编译安装. [root@localhost etc]# cd /usr/loca ...

  7. k8s pod访问不通外网问题排查

    环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...

  8. DrawerLayout(抽屉效果)

    DrawerLayout是V4包下提供的一种左滑右滑抽屉布局效果. 实现效果如下: 因为是官方提供的,所以使用起来也相对的比较简单. DrawerLayout 提供 1.当界面弹出的时候,主要内容区会 ...

  9. Android实现apk插件方式换肤

    换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...

  10. 利用C++实现模块隐藏(R3层断链)

    一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...