SDCC allows the use of in-line assembler with a few restriction as
regards labels. All labels defined within inline assembler code has
to be of the form nnnnn$ where nnnn is a number less than
100 (which implies a limit of utmost 100 inline assembler labels per
function). It is strongly recommended that each assembly
instruction (including labels) be placed in a separate line (as the
example shows). When the -peep-asm command line option is
used, the inline assembler code will be passed through the peephole
optimizer. This might cause some unexpected changes in the inline
assembler code. Please go throught the peephole optimizer rules defined
in file SDCCpeeph.def carefully before using this option.
_asm
mov b,#10
00001$:
djnz b,00001$
_endasm ;
The inline assembler code can contain any valid code understood by
the assembler, this includes any assembler directives and comment
lines. The compiler does not do any validation of the code within
the _asm ... _endasm; keyword pair.
Inline assembler code cannot reference any C-Labels, however it can
reference labels defined by the inline assembler, e.g.:
foo() {
/* some c code */
_asm
; some assembler code
ljmp $0003
_endasm;
/* some more c code */
clabel: /* inline assembler cannot reference this label
*/
_asm
$0003: ;label (can be reference by inline assembler
only)
_endasm ;
/* some more c code */
}
In other words inline assembly code can access labels defined in inline
assembly within the scope of the funtion.
The same goes the other way, ie. labels defines in inline assembly CANNOT be accessed by C statements.