2010-08-25 73 views
2

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

非常感谢

/* 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" 

回答

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_vmxvmx指向(%c表示“常量”)的相应值的整数常量偏移量。

所以行:

mov %c[cr2](%0), %%rax 

vmx->vcpu.arch.cr2内容移动到%rax

0

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