大家。我在Dalvik字节码的仪器上遇到了问题。
原始字节码是:
virtual methods
.method public onClick(Landroid/view/View;)V
.locals 12
.param p1, "v" # Landroid/view/View;
...
return-void
.end method
要打印一些东西,我需要添加4个新寄存器。但是,12(本地)+2(参数)+4(新)> 16,这将导致某些指令出现问题。
所以,我想到了一个引人注目的想法:
整个寄存器的数量是20. v0-v11是本地的,v18-v19是参数。
首先将v18-v19移动到v12-v13,参数寄存器在v15内。另外,
我们需要将p0修改为v12,将p1修改为v13。
如果我们想使用4个新寄存器,请将v0-v3移至v14-17。处理完4个新寄存器后,将v14-v17移回v0-v3。
新字节码变为:
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
不幸的是,我遇到了Java.lang.VerifyError
。谁能帮助我?谢谢。
答案 0 :(得分:1)
登记册不可互换。有些指令只接受寄存器0-15,其他指令0-255,所以这种方法不起作用。