如何在C代码中使用内联汇编之带有C表达式操作数的汇编指令

扩展的asm----带有C表达式操作数的汇编指令
扩展的asm语句语法格式:
#语法1:
asm asm-qualifiers ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])
#语法2:
asm asm-qualifiers ( AssemblerTemplate
:
: InputOperands
: Clobbers
: GotoLabels)

使用扩展的asm可以在汇编代码中读/写C变量并且可以实现从汇编代码中跳转到C标签。
扩展的asm语法在汇编模板后使用冒号":"界定操作数参数。
语法1的asm限定符包含volatile和inline,而语法2de asm限定符除了包含它两个外,还包含goto。
当使用-ansi和各种-std选线编译代码时,使用关键字__asm__而不是使用asm。
扩展的asm语句必须在一个函数体内。

asm限定符(asm-qualifiers):
volatile:
扩展asm语句的典型用法是操作输入值以生成输出值
然而,asm语句也可能产生副作用。
如果是这样,您可能需要使用volatile限定符来禁用某些优化
inline:
如果使用inline限定符,那么出于内联的目的,asm语句的大小要尽可能的小。
goto:
goto限定符通知编译器,asm可能会执行一个跳转,跳转到在GotoLabels中的标签列表中的某一个。

参数:
AssemblerTemplate
这是一个文本字符串,是汇编代码的模板。
它是一个固定文本和引用输入、输出以及goto参数的组合。
OutputOperands
由汇编模板中的指令修改的以逗号分隔的C变量列表。
输出操作数可以是空的。
InputOperands
由汇编模板中的指令读取的以逗号分隔的C表达式列表。
Clobbers
由汇编模板中的指令更改的以逗号分隔的寄存器或其他值的列表。
可以允许空列表
GotoLabels
从汇编模板中可能跳去的C标签列表
asm语句不能跳转到其他asm语句,只能跳转到列出的GotoLabels
示例:
void test()
{
int src = 1;
int dst;

asm ("mov %1, %0\n\t"
    "add $1, %0"
    : "=r" (dst) 
    : "r" (src));

printf("%d\n", dst);

}

Volatile:
如果确定不需要输出变量的话,GCC的优化器有时会丢弃asm语句。
此外,如果优化器认为代码总是返回相同的结果(即调用之间输入值没有任何变化),那么它们可能会将代码移出循环。
使用volatile限定符可以禁止这些优化。
没有输出操作数的asm语句(包括asm goto语句)是隐式的volatile.

猜你喜欢

转载自blog.csdn.net/wzc18743083828/article/details/100544042