The data stack holds 3 types of data
Integer and float data are stored in the stack by PUSHI and PUSHF in 32bit format with a data type byte set to either 0x01 (integer) or 0x02 (float).
Strings, by default, are not stored in the stack. Initially, if they originate from the code (via PUSHS) a pointer to them is stored in a struct that also contains the size of the string, and the address of the struct is stored in the stack with with type bit set to 0x03 (string in code).
If the string is modified, or placed on the stack by and outside function, a pointer to the new string and its size is placed into a struct and the struct address plus the data type 0x04 (modified string) is placed onto the stack.
A value can be removed from the stack at any time by using POP. There is no command to obtain data from the stack to store locally.
Any command effecting data on the stack is destructive to the stack and removes data on the stack it effects, replacing it with the result, if any. In the case of commands effecting strings, the struct for that string is cleared. For this reason there is a command (STORE) to "remember" values that can later be recalled (RETRV) to the stack. Any STORE'd data, although removed from the stack, can be recalled later by using RETRV with the same 32bit ID that was used to STORE it.