A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

4. A Memória do Computador

Sab

26

Mai

2007


11:21

(32 votos, média 4.22 de 5) 


Calculando um endereço de memória

Imagine a memória disponível para o usuário como uma fileira de bits contínuos de 640 Kb de comprimento e que cada bloco tenha 64 Kb de comprimento. Quantas partes de 64 Kb você consegue destacar nesta fileira? Até parece pegadinha wink

A primeira resposta que vem na cabeça da gente é 16 (mesmo porque já fizemos a conta). Pois é, se você respondeu 16, enganou-se! Imagine a primeira parte começando na primeira posição (a posição 0) e indo até a posição do byte 65.535; a segunda parte começando na segunda posição e indo até 65.536; a terceira parte começando na terceira posição e indo até 65.537 e assim sucessivamente. Só por cusiosidade, seria possível destacar 589.824 partes completas! É claro que usamos o expediente de sobrepor as partes, sempre com um intervalo de 1 byte.

Os engenheiros da Intel resolveram fazer a mesma coisa, só que com intervalos de 16 bytes, e chamaram cada parte de segmento. Portanto, segmento de memória são 65.536 bytes contínuos deslocados em 16 bytes para frente em relação ao início do segmento anterior. Está parecendo uma salada? Pois é isto mesmo que os engenheiros conseguiram fazer! A segmentação da memória ficou assim:

   Segmento 0 começa na posição 0 e vai até 65535
   Segmento 1 começa na posição 16 e vai até 65551
   ...
   Segmento 100 começa na posição 1600 e vai até 67135
   ...
   Segmento X começa na posição X*16 e vai até X*16 + 65535

Os blocos passaram a ser denominados Segmentos e a posição dentro de um bloco foi chamada de Deslocamento (offset, em Inglês). Convencionou-se indicar com Segmento:Deslocamento o parzinho que aponta uma determinada posição.

Agora um conceito importante: a diferença entre endereço absoluto ou real e endereço segmentado ou relativo. O endereço absoluto é o endereço físico, como se contássemos as posições na memória apontando com o dedo. O endereço segmentado é o indicado pelo parzinho Segmento:Deslocamento.

Talvez um exemplo de como 3 endereços segmentados indicam o mesmo endereço absoluto tire qualquer dúvida. Veja abaixo:

   4660:0005 => 4660 x 16 +   5 = 74.565
   4656:0069 => 4656 x 16 +  69 = 74.565
   4608:0837 => 4608 x 16 + 837 = 74.565

Abra a calculadora do Windows, passe-a para o modo científica e transforme os números acima em hexadecimal (a notação usada com frequência no Assembly). Lembre-se que 16 decimal corresponde a 10 hexadecimal, portanto, basta adicionar um 0 ao hexadecimal para multiplicá-lo por 16. Você deve obter o seguinte:

   1234:0005 => 1234 x 10 +   5 = 12340 +   5 = 12345
   1230:0045 => 1230 x 10 +  45 = 12300 +  45 = 12345
   1200:0345 => 1200 x 10 + 345 = 12000 + 345 = 12345

Informações adicionais