在前面已经说到Dalvik虚拟机是基于寄存器运行的虚拟机,这是与JAVA虚拟机有本质上的区别,因为它是基于栈运行的虚拟机,因而Dalvik虚拟机运行的速度更快,更高效。下面就来分析一段代码片段,看看是怎么样基于寄存器操作的,以便有更深入的了解。代码如下:
#defineHANDLE_OP_SHX_INT(_opcode, _opname, _cast, _op) \
HANDLE_OPCODE(_opcode /*vAA,vBB, vCC*/) \
{ \
u2 srcRegs; \
vdst = INST_AA(inst); \
这里从第一条指令获取到目标寄存器地址。
srcRegs = FETCH(1); \
这里取第二条指令。
vsrc1 = srcRegs &0xff; \
计算第一个操作数的寄存器地址。
vsrc2 = srcRegs >>8; \
计算第二个操作数的寄存器地址。
ILOGV("|%s-intv%d,v%d", (_opname), vdst, vsrc1); \
SET_REGISTER(vdst, \
_castGET_REGISTER(vsrc1) _op (GET_REGISTER(vsrc2) & 0x1f)); \
第一个操作数与第二个操作数进行运算,保存到目标寄存器。
} \
FINISH(2);
在这段代码里,就是处理两个寄存器数,计算后再保存到第三个寄存器。在这里使用函数SET_REGISTER和函数GET_REGISTER的运算,就叫做寄存器操作,在Dalvik虚拟机,很多临时的操作,都是基于寄存器的操作,而不是基于栈,这样减少了不少操作栈的指令,同时也优化这种寄存器操作,直接映射到ARM处理器的寄存器里面,这样更高效率。