Smali语法学习三

Stella981
• 阅读 632

寄存器与变量

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
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
代码还原的技术: Unidbg调试浮点数运算(一)
一、目标在做代码还原的时候,经常能看到一些奇怪的寄存器和奇怪的指令:vldrs15,可以看出两个区别,一个是寄存器不一样,普通运算使用的寄存器是R0Rx,浮点数运算使用的是D0Dx(其实还有S0Sx),另一个是指令不一样,普通运算是MOV、MUL,而浮点数运算使用的是VMOV,VMUL,感觉就是普通运算的VIP版。第一个知识点就出来了,V开头的指令
Wesley13 Wesley13
2年前
STM32 HAL库 IIC 协议库函数
/\第1个参数为I2C操作句柄第2个参数为从机设备地址第3个参数为从机寄存器地址第4个参数为从机寄存器地址长度第5个参数为发送的数据的起始地址第6个参数为传输数据的大小第7个参数为操作超时时间\/HAL\_I2C\_Mem\_Write(&hi2c2,salve\_add,0,0,PA\_BUFF,sizeo
Wesley13 Wesley13
2年前
java并发编程实战:第十六章
一、什么是内存模型,为什么要使用它如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序,可以与源代码中的顺序不同处理器采用乱序或并行的方式来执行指令保存在处理器本地缓存中的值,对于其他处理器是不可见在单线程中,只要
Stella981 Stella981
2年前
Linux性能分析之上下文切换
而在每个任务运行前,CPU都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU寄存器和程序计数器CPU寄存器,是CPU内置的容量小、但速度极快的内存。而程序计数器,则是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。它们都是CPU在运行任何任务前,必须的依赖环境,因此也被叫做C
Wesley13 Wesley13
2年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Stella981 Stella981
2年前
Modbus功能码及错误码说明
有效功能码说明(十进制)功能码说明01读取线圈状态02读取输入状态03读取保持寄存器04读取输入寄存器05强置单线圈06预置单寄存器07读取异常状态08回送诊断校验09编程(只用于484)10控询11读取事件计数12读取通信事件记录13编程
Stella981 Stella981
2年前
JVM基本结构
JVM架构图!(http://static.oschina.net/uploads/space/2016/0814/104922_8DB5_2253738.png)PC寄存器每个线程拥有一个PC寄存器在线程创建时创建指向下一条指令的地址执行本地方法时,PC的值为undefined
Stella981 Stella981
2年前
RTC时钟和BKP的配置stm32
摘自:https://blog.csdn.net/gtkknd/article/details/52233605RTC和后备寄存器通过一个开关供电,在VDD有效的时候选择VDD供电,否则选择VBAT引脚供电.后备寄存器(10个16位的寄存器),可以用于在关闭VDD时,保存20个字节的用户应用数据(中容量和小容量产品,大容量和互联性产品有84字节).
Wesley13 Wesley13
2年前
C语言内存优化——继续含泪总结
之前分析了基本数据类型的优化,现在开始涉及全局和局部变量的优化,话说这个东西我从没想过还能这样优化的喂!全局变量/Globalvariables全局变量不会被分配在寄存器上,修改全局变量需要通过指针或者调用函数的方式间接进行。所以编译器不会将全局变量存储在寄存器中,那样会带来额外的、不必要的负担和存储空间。所以在比较关键的循环中,我们要