2014-12-07 82 views
0

我需要一个额外的寄存器来以smali方法存储一个字符串。我知道小写代码中的寄存器逻辑(请参阅https://github.com/JesusFreke/smali/wiki/Registers),但我仍然想知道如何将寄存器增加归档。Smali:增加寄存器的数量

假设我有一个方法.locals n。现在我想要.locals n + 1。首先,我想迭代该方法,并添加1到每个v寄存器(v0 - > v1,v1 - > v2)。然后v0将是我的新注册,我不会打破任何现有的数据。此外我保持p和v寄存器之间的对齐。

不幸的是,这种简单的方法会导致非编译代码。我不知道为什么。我错过了什么?

回答

1

不幸的是,没有简单的,有保证的方式来做到这一点。但是,最接近的是增加.registers或.locals中的寄存器数量,就像您所描述的那样,然后最后一个非参数寄存器可供您使用。另外,请确保文件是而不是使用-p/- no-parameter-registers选项反汇编,以便所有参数寄存器都使用它们自己的编号方案,因此它们不会受寄存器增加的影响。

使用此方法时可能会遇到的一个问题是由于参数寄存器碰撞寄存器。例如,如果其中一个参数寄存器映射到v15,则会导致问题,并且它会变为v16。这可能是一个问题,因为很多指令只能接受v0到v15。因此,在这些情况下,您可能需要添加另外一个临时寄存器或两个寄存器值的音乐椅,并将值交换到低位寄存器,以便在只能寻址前16个寄存器的指令中使用。

由于这样做的复杂性,我通常建议您尽量避免更改现有方法中寄存器的数量。而是尝试在新方法中实现逻辑,然后您可以从现有方法调用而不必分配新寄存器。当然,取决于你想做什么,这并不总是可能的。