Smail語法基本知識(二)

這篇文章介紹了一些常見的指令語法,

想要知道更全的指令語法,請見: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章