1. 程式人生 > >GNU C內嵌彙編學習筆記

GNU C內嵌彙編學習筆記

前文所述,只是針對彙編格式的整理,本文將使用coreboot專案程式碼對其進行例項化。以方便、清晰瞭解到如何在C語言裡使用內嵌彙編的方法。同樣地,網路上也有眾多文章涉及到這方面,所以本文更多是歸納總結。形成自己的學習筆記。

內嵌彙編一般格式如下:
asm volatile("Instruction List"
                : Output
                : Input
                : Clobber/Modify);
注意,Output、Input、Clobber/Modify都是可選的,因為有的指令沒有輸入輸出,有的指令只有輸入或只有輸出。

下面是來自coreboot程式碼讀、寫msr的函式:

// msr,Model Specific Register,使用rdmsr、wrmsr分別讀寫MSR
// rdmsr讀取64位元MSR資料放到edx和eax (分別為高低32位元) wrms同理
// 暫存器索引在ecx中
static inline __attribute__((always_inline)) msr_t rdmsr(unsigned index)
{
msr_t result;
__asm__ __volatile__ (
"rdmsr"
: "=a" (result.lo), "=d" (result.hi)
: "c" (index)
);
return result;
}


static inline __attribute__((always_inline)) void wrmsr(unsigned index, msr_t msr)
{
__asm__ __volatile__ (
"wrmsr"
: /* No outputs */
: "c" (index), "a" (msr.lo), "d" (msr.hi)
);
}

/*
 * Generic CPUID function
 */
static inline struct cpuid_result cpuid(int op)
{
struct cpuid_result result;
asm volatile(
"mov %%ebx, %%edi;"
"cpuid;"
"mov %%ebx, %%esi;"
"mov %%edi, %%ebx;"
: "=a" (result.eax),
 "=S" (result.ebx),
 "=c" (result.ecx),
 "=d" (result.edx)
: "0" (op)
: "edi");
return result;
}

http://blog.csdn.net/surfacedust/article/details/17138675