%C在GCC内联汇编代码中的含义是什么?

时间:2009-11-04 10:26:12

标签: c gcc assembly inline-assembly xen

我想了解这个来自_hypercall0 here的内联汇编代码。

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 个答案:

答案 0 :(得分:12)

来自GCC internals documentation

  

`%c 数字'可用于替换   操作数是一个常量值   没有通常的语法   表示一个直接操作数。

答案 1 :(得分:2)

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

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

顺便说一下,这个__HYPERVISOR##name的东西真的让我想起你在Linux的< asm / unistd.h>中看到的系统调用的__NR_name_of_syscall类型约定。和类似的地方。