2010-08-25 20 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位。