7

我试图理解这个来自_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]。还有其他地方我应该看看吗?

4

2 回答 2

13

GCC 内部文档

'%c digit ' 可用于替换一个常量值的操作数,而无需使用通常指示立即操作数的语法。

于 2009-11-04T11:17:29.647 回答
2

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

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

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

于 2009-11-04T10:55:21.700 回答