TL; DR;
A que se destina o registro “FS” / “GS”?
Simplesmente para acessar dados além do segmento de dados padrão (DS). Exatamente como o ES.
A longa leitura:
Então, eu sei quais são os seguintes registros e seus usos:
[...]
Bem, quase, mas o DS não é 'algum' segmento de dados, mas o padrão. Todas as operações ocorreram por padrão (* 1). É onde todas as variáveis padrão estão localizadas - essencialmente data
e bss
. De certa forma, é parte da razão pela qual o código x86 é bastante compacto. Todos os dados essenciais, que são os acessados com mais frequência, (mais o código e a pilha) estão a uma distância abreviada de 16 bits.
O ES é usado para acessar todo o resto (* 2), tudo além dos 64 KiB do DS. Como o texto de um processador de texto, as células de uma planilha ou os dados de imagem de um programa gráfico e assim por diante. Ao contrário do que costumamos presumir, esses dados não são tão acessados, portanto, precisar de um prefixo dói menos do que usar campos de endereço mais longos.
Da mesma forma, é apenas um pequeno aborrecimento que o DS e o ES tenham que ser carregados (e recarregados) ao fazer operações de string - isso pelo menos é compensado por um dos melhores conjuntos de instruções de tratamento de caracteres de seu tempo.
O que realmente dói é quando os dados do usuário excedem 64 KiB e as operações precisam ser iniciadas. Enquanto algumas operações são feitas simplesmente em um único item de dados por vez (pense A=A*2
), a maioria requer dois ( A=A*B
) ou três itens de dados ( A=B*C
). Se esses itens residirem em segmentos diferentes, o ES será recarregado várias vezes por operação, adicionando alguma sobrecarga.
No início, com pequenos programas do mundo de 8 bits (* 3) e conjuntos de dados igualmente pequenos, não era grande coisa, mas logo se tornou um grande gargalo de desempenho - e mais ainda um verdadeiro pé no saco para programadores (e compiladores). Com o 386, a Intel finalmente proporcionou alívio ao adicionar mais dois segmentos, de forma que qualquer operação unária , binária ou ternária em série , com elementos espalhados na memória, poderia ocorrer sem recarregar o ES o tempo todo.
Para programação (pelo menos em montagem) e design do compilador, isso foi um ganho e tanto. Claro, poderia ter havido ainda mais, mas com três o gargalo basicamente havia sumido, então não há necessidade de exagerar.
Em termos de nomenclatura, as letras F / G são simplesmente continuações alfabéticas após E. Pelo menos do ponto de vista do design da CPU, nada está associado.
* 1 - O uso de ES para destino de string é uma exceção, pois são necessários simplesmente dois registradores de segmento. Sem eles não seriam muito úteis - ou sempre precisando de um prefixo de segmento. O que poderia matar um dos recursos surpreendentes, o uso de instruções de string (não repetitivas), resultando em desempenho extremo devido à codificação de byte único.
* 2 - Então, em retrospectiva, 'segmento de tudo o resto' teria sido uma nomenclatura muito melhor do que 'segmento extra'.
* 3 - É sempre importante ter em mente que o 8086 foi criado apenas como uma medida provisória até que o 8800 fosse concluído e destinado principalmente ao mundo embarcado para manter os clientes do 8080/85 a bordo.