Crossware

Table of Contents        Previous topic       Next topic       

C COMPILER->In Line Assembler Code->Accessing Local Variables and Function Parameters->Reentrant Functions Small Mini and Tiny Memory Models

Reentrant Functions, Small, Mini and Tiny Memory Models

The variables are located in data or idata space relative to the internal stack frame pointer R7.  The contents of R7 must be loaded into either R0 or R1 and the offset (which may be positive or negative) added to it.  The variable name enclosed in curly braces is converted to the offset.

_bit variables are quietly converted to unsigned chars and so must be accessed in the same was as other local variables.

void func(unsigned char Var1, unsigned char Var2)
{
    _bit BitVar;
    unsigned char Var3, Var4;
    _asm( "    mov a,R7");
    _asm( "    add a,#{Var1}");
    _asm( "    mov R0,a");
    _asm( "    mov a,@R0");
    _asm( "    mov a,R7");
    _asm( "    add a,#{Var2}");
    _asm( "    mov R0,a");
    _asm( "    mov a,@R0");
    _asm( "    mov a,R7");
    _asm( "    add a,#{Var3}");
    _asm( "    mov R0,a");
    _asm( "    mov a,@R0");
    _asm( "    mov a,R7");
    _asm( "    add a,#{Var4}");
    _asm( "    mov R0,a");
    _asm( "    mov a,@R0");
    _asm( "    mov a,R7");
    _asm( "    add a,#{BitVar}");
    _asm( "    mov R0,a");
    _asm( "    mov a,@R0");
}

compiles to:

_func
    MOV    A,R7
    PUSH    ACC
    MOV    R7,SP
    MOV    A,R7
    ADD    A,#3
    MOV    SP,A
    mov a,R7
    add a,#-3
    mov R0,a
    mov a,@R0
    mov a,R7
    add a,#-4
    mov R0,a
    mov a,@R0
    mov a,R7
    add a,#1
    mov R0,a
    mov a,@R0
    mov a,R7
    add a,#2
    mov R0,a
    mov a,@R0
    mov a,R7
    add a,#0
    mov R0,a
    mov a,@R0
    MOV    SP,R7
    POP    ACC
    MOV    R7,A
    RET

;   Function 'func' Internal Objects
;
;   unsigned char _idata Var1      @(R7-3)
;   unsigned char _idata Var2      @(R7-4)
;   unsigned char _idata BitVar    @(R7+0)
;   unsigned char _idata Var3      @(R7+1)
;   unsigned char _idata Var4      @(R7+2)