这是寄存器加载代码列表:
a eax
b ebx
c ecx
d edx
S esi
D edi
I常数值(0到31)
q,r动态分配寄存器(见下文)
g eax,ebx,ecx,edx或内存中
的变量a eax和edx合并为64位整数(使用long longs)
但这是intel i386的注册限制.我的问题是我可以在哪里找到intel x86_64系统的寄存器限制,例如:
?%r10
?%r8
?%的RDX
等等.
我正在研究Android Dalvik VM,当我在文件vm/mterp/out/InterpC-portable.cpp中读取mterp代码时会遇到一个问题.实际上它是dalvik vm的主要解释器循环来解释dex文件中的字节代码.如果我写了这个文件,我会选择一个switch-case结构来做这样的事情:
while (hasMoreIns()) {
int ins = getNextIns();
switch(ins) {
case MOV:
//interprete this instruction
...
break;
case ADD:
...
break;
...
default: break;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,mterp使用的与我的想法非常不同,它使用了一些神奇的代码(对我而言),如下所示:
FINISH(0);
HANDLE_OPCODE(OP_NOP)
FINISH(1);
OP_END
HANDLE_OPCODE(OP_MOVE)
...
OP_END
...
Run Code Online (Sandbox Code Playgroud)
我谷歌它发现它似乎是一个修改过的"线程"式执行,它与switch-case风格不同,并且具有更好的性能,因为它删除了while循环中的分支操作.但我仍然无法理解这段代码以及为什么它在性能上更好.它是如何找到解释器的下一个代码的?
我正在学习Dalvik VM代码,但是在文件InterpC-portable.cpp中被一些奇怪的C定义宏停止了.他们很难理解我.代码是:
# define H(_op) &&op_##_op
Run Code Online (Sandbox Code Playgroud)
在文件libdex/DexOpcodes.h中,它的使用方式如下:
#define DEFINE_GOTO_TABLE(_name) \
static const void* _name[kNumPackedOpcodes] = { \
/* BEGIN(libdex-goto-table); GENERATED AUTOMATICALLY BY opcode-gen */ \
H(OP_NOP), \
H(OP_MOVE), \
H(OP_MOVE_FROM16), \
...
Run Code Online (Sandbox Code Playgroud)
OP_NOP,OP_MOVE,OP_MOVE_FROM16是一些枚举变量.但是H(_op)宏中&&操作的含义是什么?获取不存储在内存中的指针指针是没有意义的.有人可以帮帮我吗?谢谢.