在前面已经说到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处理器的寄存器里面,这样更高效率。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐