Smali中的指令
在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:无条件跳转到指定标签处。