我试图理解此内联合代码来自 _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>和类似的地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top