我需要一个额外的寄存器来存储一个smali方法中的字符串。我知道smali代码中的寄存器逻辑(参见https://github.com/JesusFreke/smali/wiki/Registers),但我仍然想知道如何归档寄存器的增加。
假设我有 .locals n 的方法。现在我想要 .locals n + 1 。首先,我想迭代该方法并向每个v寄存器添加1(v0 - > v1,v1 - > v2)。然后v0将是我的新注册,我不会破坏任何现有数据。此外,我保持p和v寄存器之间的对齐。
不幸的是,这种简单的方法会导致非编译代码。我不知道为什么。我错过了什么?
答案 0 :(得分:4)
不幸的是,没有简单,有保证的方法来做到这一点。但是,最接近的是增加.registers
或.locals
中的寄存器数量,如您所述,然后最后一个非参数寄存器将可供您使用。另外,请确保使用-p / - no-parameter-registers选项对文件 not 进行反汇编,以便所有参数寄存器都使用自己的编号方案,这样它们就不会受到影响通过增加寄存器。
使用这种方法时可能遇到的一个问题是由于参数寄存器被压低了寄存器。例如,如果其中一个参数寄存器映射到v15,则会导致问题,并且它会降低到v16。这可能是一个问题,因为许多指令只能接受v0到v15。因此,在这些情况下,您可能需要添加另一个或两个临时寄存器,并使用寄存器值播放音乐椅,将值交换进出较低寄存器,以便在只能寻址前16个寄存器的指令中使用。
由于执行此操作的复杂性,我通常建议您尽量避免更改现有方法中的寄存器数量。而是尝试在新方法中实现逻辑,然后可以从现有方法调用,而无需分配新寄存器。当然,根据你想要做的事情,这并非总是可行。