ich habe den Fehler gefunden, es lag an '*dat'
so ist das richtig:
void FlashLesen( unsigned long adr )
{
unsigned char dat[16];
unsigned int i;

TBLPTR = adr;

INTCONbits.GIEH = 0;
EECON1bits.EEPGD = 1;

for(i = 0; i < 16; i++)
{
_asm TBLRD _endasm
dat[i] = TABLAT;
TBLPTR++;
}

INTCONbits.GIEH = 1;
}