next up previous contents index
Next: 3.14 int(16 bit) and Up: 3. Using SDCC Previous: 3.12 Startup Code   Contents   Index

3.13 Inline Assembler Code

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.


next up previous contents index
Next: 3.14 int(16 bit) and Up: 3. Using SDCC Previous: 3.12 Startup Code   Contents   Index
Johan Knol
2001-07-13