2009-11-04 144 views
6

我想了解这个内联汇编代码,它来自_hypercall0here%c在GCC内联汇编代码中的含义是什么?

asm volatile ("call hypercall_page+%c[offset]" \ 
     : "=r" (__res) \ 
     : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ 
     : "memory", "edi", "esi", "edx", "ecx", "ebx", "eax") 

我有麻烦找什么%c在第一线意味着信息。我在GCC manual的最明显部分没有找到任何信息,其中解释为%[name],但不是%c[name]。还有其他地方我应该看看吗?

回答

2

检查程序集输出(使用gcc -S,或者反汇编目标文件)并且它可能更清晰。

我的猜测是它代表常数hypercall_page看起来像一个指令表,每个指令都执行系统调用。也许这会产生一个call hypercall_page + {constant based on the expression given},本质上是在编译时计算了这个偏移量的地址。

顺便说一句,这__HYPERVISOR##name东西真的提醒你在Linux中的< ASM/unistd.h中>和类似的地方看到系统调用的__NR_name_of_syscall类型公约的我。