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).

Exemplo 1: Imprimir o segmento e o offset de um número inteiro:

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

Exemplo 2: Mudando o valor do byte contido no segmento $0008, com deslocamento $0050

Mem[$0008:$0050] := 10

 

Exemplo 3: Uma atribuição usando acesso direto à memória

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>;

Exemplo 4: Declarando variáveis absolutas

var x : integer absolute $0010:$0005;
    y : integer;
    z : integer absolute y;

 

Exemplo 5: Obter o tamanho de uma string usando uma variável absoluta.

var
   str       : string[100];
   strlength : byte absolute str;
begin
   str := 'string';
   writeln('Tamanho de str = ', strlength);
   strlength := 2;
   writeln(str);    {Escreve apenas st}
end.