哪几种情况中必须使用内联汇编或嵌入型汇编?
四、内核实例
为了让读者有个更加深刻的理解, 以内核中的例子为例:
arch/arm/kernel/setup.c
void notrace cpu_init(void)
{
unsigned int cpu = smp_processor_id();----获取CPU ID
struct stack *stk = &stacks[cpu];----获取该CPU对于的irq abt和und的stack指针
……
#ifdef CONFIG_THUMB2_KERNEL
#define PLC "r"----Thumb-2下,msr指令不允许使用立即数,只能使用寄存器。
#else
#define PLC "I"
#endif __asm__ (
"msr cpsr_c, %1 "----让CPU进入IRQ mode
"add r14, %0, %2 "----r14寄存器保存stk->irq
"mov sp, r14 "----设定IRQ mode的stack为stk->irq
"msr cpsr_c, %3 "
"add r14, %0, %4 "
"mov sp, r14 "----设定abt mode的stack为stk->abt
"msr cpsr_c, %5 "
"add r14, %0, %6 "
"mov sp, r14 "----设定und mode的stack为stk->und
"msr cpsr_c, %7"---回到SVC mode
:----上面是code,下面的output部分是空的
: "r" (stk),----对应上面代码中的%0
PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),----对应上面代码中的%1
"I" (offsetof(struct stack, irq[0])),----对应上面代码中的%2
PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),----以此类推,下面不赘述
"I" (offsetof(struct stack, abt[0])),
PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
"I" (offsetof(struct stack, und[0])),
PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
: "r14");----上面是input操作数列表,r14是要clobbered register列表
}
图片新闻
最新活动更多
-
11月8日立即预约>> 筑梦启光 砺行致远 | 新天激光数字化产研基地奠基仪式
-
即日-11.13立即报名>>> 【在线会议】多物理场仿真助跑新能源汽车
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
11月29日立即预约>> 【上海线下】设计,易如反掌—Creo 11发布巡展
-
11月30日立即试用>> 【有奖试用】爱德克IDEC-九大王牌安全产品
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论