哪几种情况中必须使用内联汇编或嵌入型汇编?

一口Linux
关注

四、内核实例

为了让读者有个更加深刻的理解, 以内核中的例子为例:

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列表


声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存