%c在GCC内联装配代码中意味着什么?
-
16-09-2019 - |
题
我试图理解此内联合代码来自 _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
在第一行中意味着。我在最明显的部分中没有找到任何信息 海湾合作委员会手册, ,解释 %[name]
, , 但不是 %c[name]
. 。我还应该看其他地方吗?
解决方案
来自 GCC内部文档:
`%c数字'可以用来替换一个通常表示即时操作数的语法的恒定值的操作数。
其他提示
检查装配输出(使用 gcc -S
, ,或者可能拆卸对象文件),并且可能更清晰。
我的猜测是代表 持续的. hypercall_page
看起来像是每个执行syscall的指令表。也许这会产生一个 call hypercall_page + {constant based on the expression given}
, ,从本质上计算出该编译时间的偏移的地址。
顺便说一句 __HYPERVISOR##name
东西真的让我想起了 __NR_name_of_syscall
您在Linux的Syscall中看到的类型会议u003Casm/unistd.h>和类似的地方。
不隶属于 StackOverflow