Inline assembly code allows for passing control-flow and values between C/C++ and assembly at a fine-grained level. The values that are used as inputs to and outputs from the assembly code must be listed. Special tokens in the assembly string are replaced with the registers that contain these values.
As with file-scope inline assembly, you can use any instructions or directives that are available in the integrated assembler in the assembly string. Use multiple assembly statements in the string of one inline assembly statement by separating them with newlines or semicolons. If you use multiple instructions in this way, the optimizer treats them as a complete unit. It does not split them up, reorder them, or omit some of them.
The compiler does not guarantee that the ordering of multiple inline assembly statements will be preserved. It might also do the following:
- Merge two identical inline assembly statements into one inline assembly statement.
- Split one inline assembly statement into two inline assembly statements.
- Remove an inline assembly statement that has no apparent effect on the result of the program.
To prevent the compiler from doing any of these operations, you must use the input and output operands
and the volatile
keyword to indicate to the compiler which optimizations are
valid.
The compiler does not parse the contents of the assembly string, except for replacing template
strings, until code-generation is complete. It relies on the input and output
operands, and clobbers to tell it about the requirements of the assembly code, and
constraints on the surrounding generated code. Therefore the input and output
operands, and clobbers must be accurate.