Smali语法学习三

寄存器与变量

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

v1:第二个本地寄存器

v2 p0(this)

v3 p1 第一个参数

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

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

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

方法指令

1.field private isFlag:z #定义变量 2.methd #方法 3.parameter #方法参数 4.prologue #方法开始 5.line 12 #此方法位于第126 7invoke-direct #调用函数 8 9return-void #返回void 10 11 12.end method #函数结束 13 14new-instence #创建实例 15input-object #对象赋值 16 17iget-object #调用对象 18 19invoke-static #调用静态函数

方法的定义

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

对应的smali代码:

1.method private static sum(II)I 2.locals 4 #表示需要申请4个本地寄存器 3.parameter 4.parameter #这里表示有两个参数 5.prologue 6.line 27 7 8move v0, p0 9.local v0, a:I 10 11move v1, p1 12.local v1, b:I 13 14move v2, v0 15 16move v3, v1 17 18add-int/2addr v2, v3 19 20move v0, v2 21# 22.end local v0 23 24return v0 25 # 26.end method
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java并发编程实战:第十六章

一、什么是内存模型,为什么要使用它如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序,可以与源代码中的顺序不同处理器采用乱序或并行的方式来执行指令保存在处理器本地缓存中的值,对于其他处理器是不可见在单线程中,只要

代码还原的技术: Unidbg调试浮点数运算(一)

一、目标在做代码还原的时候,经常能看到一些奇怪的寄存器和奇怪的指令:vldrs15,可以看出两个区别,一个是寄存器不一样,普通运算使用的寄存器是R0Rx,浮点数运算使用的是D0Dx(其实还有S0Sx),另一个是指令不一样,普通运算是MOV、MUL,而浮点数运算使用的是VMOV,VMUL,感觉就是普通运算的VIP版。第一个知识点就出来了,V开头的指令

PIC中档单片机汇编指令详解(5)

位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指