Mapeamento e Alocação de Memória
A memória é composta de bits que são agrupados de 8 em 8, formando bytes. Cada byte possui um endereço com o qual é possível referenciá-lo. A memória é dividida em segmentos de até 64KB, como mostrado abaixo:
Tanto os dados como o código do programa estão na memória. Organização da memória em um programa:
As variáveis globais, as units (e suas variáveis e rotinas) e o programa principal são alocados no início da execução. O Heap e a Pilha compartilham o resto da memória disponível para o processo.
Para referenciar uma variável é necessário saber seu segmento e o deslocamento (offset) dentro desse segmento. O Pascal tem duas funções chamadas Seg e Ofs que retornam, respectivamente, o segmento e o deslocamento (offset).
var x: integer;
begin
writeln ('Segmento de X = ', Seg(x));
writeln('Offset de X = ', Ofs(x))
end.
É possível acessar diretamente a memória através de arrays especiais:
Mem [<seg>:<ofs>] => cada elemento é um byte
MemW [<seg>:<ofs>] => cada elemento é um word
MemL [<seg>:<ofs>] => cada elemento é um long
Mem[$0008:$0050] := 10
var x, dado: word;
begin
dado := 0;
x := 1;
dado := MemW[Seg(x):Ofs(x)];
writeln ('Valor do dado = ', dado);
end.
O endereço de uma variável não muda durante a execução. O que muda é o valor armazenado no endereço.
Podemos especificar o endereço de uma variável durante sua declaração. Essas variáveis são chamadas variáveis absolutas.
1º Forma) Especificando o segmento e o offset.
var <nome-variável> : <tipo> absolute <seg>:<offset>;
2º Forma) Especificando outra variável:
var <nome-variável> : <tipo> absolute <nome-da-outra-variável>;
var x : integer absolute
$0010:$0005;
y : integer;
z : integer absolute y;
var
str : string[100];
strlength : byte absolute str;
begin
str := 'string';
writeln('Tamanho de str = ', strlength);
strlength := 2;
writeln(str); {Escreve apenas st}
end.