Smali語法:Registers(暫存器)

jia635發表於2014-07-29

在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

相關文章