You copied the Doc URL to your clipboard.

Differences in compiler support of inline and embedded assembly code

There are differences between the ways inline and embedded assembly are compiled:

  • Inline assembly code uses a high level of processor abstraction, and is integrated with the C and C++ code during code generation. Therefore, the compiler optimizes the C and C++ code and the assembly code together.

  • Unlike inline assembly code, embedded assembly code is assembled separately from the C and C++ code to produce a compiled object that is then combined with the object from the compilation of the C or C++ source.

  • Inline assembly code can be inlined by the compiler, but embedded assembly code cannot be inlined, either implicitly or explicitly.

Table 25 summarizes the main differences between inline assembler and embedded assembler.

Table 25. Differences between inline and embedded assembler
FeatureEmbedded assemblerInline assembler
Instruction setARM and Thumb.

ARM on all processors.

Thumb on processors with Thumb-2 technology.

ARM assembler directivesAll supported.None supported.
ARMv6 instructionsAll supported.

Supports most instructions, with some exceptions, for example SETEND and some of the system extensions. The complete set of ARMv6 SIMD instructions is supported.

ARMv7 instructionsAll supported.Supports most instructions.
VFP and NEON instructionsAll supported.VFPv2 only.
C/C++ expressionsConstant expressions only.Full C/C++ expressions.
Optimization of assembly codeNo optimization.Full optimization.
Register accessSpecified physical registers are used. You can also use PC, LR and SP.

Uses virtual registers. Using sp (r13), lr (r14), and pc (r15) gives an error.

Return instructionsYou must add them in your code.Generated automatically. (The BX, BXJ, and BLX instructions are not supported.)
BKPT instructionSupported directly.Not supported.