Crossware

Table of Contents        Previous topic       Next topic       

C COMPILER->In Line Assembler Code->Accessing Local Variables and Function Parameters->Reentrant Functions Large Memory Model

Reentrant Functions, Large Memory Model

The variables are located in xdata space relative to the external stack frame pointer __XFP.  The contents of __XFP and __XFP+1 must be loaded into the data pointer dptr and the offset (which may be positive or negative) added to it.  The variable name enclosed in curly braces is converted to the offset.  __XFP and __XFP+1 are located in data space.

_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,#low({Var1})");
    _asm( "    add a,__XFP");
    _asm( "    mov dpl,a");
    _asm( "    mov a,#high({Var1})");
    _asm( "    addc a,__XFP+1");
    _asm( "    mov dph,a");
    _asm( "    movx a,@dptr");

    _asm( "    mov a,#low({Var2})");
    _asm( "    add a,__XFP");
    _asm( "    mov dpl,a");
    _asm( "    mov a,#high({Var2})");
    _asm( "    addc a,__XFP+1");
    _asm( "    mov dph,a");
    _asm( "    movx a,@dptr");
    
    _asm( "    mov a,#low({Var3})");
    _asm( "    add a,__XFP");
    _asm( "    mov dpl,a");
    _asm( "    mov a,#high({Var3})");
    _asm( "    addc a,__XFP+1");
    _asm( "    mov dph,a");
    _asm( "    movx a,@dptr");

    _asm( "    mov a,#low({Var4})");
    _asm( "    add a,__XFP");
    _asm( "    mov dpl,a");
    _asm( "    mov a,#high({Var4})");
    _asm( "    addc a,__XFP+1");
    _asm( "    mov dph,a");
    _asm( "    movx a,@dptr");

    _asm( "    mov a,#low({BitVar })");
    _asm( "    add a,__XFP");
    _asm( "    mov dpl,a");
    _asm( "    mov a,#high({BitVar })");
    _asm( "    addc a,__XFP+1");
    _asm( "    mov dph,a");
    _asm( "    movx a,@dptr");
}

compiles to:

_func
    PUSH    __XFP
    PUSH    __XFP+1
    MOV    A,#3
    MOV    __XFP,DPL
    MOV    __XFP+1,DPH
    ADD    A,__XFP
    MOV    DPL,A
    CLR    A
    ADDC    A,__XFP+1
    MOV    C,EA
    CLR    EA
    MOV    __XSP,DPL
    MOV    __XSP+1,A
    MOV    EA,C
    mov a,#low(-1)
    add a,__XFP
    mov dpl,a
    mov a,#high(-1)
    addc a,__XFP+1
    mov dph,a
    movx a,@dptr
    mov a,#low(-2)
    add a,__XFP
    mov dpl,a
    mov a,#high(-2)
    addc a,__XFP+1
    mov dph,a
    movx a,@dptr
    mov a,#low(1)
    add a,__XFP
    mov dpl,a
    mov a,#high(1)
    addc a,__XFP+1
    mov dph,a
    movx a,@dptr
    mov a,#low(2)
    add a,__XFP
    mov dpl,a
    mov a,#high(2)
    addc a,__XFP+1
    mov dph,a
    movx a,@dptr
    mov a,#low(0)
    add a,__XFP
    mov dpl,a
    mov a,#high(0)
    addc a,__XFP+1
    mov dph,a
    movx a,@dptr
    POP    __XFP+1
    POP    __XFP
    RET

;   Function 'func' Internal Objects
;
;   unsigned char _xdata Var1      @(__XFP-1)
;   unsigned char _xdata Var2      @(__XFP-2)
;   unsigned char _xdata BitVar    @(__XFP+0)
;   unsigned char _xdata Var3      @(__XFP+1)
;   unsigned char _xdata Var4      @(__XFP+2)