|
|
举例赋值,返回,判断,调用,字段访问,正则这六种。
1. 赋值操作
赋值操作根据数据类型和大小选择不同指令:
(1) 数值赋值
小整数(4位/8位):
const/4 v0, 0x1 // v0 = 1(4位有符号数,范围:-8 ~ 7)
const/16 v1, 0x100 // v1 = 256(16位有符号数,范围:-32768 ~ 32767)
大整数(32位):
const v2, 0x12345 // v2 = 74565(32位有符号数)
const/high16 v3, 0x1 // v3 = 65536(高16位赋值,用于大数值初始化)
(2) 长整型赋值(64位)
const-wide/16 v6, 0x100L // 赋值256(十进制),v6和v7共同存储64位值。
解释—在Dalvik字节码中,宽指令(wide指令,如 const-wide )会占用两个连续的寄存器(例如 v6 和 v7 )。
(3) 字符串赋值
const-string v5, "Hello" // v5 = "Hello"
(4) 对象赋值
const-class v6, Ljava/lang/String; // v6 = String.class
------
2. 返回操作
返回操作根据返回值类型选择不同指令:
(1) 返回空
return-void // 无返回值
(2) 返回整数
return v0 // 返回 v0 中的整数值
(3) 返回长整型
return-wide v1 // 返回 v1 和 v2 中的长整型值
(4) 返回对象
return-object v3 // 返回 v3 中的对象引用
------
3. 判断操作
判断操作通过条件跳转指令实现:
(1) 相等/不等判断
if-eq v0, v1, :cond // 如果 v0 == v1,跳转到 :cond
if-ne v0, v1, :cond // 如果 v0 != v1,跳转到 :cond
(2) 大小判断
if-lt v0, v1, :cond // 如果 v0 < v1,跳转到 :cond
if-ge v0, v1, :cond // 如果 v0 >= v1,跳转到 :cond
(3) 零值判断
if-eqz v0, :cond // 如果 v0 == 0,跳转到 :cond
if-nez v0, :cond // 如果 v0 != 0,跳转到 :cond
------
类型 描述符 备注
int I 32位整数
long J 64位长整数
float F 32位单精度浮点数
double D 64位双精度浮点数
boolean Z 布尔值(true/false)
byte B 8位字节
short S 16位短整数
char C 16位Unicode字符
void V 无返回值
------
4. 调用操作
调用操作通过invoke系列指令实现,具体分为以下几种:
1. 调用实例方法
invoke-virtual: 调用普通实例方法(非私有、非静态)。
invoke-virtual {<目标寄存器>, <参数寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
示例:
invoke-virtual {v0, v1}, Lcom/example/MyClass;->myMethod(I)V
解释:调用 v0 寄存器中的对象(Lcom/example/MyClass 实例)的 myMethod 方法,传入 v1 寄存器中的整数参数,返回类型为 V(void)。
invoke-direct: 调用私有方法或构造函数。
invoke-direct {<目标寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
示例:
invoke-direct {v0}, Lcom/example/MyClass;-><init>()V
解释:调用 v0 寄存器中的对象(Lcom/example/MyClass 实例)的构造函数 <init>,无参数,返回类型为 V(void)。
2. 调用静态方法
invoke-static: 调用静态方法。
invoke-static {<参数寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
示例:
invoke-static {}, Lcom/example/MyClass;->staticMethod()V
解释:调用 Lcom/example/MyClass 类的静态方法 staticMethod,无参数,返回类型为 V(void)。
3. 调用父类方法
invoke-super: 调用父类方法。
invoke-super {<目标寄存器>, <参数寄存器>}, <父类名>-><方法名>(<参数类型>)<返回类型>
示例:
invoke-super {v0}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
解释:调用 v0 寄存器中的对象(Activity 实例)的父类 Activity 的 onCreate 方法,传入 Bundle 参数,返回类型为 V(void)。
4. 调用接口方法
invoke-interface: 调用接口方法。
invoke-interface {<目标寄存器>, <参数寄存器>}, <接口名>-><方法名>(<参数类型>)<返回类型>
示例:
invoke-interface {v0}, Lcom/example/MyInterface;->interfaceMethod()V
解释:调用 v0 寄存器中的对象(MyInterface 实例)的 interfaceMethod 方法,无参数,返回类型为 V(void)。
------5. 字段访问语法
iget: 用于从对象的实例字段中读取值,并将其存储到指定的寄存器中。(从实例字段中读取值)
iget <类型> <目标寄存器>, <对象寄存器>, <字段名>
解释
<类型>:字段的类型(如 int、boolean、object 等)。
<目标寄存器>:存储读取结果的寄存器。
<对象寄存器>:包含字段的对象所在的寄存器。
<字段名>:字段的完整路径(如 Lcom/example/MyClass;->myField:I)。
示例:
iget v0, v1, Lcom/example/MyClass;->myField:I
解释:从 v1 寄存器中的对象(Lcom/example/MyClass 实例)中获取 myField 字段的值,并将其存储在 v0 寄存器中,字段类型为 I(int)。
根据字段类型的不同,iget 有多个变体:
iget:读取普通字段(如 int、float 等)。
iget-wide:读取 64 位字段(如 long、double)。
iget-object:读取对象字段(如 String、MyClass)。
iget-boolean:读取布尔字段(boolean)。
iget-byte:读取字节字段(byte)。
iget-char:读取字符字段(char)。
iget-short:读取短整型字段(short)。
iput: 设置实例字段的值。(将值写入实例字段)
iput <类型> <源寄存器>, <对象寄存器>, <字段名>
示例:
iput v0, v1, Lcom/example/MyClass;->myField:I
解释:将 v0 寄存器中的值存储到 v1 寄存器中的对象(Lcom/example/MyClass 实例)的 myField 字段中,字段类型为 I(int)。
sget: 获取静态字段的值。
sget <类型> <目标寄存器>, <类名>-><字段名>
示例:
sget v0, Lcom/example/MyClass;->myStaticField:I
解释:从 Lcom/example/MyClass 类中获取 myStaticField 静态字段的值,并将其存储在 v0 寄存器中,字段类型为 I(int)。
sput: 设置静态字段的值。
sput <类型> <源寄存器>, <类名>-><字段名>
示例:
sput v0, Lcom/example/MyClass;->myStaticField:I
解释:将 v0 寄存器中的值存储到 Lcom/example/MyClass 类的 myStaticField 静态字段中,字段类型为 I(int)。
------
6.正则赋值
举例
iget-boolean v0, v1, Lcom/example/MyClass;->vip:Z
解释:从 v1 寄存器中的对象(Lcom/example/MyClass 实例)中获取 vip 字段的值,并将其存储在 v0 寄存器中,字段类型为布尔。
正则转换后
iget-boolean (.*), .*, Lcom/example/MyClass;->vip:Z
解释: 还记得iget-boolean <目标寄存器>, <对象寄存器>, <字段名>吗
(.*) 捕获的是目标寄存器(如 v0 ),用于存储字段值。
.* 匹配但不捕获的是对象寄存器(如 v1 ),表示字段所属的实例对象。
根据判断操作替换相应的值
(如赋值为1)搜索代码正则表达式替换为
const $1, 0x1
解释: $1 是正则替换中的占位符,动态引用捕获的寄存器名(如 v0 )。
const $1, 0x1 的作用:将目标寄存器直接赋值为 1 ,跳过字段读取逻辑。
(为什么用正则替换呢?有什么优势呢?答案是灵活和大批量处理,如果有几百个要赋值的难道要手动吗 ,通过 (.*) 捕获目标寄存器名,并在替换时使用 $1 动态引用,无论原寄存器名是什么,替换语句都能自动适配 )
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +4
金币 +5
|