smali指令语法

  • iget-object从一个对象实例中读取一个对象类型的字段,这里的 “i” 代表 “instance”。
# 从对象 p0 中获取名为 myField 的字段,并将这个对象的引用存储在寄存器 v0 中。
# 在非静态方法中,p0代表 this ,即当前对象。
iget-object v0, p0, Lcom/example/MyClass;->myField:Ljava/lang/Object;
  • sget-object用于获取静态字段(即类变量)的值,这里的 “s” 代表 “static”。
# 获取 MyClass 类中名为 myStaticField 的静态字段,并将其对象引用存储在寄存器 v0 中。
sget-object v0, Lcom/example/MyClass;->myStaticField:Ljava/lang/Object;
  • const/4用于将一个4位的常量值(即0到15之间的整数)加载到一个寄存器中,只适用于v4寄存器类型(即4位寄存器)。
# 将常量值4加载到寄存器v0中
const/4 v0, 4

# 将常量值15加载到寄存器v1中
const/4 v1, 15

# 将常量值-3加载到寄存器v2中
const/4 v2, -3
  • const/16用于将一个16位的常量值加载到一个寄存器中,允许加载0到65535之间的任何值。
# 将常量值32768加载到寄存器v0中
const/16 v0, 32768

# 将常量值65535加载到寄存器v1中
const/16 v1, 65535

# 将常量值-1加载到寄存器v2中
const/16 v2, -1

# 使用const-wide指令加载一个64位的常量值
const-wide v4, 1234567890123456789

# 使用const指令加载一个32位的常量值
const v3, 100000
  • move-result-object将一个方法调用的结果移动到一个寄存器中,当这个结果是对象类型时使用。这个指令通常用在调用返回对象的方法之后,目的是将返回的对象引用存储到一个指定的寄存器中,以便后续使用。
# 假设我们调用了一个返回对象的方法
invoke-virtual {v0}, Ljava/lang/Object;->clone()Ljava/lang/Object;

# 使用move-result-object将结果移动到寄存器v1
move-result-object v1
  • invoke-virtual调用一个对象实例的方法。

语法

#{vA1, vA2, ..., vAN} 是一个寄存器列表,包含了调用方法时传递给方法的参数。这些参数按照方法定义中的顺序排列。
#vB 是包含对象引用的寄存器,这个对象是调用方法的实例。
#LClassName; 是方法所属的类的全名,包括包名和类名,使用分号;结束。
#MethodName 是要调用的方法的名称。
#(I)R 是方法的参数和返回值的类型描述。I 表示方法接受一个整型参数,R 表示方法返回的值的类型。类型可以是V(表示无返回值,即void),I(整型),F(浮点型),J(长整型),D(双精度浮点型),Ljava/lang/Object;(对象类型)等。
invoke-virtual {vA1, vA2, ..., vAN}, vB, LClassName;->MethodName(I)R

smali指令语法
http://blog.icy8.cn/posts/3471467452/
作者
icy8
发布于
2024年7月13日
许可协议