1.普通欄位讀寫操作
iget-object vAA,vBB,filed_id: 表示讀取vAA暫存器中的物件中的filed_id物件的參考值給VBB暫存器,
iget_boolean vAA,vBB,filed_id: 表示讀取vAA暫存器中的物件中的filed_id的值給vBB暫存器,
iget_wide vAA,vBB,filed_id :表示讀取vAA暫存器中物件中的filed_id的值給vBB暫存器, iget vAA,vBB,filed_id:表示vAA暫存器中物件的filed_id值給vBB暫存器,
iput-object vAA,vBB,filed_id:表示把vAA暫存器指向的物件的參考賦值給vBB暫存器中的filed_id, iput-boolean vAA,vBB,filed_id:表示把vAA暫存器的值給vBB暫存器中的boolean型別,
iput_wide vAA,vBB,filed_id:表示把vAA暫存器的值給vBB暫存器的wide型別,
iput vAA,vBB,filed_id: 表示把vAA暫存器的值給vBB暫存器的int型別,
aget vx,vy,vz 表示從int陣列獲取一個int型的值到vx,物件陣列的參考位于vy,需獲取的元素的索引位于vz,
age-wide vx,vy,vz 表示從long/double陣列獲取一個long/double值到vx,vx+1,陣列的參考位于vy,需獲取元素的索引位于vz,
2.靜態欄位的讀寫操作
sget-object vAA,vBB,filed_id: 表示讀取vAA暫存器中的物件中的filed_id物件的參考值給VBB暫存器,
sget_boolean vAA,vBB,filed_id: 表示讀取vAA暫存器中的物件中的filed_id的值給vBB暫存器,
sget_wide vAA,vBB,filed_id :表示讀取vAA暫存器中物件中的filed_id的值給vBB暫存器, sget vAA,vBB,filed_id:表示vAA暫存器中物件的filed_id值給vBB暫存器,
sput-object vAA,vBB,filed_id:表示把vAA暫存器指向的物件的參考賦值給vBB暫存器中的filed_id,
sput-boolean vAA,vBB,filed_id:表示把vAA暫存器的值給vBB暫存器中的boolean型別,
sput_wide vAA,vBB,filed_id:表示把vAA暫存器的值給vBB暫存器的wide型別,
sput vAA,vBB,filed_id: 表示把vAA暫存器的值給vBB暫存器的int型別,
3.跳轉指令
dalvik指令中有三種跳轉指令:無條件跳轉(goto),分支跳轉(switch),條件跳轉(if)
goto +AA:無條件跳轉到指定偏移處,偏移量AA不能為0,
goto/16 +AAAA:無條件跳轉到指定偏移處,偏量AAAA不能為0,
goto/32 +AAAAAAAA:無條件跳轉到指定偏移處,
packed-switch vAA, +BBBBBBBB:分支跳轉指令,vAA暫存器為switch分支中需要判斷的值,BBBBBBBB指向一個packed-switch-payload格式的偏移表,表中的值是有規律遞增的,
sparse-switch vAA, +BBBBBBBB:分支跳轉指令,vAA暫存器為switch分支中需要判斷的值,BBBBBBBB指向一個sparse-switch-payload格式的偏移表,表中的值是無規律的偏移量,
if-test vA, vB, +CCCC:條件跳轉指令,比較vA暫存器與vB暫存器的值,如果比較結果滿足就跳轉到CCCC指定的偏移處,偏移量CCCC不能為0,
if-test型別的指令有以下幾條:
if-eq:如果vA等于vB則跳轉,Java語法表示為“if(vA == vB)”
if-ne:如果vA不等于vB則跳轉,Java語法表示為“if(vA != vB)”
if-lt:如果vA小于vB則跳轉,Java語法表示為“if(vA < vB)”
if-ge:如果vA大于等于vB則跳轉,Java語法表示為“if(vA >= vB)”
if-gt:如果vA大于vB則跳轉,Java語法表示為“if(vA > vB)”
if-le:如果vA小于等于vB則跳轉,Java語法表示為“if(vA <= vB)”
if-testz vAA, +BBBB:條件跳轉指令,拿vAA暫存器與0比較,如果比較結果滿足或值為0時就跳轉到BBBB指定的偏移處,偏移量BBBB不能為0, if-testz型別的指令有以下幾條:
if-eqz:如果vAA為0則跳轉,Java語法表示為“if(vAA == 0)”
if-nez:如果vAA不為0則跳轉,Java語法表示為“if(vAA != 0)”
if-ltz:如果vAA小于0則跳轉,Java語法表示為“if(vAA < 0)”
if-gez:如果vAA大于等于0則跳轉,Java語法表示為“if(vAA >= 0)”
if-gtz:如果vAA大于0則跳轉,Java語法表示為“if(vAA > 0)”
if-lez:如果vAA小于等于0則跳轉,Java語法表示為“if(vAA <= 0)”
4.比較指令
它的格式: cmpkind vAA, vBB, vCC :其中vBB暫存器與vCC暫存器是需要比較兩個暫存器,比較結果放到vAA暫存器中,
Dalvik指令集共有5個比較指令 cmpl-float vAA, vBB, vCC: 比較兩個單精度浮點數,如果vBB暫存器大于vCC暫存器,結果為-1,相等則結果為0,小于的話結果為1,
cmpg-float vAA, vBB,vCC :比較兩個單精度浮點數,如果vBB暫存器大于VCC暫存器,結果為1,相等結果為0,小于的話結果為-1,
cmpl-double vAA, vBB,vCC: 比較兩個雙精度浮點數,如果VBB暫存器大于VCC暫存器,結果為-1,相等結果為0,小于的話為1,
cmpg-double vAA, vBB,vCC: 比較兩個雙精度浮點數,如果VBB暫存器大于VCC暫存器,結果為1,相等結果為0,小于的話為-1,
cmp-long vAA, vBB, vCC:比較兩個長整型,如果vBB暫存器大于vCC暫存器,結果為1,相等結果為0,小于結果為-1,
5.資料轉換指令
它的格式: unop vA,vB:vB暫存器轉換到對應資料并將結果放到vA暫存器上,
.“neg-int”:對整型數求補,
.“not-int”:對整型數求反,
.“neg-long”:對長整型數求補,
.“not-long”:對長整型數求反
.“neg-float”:對單精度浮點型數求補,
.“neg-double”:對雙精度浮點型數求補,
.“int-to-long”:將整型數轉換為長整型,
.“int-to-float”:將整型數轉換為單精度浮點型數,
.“int-to-dobule”:將整型數轉換為雙精度浮點數,
.“long-to-int”:將長整型數轉換為整型,
.“long-to-float”:將長整型數轉換為單精度浮點型,
.“long-to-double”:將長整型數轉換為雙精度浮點型,
.“float-to-int”:將單精度浮點數轉換為整型,
.“float-to-long”:將單精度浮點數轉換為長整型數,
.“float-to-double”:將單精度浮點數轉換為雙精度浮點型數,
.“double-to-int”:將雙精度浮點數轉換為整型,
.“double-to-long”:將雙精度浮點數轉換為長整型,
.“double-to-float”:將雙精度浮點數轉換為單精度浮點型,
.“int-to-byte”:將整型轉換為位元組型,
.“int-to-char”:將整型轉換為字符型,
.“int-to-short”:將整型轉換為短整型,
6.資料運行指令
資料運算指令包括算術運算指令與邏輯運算指令,
算術運算指令主要進行數值間如加,減,乘,除,模,移位等運算,
邏輯運算指令主要進行數值間與,或,非,抑或等運算,
資料運算指令有如下四類(資料運算時可能是在暫存器或暫存器對間進行,下面的指令作用講解時使用暫存器來描述):
.“binop vAA, vBB, vCC”:將vBB暫存器與vCC暫存器進行運算,結果保存到vAA暫存器,
.“binop/2addr vA, vB”:將vA暫存器與vB暫存器進行運算,結果保存到vA暫存器,
.“binop/lit16 vA, vB, #+CCCC”:將vB暫存器與常量 CCCC進行運算,結果保存到vA暫存器,
.“binop/lit8 vAA, vBB, #+CC”:將vBB暫存器與常量CC進行運算,結果保存到vAA暫存器,
7.方法呼叫指令
.invoke-virtual或 invoke-virtual/range呼叫實體的虛方法, .invoke-super或”invoke-super/range呼叫實體的父類方法, .invoke-direct或“invoke-direct/range呼叫實體的直接方法, .invoke-static或invoke-static/range呼叫實體的靜態方法, .invoke-interface或invoke-interface/range呼叫實體的介面方法
8.例外處理指令
.throw vAA:拋出vAA暫存器中指定型別的例外,
9.回傳指令
.return-void: 表示函式從一個void回傳 .return vAA: 表示函式回傳一個32位非物件型別的值,回傳值暫存器為8位的暫存器vAA .return-wide vAA: 表示函式回傳一個64位飛物件型別的值,反黑值為8位的暫存器對vAA .return-object vAA:表示函式回傳一個物件型別的值,回傳值為8位暫存器vAA,
10.資料操作指令
.move vA, vB:將vB暫存器的值賦給vA暫存器,A源暫存器與目的暫存器都為4位,
.move/from16 vAA, vBBBB:將vBBBB暫存器的值賦給vAA暫存器,源暫存器為16位,目的暫存器為8位,
.move/16 vAAAA, vBBBB:將vBBBB暫存器的值賦給vAAAA暫存器,源暫存器與目的暫存器都為16位,
.move-wide vA, vB:為4位的暫存器對賦值,源暫存器與目的暫存器都為4位,
.move-wide/from16 vAA, vBBBB 與“move-wide/16 vAAAA, vBBBB”實作與“move-wide”相同,
.move-object vA, vB:為物件賦值,源暫存器與目的暫存器都為4位,
.move-object/from16 vAA, vBBBB:為物件賦值,源暫存器為16位,目的暫存器為8位,
.move-object/16 vAA, vBBBB:為物件賦值,源暫存器與目的暫存器都為16位,
.move-result vAA:將上一個invoke型別指令操作的單字非物件結果賦給vAA暫存器,
.move-result-wide vAA:將上一個invoke型別指令操作的雙字非物件結果賦給vAA暫存器,
.move-result-object vAA:將上一個invoke型別指令操作的物件結果賦給vAA暫存器,
.move-exception vAA:保存一個運行時發生的例外到vAA暫存器,這條指令必須是例外發生時的例外處理器的一條指令,否則的話,指令無效,
.registers指令指定了在這個方法中有多少個可用暫存器,
.locals指明了在這個方法中非參暫存器的數量,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292765.html
標籤:其他
上一篇:Android性能優化的底層邏輯
