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. 主动降噪技术(ANC)的前生今世--概念历史

    一 概念 假如使用一句通俗的语言来概述ANC的原理的话,那就是:通过发出与噪声相位相反,频率.振幅相同的声波与噪声干涉实现相位抵消. 使用比较正式的语言来解释就是:动降噪通过降噪系统产生与外界噪音相等 ...

  2. 提交任务到spark(以wordcount为例)

    1.首先需要搭建好hadoop+spark环境,并保证服务正常.本文以wordcount为例. 2.创建源文件,即输入源.hello.txt文件,内容如下: tom jerry henry jim s ...

  3. 品Spring:SpringBoot发起bean定义注册的“二次攻坚战”

    上一篇文章整体非常轻松,因为在容器启动前,只注册了一个bean定义,就是SpringBoot的主类. OK,今天接着从容器的启动入手,找出剩余所有的bean定义的注册过程. 具体细节肯定会颇为复杂,同 ...

  4. Emacs 笔记二

    Emacs 笔记二 Table of Contents 1. 前言 2. emacs基本操作(常用快捷键) 3. emacs模式讲解 4. emacs缓冲区 5. org mode 5.1. 列表 5 ...

  5. swagger2的简单使用

    swagger2的简单使用 优点: 可以生成文档形式的API并提供给不同的团队使用 便于自己单测 无需过多冗余的word文档,这一点很重要,因为我在工作中就遇到这么一个情况,由于开发使用的文档和最新文 ...

  6. hadoop之mapreduce详解(优化篇)

    一.概述 优化前我们需要知道hadoop适合干什么活,适合什么场景,在工作中,我们要知道业务是怎样的,能才结合平台资源达到最有优化.除了这些我们当然还要知道mapreduce的执行过程,比如从文件的读 ...

  7. java8 base64使用

    java 1.8中引入了Base64,不在需要引入第三方库就可以使用base64了. 在需要用到base64进行加密解密的时候就可以使用了 String text = "base64 in ...

  8. Activiti(1) - TaskRuntime API 入门

    目录 TaskRuntime API pom.xml 注册TaskRuntime实例 角色与分组 任务事件监听器 DemoApplication 源码 Activiti 是一个自动化工作流框架.它能帮 ...

  9. Shell之Xargs命令

    目录 Shell之Xargs命令 参考 xargs命令简介 xargs命令格式 xargs实例说明 Shell之Xargs命令

  10. Java文件操作——File

    创建File isFile().length().exists().createNewFile(). File.separator / isDirtory(). mkdir().mkdirs(). d ...