SMALI语法-中文说明

上传人:豆浆 文档编号:24901607 上传时间:2017-12-08 格式:PDF 页数:18 大小:199.41KB
返回 下载 相关 举报
SMALI语法-中文说明_第1页
第1页 / 共18页
SMALI语法-中文说明_第2页
第2页 / 共18页
SMALI语法-中文说明_第3页
第3页 / 共18页
SMALI语法-中文说明_第4页
第4页 / 共18页
SMALI语法-中文说明_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《SMALI语法-中文说明》由会员分享,可在线阅读,更多相关《SMALI语法-中文说明(18页珍藏版)》请在金锄头文库上搜索。

1、Dalvik虚拟机操作码作者:Gabor Paller 翻译:YULIANGMAX v1.0表中的vx、vy、vz表示某个Dalvik寄存器。根据不同指令可以访问16、256或64K寄存器。表中lit4、lit8、lit16、lit32、lit64表示字面值(直接赋值),数字是值所占用位的长度。long和double型的值占用两个寄存器,例:一个在v0寄存器的double值实际占用v0,v1两个寄存器。boolean值的存储实际是1和0,1为真、0为假;boolean型的值实际是转成int型的值进行操作。所有例子的字节序都采用高位存储格式,例:0F00 0A00的编译为0F, 00, 0A,

2、00 存储。有一些指令没有说明和例子,因为我没有在正常使用中看到过这些指令,它们的存在是从这里知道的:Android opcode constant list。Opcode操作码(hex) Opcode name操作码名称 Explanation说明 Example示例00 nop 无操作 0000 - nop01 move vx, vy 移动vy的内容到vx。两个寄存器都必须在最初的256寄存器范围以内。 0110 - move v0, v1移动v1寄存器中的内容到v0。02 move/from16 vx, vy 移动vy的内容到vx。vy可能在64K寄存器范围以内,而vx则是在最初的256

3、寄存器范围以内。 0200 1900 - move/from16 v0, v25移动v25寄存器中的内容到v0。03 move/16 未知注404 move-wide 未知注405 move-wide/from16 vx, vy 移动一个long/double值,从vy到vx。vy可能在64K寄存器范围以内,而vx则是在最初的256寄存器范围以内。 0516 0000 - move-wide/from16 v22, v0移动v0,v1寄存器中的内容到 v22,v23。06 move-wide/16 未知注407 move-object vx, vy 移动对象引用,从vy到vx。 0781 -

4、move-object v1, v8移动v8寄存器中的对象引用到v1。08 move-object/from16 vx, vy 移动对象引用,从vy到vx。vy可以处理64K寄存器地址,vx可以处理256寄存器地址。 0801 1500 - move-object/from16 v1, v21移动v21寄存器中的对象引用到v1。09 move-object/16 未知注40A move-result vx 移动上一次方法调用的返回值到vx。 0A00 - move-result v0移动上一次方法调用的返回值到v0。0B move-result-wide vx 移动上一次方法调用的long/d

5、ouble型返回值到vx,vx+1。 0B02 - move-result-wide v2移动上一次方法调用的long/double型返回值到v2,v3。0C move-result-object vx 移动上一次方法调用的对象引用返回值到vx。 0C00 - move-result-object v0移动上一次方法调用的对象引用返回值到v0。0D move-exceptionvx 当方法调用抛出异常时移动异常对象引用到vx。 0D19 - move-exception v25当方法调用抛出异常时移动异常对象引用到v25。0E return-void 返回空值。 0E00 - return-v

6、oid返回值为void,即无返回值,并非返回null。0F return vx 返回在vx寄存器的值。 0F00 - return v0返回v0寄存器中的值。10 return-wide vx 返回在vx,vx+1寄存器的double/long值。 1000 - return-wide v0返回v0,v1寄存器中的double/long值。11 return-objectvx 返回在vx寄存器的对象引用。 1100 - return-object v0返回v0寄存器中的对象引用。12 const/4 vx, lit4 存入4位常量到vx。 1221 - const/4 v1, #int 2存入

7、int型常量2到v1。目的寄存器在第二个字节的低4位,常量2在更高的4位。13 const/16 vx, lit16 存入16位常量到vx。 1300 0A00 - const/16 v0, #int 10存入int型常量10到v0。14 const vx, lit32 存入int 型常量到vx。 1400 4E61 BC00 - const v0, #12345678 / #00BC614E存入常量12345678到v0。15 const/high16 v0, lit16 存入16位常量到最高位寄存器,用于初始化float值。 1500 2041 - const/high16 v0, #fl

8、oat 10.0 / #41200000存入float常量10.0到v0。该指令最高支持16位浮点数。16 const-wide/16vx, lit16 存入int常量到vx,vx+1寄存器,扩展int型常量为long常量。 1600 0A00 - const-wide/16 v0, #long 10存入long常量10到v0,v1寄存器。17 const-wide/32vx, lit32 存入32位常量到vx,vx+1寄存器,扩展int型常量到long常量。1702 4e61 bc00 - const-wide/32 v2, #long 12345678 / #00bc614e存入long常

9、量12345678到v2,v3寄存器。18 const-wide vx,lit64 存入64位常量到vx,vx+1寄存器。 1802 874b 6b5d 54dc 2b00- const-wide v2, #long 12345678901234567 / #002bdc545d6b4b87存入long常量12345678901234567到v2,v3寄存器。19 const-wide/high16 vx, lit16 存入16位常量到最高16位的vx,vx+1寄存器,用于初始化double 值。 1900 2440 - const-wide/high16 v0, #double 10.0 /

10、 #402400000存入double常量10.0到v0,v1。1A const-string vx, 字符串ID 存入字符串常量引用到vx,通过字符串ID或字符串。 1A08 0000 - const-string v8, / string0000存入string0000(字符串表#0条目)的引用到v8。1B const-string-jumbo 未知注41C const-class vx, 类型ID 存入类对象常量到vx,通过类型ID或类型(如Object.class)。1C00 0100 - const-class v0, Test3 / type0001存入Test3.class(类型

11、ID表#1条目)的引用到v0。1D monitor-entervx 获得vx寄存器中的对象引用的监视器。 1D03 - monitor-enter v3获得v3寄存器中的对象引用的监视器。1E monitor-exit 释放vx寄存器中的对象引用的监视器。 1E03 - monitor-exit v3释放v3寄存器中的对象引用的监视器。1F check-cast vx,类型ID 检查vx寄存器中的对象引用是否可以转换成类型ID对应类型的实例。如不可转换,抛出ClassCastException 异常,否则继续执行。 1F04 0100 - check-cast v4, Test3 / type

12、0001检查v4寄存器中的对象引用是否可以转换成Test3(类型ID表#1条目)的实例。20 instance-of vx, vy, 类型ID 检查vy寄存器中的对象引用是否是类型ID对应类型的实例,如果是,vx存入非0值,否则vx存入0。 2040 0100 - instance-of v0, v4, Test3/ type0001检查v4寄存器中的对象引用是否是Test3(类型ID表#1条目)的实例。如果是,v0存入非0值,否则v0存入0。21 array-length vx, vy 计算vy寄存器中数组引用的元素长度并将长度存入vx。 2111 - array-length v0, v1

13、计算v1寄存器中数组引用的元素长度并将长度存入v0。22 new-instance vx, 类型ID 根据类型ID或类型新建一个对象实例,并将新建的对象的引用存入vx。 2200 1500 - new-instance v0, java.io.FileInputStream / type0015实例化java.io.FileInputStream(类型ID表#15H条目)类型,并将其对象引用存入v0。23 new-array vx,vy, 类型ID 根据类型ID或类型新建一个数组,vy存入数组的长度,vx存入数组的引用。 2312 2500 - new-array v2, v1, char /

14、 type0025新建一个char(类型ID表#25H条目)数组,v1存入数组的长度,v2存入数组的引用。24 filled-new-array 参数, 类型ID 根据类型ID或类型新建一个数组并通过参数填充注5。新的数组引用可以得到一个move-result-object指令,前提是执行过filled-new-array 指令。 2420 530D 0000 - filled-new-array v0,v0,I / type0D53新建一个int(类型ID表#D53H条目)数组,长度将为2并且2个元素将填充到v0寄存器。25 filled-new-array-range vx.vy, 类型I

15、D 根据类型ID或类型新建一个数组并以寄存器范围为参数填充。新的数组引用可以得到一个move-result-object指令,前提是执行过filled-new-array 指令。 2503 0600 1300 - filled-new-array/range v19.v21, B / type0006新建一个byte(类型ID表#6条目)数组,长度将为3并且3个元素将填充到v19,v20,v21寄存器注4。26 fill-array-data vx, 偏移量 用vx的静态数据填充数组引用。静态数据的位址是当前指令位置加偏移量的和。 2606 2500 0000 - fill-array-dat

16、a v6, 00e6 / +0025用当前指令位置+25H的静态数据填充v6寄存器的数组引用。偏移量是32位的数字,静态数据的存储格式如下:0003 / 表类型:静态数组数据0400 / 每个元素的字节数(这个例子是4字节的int型)0300 0000 / 元素个数0100 0000 / 元素 #0:int 10200 0000 / 元素 #1:int 20300 0000 / 元素 #2:int 327 throw vx 抛出异常对象,异常对象的引用在vx寄存器。 2700 - throw v0抛出异常对象,异常对象的引用在v0寄存器。28 goto 目标 通过短偏移量注2无条件跳转到目标。 28F0 - goto 0005 / -0010跳转到当前位置-16(hex 10)的位置,0005是目标指令标签。29 goto/16目标 通过16位偏移量注2无条件跳转到目标。 2900 0FFE - goto/16 002f / -01f1跳转到当前位置-1F1H的

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号