总结:https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Using-Assembly-Language-with-C.html

分类

基本的 asm 语句:这是没有操作数的汇编语句(参见 Basic Asm - Assembler Instructions Without Operands)。它用于直接插入汇编代码,而不需要与 C 代码中的变量或表达式进行交互。

扩展的 asm 语句:这种语句包括一个或多个操作数(参见 Extended Asm - Assembler Instructions with C Expression Operands)。扩展形式允许你将 C 语言中的表达式与汇编代码进行混合使用,使得在一个函数中可以更好地结合 C 语言和汇编语言。这种形式通常是更优选的。

basic_asm

形式

因为gcc扩展的原因,做好写为:__asm__的形式

qualifiers:

The optional volatile qualifier has no effect. All basic asm blocks are implicitly volatile.防止代码优化,但是没啥用

inline:貌似没有啥大用

Parameters:汇编指令

asm asm-qualifiers ( AssemblerInstructions )
__asm__ asm-qualifiers ( AssemblerInstructions )

extend_asm

形式

qualifiers:多个个goto标签

OutputOperands:c变量,由指令修改

InputOperands:c变量,输入到指令

Clobbers:更改的寄存器列表

GotoLabels:可以跳到的范围

注意:输入+输出+goto操作数的总数限制为30。

asm asm-qualifiers ( AssemblerTemplate 
: OutputOperands
: InputOperands
: Clobbers
: GotoLabels)

Special format strings

OutputOperands

输出约束必须以 =+ 开头

**=**:表示这个操作数是一个纯输出操作数,即汇编代码会将新的值写入这个操作数,覆盖其原有的内容。编译器会将这个操作数视为新的输出,不会依赖它在汇编代码执行前的值。

**+**:表示这个操作数既是输入又是输出。汇编代码会读取这个操作数的原始值,并且在执行后将新的值写回操作数中。

约束为了让编译器做出正确的行为

[ [asmSymbolicName] ] constraint (cvariablename)

InputOperands

和输出操作数差不多,不同的是约束不能以=与+开头