Smali中的指令
在Smali中,指令(Instructions)是用來執(zhí)行具體操作的基本命令。每個指令執(zhí)行一種特定的操作,如加載常量、算術(shù)運算、方法調(diào)用等。了解Smali的指令是理解和編寫Smali代碼的關(guān)鍵。以下是一些常見的Smali指令及其作用:
1. 加載常量指令(const):
? ?const/4:將4位整數(shù)常量加載到寄存器中。
? ?const/16:將16位整數(shù)常量加載到寄存器中。
? ?const:將32位整數(shù)常量加載到寄存器中。
? ?const-wide:將64位整數(shù)常量加載到寄存器中。
? ?const-string:將字符串常量加載到寄存器中。
? ?const-class:將類引用常量加載到寄存器中。
2. 寄存器操作指令(move):
? ?-move:將一個寄存器的值復制到另一個寄存器。
? ?move/from16:類似于move,但是目標寄存器編號在16到31之間。
3. 算術(shù)運算指令(add、sub、mul、div等):
? ?add-int:整數(shù)相加。
? ?sub-int:整數(shù)相減。
? ?-mul-int:整數(shù)相乘。
? ?-div-int:整數(shù)相除。
4. 比較和跳轉(zhuǎn)指令(if-*):
? ?-if-eq:如果兩個寄存器中的值相等,則跳轉(zhuǎn)到指定標簽處。
? ?if-ne:如果兩個寄存器中的值不相等,則跳轉(zhuǎn)到指定標簽處。
? ?if-lt:如果第一個寄存器中的值小于第二個寄存器中的值,則跳轉(zhuǎn)到指定標簽處。
? ?-if-ge:如果第一個寄存器中的值大于等于第二個寄存器中的值,則跳轉(zhuǎn)到指定標簽處。
5. 方法調(diào)用指令(invoke-*):
? ?invoke-static:調(diào)用靜態(tài)方法。
? ?invoke-virtual:調(diào)用實例方法。
? ?invoke-direct:調(diào)用私有方法和構(gòu)造方法。
? ?invoke-super:調(diào)用父類方法。
6. 返回指令(return):
? ?return:返回void。
? ?return-wide:返回64位整數(shù)或雙精度浮點數(shù)。
? ?return-object:返回對象引用。
? ?return-void:返回void(在方法末尾使用)。
7. 對象操作指令:
? ?ew-instance:創(chuàng)建一個新的類實例。
? ?check-cast:檢查對象引用是否可以轉(zhuǎn)換為指定的類。
? ?instance-of:檢查對象引用是否是指定類或其子類的實例。
8. 數(shù)組操作指令:
? ?new-array:創(chuàng)建一個新的數(shù)組。
? ?aget:從數(shù)組中獲取元素。
? ?aput:將元素存儲到數(shù)組中。
9. 其他常見指令:
? ?move-result:將前一個方法調(diào)用的返回值移動到指定的寄存器中。
? ?goto:無條件跳轉(zhuǎn)到指定標簽處。