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;
}



coreboot项目主页:http://www.coreboot.org/

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值