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)