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

我试图理解这个来自_hypercall0内联汇编代码。

 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手册最明显的部分找到任何信息,这解释了%[name] ,但没有找到%c[name] 。 还有其他我应该看的地方吗?

来自GCC内部文件 :

`%c digit ‘可用于替换常量值的操作数,而不使用通常表示立即操作数的语法。

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

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

__HYPERVISOR##name ,这个__HYPERVISOR##name内容确实让我想起了你在Linux的和类似地方看到的系统调用的__NR_name_of_syscall类型约定。