Android逆向基礎(chǔ)之Dalvik指令集

Dalvik是Google公司自己設(shè)計(jì)的用于Android平臺(tái)的虛擬機(jī)舷礼。Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一。它可以支持已轉(zhuǎn)換為 .dex(即Dalvik Executable)格式的Java應(yīng)用程序的運(yùn)行郊闯,.dex格式是專為Dalvik設(shè)計(jì)的一種壓縮格式妻献,適合內(nèi)存和處理器速度有限的系統(tǒng)。Dalvik 經(jīng)過優(yōu)化虚婿,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例旋奢,并且每一個(gè)Dalvik 應(yīng)用作為一個(gè)獨(dú)立的Linux 進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉至朗。

1. 指令特點(diǎn)

Dalvik指令在調(diào)用格式上模仿了C語言的調(diào)用約定。Dalvik指令的語法與助詞符有如下特點(diǎn):

  • 參數(shù)采用從目標(biāo)(destination)到源(source)的方式剧浸。
  • 根據(jù)字節(jié)碼的大小與類型不同锹引,一些字節(jié)碼添加了名稱后綴以消除岐義。
    • 32位常規(guī)類型的字節(jié)碼末添加任何后綴唆香。
    • 64位常規(guī)類型的字節(jié)碼添加 -wide后綴嫌变。
    • 特殊類型的字節(jié)碼根據(jù)具體類型添加后綴。它們可以是 -boolean躬它,-byte腾啥,-char,-short冯吓,-int倘待,-long,-float组贺,-double凸舵,-object,-string失尖,-class啊奄,-void之一渐苏。
  • 根據(jù)字節(jié)碼的布局與選項(xiàng)不同,一些字節(jié)碼添加了字節(jié)碼后綴以消除岐義菇夸。這些后綴通過在字節(jié)碼主名稱后添加斜杠“/”來分隔開琼富。
  • 在指令集的描述中,寬度值中每個(gè)字母表示寬度為4位峻仇。

例如這條指令:move-wide/from16 vAA, vBBBB

  • move為基礎(chǔ)字節(jié)碼(base opcode)公黑,標(biāo)識(shí)這是基本操作。
  • wide為名稱后綴(name suffix)摄咆,標(biāo)識(shí)指令操作的數(shù)據(jù)寬度(64位)。
  • from16為字節(jié)碼后綴(opcode suffix)人断,標(biāo)識(shí)源為一個(gè)16位的寄存器引用變量吭从。
  • vAA為目的寄存器,它始終在源的前面恶迈,取值范圍為v0~v255涩金。
  • vBBBB為源寄存器,取值范圍為v0~v65535暇仲。

Dalvik指令集中大多數(shù)指令用到了寄存器作為目的操作數(shù)或源操作數(shù)步做,其中:

  • A/B/C/D/E/F/G/H代表一個(gè)4位的數(shù)值,可用來表示0~15的數(shù)值或v0~v15的寄存器奈附;
  • AA/BB/CC/DD/EE/FF/GG/HH代表一個(gè)8位的數(shù)值全度,可用來表示0255的數(shù)值或v0v255的寄存器;
  • AAAA/BBBB/CCCC/DDDD/EEEE/FFFF/GGGG/HHHH代表一個(gè)16位的數(shù)值斥滤,可用來表示0~65535的數(shù)值或v0~v65535的寄存器将鸵。

注意:

  • Android官方指令文檔描述寄存器時(shí),對(duì)不同取值范圍的寄存器以括號(hào)說明其大小佑颇,如A:destination register(4 bits)顶掉,A:destination register(16 bits)。
  • Dalvik虛擬機(jī)中的每個(gè)寄存器都是32位的挑胸,描述指令時(shí)所說的位數(shù)表示的是寄存器數(shù)值的取值范圍痒筒。

2. 空操作指令

空操作指令的助記符為nop。它的值為00茬贵,通常nop指令被用來作對(duì)齊代碼之用簿透,無實(shí)際操作。

3. 數(shù)據(jù)操作指令

數(shù)據(jù)操作指令為move闷沥。move指令的原型為move destination,source萎战,move指令根據(jù)字節(jié)碼的大小與類型不同,后面會(huì)跟上不同的后綴舆逃。

指令 說明
move vA, vB 將vB寄存器的值賦給vA寄存器蚂维,源寄存器與目的寄存器都為4位
move/from16 vAA, vBBBB 將vBBBB寄存器的值賦給vAA寄存器戳粒,源寄存器為16位,目的寄存器為8位
move/16 vAAAA, vBBBB 將vBBBB寄存器的值賦給vAAAA寄存器虫啥,源寄存器與目的寄存器都為16位
move-wide vA, vB 為4位的寄存器對(duì)賦值蔚约。源寄存器與目的寄存器都為4位
move-wide/from16 vAA, vBBBB move-wide相同
move-wide/16 vAAAA, vBBBB move-wide相同
move-object vA, vB 為對(duì)象賦值。源寄存器與目的寄存器都為4位
move-object/from16 vAA, vBBBB 為對(duì)象賦值涂籽。源寄存器為16位苹祟,目的寄存器為8位
move-object/16 vAA, vBBBB 為對(duì)象賦值。源寄存器與目的寄存器都為16位
move-result vAA 將上一個(gè)invoke類型指令操作的單字非對(duì)象結(jié)果賦給vAA寄存器
move-result-wide vAA 將上一個(gè)invoke類型指令操作的雙字非對(duì)象結(jié)果賦給vAA寄存器
move-result-object vAA 將上一個(gè)invoke類型指令操作的對(duì)象結(jié)果賦給vAA寄存器
move-exception vAA 保存一個(gè)運(yùn)行時(shí)發(fā)生的異常到vAA寄存器评雌,這條指令必須是異常發(fā)生時(shí)的異常處理器的一條指令,否則指令無效

4. 返回指令

返回指令指的是函數(shù)結(jié)尾時(shí)運(yùn)行的最后一條指令树枫。它的基礎(chǔ)字節(jié)碼為teturn,共有以下四條返回指令:

指令 說明
return-void 表示函數(shù)從一個(gè)void方法返回
return vAA 表示函數(shù)返回一個(gè)32位非對(duì)象類型的值景东,返回值寄存器為8位的寄存器vAA
return-wide vAA 表示函數(shù)返回一個(gè)64位非對(duì)象類型的值砂轻,返回值為8位的寄存器對(duì)vAA
return-object vAA 表示函數(shù)返回一個(gè)對(duì)象類型的值。返回值為8位的寄存器vAA

5. 數(shù)據(jù)定義指令

數(shù)據(jù)定義指令用來定義程序中用到的常量斤吐,字符串搔涝,類等數(shù)據(jù)。它的基礎(chǔ)字節(jié)碼為const和措。

指令 說明
const/4 vA, #+B 將數(shù)值符號(hào)擴(kuò)展為32位后賦給寄存器vA
const/16 vAA, #+BBBB 將數(shù)據(jù)符號(hào)擴(kuò)展為32位后賦給寄存器vAA
const vAA, #+BBBBBBBB 將數(shù)值賦給寄存器vAA
const/high16 vAA, #+BBBB0000 將數(shù)值右邊零擴(kuò)展為32位后賦給寄存器vAA
const-wide/16 vAA, #+BBBB 將數(shù)值符號(hào)擴(kuò)展為64位后賦給寄存器對(duì)vAA
const-wide/32 vAA, #+BBBBBBBB 將數(shù)值符號(hào)擴(kuò)展為64位后賦給寄存器對(duì)vAA
const-wide vAA, #+BBBBBBBBBBBBBBBB 將數(shù)值賦給寄存器對(duì)vAA
const-wide/high16 vAA, #+BBBB000000000000 將數(shù)值右邊零擴(kuò)展為64位后賦給寄存器對(duì)vAA
const-string vAA, string@BBBB 通過字符串索引構(gòu)造一個(gè)字符串并賦給寄存器vAA
const-string/jumbo vAA, string@BBBBBBBB 通過字符串索引(較大)構(gòu)造一個(gè)字符串并賦給寄存器vAA
const-class vAA, type@BBBB 通過類型索引獲取一個(gè)類引用并賦給寄存器vAA
const-class/jumbo vAAAA, type@BBBBBBBB 通過給定的類型索引獲取一個(gè)類引用并賦給寄存器vAAAA庄呈。
這條指令占用兩個(gè)字節(jié),值為0xooff(Android4.0中新增的指令)

6. 鎖指令

鎖指令多用在多線程程序中對(duì)同一對(duì)象的操作派阱。Dalvik指令集中有兩條鎖指令:

指令 說明
monitor-enter vAA 為指定的對(duì)象獲取鎖
monitor-exit vAA 釋放指定的對(duì)象的鎖

7. 實(shí)例操作指令

與實(shí)例相關(guān)的操作包括實(shí)例的類型轉(zhuǎn)換诬留,檢查及新建等:

指令 說明
check-cast vAA, type@BBBB 將vAA寄存器中的對(duì)象引用轉(zhuǎn)換成指定的類型,如果失敗會(huì)拋出ClassCastException異常颁褂。
如果類型B指定的是基本類型故响,對(duì)于非基本類型的A來說,運(yùn)行時(shí)始終會(huì)失敗
instance-of vA, vB, type@CCCC 判斷vB寄存器中的對(duì)象引用是否可以轉(zhuǎn)換成指定的類型颁独,如果可以vA寄存器賦值為1彩届,否則vA寄存器賦值為0
new-instance vAA, type@BBBB 構(gòu)造一個(gè)指定類型對(duì)象的新實(shí)例,并將對(duì)象引用賦值給vAA寄存器誓酒,類型符type指定的類型不能是數(shù)組類
check-cast/jumbo vAAAA, type@BBBBBBBB 指令功能與check-cast vAA, type@BBBB相同樟蠕,只是寄存器值與指令的索引取值范圍更大(Android4.0中新增的指令)
instance-of/jumbo vAAAA, vBBBB, type@CCCCCCCC 指令功能與instance-of vA, vB, type@CCCC相同,只是寄存器值與指令的索引取值范圍更大(Android4.0中新增的指令)
new-instance/jumbo vAAAA, type@BBBBBBBB 指令功能與new-instance vAA, type@BBBB相同靠柑,只是寄存器值與指令的索引取值范圍更大(Android4.0中新增的指令)

8. 數(shù)組操作指令

數(shù)組操作包括獲取數(shù)組長度寨辩,新建數(shù)組,數(shù)組賦值歼冰,數(shù)組元素取值與賦值等操作靡狞。

指令 說明
array-length vA, vB 獲取給定vB寄存器中數(shù)組的長度并將值賦給vA寄存器,數(shù)組長度指的是數(shù)組的條目個(gè)數(shù)
new-array vA, vB, type@CCCC 構(gòu)造指定類型(type@CCCC)與大懈舻铡(vB)的數(shù)組甸怕,并將值賦給vA寄存器
filled-new-array {vC, vD, vE, vF, vG},type@BBBB 構(gòu)造指定類型(type@BBBB)與大懈蚀(vA)的數(shù)組并填充數(shù)組內(nèi)容。
vA寄存器是隱含使用的梢杭,除了指定數(shù)組的大小外還指定了參數(shù)的個(gè)數(shù)温兼,vC~vG是使用到的參數(shù)寄存序列
filled-new-array/range {vCCCC ..vNNNN}, type@BBBB 指令功能與filled-new-array {vC, vD, vE, vF, vG},type@BBBB相同派近,只是參數(shù)寄存器使用range字節(jié)碼后綴指定了取值范圍 案疲,vC是第一個(gè)參數(shù)寄存器磕诊,N = A +C -1
fill-array-data vAA, +BBBBBBBB 用指定的數(shù)據(jù)來填充數(shù)組爷贫,vAA寄存器為數(shù)組引用,引用必須為基礎(chǔ)類型的數(shù)組锭环,在指令后面會(huì)緊跟一個(gè)數(shù)據(jù)表
new-array/jumbo vAAAA, vBBBB,type@CCCCCCCC 指令功能與new-array vA,vB,type@CCCC相同驮肉,只是寄存器值與指令的索引取值范圍更大(Android4.0中新增的指令)
filled-new-array/jumbo {vCCCC ..vNNNN},type@BBBBBBBB 指令功能與filled-new-array/range {vCCCC ..vNNNN},type@BBBB相同涣雕,只是索引取值范圍更大(Android4.0中新增的指令)
arrayop vAA, vBB, vCC 對(duì)vBB寄存器指定的數(shù)組元素進(jìn)入取值與賦值钧排。
vCC寄存器指定數(shù)組元素索引敦腔,vAA寄存器用來存放讀取的或需要設(shè)置的數(shù)組元素的值

讀取元素使用aget類指令,元素賦值使用aput類指定恨溜,根據(jù)數(shù)組中存儲(chǔ)的類型指令后面會(huì)緊跟不同的指令后綴,指令列表如下:

aget, aget-wide, aget-object, aget-boolean, aget-byte,aget-char, aget-short, 
aput, aput-wide, aput-object, aput-boolean, aput-byte, aput-char, aput-short

9. 異常指令

Dalvik指令集中有一條指令用來拋出異常找前。

throw vAA用來拋出vAA寄存器中指定類型的異常糟袁。

10. 跳轉(zhuǎn)指令

跳轉(zhuǎn)指令用于從當(dāng)前地址跳轉(zhuǎn)到指定的偏移處。Dalvik指令集中有三種跳轉(zhuǎn)指令:無條件跳轉(zhuǎn)(goto)躺盛,分支跳轉(zhuǎn)(switch)與條件跳轉(zhuǎn)(if)项戴。

指令 說明
goto +AA 無條件跳轉(zhuǎn)到指定偏移處,偏移量AA不能為0
goto/16 +AAAA 無條件跳轉(zhuǎn)到指定偏移處槽惫,偏量AAAA不能為0
goto/32 +AAAAAAAA 無條件跳轉(zhuǎn)到指定偏移處
packed-switch vAA, +BBBBBBBB 分支跳轉(zhuǎn)指令周叮。
vAA寄存器為switch分支中需要判斷的值,
BBBBBBBB指向一個(gè)packed-switch-payload格式的偏移表界斜,表中的值是有規(guī)律遞增的
sparse-switch vAA, +BBBBBBBB 分支跳轉(zhuǎn)指令仿耽。
vAA寄存器為switch分支中需要判斷的值,
BBBBBBBB指向一個(gè)sparse-switch-payload格式的偏移表各薇,表中的值是無規(guī)律的偏移量
if-test vA, vB, +CCCC 條件跳轉(zhuǎn)指令项贺。
比較vA寄存器與vB寄存器的值,如果比較結(jié)果滿足就跳轉(zhuǎn)到CCCC指定的偏移處峭判。
偏移量CCCC不能為0
if-testz vAA, +BBBB 條件跳轉(zhuǎn)指令开缎。
拿vAA寄存器與0比較,如果比較結(jié)果滿足或值為0時(shí)就跳轉(zhuǎn)到BBBB指定的偏移處林螃。
偏移量BBBB不能為0

if-test類型的指令有以下幾條:

指令 說明 Java語法
if-eq 如果vA等于vB則跳轉(zhuǎn) if(vA == vB)
if-ne 如果vA不等于vB則跳轉(zhuǎn) if(vA != vB)
if-lt 如果vA小于vB則跳轉(zhuǎn) if(vA < vB)
if-ge 如果vA大于等于vB則跳轉(zhuǎn) if(vA >= vB)
if-gt 如果vA大于vB則跳轉(zhuǎn) if(vA > vB)
if-le 如果vA小于等于vB則跳轉(zhuǎn) if(vA <= vB)

if-testz類型的指令有以下幾條:

指令 說明 Java語法
if-eqz 如果vAA為0則跳轉(zhuǎn) if(vAA == 0)
if-nez 如果vAA不為0則跳轉(zhuǎn) if(vAA != 0)
if-ltz 如果vAA小于0則跳轉(zhuǎn) if(vAA < 0)
if-gez 如果vAA大于等于0則跳轉(zhuǎn) if(vAA >= 0)
if-gtz 如果vAA大于0則跳轉(zhuǎn) if(vAA > 0)
if-lez 如果vAA小于等于0則跳轉(zhuǎn) if(vAA <= 0)

11. 比較指令

比較指令用于對(duì)兩個(gè)寄存器的值(浮點(diǎn)型或長整型)進(jìn)行比較奕删。它的格式為cmpkind vAA, vBB, vCC,其中vBB寄存器與vCC寄存器是需要比較的兩個(gè)寄存器或寄存器對(duì)疗认,比較的結(jié)果放到vAA寄存器完残。Dalvik指令集中共有5條比較指令:

指令 說明
cmpl-float 比較兩個(gè)單精度浮點(diǎn)數(shù)伏钠。
如果vBB寄存器大于vCC寄存器,結(jié)果為-1坏怪,相等則結(jié)果為0贝润,小于的話結(jié)果為1
cmpg-float 比較兩個(gè)單精度浮點(diǎn)數(shù)。
如果vBB寄存器大于vCC寄存器铝宵,則結(jié)果為1打掘,相等則結(jié)果為0,小于的話結(jié)果為-1
cmpl-double 比較兩個(gè)雙精度浮點(diǎn)數(shù)鹏秋。
如果vBB寄存器對(duì)大于vCC寄存器對(duì)尊蚁,則結(jié)果為-1,相等則結(jié)果為0侣夷,小于則結(jié)果為1
cmpg-double 比較兩個(gè)雙精度浮點(diǎn)數(shù)横朋。
如果vBB寄存器對(duì)大于vCC寄存器對(duì),則結(jié)果為1百拓,相等則結(jié)果為0琴锭,小于的話,則結(jié)果為-1
cmp-long 比較兩個(gè)長整型數(shù)衙传。
如果vBB寄存器大于vCC寄存器决帖,則結(jié)果為1,相等則結(jié)果為0蓖捶,小則結(jié)果為-1

12. 字段操作指令

字段操作指令用來對(duì)對(duì)象實(shí)例的字段進(jìn)入讀寫操作地回。字段的類型可以是Java中有效的數(shù)據(jù)類型。對(duì)普通字段與靜態(tài)字段操作有兩種指令集俊鱼,分別是iinstanceop vA, vB, fidld@CCCCsstaticop vAA, field@BBBB刻像。

普通字段指令的指令前綴為i,如對(duì)普通字段讀操作使用iget指令并闲,寫操作使用iput指令细睡;靜態(tài)字段的指令前綴為s,如對(duì)靜態(tài)字段讀操作使用 sget 指令焙蚓,寫操作使用 sput 指令纹冤。

根據(jù)訪問的字段類型不同,字段操作指令后面會(huì)緊跟字段類型的后綴购公,如 iget-byte指令表示讀取實(shí)例字段 的值類型為字節(jié)類型萌京,iput-short指令表示設(shè)置實(shí)例字段的值類型為短整型。兩類指令操作結(jié)果都是一樣宏浩,只是指令前綴與操作的字段類型不同知残。

普通字段操作指令有:

iget,iget-wide比庄,iget-object求妹,iget-boolean乏盐,iget-byte,iget-char制恍,iget-short父能,
iput,iput-wide净神,iput-object何吝,iput-boolean,iput-byte鹃唯,iput-char爱榕,iput-short。

靜態(tài)字段操作指令有:

sget坡慌,sget-wide黔酥,sget-object,sget-boolean洪橘,sget-byte跪者,sget-char,sget-short熄求,
sput坑夯,sput-wide,sput-object抡四,sput-boolean,sput-byte仗谆,sput-char指巡,sput-short。

在Android4.0系統(tǒng)中隶垮,Dalvik指令集中增加了iinstanceop/jumbo vAAAA, vBBBB, field@CCCCCCCCsstaticop/jumbo vAAAA, field@BBBBBBBB兩類指令藻雪,它們與上面介紹的兩類指令作用相同,只是在指令中增加了jumbo字節(jié)碼后綴狸吞,且寄存器值與指令的索引取值范圍更大勉耀。

13. 方法調(diào)用指令

方法調(diào)用指令負(fù)責(zé)調(diào)用類實(shí)例的方法。它的基礎(chǔ)指令為invoke蹋偏,方法調(diào)用指令有invoke-kind {vC, vD, vE, vF, vG},meth@BBBBinvoke-kind/range {vCCCC .. vNNNN},meth@BBBB兩類便斥,兩類指令在作用上并無不同,只是后者在設(shè)置參數(shù)寄存器時(shí)使用了range來指定寄存器的范圍威始。根據(jù)方法類型的不同枢纠,共有如下五條方法調(diào)用指令:

指令 說明
invoke-virtual 或 invoke-virtual/range 調(diào)用實(shí)例的虛方法
invoke-super 或 invoke-super/range 調(diào)用實(shí)例的父類方法
invoke-direct 或 invoke-direct/range 調(diào)用實(shí)例的直接方法
invoke-static 或 invoke-static/range 調(diào)用實(shí)例的靜態(tài)方法
invoke-interface 或 invoke-interface/range 調(diào)用實(shí)例的接口方法

在Android4.0系統(tǒng)中,Dalvik指令集中增加了invoke-kind/jumbo {vCCCC .. vNNNN},meth@BBBBBBBB這類指令黎棠,它與上面介紹的兩類指令作用相同晋渺,只是在指令中增加了jumbo字節(jié)碼后綴镰绎,且寄存器值與指令的索引取值范圍更大。

方法調(diào)用指令的返回值必須使用move-result*指令來獲取木西。如下面兩條指令:

invoke-static {}, Landroid/os/Parcel;->obtain() Landroid/os/Parcel;
move-result-object v0

14. 數(shù)據(jù)轉(zhuǎn)換指令

數(shù)據(jù)轉(zhuǎn)換指令用于將一種類型的數(shù)值轉(zhuǎn)換成另一種類型畴栖。它的格式為unop vA, vB,vB寄存器或vB寄存器對(duì)存放需要轉(zhuǎn)換的數(shù)據(jù)八千,轉(zhuǎn)換后的結(jié)果保存在vA寄存器或vA寄存器對(duì)中吗讶。

指令 說明
neg-int 對(duì)整型數(shù)求補(bǔ)
not-int 對(duì)整型數(shù)求反
neg-long 對(duì)長整型數(shù)求補(bǔ)
not-long 對(duì)長整型數(shù)求反
neg-float 對(duì)單精度浮點(diǎn)型數(shù)求補(bǔ)
neg-double 對(duì)雙精度浮點(diǎn)型數(shù)求補(bǔ)
int-to-long 將整型數(shù)轉(zhuǎn)換為長整型
int-to-float 將整型數(shù)轉(zhuǎn)換為單精度浮點(diǎn)型數(shù)
int-to-dobule 將整型數(shù)轉(zhuǎn)換為雙精度浮點(diǎn)數(shù)
long-to-int 將長整型數(shù)轉(zhuǎn)換為整型
long-to-float 將長整型數(shù)轉(zhuǎn)換為單精度浮點(diǎn)型
long-to-double 將長整型數(shù)轉(zhuǎn)換為雙精度浮點(diǎn)型
float-to-int 將單精度浮點(diǎn)數(shù)轉(zhuǎn)換為整型
float-to-long 將單精度浮點(diǎn)數(shù)轉(zhuǎn)換為長整型數(shù)
float-to-double 將單精度浮點(diǎn)數(shù)轉(zhuǎn)換為雙精度浮點(diǎn)型數(shù)
double-to-int 將雙精度浮點(diǎn)數(shù)轉(zhuǎn)換為整型
double-to-long 將雙精度浮點(diǎn)數(shù)轉(zhuǎn)換為長整型
double-to-float 將雙精度浮點(diǎn)數(shù)轉(zhuǎn)換為單精度浮點(diǎn)型
int-to-byte 將整型轉(zhuǎn)換為字節(jié)型
int-to-char 將整型轉(zhuǎn)換為字符型
int-to-short 將整型轉(zhuǎn)換為短整型

15. 數(shù)據(jù)運(yùn)行指令

數(shù)據(jù)運(yùn)算指令包括算術(shù)運(yùn)算指令與邏輯運(yùn)算指令。算術(shù)運(yùn)算指令主要進(jìn)行數(shù)值間如加叼丑,減关翎,乘,除鸠信,模纵寝,移位等運(yùn)算。邏輯運(yùn)算指令主要進(jìn)行數(shù)值間與星立,或爽茴,非,抑或等運(yùn)算绰垂。數(shù)據(jù)運(yùn)算指令有以下四類(數(shù)據(jù)運(yùn)算時(shí)可能是在寄存器或寄存器對(duì)間進(jìn)行室奏,下面的指令作用講解時(shí)使用寄存器來描述):

指令 說明
binop vAA, vBB, vCC 將vBB寄存器與vCC寄存器進(jìn)行運(yùn)算,結(jié)果保存到vAA寄存器
binop/2addr vA, vB 將vA寄存器與vB寄存器進(jìn)行運(yùn)算劲装,結(jié)果保存到vA寄存器
binop/lit16 vA, vB, #+CCCC 將vB寄存器與常量 CCCC進(jìn)行運(yùn)算胧沫,結(jié)果保存到vA寄存器
binop/lit8 vAA, vBB, #+CC 將vBB寄存器與常量CC進(jìn)行運(yùn)算,結(jié)果保存到vAA寄存器

后面3類指令比第1類指令分別多出了2addr占业,lit16绒怨,lit8等指令后綴。四類指令中基礎(chǔ)字節(jié)碼相同的指令執(zhí)行的運(yùn)算操作是類似的谦疾,第1類指令中南蹂,根據(jù)數(shù)據(jù)的類型不同會(huì)在基礎(chǔ)字節(jié)碼后面加上數(shù)據(jù)類型后綴,如 -int 或 -long 分別表示操作的數(shù)據(jù)類型為整型與長整型念恍。第1類指令可歸類如下:

指令 說明
add-type vBB寄存器與vCC寄存器值進(jìn)行加法運(yùn)算(vBB + vCC)
sub-type vBB寄存器與vCC寄存器值進(jìn)行減法運(yùn)算(vBB - vCC)
mul-type vBB寄存器與vCC寄存器值進(jìn)行乘法運(yùn)算(vBB * vCC)
div-type vBB寄存器與vCC寄存器值進(jìn)行除法運(yùn)算(vBB / vCC)
rem-type vBB寄存器與vCC寄存器值進(jìn)行模運(yùn)算(vBB % vCC)
and-type vBB寄存器與vCC寄存器值進(jìn)行與運(yùn)算(vBB & vCC)
or-type vBB寄存器與vCC寄存器值進(jìn)行或運(yùn)算(vBB | vCC)
xor-type vBB寄存器與vCC寄存器值進(jìn)行異或運(yùn)算(vBB ^ vCC)
shl-type vBB寄存器值(有符號(hào)數(shù))左移vCC位(vBB << vCC )
shr-type vBB寄存器值(有符號(hào))右移vCC位(vBB >> vCC)
ushr-type vBB寄存器值(無符號(hào)數(shù))右移vCC位(vBB >>> vCC)

其中基礎(chǔ)字節(jié)碼后面的-type可以是-int六剥,-long, -float峰伙,-double疗疟。后面3類指令與之類似。

至此词爬,Dalvik虛擬機(jī)支持的所有指令就介紹完了秃嗜。在android4.0系統(tǒng)以前,每個(gè)指令的字節(jié)碼只占用一個(gè)字節(jié),范圍是0x0~0x0ff锅锨。在android4.0系統(tǒng)中叽赊,又?jǐn)U充了一部分指令,這些指令被稱為擴(kuò)展指令必搞,主要是在指令助記符后添加了jumbo后綴必指,增加了寄存器與常量的取值范圍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恕洲,一起剝皮案震驚了整個(gè)濱河市塔橡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霜第,老刑警劉巖葛家,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泌类,居然都是意外死亡癞谒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門刃榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弹砚,“玉大人,你說我怎么就攤上這事枢希∽莱裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵苞轿,是天一觀的道長茅诱。 經(jīng)常有香客問我,道長搬卒,這世上最難降的妖魔是什么让簿? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮秀睛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莲祸。我一直安慰自己蹂安,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布锐帜。 她就那樣靜靜地躺著田盈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴阎。 梳的紋絲不亂的頭發(fā)上允瞧,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼述暂。 笑死痹升,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畦韭。 我是一名探鬼主播疼蛾,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艺配!你這毒婦竟也來了察郁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤转唉,失蹤者是張志新(化名)和其女友劉穎皮钠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赠法,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡麦轰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了期虾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片原朝。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镶苞,靈堂內(nèi)的尸體忽然破棺而出喳坠,到底是詐尸還是另有隱情,我是刑警寧澤茂蚓,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布壕鹉,位于F島的核電站,受9級(jí)特大地震影響聋涨,放射性物質(zhì)發(fā)生泄漏晾浴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一牍白、第九天 我趴在偏房一處隱蔽的房頂上張望脊凰。 院中可真熱鬧,春花似錦茂腥、人聲如沸狸涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕胆。三九已至,卻和暖如春般渡,著一層夾襖步出監(jiān)牢的瞬間懒豹,已是汗流浹背芙盘。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脸秽,地道東北人儒老。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像豹储,于是被迫代替她去往敵國和親贷盲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容