Número offset
# Número offset

O número offset está ligado ao número do segmento, em termos de memória são relacionados ao modo de memória segmentada usada nos antigos processadores. A memória do processador Intel 80188 está dividida em segmentos e offsets (os termos são apenas uma convenção).
A memória do 80188 é uma fila indiana de bytes (de tamanho 220 sendo 1MB o tamaho máximo) e cada um com o seu número de endereço físico ou efetivo, de 0 a FFFFFh = 1048576d.
Cada segmento possui tamanho de 64 Kbytes consecutivos e começa em um endereço múltiplo de 16 (= 10 hex). O segmento 0 inicia no endereço 00000h, o segmento 1 no 00010h, o segmento 2 em 00020h e sucessivamente. A posição de um determinado byte dentro de um segmento é o seu o offset da posição em relação a esse segmento (a distância entre o começo do segmento e a posição de memória que o usuário deseja). Cada endereço na memória é dado por um par SSSS:AAAA, onde SSSS é o segmento e AAAA o seu offset. Isso permite aumentar as memórias com mais de 64 KBytes (1MB para o caso do 80188 que necessita de 20 bits de endereço) com processadores que têm registos só de 16bits.
Basicamente, os produtores de hardware queriam estender a quantidade de memória disponível mas, como o processador era de 16 bits, o valor máximo de endereço de memória era de 0xFFFF (= 64kb). Sendo assim, para ultrapassar esse limite, foi criado a memória segmentada.

## Funcionamento da memória segmentada

Funciona da seguinte forma: existem dois valores para cada endereço de memória - o endereço de segmento, e o seu offset. Assim, se tem endereços de memória de 20 bits divididos entre 2 registradores, liberando um acesso de até 1 MB de memória pois o endereço máximo é 0xFFFF:0xFFFF.
Imagine um segmento como uma janela de 64k dentro de um campo de 1MB de memória, movendo essa janela se tem acesso a novas posições de memória.
Um endereço de memória típico de 16bits (em modo real) seria 0x2000:0x1000, onde 0x2000 é o segmento e 0x1000 o offset. O seu equivalente em 32 bits (em modo protegido) seria 0x21000, de acordo com a conversão 0x11000 = 0x2000*16+0x1000 = 0x2000<<4+0x1000.
Segmentos eram muito complexos, um segmento não começa quando o outro termina. Devido ao fato de o offset variar entre 0 e 0xFFFF, se tem os endereços 0x0000:0x0010 e 0x0001:0x0000 representando a mesma posição na memória.

## Atualidade

Atualmente os segmentos deram lugar aos seletores, que ao invés de indicar um pedaço da memória, agora definem o tipo de acesso permitido (memória do sistema, memória gravável, memória do usuário, memória de somente leitura, etc).
* Portal das tecnologias de informação