小编Jin*_*hen的帖子

GCC内联汇编:在intel x86_64上注册约束

这是寄存器加载代码列表:

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

等等.

assembly gcc x86-64 inline-assembly

15
推荐指数
2
解决办法
8901
查看次数

mterp(Dalvik VM)如何组织其字节码解释循环?

我正在研究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循环中的分支操作.但我仍然无法理解这段代码以及为什么它在性能上更好.它是如何找到解释器的下一个代码的?

performance android interpreter

6
推荐指数
1
解决办法
957
查看次数

如何理解这个定义宏?

我正在学习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)宏中&&操作的含义是什么?获取不存储在内存中的指针指针是没有意义的.有人可以帮帮我吗?谢谢.

c android

4
推荐指数
1
解决办法
154
查看次数

标签 统计

android ×2

assembly ×1

c ×1

gcc ×1

inline-assembly ×1

interpreter ×1

performance ×1

x86-64 ×1