之前每次看内联汇编都有一些地方看不明白,"=r","r","%0","%1"这些符号看不明白,本次总结一下这些内容吧,虽然很简单,但是手不能懒!
首先,C语言中为什么要内联汇编以及其带来的好处这个我就不说了。C语言中使用汇编要通过函数asm(),即__asm__()的别名,两者是一样的。
常见的内联汇编有下面两种形式:
asm(
"mov r0, r0\n\t"
"mov r0, r0\n\t"
"mov r0, r0\n\t"
"mov r0, r0"
);
例1
asm(
"mov %[result], %[value], ror #1"
: [result] "=r" (y)
: [value] "r" (x)
:
);
例2
第一种和一般汇编文件中的汇编程序是一样的,这里不多说了。着重看第二种,为什么要有第二种形式呢?这就和为什么要内联汇编有很大关系了,一般都是在一个C的函数中会使用内联汇编,汇编代码一般会与C函数的代码有数据交换,也就是说通过汇编代码来操作C代码中的一些变量数据,而C代码中的数据存放在内存还是寄存器,或者存放在哪个寄存器我们在写C代码的时候并不知道,所以不可能使用第一种内联汇编形式,那就必须要用第二种形式了。下面是第二种汇编形式的格式定义:
asm(
code /*汇编指令*/
: output operand list /*输出操作数列表*/
: input operand list

本文详细介绍了GCC内联汇编的基本用法,包括 "=r"、"r" 和 "%0"、"%1" 等符号的含义。通过示例1和示例2展示了内联汇编的两种形式,并解释了输入和输出操作数列表的结构。同时,提到了asm volatile()的使用,以防止编译器优化导致的意外行为。
最低0.47元/天 解锁文章
1869

被折叠的 条评论
为什么被折叠?



