GCC内联汇编代码中的%c是什么意思?

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手册的最明显部分中没有找到有关%c[name]的解释,该手册仅解释了%[name]。我是否需要查看其他地方?

2个回答

15

来自GCC内部文档:

`%c数字'可以用于替换一个常量值操作数,而不需要通常表示立即操作数的语法。


2

查看汇编输出(使用gcc -S,或者可能会反汇编目标文件),这样可能会更清楚。

我猜它代表常量hypercall_page 看起来像是一张指令表,每个指令都执行一个系统调用。也许这将生成一个 call hypercall_page + {基于给定表达式的常量},本质上是在编译时计算出此偏移量的地址。

顺便说一句,这个 __HYPERVISOR##name 的东西真的让我想起了 Linux 的 <asm/unistd.h> 和类似位置中用于系统调用的 __NR_name_of_syscall 类型约定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接