uboot中 内嵌汇编

内嵌汇编语法:
__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));  
 
    movl %1,%0  是指令模板;%0  和 %1 代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数

相对应。
 
    指令模板后面用小括号括起来的是 C 语言表达式,本例中只有两个:result 和 input ,他们按照出现的顺序分别与指

令操作数 %0 、%1 对应;注意对应顺序:第一个 C 表达式对应 %0 ;第二个表达式对应 %1 ,依次类推,操作数至多有10

个,分别用 %0, %1 …. %9 表示。

__asm__ __volatile__(
  "mrc p15, 0, %0, c1, c0, 0   @ read control reg\n"
   : "=r" (value),"+r"(b),"+&r"(e),
   :
   : "memory");
r代表是以寄存器方式操作,=代表该变量只写,+代表可读可写,+&r代表输出时不使用输入部分使用过的寄存器。

读写寄存器实例
static unsigned long read_p15_c1 (void)
{
 unsigned long value;

 __asm__ __volatile__(
      "mrc p15, 0, %0, c1, c0, 0   @ read control reg\n"
      : "=r" (value)
      :
      : "memory");
 return value;
}

/* write to co-processor 15, register #1 (control register) */
static void write_p15_c1 (unsigned long value)
{
 __asm__ __volatile__(
      "mcr p15, 0, %0, c1, c0, 0   @ write it back\n"
      :
      : "r" (value)
      : "memory");

 read_p15_c1 ();
}

你可能感兴趣的:(linux,设备驱动)