Smali语法学习三

Stella981
• 阅读 415

寄存器与变量

Java中的变量都是放在内存中的,安卓为了提高性能,变量都是放在寄存器中的。寄存器为32位,可以支持任何类型。其中long和double这种64为的类型需要两个寄存器保存。寄存器采用v和p来命名,v表示本地寄存器,p表示参数寄存器,关系如下: v0:第一个本地寄存器

v1:第二个本地寄存器

v2 p0(this)

v3 p1 第一个参数

当然,如果是静态方法,就只有5个寄存器,不需要存this。

.registers使用这个指令指定方法中寄存器的总数

.locals使用这个指令指定方法中非参寄存器总数,放在方法第一行。

方法指令

.field private isFlag:z    #定义变量
.methd                          #方法
.parameter                    #方法参数
.prologue                      #方法开始
.line 12                         #此方法位于第12行

invoke-direct                #调用函数

return-void                   #返回void


.end method                #函数结束

new-instence               #创建实例
input-object                 #对象赋值

iget-object                    #调用对象

invoke-static                #调用静态函数

方法的定义

private static int sum(int a, int b) { 
    return a+b; 
 }

对应的smali代码:

.method private static sum(II)I 
.locals 4 #表示需要申请4个本地寄存器 
.parameter 
.parameter #这里表示有两个参数 
.prologue 
.line 27 

move v0, p0 
.local v0, a:I 

move v1, p1 
.local v1, b:I 

move v2, v0 

move v3, v1 

add-int/2addr v2, v3 

move v0, v2 
#  
.end local v0 
 
return v0
 #  
.end method
点赞
收藏
评论区
推荐文章
代码还原的技术: Unidbg调试浮点数运算(一)
一、目标在做代码还原的时候,经常能看到一些奇怪的寄存器和奇怪的指令:vldr s15, 可以看出两个区别, 一个是寄存器不一样,普通运算使用的寄存器是R0Rx,浮点数运算使用的是D0Dx (其实还有 S0Sx),另一个是指令不一样,普通运算是MOV、MUL,而浮点数运算使用的是VMOV,VMUL,感觉就是普通运算的VIP版。第一个知识点就出来了,V开头的指令
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Wesley13 Wesley13
1年前
PIC中档单片机汇编指令详解(5)
位操作指令详述 BCF 数据寄存器指定位清0 语法形式:BCF f,b 操作数:f为数据寄存器的低7位地址(0x00~0x7F) B为数据位编号(0~7) 执行时间:一个指令周期 执行过程:使数据寄存器f的的b位清0 状态标志影响:无 说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。 指
Stella981 Stella981
1年前
Modbus功能码及错误码说明
**有效功能码说明(十进制)** 功能码 说明 01 读取线圈状态 02 读取输入状态 03 读取保持寄存器 04 读取输入寄存器 05 强置单线圈 06 预置单寄存器 07 读取异常状态 08 回送诊断校验 09 编程(只用于484) 10 控询 11 读取事件计数 12 读取通信事件记录 13 编程
Stella981 Stella981
1年前
JVM基本结构
JVM架构图 ====== ![](http://static.oschina.net/uploads/space/2016/0814/104922_8DB5_2253738.png) PC寄存器 ===== * 每个线程拥有一个PC寄存器 * 在线程创建时创建 * 指向下一条指令的地址 * 执行本地方法时,PC的值为undefined
Stella981 Stella981
1年前
RTC时钟和BKP的配置stm32
摘自:https://blog.csdn.net/gtkknd/article/details/52233605 RTC和后备寄存器通过一个开关供电,在VDD有效的时候选择VDD供电,否则选择VBAT引脚供电. 后备寄存器(10个16位的寄存器),可以用于在关闭VDD时,保存20个字节的用户应用数据(中容量和小容量产品,大容量和互联性产品有84字节).
Wesley13 Wesley13
1年前
C语言内存优化——继续含泪总结
之前分析了基本数据类型的优化,现在开始涉及全局和局部变量的优化,话说这个东西我从没想过还能这样优化的喂! ### 全局变量 / Global variables 全局变量不会被分配在寄存器上,修改全局变量需要通过指针或者调用函数的方式间接进行。所以编译器不会将全局变量存储在寄存器中,那样会带来额外的、不必要的负担和存储空间。所以在比较关键的循环中,我们要
Wesley13 Wesley13
1年前
java并发编程实战:第十六章
**一、什么是内存模型,为什么要使用它** 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 * 编译器把变量保存在本地寄存器而不是内存中 * 编译器中生成的指令顺序,可以与源代码中的顺序不同 * 处理器采用乱序或并行的方式来执行指令 * 保存在处理器本地缓存中的值,对于其他处理器是不可见 在单线程中,只要
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue