2014-04-04 6 views
18

alle. Ich habe ein Problem bei der Instrumentierung mit Dalvik-Bytecode festgestellt.Hinzufügen neuer Register auf Dalvik bytecode

Der Ursprung Bytecode ist:

virtual methods 

.method public onClick(Landroid/view/View;)V 

    .locals 12 

    .param p1, "v" # Landroid/view/View; 

... 

    return-void 

.end method 

etwas zu drucken, ich brauche 4 neue Register hinzuzufügen. Jedoch 12 (lokal) +2 (Argumente) +4 (neu)> 16, was zu einem Problem für einen Befehl führen wird.

So, denke ich an eine Idee in Weg blies:

Die Anzahl der ganzen Register sind 20 v0-v11 sind lokal, v18-v19 Argumente sind.

Verschieben Sie zunächst die v18-v19 zu v12-v13, und die Argumente befinden sich in v15. Zusätzlich müssen

wir müssen p0 bis v12, p1 bis v13 ändern.

Wenn wir 4 neue Register verwenden möchten, verschieben Sie v0-v3 zu v14-17. Verschieben Sie nach der Verarbeitung von 4 neuen Registern v14-v17 nach v0-v3 zurück.

Die neue Bytecode wird:

virtual methods 

.method public onClick(Landroid/view/View;)V 

    .locals 18 

    .param p1, "v" # Landroid/view/View; 

move v12, v18 

move v13, v19 

... 

//want to use 4 new registers 

move v14, v0 

move v15, v1 

move v16, v2 

move v17, v3 

//use 4 new registers 

move v0, v14 

move v1, v15 

move v2, v16 

move v3, v17 

    return-void 

.end method 

Leider traf ich Java.lang.VerifyError. Könnte mir jemand helfen? Vielen Dank.

Antwort

1

Register sind nicht austauschbar. Einige Anweisungen akzeptieren nur die Register 0-15, andere 0-255, so dass dieser Ansatz nicht funktioniert.