這篇文章介紹了一些常見的指令語法,
想要知道更全的指令語法,請見:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
.標記
.field 變量
.method 方法的起始
.end method 方法的終止
.locals 本地寄存器數目(總寄存器數reg - 參數寄存器數目para)
移動
move vx,vy 將vy的內容移動到vx中。 兩個寄存器必須是最前面256個寄存器中之一。
move-object vx,vy 移動對象的引用。
move-result vx 將前一個方法的結果值移動到vx寄存器中
move-result-wide vx 與上條相似,但是移動64位結果到vx,vx+1
返回值
return-void 返回空值
return vx 返回vx寄存器的值
return-object vx 返回vx寄存器的值(對象)
常量定義
const/4 vx,lit4 移動4bit常量到vx 例如:const/4 v0, 0x0
const/16 vx,lit16 移動16bit常量到vx 例如:const/16 v0, #int 10
const vx, lit32 移動integer常量到vx 例如:const v0, #12345678 // #00BC614E
const-string vx,string_id 移動String的引用到vx 例如:const-string v3, "none"
跳轉
if-eqz vx,target vx爲0,跳轉到目標
if-nez vx,target vx非0,跳轉到目標
if-gez vx,target vx>=0 ,跳轉到目標
if-ltz
vx,target vx<0 ,跳轉到目標
結論:eq ,e是等於;ne是不等於 g是大於,l是小於 ,z是零。
if-eq vx,vy,target ;if-ne vx,vy,target;if-ge
vx, vy,target;if-ltz vx,target 類似可知。
當然還有無條件跳轉的 goto target
讀取,寫入寄存器
sput-object vx,field_id 將對象引用放入靜態域內:方向 vx->field_id
iput vx,vy, field_id 將vx的放入實例域內,vx是vy的引用對象之一
對象創建
new-instance vx,type 創建 type類型的對象,放入vx中
方法調用
invoke-virtual { parameters }, methodtocall 使用參數調用虛方法
invoke-super {parameter},methodtocall 使用參數調用父類方法
invoke-direct { parameters }, methodtocall
invoke-static {parameters}, methodtocall