Linker Directives
mikroPascal PRO for 8051 uses internal algorithm to distribute objects within memory. If you need to have a variable or a routine at the specific predefined address, use the linker directives absolute
and org
.

Directive absolute
Directive absolute
specifies the starting address in RAM for a variable. If the variable is multi-byte, higher bytes will be stored at the consecutive locations.
Directive absolute
is appended to declaration of a variable:
// Variable x will occupy 1 word (16 bits) at address 0x32 var x : word; absolute 0x32; // Variable y will occupy 2 words at addresses 0x34 and 0x36 var y : longint; absolute 0x34;
Be careful when using the absolute
directive, as you may overlap two variables by accident. For example:
// Variable i will occupy 1 word at address 0x42; var i : word; absolute 0x42; // Variable will occupy 2 words at 0x40 and 0x42; thus, // changing i changes jj at the same time and vice versa var jj : longint; absolute 0x40;
Directive absolute
can be appended to the declaration of a variable or inserted immediately after the variable name in variable declaration.
The second syntax is very convenient when declaring more than one variable at once.
In this way, each declared variable can be assigned different address.
Furtermore, this two syntaxes can be combined, with absolute
directive following the variable name overriding absolute
directive placed at the end of the variable declaration.
That is, all variables which do not have absolute
directive following variable name will be assigned address specified by absolute
directive placed at the end of the variable declaration if such exists.
var p absolute 10, q , r absolute 16 : byte; absolute 8; // Variable p will occupy a byte at address 10 // Variable q will occupy a byte at address 8 // Variable r will occupy a byte at address 16
Directive org
Directive org
specifies the starting address of a constant or a routine in ROM. It is appended to the constant or a routine declaration.
To place a constant array in Flash memory, write the following :
// Constant array MONTHS will be placed starting from the address 0x800 const MONTHS : array[1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); org 0x800;
If you want to place simple type constant into Flash memory, instead of following declaration:
const SimpleConstant : byte = 0xAA; org 0x2000;
use an array consisting of single element :
const SimpleConstant : array[1] of byte = (0xAA); org 0x800;
In first case, compiler will recognize your attempt, but in order to save Flash space, and boost performance, it will automatically replace all instances of this constant in code with it's literal value.
In the second case your constant will be placed in Flash in the exact location specified.
To place a routine on a specific address in Flash memory you should write the following :
procedure proc(par : byte); org 0x200; begin // Procedure will start at address 0x200; ... end;
org
directive can be used with main
routine too. For example:
program Led_Blinking; begin org 0x800; // main procedure starts at 0x800 ... end.

org
directive.
Directive orgall
Use the orgall
directive to specify the address above which all routines and constants will be placed. Example:
begin orgall(0x200); // All the routines, constants in main program will be above the address 0x200 ... end.
What do you think about this topic ? Send us feedback!