| |||
| Home > Inline and Embedded Assemblers > Embedded assembler > Generation of embedded assembly functions | |||
The bodies of all the __asm functions in
a translation unit are assembled as if they are concatenated into
a single file that is then passed to the ARM assembler. The order
of __asm functions in the assembly file that
is passed to the assembler is guaranteed to be the same order as
in the source file, except for functions that are generated using
a template instantiation.
This means that it is possible for control to pass from one __asm function
to another by falling off the end of the first function into the
next __asm function in the file, if the return instruction
is omitted.
When you invoke armcc, the object file produced by the assembler is combined with the object file of the compiler by a partial link that produces a single object file.
The compiler generates an AREA directive for
each __asm function. For example, the following __asm function:
#include <cstddef>
struct X { int x,y; void addto_y(int); };
__asm void X::addto_y(int) {
LDR r2,[r0, #__cpp(offsetof(X, y))]
ADD r1,r2,r1
STR r1,[r0, #__cpp(offsetof(X, y))]
BX lr
}
For this function, the compiler generates:
AREA ||.emb_text||, CODE, READONLY
EXPORT |_ZN1X7addto_yEi|
#line num "file"
|_ZN1X7addto_yEi| PROC
LDR r2,[r0, #4]
ADD r1,r2,r1
STR r1,[r0, #4]
BX lr
ENDP
END
The use of offsetof must be inside the __cpp() because
it is the normal offsetof macro from the cstddef header
file.
Ordinary __asm functions are put in an
ELF section with the name .emb_text. That is, embedded
assembly functions are never inlined. However, implicitly instantiated template
functions and out-of-line copies of inline functions are placed
in an area with a name that is derived from the name of the function,
and an extra attribute that marks them as common. This ensures that
the special semantics of these kinds of functions is maintained.
Due to the special naming of the area for out-of-line copies
of inline functions and template functions, these functions are
not in the order of definition, but in an arbitrary order. Therefore,
you cannot assume that a code execution falls out of an inline or template
function and into another __asm function.