Basic format:
// Note that __asm__ is also valid.
asm( <assembly> )
// When assembly code modifies registers
asm( <assembly>
: <outputs> // optional
: <inputs> // optional
: <clobbered-registers> // optional
);
// Clobbered registers include used registers that are not listed as an input or output.Extended inline assembly
int a=10, b;
// b = a
asm("movl %1, eax, %0;"
:"=r"(b) /* output */
:"r"(a) /* input */
:"%eax" /* clobbered register */
);- output:
"constraints-and-modifiers" (expr), ... - input:
"constraints-and-modifiers" (expr), ...- same thing as output, but expr can be any expression (not necessarily a lvalue)
- constraints
r: use any register for this operand (refer to it using%n, where n is the operand’s zero-based index in the entire output & input list)g: TODO<n>: use a zero-based index to refer to a previous operand<r>: specify a register to use, a = eax, b = ebx, …, S = esi, D = edi
- constraint modifier
=<...>: output registers should use a ”=” constraint modifier+<...>: both an input and output register
- clobber list: list any registers that are changed and are not part of the output list
cc: if condition codes are modified
Registers can also be named, so instead of %%ecx or %0, we can use [var_name]. The corresponding name must appear in the operand list, e.g., asm( ... : [sum] "+r" (sum_var) : ... : ...).