Looks like a Linker problem to me. The program is linked to one place, but you are executing in another place, so position independent code will execute, but data (the string) is read from another location.
You can test the following:
unsigned char string[32] volatile unsigned char c;
c='T'; string[0] = c; c='h'; string[1] = c; c='i'; string[2] = c; c='s'; string[3] = c; c=' '; string[4] = c; c='i'; string[5] = c; c='s'; string[6] = c; c='a'; string[7] = c; c='t'; string[8] = c; c='e'; string[9] = c; c='s'; string[10] = c; c='t'; string[11] = c; c='!'; string[12] = c; c='\n'; string[13] = c; c='\0'; string[14] = c; printf(string);
Check the assmbler code that the characters are loaded as constants and are not loaded with PC relative load instructions. If that is the case, run the program.