1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-11-08 20:06:24 +00:00
millfork/docs/abi/variable-storage.md
2018-04-03 00:21:26 +02:00

73 lines
2.6 KiB
Markdown

[< back to index](../index.md)
# Variable storage
Variables in Millfork can belong to one of the following storage classes:
* static: all global variables; local variables declared with `static`
* stack: local variables declared with `stack`
* automatic: other local variables
* parameter: function parameters
Variables can also belong to one of the following memory segments
(unless overridden with the `@` operator):
* zeropage: all `pointer` variables and parameters
* high RAM: all the other variables and parameters
All arrays can be considered static.
## Static variables
Static variables have a fixed and unique memory location.
Their lifetime is for the entire runtime of the program.
If they do not have initial value declared, reading them before initialization yields an undefined value.
## Stack variables
Stack variables, as their name suggests, live on the stack.
Their lifetime starts with the beginning of the function they're in
and ends when the function returns.
They are not automatically initialized before reading, reading them before initialization yields an undefined value.
The main advantage is that they are perfectly safe to use in reentrant code,
but the main disadvantages are:
* slower access
* bigger code
* increased stack usage
* cannot take their addresses
* cannot use them in inline assembly code blocks
## Automatic variables
Automatic variables have lifetime starting with the beginning of the function they're in
and ending when the function returns.
Most automatic variables reside in memory.
They can share their memory location with other automatic variables and parameters,
to conserve memory usage.
Some small automatic variables may be inlined to index registers.
They are not automatically initialized before reading, reading them before initialization yields an undefined value.
Automatic local variables are not safe to use with reentrant functions, see the [relevant documentation](../lang/reentrancy.md) for more details.
Automatic variables defined with the `register` keyword will have the priority when it comes to register allocation.
## Parameters
Function parameters have lifetime starting with the beginning
of the function call to the function they're defined in
and ending when the function returns.
They reside in memory and can share their memory location with other parameters and automatic variables,
to conserve memory usage.
Unlike automatic variables, they are never inlined into index registers.
Parameters are not safe to use with reentrant functions, see the [relevant documentation](../lang/reentrancy.md) for more details.