簡體   English   中英

x86_64內聯匯編中%c的用途是什么?

[英]What's use of %c in 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"

您可以在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]等是vmxstruct vcpu_vmx中對應值的整數常量偏移量指向( %c表示“常量”)。

所以這行:

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

正在將vmx->vcpu.arch.cr2的內容移動到%rax

這是一個操作數 基本上,您可以將C變量綁定到寄存器。 對於32位也應該有效,但是這里可能有一些特定於應用程序的原因僅將其用於64位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM