内嵌汇编语法:
__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");