在x86_64内联汇编中使用%c有什么用?

时间:2010-08-25 03:36:02

标签: c gcc x86-64 inline-assembly

我正在阅读KVM源代码并遇到x86_64内联汇编。在下面的代码中,有什么用“%c”?它是x86_64内联汇编的新功能吗? gcc中x86_64内联汇编中的新功能的任何参考?

非常感谢

    /* Check if vmlaunch of vmresume is needed */
    "cmp $0, %1 \n\t"
    /* Load guest registers.  Don't clobber flags. */
#ifdef CONFIG_X86_64
    "mov %c[cr2](%3), %%rax \n\t"
    "mov %%rax, %%cr2 \n\t"
    "mov %c[rax](%3), %%rax \n\t"
    "mov %c[rbx](%3), %%rbx \n\t"
    "mov %c[rdx](%3), %%rdx \n\t"

2 个答案:

答案 0 :(得分:4)

您可以在asm声明的末尾看到这是如何工作的:

      : : "c"(vmx), "d"((unsigned long)HOST_RSP),
    [launched]"i"(offsetof(struct vcpu_vmx, launched)),
    [fail]"i"(offsetof(struct vcpu_vmx, fail)),
    [rax]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_RAX])),
    [rbx]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_RBX])),

%3(我的源代码树中的%0)是对本地变量vmx的引用,而%c[rax]%c[cr2]等是struct vcpu_vmx vmx指向%c表示“常数”的mov %c[cr2](%0), %%rax 内相应值的整数常量偏移量。)

所以这一行:

vmx->vcpu.arch.cr2

正在将%rax的内容移至{{1}}。

答案 1 :(得分:0)

这是operand。基本上,您可以将C变量绑定到寄存器。也应该对32位有效,但这里可能有一些特定于应用程序的原因只能用于64位。