next up previous contents index
Next: 3.14.4 Assembler Routine (reentrant) Up: 3.14 Interfacing with Assembler Previous: 3.14.2 Registers usage   Contents   Index

3.14.3 Assembler Routine (non-reentrant)

In the following example the function c_func calls an assembler routine asm_func, which takes two parameters.

extern int asm_func(unsigned char, unsigned char); 
 
int c_func (unsigned char i, unsigned char j) 
{ 
    return asm_func(i,j); 
} 
 
int main() 
{ 
    return c_func(10,9); 
}
The corresponding assembler function is:

.globl _asm_func_PARM_2  
        .globl _asm_func  
        .area OSEG  
_asm_func_PARM_2: 
        .ds 1  
        .area CSEG  
_asm_func:  
        mov    a,dpl  
        add    a,_asm_func_PARM_2  
        mov    dpl,a  
        mov    dph,#0x00  
        ret
The parameter naming convention is _<function_name>_PARM_<n>, where n is the parameter number starting from 1, and counting from the left. The first parameter is passed in DPH, DPL, B and ACC according to the description above. The variable name for the second parameter will be _<function_name>_PARM_2.

Assemble the assembler routine with the following command:

asx8051 -losg asmfunc.asm

Then compile and link the assembler routine to the C source file with the following command:

sdcc cfunc.c asmfunc.rel


next up previous contents index
Next: 3.14.4 Assembler Routine (reentrant) Up: 3.14 Interfacing with Assembler Previous: 3.14.2 Registers usage   Contents   Index
2008-12-05