x86-64内联汇编
总结: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 basicasm
blocks are implicitly volatile.防止代码优化,但是没啥用inline:貌似没有啥大用
Parameters:汇编指令
asm asm-qualifiers ( AssemblerInstructions ) |
extend_asm
形式
qualifiers:多个个goto标签
OutputOperands:c变量,由指令修改
InputOperands:c变量,输入到指令
Clobbers:更改的寄存器列表
GotoLabels:可以跳到的范围
注意:输入+输出+goto操作数的总数限制为30。
asm asm-qualifiers ( AssemblerTemplate |
Special format strings ¶
OutputOperands
输出约束必须以
=
或+
开头:**
=
**:表示这个操作数是一个纯输出操作数,即汇编代码会将新的值写入这个操作数,覆盖其原有的内容。编译器会将这个操作数视为新的输出,不会依赖它在汇编代码执行前的值。**
+
**:表示这个操作数既是输入又是输出。汇编代码会读取这个操作数的原始值,并且在执行后将新的值写回操作数中。约束为了让编译器做出正确的行为
[ [asmSymbolicName] ] constraint (cvariablename) |
InputOperands
和输出操作数差不多,不同的是约束不能以=与+开头
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment