从语义上讲,Dalvik虚拟机为每个方法提供了一组新的寄存器,并且没有指令可以访问调用堆栈。但在其实现方面,寄存器应该在方法调用时以某种方式保存,并在方法返回时恢复。 (Google的实现) Dalvik是如何做到这一点的?
dalvik字节码引用的寄存器实际上并不是机器寄存器,而是调用堆栈上的位置。每当您调用一个方法时,dalvik会在该方法的堆栈帧上分配足够的内存以容纳该方法所需的所有寄存器。请注意,并非所有计算都会立即修改堆栈上的值,虚拟机显然必须将值加载到机器寄存器中以进行计算。结果可能保留在机器寄存器中以便稍后使用,而不立即写回相应的堆栈位置,由虚拟机自行决定。如果需要(例如在调用另一个方法、使用各种同步构造或需要该寄存器进行其他计算等情况下),这些值将被刷新回调用堆栈。
fp
。因此,寄存器n实际上是fp[
n]
。当一个方法调用另一个方法时,参数被复制到调用者的寄存器顶部,并且帧指针被减少以为被调用者的寄存器腾出空间。 - Pteromys