我正在阅读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"
答案 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位。