基礎(chǔ)
Android 的變量都存儲(chǔ)于寄存器中生蚁。變量分為 v 與 p 兩種格式
v 變量表示方法中非參數(shù)變量肋拔。
-
p 變量表示方法中參數(shù)變量氛魁。
如果方法是非靜態(tài)方法编饺,p0 表示 this
如果方法是靜態(tài)方法乖篷,p0 表示第一個(gè)參數(shù)。
-
寄存器都是 32 位透且。因此撕蔼, double 與 long 類型的變量會(huì)占據(jù)兩個(gè)寄存器,它們在存儲(chǔ)時(shí)會(huì)使用兩個(gè)連續(xù)的寄存器秽誊。
private void test(int x){ long a = 10000L; int b = 2; }
該方法需要的 5 個(gè)寄存器鲸沮。參數(shù)需要兩個(gè),變量 b 需要一個(gè)锅论,變量 a 需要兩個(gè)讼溺。
變量 a 會(huì)使用 v0 和 v1 兩個(gè)寄存器。變量 b 使用 v2 最易。
boolean 類型的變量會(huì)被存儲(chǔ)成 0 或 1 肾胯。其中 1 表示真,0 表示假耘纱。
表示
Lcom/demo/adapter/MainActivity;->test:Ljava/lang/String;
表示 MainActivity 類中的 String 類型的 test 變量敬肚。
類型
.registers : 聲明在方法第一行,表示該方法使用到的寄存器的個(gè)數(shù)
.param : 表示該變量為參數(shù)變量
.local : 表示方法中非參數(shù)的變量
.field : 全局變量
賦值
const-class vx,type_id : Class 對象賦值束析。 將 type_id 對應(yīng)的類的 Class 對象賦值給 vx艳馒。
-
const-string vx,string_id: 字符串賦值。將 string_id 指向的字符串賦值給 vx员寇。
string_id 也可以直接替換成具體的 String弄慰。此時(shí)表示將 String 賦值給 vx。
除 const-string 外蝶锋,還有 const-string/jumbo陆爽,它與 const-string 一樣,只不過它支持的字符串引用數(shù)更大扳缕。
數(shù)字賦值
賦值時(shí)慌闭,命令有 const 與 const-wide 兩種。其中 const 表示該變量為 32 位躯舔,const-wide 表示該變量為 64 位驴剔。
整數(shù)賦值
const/4 vx,lit4 : 將 4 位的常量賦值給 vx。也就是說 vx 的最大值是 15粥庄。
-
const/16 vx,lit16:將 16 位的常量賦值給 vx丧失。
- const-wide/16 vx, lit16 表示將一個(gè) 16 位的常量存儲(chǔ)到 vx 與 vx+1 兩個(gè)寄存器中 —— 即一個(gè) long 類型的數(shù)據(jù)。
-
const vx, lit32:將 32 位的常量賦值給 vx惜互。
- const-wide/32 vx, lit32 表示將一個(gè) 32 位的常量存儲(chǔ)到 vx 與 vx+1 兩個(gè)寄存器中 —— 即一個(gè) long 類型的數(shù)據(jù)布讹。
const-wide vx, lit64 : 將一個(gè) 64 位的數(shù)據(jù)存儲(chǔ)到 vx 與 vx+1 兩個(gè)寄存器中
/ 后的數(shù)值表示數(shù)值本身是多少位琳拭,由 const 與 const-wide 區(qū)分變量占多少位。
有些命令中描验,數(shù)值本身位數(shù)較低白嘁,而寄存器的位數(shù)較高。因此將數(shù)值填充到寄存器時(shí)挠乳,需要對數(shù)值進(jìn)行擴(kuò)展,該過程所進(jìn)行的擴(kuò)展都是 符號(hào)擴(kuò)展 —— 根據(jù)原始數(shù)值的符號(hào)位決定對數(shù)值的高位補(bǔ) 0 還是補(bǔ) 1(如果數(shù)值為負(fù)數(shù)姑躲,則高位補(bǔ) 1 睡扬;如果為正數(shù),則高位補(bǔ) 0)
浮點(diǎn)數(shù)
參考官方鏈接
const/high16 v0, lit16:將給定的 16 位常量(右零擴(kuò)展為 32 位)移到指定的寄存器中黍析。
const-wide/high16 vx,lit16:將 16 位常量右零擴(kuò)展為 64 位后填充到 vx 和 vx + 1 寄存器中卖怜。 用于初始化雙精度值。
對于 float 數(shù)值阐枣,除第一個(gè)命令外马靠,還使用 const vx,lit32 形式進(jìn)行賦值。因?yàn)?float 是 32 位蔼两。
對于 double 甩鳄,除第二個(gè)命令外,還可以使用 const-wide vx,lit64 形式進(jìn)行賦值额划。