Smali語法:Registers(暫存器)
在dalvik位元組碼中,暫存器都是32位的,能夠支援任何型別。64位型別(Long和Double型)用2個暫存器表示。
有兩種方式指定一個方法中有多少暫存器是可用的。.registers指令指定了方法中暫存器的總數。.locals指令表明了方法中非參暫存器的數量。
方法的傳參
當一個方法被呼叫的時候,方法的引數被置於最後N個暫存器中。如果一個方法有2個引數,5個暫存器(v0-v4),那麼引數將置於最後2個暫存器——v3和v4。 非靜態方法中的第一個引數總是呼叫該方法的物件。
例如,非靜態方法LMyObject;->callMe(II)V有2個整型引數,另外還有一個隱含的LMyObject;引數,所以總共有3個引數。假如在該方法中指定了5個暫存器(v0-v4),以.registers方式指定5個或以.locals方式指定2個(即2個local暫存器+3個引數暫存器)。當該方法被呼叫的時候,呼叫該方法的物件(即this引用)存放在v2中,第一個整型引數存放在v3中,第二個整型引數存放在v4中。
對於靜態方法除了沒有隱含的this引數外其它都一樣。
暫存器的命名方式
有兩種方式——V命名方式和P命名方式。P命名方式中的第一個暫存器就是方法中的第一個引數暫存器。在下表中我們用這兩種命名方式來表示上一個例子中有5個暫存器和3個引數的方法。
v0 | the first local register | |
v1 | the second local register | |
v2 | p0 | the first parameter register |
v3 | p1 | the second parameter register |
v4 | p2 | the third parameter register |
你可以用任何一種方式來引用引數暫存器——他們沒有任何差別。
注意:baksmali預設對引數暫存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers選項。
使用P命名方式是為了防止以後如果要在方法中增加暫存器,需要對引數暫存器重新進行編號的缺點。
Long/Double值
Long和double型別是64位的,需要2個暫存器(切記切記)。
例如,對於非靜態方法LMyObject;->MyMethod(IJZ)V,引數分別是LMyObject;,int,long,bool。故該方法需要5個暫存器來儲存引數。
p0 | this |
p1 | I |
p2, p3 | J |
p4 | Z |
相關文章
- Smali 語法解析 —— 類
- smali語法詳解
- Smali 語法解析——Hello World
- CS 暫存器 和 IP 暫存器
- Android反編譯:smali語法Android編譯
- 組合語言中暫存器的英文全程組合語言
- 暫存器定址和暫存器間接定址的區別
- x86 組合語言標誌暫存器組合語言
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- CS、IP和PC暫存器
- 新手分享_再談FS暫存器
- 暫存器::Vim進階索引[4]索引
- 客戶暫存器結構(轉)
- 組合語言學習筆記03——暫存器(CPU工作原理)組合語言筆記
- 【組合語言】第 3 章 暫存器(記憶體訪問)組合語言記憶體
- 《組合語言》王爽,學習筆記(標誌暫存器下)組合語言筆記
- Git 暫存修改檔案 取消暫存Git
- Cisco 路由器暫存器配置[轉貼]路由器
- Android工程師,如何簡單高效的學會smali語法Android工程師
- 程式設計中暫存器的使用程式設計
- iOS彙編基礎(二)暫存器iOS
- 移位暫存器設定移位長度
- 6.常見暫存器和指令
- Intel 8086微處理器暫存器結構Intel
- 【C/C++】 C++暫存器優化C++優化
- 10.1 除錯事件讀取暫存器除錯事件
- 程式分析與優化 - 8 暫存器分配優化
- 基於暫存器呼叫的軟體加速
- 彙編基礎——常用暫存器及其用途
- Vim使用進階:10種暫存器剖析
- 【彙編】計算機暫存器介紹計算機
- verilog中always塊語句中的暫存器變數自加問題變數
- 【自學組合語言Day-02】第二章:暫存器(CPU工作原理)組合語言
- 為什麼暫存器比記憶體快?記憶體
- VC++.NET的暫存器al的Bug (轉)C++
- 儲存過程語法儲存過程
- Git清空暫存區Git
- 關於STM32的BSRR(埠位設定/清除暫存器) 和 BRR(埠位清除暫存器) 的理解(初學32)