Smali中的指令
几米爱星空
编辑于 2023年08月06日 07:46

在Smali中,指令(Instructions)是用来执行具体操作的基本命令。每个指令执行一种特定的操作,如加载常量、算术运算、方法调用等。了解Smali的指令是理解和编写Smali代码的关键。以下是一些常见的Smali指令及其作用:

1. 加载常量指令(const):

   const/4:将4位整数常量加载到寄存器中。

   const/16:将16位整数常量加载到寄存器中。

   const:将32位整数常量加载到寄存器中。

   const-wide:将64位整数常量加载到寄存器中。

   const-string:将字符串常量加载到寄存器中。

   const-class:将类引用常量加载到寄存器中。

2. 寄存器操作指令(move):

   -move:将一个寄存器的值复制到另一个寄存器。

   move/from16:类似于move,但是目标寄存器编号在16到31之间。

3. 算术运算指令(add、sub、mul、div等):

   add-int:整数相加。

   sub-int:整数相减。

   -mul-int:整数相乘。

   -div-int:整数相除。

4. 比较和跳转指令(if-*):

   -if-eq:如果两个寄存器中的值相等,则跳转到指定标签处。

   if-ne:如果两个寄存器中的值不相等,则跳转到指定标签处。

   if-lt:如果第一个寄存器中的值小于第二个寄存器中的值,则跳转到指定标签处。

   -if-ge:如果第一个寄存器中的值大于等于第二个寄存器中的值,则跳转到指定标签处。

5. 方法调用指令(invoke-*):

   invoke-static:调用静态方法。

   invoke-virtual:调用实例方法。

   invoke-direct:调用私有方法和构造方法。

   invoke-super:调用父类方法。

6. 返回指令(return):

   return:返回void。

   return-wide:返回64位整数或双精度浮点数。

   return-object:返回对象引用。

   return-void:返回void(在方法末尾使用)。

7. 对象操作指令:

   ew-instance:创建一个新的类实例。

   check-cast:检查对象引用是否可以转换为指定的类。

   instance-of:检查对象引用是否是指定类或其子类的实例。

8. 数组操作指令:

   new-array:创建一个新的数组。

   aget:从数组中获取元素。

   aput:将元素存储到数组中。

9. 其他常见指令:

   move-result:将前一个方法调用的返回值移动到指定的寄存器中。

   goto:无条件跳转到指定标签处。