Dalvik汇编指令集(I)

来源:互联网 发布:一楼土木人淘宝店没了 编辑:程序博客网 时间:2024/05/18 20:10

指令格式

  1. 每16位的字采用空格分隔开
  2. 每个字母表示四位,每个字母按照顺序从高字节开始,排列到低字节,每四位之间可能使用竖线“|”来表示不同的内容
  3. 顺序采用A~Z的单个大写字母作为一个4位的操作码,op表示一个8位的操作码
  4. ”来表示这字段所有位为0值

实例

A|G|op BBBB F|E|D|C

位数 内容 含义 16位 A|G|op 高8位由A和G组成,低8位由操作码op组成 16位 BBBB 一个16位的偏移量 16位 F|E|D|C 寄存器参数

指令格式标识:
1:指令格式大多是时3个字符,前两个是数字,最后一个是字母
2:第一个数字表示有多少个16位的字组成
3:第二个数字是表示指令最多使用的寄存器的个数,特殊标记“r”标识使用一定范围内的寄存器
4:第三个字母为类型码,表示指令用到的额外数据类型取值见下表

指令格式标识类型码

助记符 位大小 说明 b 8 8位有符号立即数 c 16,32 常量池索引 f 16 接口常量(仅对静态链接格式有效) h 16 有符号立即数(32位或者64位的高值位,低值为0) i 32 立即数,有符号整数或者32位浮点数 l 64 立即数,有符号整数或者64位双精度浮点数 m 16 方法常量(仅对静态链接格式有效) n 4 4位的立即数 s 16 短整型的立即数 t 8,16,32 跳转,分支 x 0 无额外数据

寄存器表示方法

V命名法和p命名法

V命名法 p命名法 寄存器的含义 v0 v0 第一个局部变量寄存器 v1 v1 第二个局部变量寄存器 中间的局部变量寄存器依次递减且名称相同 vM-N p0 第一个参数寄存器 中间的参数寄存器分别依次递增 vM-1 pN-1 第N个参数寄存器

Dalvik字节码的类型、方法与字段表示方法

类型

语法 含义 V void,只用于返回值类型 Z boolean B byte S short C char I int J long F float D double L Java类类型 [ 数组类型

方法

格式

Lpackage/name/ObjectName;->MethodName(III)Z

这里写图片描述

字段

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String

这里写图片描述

Dalvik指令集

指令特点:

  • 参数采用从目标(destination)到源(source)的方式
  • 根据字节码的大小与类型的不同,一些字节码添加了后缀以消除歧义

    • 32位常规类型的字节码未添加任何后缀
    • 64位常规类型的字节码添加-wide后缀
    • 特殊类型的字节码根据具体类型添加后缀(可以是:-boolean、-byte、-char、-short、-int、-long、-float、-double、-object、-string、-class、-void之一)
  • 根据字节码的布局与选项不同,一些字节码添加了字节码后缀以消除歧义,这些后缀通过在字节码主名称后添加“/”来分隔

  • 在指令集的描述中,宽度值中的每个字母表示宽度为4位

空操作指令

nop
作用通常被用来对齐代码,无实际操作。

数据操作指令

形式:move destination ,source
实例:move vA,vB;把vB寄存器的值赋值给vA寄存器

返回指令

基础字节码:return

形式 含义 return-void 函数从一个void方法返回 return vAA 函数返回一个32位非类型对象的值,返回值寄存器为8位的寄存器vAA return-wide vAA 函数返回一个64位非类型对象的值,返回值寄存器为8位的寄存器vAA return-object vAA 函数返回一个对象类型的值

数据定义指令

const/4 vA,#+B

锁命令

锁命令一共有两条:
monitor-enter vAA 为指定对象获得锁
monitor-exit vAA 释放指定对象的锁

原创粉丝点击