我想了解这个来自_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]
。还有其他我应该看的地方吗?
答案 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
类型约定。和类似的地方。